18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This file is part of the WebKit project.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Zack Rusin <zack@kde.org>
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *               2006 Dirk Mueller <mueller@kde.org>
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *               2006 Nikolas Zimmermann <zimmermann@kde.org>
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Holger Hans Peter Freyther
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * All rights reserved.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderThemeQt.h"
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSStyleSelector.h"
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CSSStyleSheet.h"
35cad810f21b803229eb11403f9209855525a25d57Steve Block#include "CSSValueKeywords.h"
36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "Chrome.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ChromeClientQt.h"
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Color.h"
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Document.h"
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Font.h"
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FontSelector.h"
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "GraphicsContext.h"
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLInputElement.h"
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLMediaElement.h"
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLNames.h"
4621939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(QT_MOBILE_THEME)
47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "QtMobileWebStyle.h"
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(VIDEO)
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "MediaControlElements.h"
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NotImplemented.h"
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PaintInfo.h"
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Page.h"
55d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "QWebPageClient.h"
56545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "QtStyleOptionWebComboBox.h"
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "qwebsettings.h"
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RenderBox.h"
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(PROGRESS_TAG)
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderProgress.h"
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
62d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "RenderSlider.h"
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "RenderTheme.h"
64d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ScrollbarThemeQt.h"
65545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "TimeRanges.h"
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "UserAgentStyleSheets.h"
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QApplication>
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QColor>
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QFile>
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <QLineEdit>
7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <QMacStyle>
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QPainter>
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QPushButton>
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QStyleFactory>
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QStyleOptionButton>
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QStyleOptionFrameV2>
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(PROGRESS_TAG)
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QStyleOptionProgressBarV2>
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
81d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QStyleOptionSlider>
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <QWidget>
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88e14391e94c850b8bd03680c23b38978db68687a8John Reckinline static void initStyleOption(QWidget *widget, QStyleOption& option)
89e14391e94c850b8bd03680c23b38978db68687a8John Reck{
90e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (widget)
91e14391e94c850b8bd03680c23b38978db68687a8John Reck        option.initFrom(widget);
92e14391e94c850b8bd03680c23b38978db68687a8John Reck    else {
93e14391e94c850b8bd03680c23b38978db68687a8John Reck        /*
94e14391e94c850b8bd03680c23b38978db68687a8John Reck          If a widget is not directly available for rendering, we fallback to default
95e14391e94c850b8bd03680c23b38978db68687a8John Reck          value for an active widget.
96e14391e94c850b8bd03680c23b38978db68687a8John Reck         */
97e14391e94c850b8bd03680c23b38978db68687a8John Reck        option.state = QStyle::State_Active | QStyle::State_Enabled;
98e14391e94c850b8bd03680c23b38978db68687a8John Reck    }
99e14391e94c850b8bd03680c23b38978db68687a8John Reck}
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// These values all match Safari/Win/Chromium
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float defaultControlFontPixelSize = 13;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float defaultCancelButtonSize = 9;
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float minCancelButtonSize = 5;
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float maxCancelButtonSize = 21;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float defaultSearchFieldResultsDecorationSize = 13;
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float minSearchFieldResultsDecorationSize = 9;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float maxSearchFieldResultsDecorationSize = 30;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const float defaultSearchFieldResultsButtonWidth = 18;
109e14391e94c850b8bd03680c23b38978db68687a8John Reck
1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(QT_MOBILE_THEME)
1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace {
1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float buttonPaddingLeft = 18;
1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float buttonPaddingRight = 18;
1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float buttonPaddingTop = 2;
1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float buttonPaddingBottom = 3;
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float menuListPadding = 9;
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    float textFieldPadding = 5;
1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
121ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockStylePainter::StylePainter(RenderThemeQt* theme, const PaintInfo& paintInfo)
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
123d0825bca7fe65beaee391d30da42e937db621564Steve Block    init(paintInfo.context ? paintInfo.context : 0, theme->qStyle());
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
126d0825bca7fe65beaee391d30da42e937db621564Steve BlockStylePainter::StylePainter(ScrollbarThemeQt* theme, GraphicsContext* context)
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
128d0825bca7fe65beaee391d30da42e937db621564Steve Block    init(context, theme->style());
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
131d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid StylePainter::init(GraphicsContext* context, QStyle* themeStyle)
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    painter = static_cast<QPainter*>(context->platformContext());
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    widget = 0;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPaintDevice* dev = 0;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (painter)
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        dev = painter->device();
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (dev && dev->devType() == QInternal::Widget)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        widget = static_cast<QWidget*>(dev);
140d0825bca7fe65beaee391d30da42e937db621564Steve Block    style = themeStyle;
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (painter) {
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // the styles often assume being called with a pristine painter where no brush is set,
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // so reset it manually
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        oldBrush = painter->brush();
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        painter->setBrush(Qt::NoBrush);
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // painting the widget with anti-aliasing will make it blurry
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // disable it here and restore it later
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        oldAntialiasing = painter->testRenderHint(QPainter::Antialiasing);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        painter->setRenderHint(QPainter::Antialiasing, false);
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectStylePainter::~StylePainter()
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (painter) {
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        painter->setBrush(oldBrush);
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        painter->setRenderHints(QPainter::Antialiasing, oldAntialiasing);
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderTheme> RenderThemeQt::create(Page* page)
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return adoptRef(new RenderThemeQt(page));
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (page)
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return RenderThemeQt::create(page);
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static RenderTheme* fallback = RenderThemeQt::create(0).releaseRef();
1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return fallback;
1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRenderThemeQt::RenderThemeQt(Page* page)
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : RenderTheme()
1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_page(page)
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_lineEdit(0)
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPushButton button;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    button.setAttribute(Qt::WA_MacSmallSize);
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QFont defaultButtonFont = QApplication::font(&button);
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QFontInfo fontInfo(defaultButtonFont);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_buttonFontFamily = defaultButtonFont.family();
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef Q_WS_MAC
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_buttonFontPixelSize = fontInfo.pixelSize();
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1905e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
19121939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(QT_MOBILE_THEME)
192a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_fallbackStyle = new QtMobileWebStyle;
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
1945e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    m_fallbackStyle = QStyleFactory::create(QLatin1String("windows"));
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderThemeQt::~RenderThemeQt()
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_fallbackStyle;
20121939df44de1705786c545cd1bf519d47250322dBen Murdoch#ifndef QT_NO_LINEEDIT
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    delete m_lineEdit;
20321939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20621939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(QT_MOBILE_THEME)
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RenderThemeQt::isControlStyled(const RenderStyle* style, const BorderData& border, const FillLayer& fill, const Color& backgroundColor) const
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (style->appearance()) {
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PushButtonPart:
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case ButtonPart:
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case MenulistPart:
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    case SearchFieldPart:
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case TextFieldPart:
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case TextAreaPart:
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Test the style to see if the UA border and background match.
2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return (style->border() != border
2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                || *style->backgroundLayers() != fill
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                || style->visitedDependentColor(CSSPropertyBackgroundColor) != backgroundColor);
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case CheckboxPart:
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case RadioPart:
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return RenderTheme::isControlStyled(style, border, fill, backgroundColor);
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint RenderThemeQt::popupInternalPaddingBottom(RenderStyle* style) const
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 1;
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Remove this when SearchFieldPart is style-able in RenderTheme::isControlStyled()
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool RenderThemeQt::isControlStyled(const RenderStyle* style, const BorderData& border, const FillLayer& fill, const Color& backgroundColor) const
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (style->appearance()) {
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case SearchFieldPart:
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Test the style to see if the UA border and background match.
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return (style->border() != border
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                || *style->backgroundLayers() != fill
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                || style->visitedDependentColor(CSSPropertyBackgroundColor) != backgroundColor);
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return RenderTheme::isControlStyled(style, border, fill, backgroundColor);
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// for some widget painting, we need to fallback to Windows style
2495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve BlockQStyle* RenderThemeQt::fallbackStyle() const
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2515e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return (m_fallbackStyle) ? m_fallbackStyle : QApplication::style();
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQStyle* RenderThemeQt::qStyle() const
2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
25621939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(QT_MOBILE_THEME)
2575e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return fallbackStyle();
2585e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#endif
2595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_page) {
261d0825bca7fe65beaee391d30da42e937db621564Steve Block        QWebPageClient* pageClient = m_page->chrome()->client()->platformPageClient();
2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
263d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (pageClient)
264d0825bca7fe65beaee391d30da42e937db621564Steve Block            return pageClient->style();
2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return QApplication::style();
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString RenderThemeQt::extraDefaultStyleSheet()
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    String result = RenderTheme::extraDefaultStyleSheet();
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(NO_LISTBOX_RENDERING)
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    result += String(themeQtNoListboxesUserAgentStyleSheet, sizeof(themeQtNoListboxesUserAgentStyleSheet));
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeQt::supportsHover(const RenderStyle*) const
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerbool RenderThemeQt::supportsFocusRing(const RenderStyle* style) const
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    switch (style->appearance()) {
2876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case CheckboxPart:
2886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case RadioPart:
2896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case PushButtonPart:
2906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SquareButtonPart:
2916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case ButtonPart:
2926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case ButtonBevelPart:
2936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case ListboxPart:
2946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case ListItemPart:
2956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case MenulistPart:
2966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case MenulistButtonPart:
2976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SliderHorizontalPart:
2986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SliderVerticalPart:
2996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SliderThumbHorizontalPart:
3006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SliderThumbVerticalPart:
3016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SearchFieldPart:
3026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SearchFieldResultsButtonPart:
3036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case SearchFieldCancelButtonPart:
3046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case TextFieldPart:
3056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    case TextAreaPart:
3066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return true;
3076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    default:
3086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return false;
3096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderThemeQt::baselinePosition(const RenderObject* o) const
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!o->isBox())
315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return 0;
316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (o->style()->appearance() == CheckboxPart || o->style()->appearance() == RadioPart)
318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return toRenderBox(o)->marginTop() + toRenderBox(o)->height() - 2; // Same as in old khtml
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return RenderTheme::baselinePosition(o);
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeQt::controlSupportsTints(const RenderObject* o) const
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isEnabled(o))
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Checkboxes only have tint when checked.
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (o->style()->appearance() == CheckboxPart)
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return isChecked(o);
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // For now assume other controls have tint if enabled.
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeQt::supportsControlTints() const
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint RenderThemeQt::findFrameLineWidth(QStyle* style) const
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
34221939df44de1705786c545cd1bf519d47250322dBen Murdoch#ifndef QT_NO_LINEEDIT
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_lineEdit)
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_lineEdit = new QLineEdit();
34521939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStyleOptionFrameV2 opt;
34821939df44de1705786c545cd1bf519d47250322dBen Murdoch    QWidget* widget = 0;
34921939df44de1705786c545cd1bf519d47250322dBen Murdoch#ifndef QT_NO_LINEEDIT
35021939df44de1705786c545cd1bf519d47250322dBen Murdoch    widget = m_lineEdit;
35121939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif
35221939df44de1705786c545cd1bf519d47250322dBen Murdoch    return style->pixelMetric(QStyle::PM_DefaultFrameWidth, &opt, widget);
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic QRect inflateButtonRect(const QRect& originalRect, QStyle* style)
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QStyleOptionButton option;
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.state |= QStyle::State_Small;
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.rect = originalRect;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QRect layoutRect = style->subElementRect(QStyle::SE_PushButtonLayoutItem, &option, 0);
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!layoutRect.isNull()) {
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int paddingLeft = layoutRect.left() - originalRect.left();
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int paddingRight = originalRect.right() - layoutRect.right();
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int paddingTop = layoutRect.top() - originalRect.top();
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int paddingBottom = originalRect.bottom() - layoutRect.bottom();
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return originalRect.adjusted(-paddingLeft, -paddingTop, paddingRight, paddingBottom);
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return originalRect;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid RenderThemeQt::adjustRepaintRect(const RenderObject* o, IntRect& rect)
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (o->style()->appearance()) {
3760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CheckboxPart:
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case RadioPart:
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PushButtonPart:
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ButtonPart: {
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QRect inflatedRect = inflateButtonRect(rect, qStyle());
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        rect = IntRect(inflatedRect.x(), inflatedRect.y(), inflatedRect.width(), inflatedRect.height());
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case MenulistPart:
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeQt::platformActiveSelectionBackgroundColor() const
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPalette pal = QApplication::palette();
39681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setPaletteFromPageClientIfExists(pal);
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pal.brush(QPalette::Active, QPalette::Highlight).color();
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeQt::platformInactiveSelectionBackgroundColor() const
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPalette pal = QApplication::palette();
40381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setPaletteFromPageClientIfExists(pal);
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pal.brush(QPalette::Inactive, QPalette::Highlight).color();
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeQt::platformActiveSelectionForegroundColor() const
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPalette pal = QApplication::palette();
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setPaletteFromPageClientIfExists(pal);
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pal.brush(QPalette::Active, QPalette::HighlightedText).color();
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeQt::platformInactiveSelectionForegroundColor() const
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPalette pal = QApplication::palette();
41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setPaletteFromPageClientIfExists(pal);
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return pal.brush(QPalette::Inactive, QPalette::HighlightedText).color();
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
421cad810f21b803229eb11403f9209855525a25d57Steve BlockColor RenderThemeQt::platformFocusRingColor() const
422cad810f21b803229eb11403f9209855525a25d57Steve Block{
423cad810f21b803229eb11403f9209855525a25d57Steve Block    QPalette pal = QApplication::palette();
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    setPaletteFromPageClientIfExists(pal);
425cad810f21b803229eb11403f9209855525a25d57Steve Block    return pal.brush(QPalette::Active, QPalette::Highlight).color();
426cad810f21b803229eb11403f9209855525a25d57Steve Block}
427cad810f21b803229eb11403f9209855525a25d57Steve Block
428231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid RenderThemeQt::systemFont(int, FontDescription&) const
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // no-op
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
433cad810f21b803229eb11403f9209855525a25d57Steve BlockColor RenderThemeQt::systemColor(int cssValueId) const
434cad810f21b803229eb11403f9209855525a25d57Steve Block{
435cad810f21b803229eb11403f9209855525a25d57Steve Block    QPalette pal = QApplication::palette();
436cad810f21b803229eb11403f9209855525a25d57Steve Block    switch (cssValueId) {
437cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSValueButtontext:
438cad810f21b803229eb11403f9209855525a25d57Steve Block        return pal.brush(QPalette::Active, QPalette::ButtonText).color();
439cad810f21b803229eb11403f9209855525a25d57Steve Block    case CSSValueCaptiontext:
440cad810f21b803229eb11403f9209855525a25d57Steve Block        return pal.brush(QPalette::Active, QPalette::Text).color();
441cad810f21b803229eb11403f9209855525a25d57Steve Block    default:
442cad810f21b803229eb11403f9209855525a25d57Steve Block        return RenderTheme::systemColor(cssValueId);
443cad810f21b803229eb11403f9209855525a25d57Steve Block    }
444cad810f21b803229eb11403f9209855525a25d57Steve Block}
445cad810f21b803229eb11403f9209855525a25d57Steve Block
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint RenderThemeQt::minimumMenuListSize(RenderStyle*) const
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QFontMetrics &fm = QApplication::fontMetrics();
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 7 * fm.width(QLatin1Char('x'));
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderThemeQt::computeSizeBasedOnStyle(RenderStyle* renderStyle) const
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QSize size(0, 0);
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QFontMetrics fm(renderStyle->font().font());
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QStyle* style = qStyle();
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (renderStyle->appearance()) {
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case TextAreaPart:
46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case SearchFieldPart:
461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case TextFieldPart: {
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int padding = findFrameLineWidth(style);
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        renderStyle->setPaddingLeft(Length(padding, Fixed));
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        renderStyle->setPaddingRight(Length(padding, Fixed));
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        renderStyle->setPaddingTop(Length(padding, Fixed));
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        renderStyle->setPaddingBottom(Length(padding, Fixed));
467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If the width and height are both specified, then we have nothing to do.
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!renderStyle->width().isIntrinsicOrAuto() && !renderStyle->height().isAuto())
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (renderStyle->appearance()) {
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case CheckboxPart: {
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QStyleOption styleOption;
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        styleOption.state |= QStyle::State_Small;
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int checkBoxWidth = style->pixelMetric(QStyle::PM_IndicatorWidth, &styleOption);
48168513a70bcd92384395513322f1b801e7bf9c729Steve Block        checkBoxWidth *= renderStyle->effectiveZoom();
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size = QSize(checkBoxWidth, checkBoxWidth);
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case RadioPart: {
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QStyleOption styleOption;
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        styleOption.state |= QStyle::State_Small;
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int radioWidth = style->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth, &styleOption);
48968513a70bcd92384395513322f1b801e7bf9c729Steve Block        radioWidth *= renderStyle->effectiveZoom();
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size = QSize(radioWidth, radioWidth);
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !USE(QT_MOBILE_THEME)
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case PushButtonPart:
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case ButtonPart: {
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QStyleOptionButton styleOption;
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        styleOption.state |= QStyle::State_Small;
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QSize contentSize = fm.size(Qt::TextShowMnemonic, QString::fromLatin1("X"));
4990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QSize pushButtonSize = style->sizeFromContents(QStyle::CT_PushButton,
5000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                       &styleOption, contentSize, 0);
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        styleOption.rect = QRect(0, 0, pushButtonSize.width(), pushButtonSize.height());
5020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QRect layoutRect = style->subElementRect(QStyle::SE_PushButtonLayoutItem,
5030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                 &styleOption, 0);
5040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // If the style supports layout rects we use that, and  compensate accordingly
5060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // in paintButton() below.
5070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!layoutRect.isNull())
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            size.setHeight(layoutRect.height());
5090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        else
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            size.setHeight(pushButtonSize.height());
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    case MenulistPart: {
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QStyleOptionComboBox styleOption;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        styleOption.state |= QStyle::State_Small;
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int contentHeight = qMax(fm.lineSpacing(), 14) + 2;
5180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QSize menuListSize = style->sizeFromContents(QStyle::CT_ComboBox,
5190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                     &styleOption, QSize(0, contentHeight), 0);
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size.setHeight(menuListSize.height());
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    default:
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        break;
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Check is flawed, since it doesn't take min-width/max-width into account.
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (renderStyle->width().isIntrinsicOrAuto() && size.width() > 0)
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        renderStyle->setWidth(Length(size.width(), Fixed));
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (renderStyle->height().isAuto() && size.height() > 0)
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        renderStyle->setHeight(Length(size.height(), Fixed));
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::setCheckboxSize(RenderStyle* style) const
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    computeSizeBasedOnStyle(style);
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
540ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintCheckbox(RenderObject* o, const PaintInfo& i, const IntRect& r)
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return paintButton(o, i, r);
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::setRadioSize(RenderStyle* style) const
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    computeSizeBasedOnStyle(style);
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
550ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintRadio(RenderObject* o, const PaintInfo& i, const IntRect& r)
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return paintButton(o, i, r);
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
555231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element*) const
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Ditch the border.
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->resetBorder();
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
560d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifdef Q_WS_MAC
561d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (style->appearance() == PushButtonPart) {
562d0825bca7fe65beaee391d30da42e937db621564Steve Block        // The Mac ports ignore the specified height for <input type="button"> elements
563d0825bca7fe65beaee391d30da42e937db621564Steve Block        // unless a border and/or background CSS property is also specified.
564d0825bca7fe65beaee391d30da42e937db621564Steve Block        style->setHeight(Length(Auto));
565d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
566d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontDescription fontDescription = style->fontDescription();
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setIsAbsoluteSize(true);
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef Q_WS_MAC // Use fixed font size and family on Mac (like Safari does)
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setSpecifiedSize(m_buttonFontPixelSize);
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setComputedSize(m_buttonFontPixelSize);
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setSpecifiedSize(style->fontSize());
5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setComputedSize(style->fontSize());
5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !USE(QT_MOBILE_THEME)
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FontFamily fontFamily;
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontFamily.setFamily(m_buttonFontFamily);
5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setFamily(fontFamily);
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setFontDescription(fontDescription);
584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->font().update(selector->fontSelector());
5852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setLineHeight(RenderStyle::initialLineHeight());
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setButtonSize(style);
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setButtonPadding(style);
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::setButtonSize(RenderStyle* style) const
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    computeSizeBasedOnStyle(style);
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !USE(QT_MOBILE_THEME)
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::setButtonPadding(RenderStyle* style) const
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QStyleOptionButton styleOption;
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    styleOption.state |= QStyle::State_Small;
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Fake a button rect here, since we're just computing deltas
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QRect originalRect = QRect(0, 0, 100, 30);
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    styleOption.rect = originalRect;
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default padding is based on the button margin pixel metric
6070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int buttonMargin = qStyle()->pixelMetric(QStyle::PM_ButtonMargin, &styleOption, 0);
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int paddingLeft = buttonMargin;
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int paddingRight = buttonMargin;
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int paddingTop = 1;
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int paddingBottom = 0;
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Then check if the style uses layout margins
6140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QRect layoutRect = qStyle()->subElementRect(QStyle::SE_PushButtonLayoutItem,
6150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                &styleOption, 0);
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!layoutRect.isNull()) {
6170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QRect contentsRect = qStyle()->subElementRect(QStyle::SE_PushButtonContents,
6180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                      &styleOption, 0);
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paddingLeft = contentsRect.left() - layoutRect.left();
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paddingRight = layoutRect.right() - contentsRect.right();
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        paddingTop = contentsRect.top() - layoutRect.top();
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Can't use this right now because we don't have the baseline to compensate
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // paddingBottom = layoutRect.bottom() - contentsRect.bottom();
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingLeft(Length(paddingLeft, Fixed));
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingRight(Length(paddingRight, Fixed));
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingTop(Length(paddingTop, Fixed));
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingBottom(Length(paddingBottom, Fixed));
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
6322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid RenderThemeQt::setButtonPadding(RenderStyle* style) const
6332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
6342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!style)
6352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
6362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingLeft(Length(buttonPaddingLeft, Fixed));
6372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingRight(Length(buttonPaddingRight, Fixed));
6382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingTop(Length(buttonPaddingTop, Fixed));
6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingBottom(Length(buttonPaddingBottom, Fixed));
6402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
6412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
643ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
645d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, i);
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       return true;
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QStyleOptionButton option;
650e14391e94c850b8bd03680c23b38978db68687a8John Reck    initStyleOption(p.widget, option);
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.rect = r;
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.state |= QStyle::State_Small;
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
654d0825bca7fe65beaee391d30da42e937db621564Steve Block    ControlPart appearance = initializeCommonQStyleOptions(option, o);
6550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (appearance == PushButtonPart || appearance == ButtonPart) {
6560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        option.rect = inflateButtonRect(option.rect, qStyle());
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        p.drawControl(QStyle::CE_PushButton, option);
6580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else if (appearance == RadioPart)
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       p.drawControl(QStyle::CE_RadioButton, option);
6600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else if (appearance == CheckboxPart)
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project       p.drawControl(QStyle::CE_CheckBox, option);
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustTextFieldStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Resetting the style like this leads to differences like:
66965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // - RenderTextControl {INPUT} at (2,2) size 168x25 [bgcolor=#FFFFFF] border: (2px inset #000000)]
67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // + RenderTextControl {INPUT} at (2,2) size 166x26
67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // in layout tests when a CSS style is applied that doesn't affect background color, border or
67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // padding. Just worth keeping in mind!
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setBackgroundColor(Color::transparent);
6745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    style->resetBorder();
6755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    style->resetPadding();
6765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    computeSizeBasedOnStyle(style);
6772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(QT_MOBILE_THEME)
6782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingLeft(Length(textFieldPadding, Fixed));
6792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingRight(Length(textFieldPadding, Fixed));
6802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
683ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintTextField(RenderObject* o, const PaintInfo& i, const IntRect& r)
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
685d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, i);
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QStyleOptionFrameV2 panel;
690e14391e94c850b8bd03680c23b38978db68687a8John Reck    initStyleOption(p.widget, panel);
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    panel.rect = r;
6920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    panel.lineWidth = findFrameLineWidth(qStyle());
6932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(QT_MOBILE_THEME)
6942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (isPressed(o))
6952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        panel.state |= QStyle::State_Sunken;
6962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    panel.state |= QStyle::State_Sunken;
6982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    panel.features = QStyleOptionFrameV2::None;
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get the correct theme data for a text field
702d0825bca7fe65beaee391d30da42e937db621564Steve Block    ControlPart appearance = initializeCommonQStyleOptions(panel, o);
7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (appearance != TextFieldPart
7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && appearance != SearchFieldPart
7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && appearance != TextAreaPart
7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && appearance != ListboxPart)
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Now paint the text field.
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.drawPrimitive(QStyle::PE_PanelLineEdit, panel);
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustTextAreaStyle(CSSStyleSelector* selector, RenderStyle* style, Element* element) const
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    adjustTextFieldStyle(selector, style, element);
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
719ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintTextArea(RenderObject* o, const PaintInfo& i, const IntRect& r)
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return paintTextField(o, i, r);
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustMenuListStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->resetBorder();
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Height is locked to auto.
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setHeight(Length(Auto));
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // White-space is locked to pre
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setWhiteSpace(PRE);
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    computeSizeBasedOnStyle(style);
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Add in the padding that we'd like to use.
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setPopupPadding(style);
7382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(QT_MOBILE_THEME)
7392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    style->setPaddingLeft(Length(menuListPadding, Fixed));
7402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::setPopupPadding(RenderStyle* style) const
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
74581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const int paddingLeft = 4;
74681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const int paddingRight = style->width().isFixed() || style->width().isPercent() ? 5 : 8;
74781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
74881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    style->setPaddingLeft(Length(paddingLeft, Fixed));
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QStyleOptionComboBox opt;
7510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int w = qStyle()->pixelMetric(QStyle::PM_ButtonIconSize, &opt, 0);
75281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    style->setPaddingRight(Length(paddingRight + w, Fixed));
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingTop(Length(2, Fixed));
75581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    style->setPaddingBottom(Length(2, Fixed));
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
759ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMenuList(RenderObject* o, const PaintInfo& i, const IntRect& r)
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
761d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, i);
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
765dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QtStyleOptionWebComboBox opt(o);
766e14391e94c850b8bd03680c23b38978db68687a8John Reck    initStyleOption(p.widget, opt);
767d0825bca7fe65beaee391d30da42e937db621564Steve Block    initializeCommonQStyleOptions(opt, o);
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
76981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    IntRect rect = r;
77081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
77181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC)
77281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // QMacStyle makes the combo boxes a little bit smaller to leave space for the focus rect.
77381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Because of it, the combo button is drawn at a point to the left of where it was expect to be and may end up
77481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // overlapped with the text. This will force QMacStyle to draw the combo box with the expected width.
77581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (qobject_cast<QMacStyle*>(p.style))
77681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        rect.inflateX(3);
77781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
77881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
77981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const QPoint topLeft = rect.location();
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->translate(topLeft);
7810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    opt.rect.moveTo(QPoint(0, 0));
78281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    opt.rect.setSize(rect.size());
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.drawComplexControl(QStyle::CC_ComboBox, opt);
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->translate(-topLeft);
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
789231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid RenderThemeQt::adjustMenuListButtonStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
79121939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(QT_MOBILE_THEME)
79221939df44de1705786c545cd1bf519d47250322dBen Murdoch    // Mobile theme uses border radius.
79321939df44de1705786c545cd1bf519d47250322dBen Murdoch#else
7940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // WORKAROUND because html.css specifies -webkit-border-radius for <select> so we override it here
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // see also http://bugs.webkit.org/show_bug.cgi?id=18399
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->resetBorderRadius();
797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Height is locked to auto.
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setHeight(Length(Auto));
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // White-space is locked to pre
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setWhiteSpace(PRE);
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    computeSizeBasedOnStyle(style);
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Add in the padding that we'd like to use.
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setPopupPadding(style);
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
811ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMenuListButton(RenderObject* o, const PaintInfo& i,
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                        const IntRect& r)
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
814d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, i);
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
818dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QtStyleOptionWebComboBox option(o);
819e14391e94c850b8bd03680c23b38978db68687a8John Reck    initStyleOption(p.widget, option);
820d0825bca7fe65beaee391d30da42e937db621564Steve Block    initializeCommonQStyleOptions(option, o);
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.rect = r;
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // for drawing the combo box arrow, rely only on the fallback style
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.style = fallbackStyle();
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.subControls = QStyle::SC_ComboBoxArrow;
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.drawComplexControl(QStyle::CC_ComboBox, option);
8278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(PROGRESS_TAG)
832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockdouble RenderThemeQt::animationRepeatIntervalForProgressBar(RenderProgress* renderProgress) const
833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (renderProgress->position() >= 0)
835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Use hard-coded value until http://bugreports.qt.nokia.com/browse/QTBUG-9171 is fixed.
838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Use the value from windows style which is 10 fps.
839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0.1;
840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockdouble RenderThemeQt::animationDurationForProgressBar(RenderProgress* renderProgress) const
843dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
844dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (renderProgress->position() >= 0)
845dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QStyleOptionProgressBarV2 option;
848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.rect.setSize(renderProgress->size());
849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // FIXME: Until http://bugreports.qt.nokia.com/browse/QTBUG-9171 is fixed,
850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // we simulate one square animating across the progress bar.
851dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return (option.rect.width() / qStyle()->pixelMetric(QStyle::PM_ProgressBarChunkWidth, &option)) * animationRepeatIntervalForProgressBar(renderProgress);
852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderThemeQt::adjustProgressBarStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
856dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    style->setBoxShadow(0);
857dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
859ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintProgressBar(RenderObject* o, const PaintInfo& pi, const IntRect& r)
860dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
861545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (!o->isProgress())
862545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return true;
863545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
864dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    StylePainter p(this, pi);
865dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!p.isValid())
866dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block       return true;
867dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
868dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QStyleOptionProgressBarV2 option;
869e14391e94c850b8bd03680c23b38978db68687a8John Reck    initStyleOption(p.widget, option);
870dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    initializeCommonQStyleOptions(option, o);
871dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
872dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RenderProgress* renderProgress = toRenderProgress(o);
873dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.rect = r;
874dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.maximum = std::numeric_limits<int>::max();
875dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.minimum = 0;
876dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.progress = (renderProgress->position() * std::numeric_limits<int>::max());
877dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const QPoint topLeft = r.location();
879dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->translate(topLeft);
880dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.rect.moveTo(QPoint(0, 0));
881dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    option.rect.setSize(r.size());
882dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
883dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (option.progress < 0) {
884dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // FIXME: Until http://bugreports.qt.nokia.com/browse/QTBUG-9171 is fixed,
885dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // we simulate one square animating across the progress bar.
886dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        p.drawControl(QStyle::CE_ProgressBarGroove, option);
887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int chunkWidth = qStyle()->pixelMetric(QStyle::PM_ProgressBarChunkWidth, &option);
888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        QColor color = (option.palette.highlight() == option.palette.background()) ? option.palette.color(QPalette::Active, QPalette::Highlight) : option.palette.color(QPalette::Highlight);
889dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (renderProgress->style()->direction() == RTL)
890dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            p.painter->fillRect(option.rect.right() - chunkWidth  - renderProgress->animationProgress() * option.rect.width(), 0, chunkWidth, option.rect.height(), color);
891dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
892dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            p.painter->fillRect(renderProgress->animationProgress() * option.rect.width(), 0, chunkWidth, option.rect.height(), color);
893dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else
894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        p.drawControl(QStyle::CE_ProgressBar, option);
895dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->translate(-topLeft);
897dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
898dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
899dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
900dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
901dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
902ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintSliderTrack(RenderObject* o, const PaintInfo& pi,
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                     const IntRect& r)
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
905d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, pi);
906d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!p.isValid())
907d0825bca7fe65beaee391d30da42e937db621564Steve Block       return true;
908d0825bca7fe65beaee391d30da42e937db621564Steve Block
909d0825bca7fe65beaee391d30da42e937db621564Steve Block    QStyleOptionSlider option;
910e14391e94c850b8bd03680c23b38978db68687a8John Reck    initStyleOption(p.widget, option);
911a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    option.subControls = QStyle::SC_SliderGroove | QStyle::SC_SliderHandle;
912d0825bca7fe65beaee391d30da42e937db621564Steve Block    ControlPart appearance = initializeCommonQStyleOptions(option, o);
913d0825bca7fe65beaee391d30da42e937db621564Steve Block
914d0825bca7fe65beaee391d30da42e937db621564Steve Block    RenderSlider* renderSlider = toRenderSlider(o);
915d0825bca7fe65beaee391d30da42e937db621564Steve Block    IntRect thumbRect = renderSlider->thumbRect();
916d0825bca7fe65beaee391d30da42e937db621564Steve Block
917d0825bca7fe65beaee391d30da42e937db621564Steve Block    option.rect = r;
918d0825bca7fe65beaee391d30da42e937db621564Steve Block
919d0825bca7fe65beaee391d30da42e937db621564Steve Block    int value;
920d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (appearance == SliderVerticalPart) {
921d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.maximum = r.height() - thumbRect.height();
922d0825bca7fe65beaee391d30da42e937db621564Steve Block        value = thumbRect.y();
923d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else {
924d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.maximum = r.width() - thumbRect.width();
925d0825bca7fe65beaee391d30da42e937db621564Steve Block        value = thumbRect.x();
926d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
927d0825bca7fe65beaee391d30da42e937db621564Steve Block
928d0825bca7fe65beaee391d30da42e937db621564Steve Block    value = QStyle::sliderValueFromPosition(0, option.maximum, value, option.maximum);
929d0825bca7fe65beaee391d30da42e937db621564Steve Block
930d0825bca7fe65beaee391d30da42e937db621564Steve Block    option.sliderValue = value;
931d0825bca7fe65beaee391d30da42e937db621564Steve Block    option.sliderPosition = value;
932d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (appearance == SliderVerticalPart)
933d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.orientation = Qt::Vertical;
934d0825bca7fe65beaee391d30da42e937db621564Steve Block
935d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (renderSlider->inDragMode()) {
936d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.activeSubControls = QStyle::SC_SliderHandle;
937d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.state |= QStyle::State_Sunken;
938d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
939d0825bca7fe65beaee391d30da42e937db621564Steve Block
9402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const QPoint topLeft = r.location();
941d0825bca7fe65beaee391d30da42e937db621564Steve Block    p.painter->translate(topLeft);
942d0825bca7fe65beaee391d30da42e937db621564Steve Block    option.rect.moveTo(QPoint(0, 0));
943d0825bca7fe65beaee391d30da42e937db621564Steve Block    option.rect.setSize(r.size());
944d0825bca7fe65beaee391d30da42e937db621564Steve Block
945d0825bca7fe65beaee391d30da42e937db621564Steve Block    p.drawComplexControl(QStyle::CC_Slider, option);
946d0825bca7fe65beaee391d30da42e937db621564Steve Block    p.painter->translate(-topLeft);
947d0825bca7fe65beaee391d30da42e937db621564Steve Block
948d0825bca7fe65beaee391d30da42e937db621564Steve Block    return false;
949d0825bca7fe65beaee391d30da42e937db621564Steve Block}
950d0825bca7fe65beaee391d30da42e937db621564Steve Block
951d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderThemeQt::adjustSliderTrackStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
952d0825bca7fe65beaee391d30da42e937db621564Steve Block{
953d0825bca7fe65beaee391d30da42e937db621564Steve Block    style->setBoxShadow(0);
9548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
956ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintSliderThumb(RenderObject* o, const PaintInfo& pi,
9578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                     const IntRect& r)
9588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
959d0825bca7fe65beaee391d30da42e937db621564Steve Block    // We've already painted it in paintSliderTrack(), no need to do anything here.
960d0825bca7fe65beaee391d30da42e937db621564Steve Block    return false;
961d0825bca7fe65beaee391d30da42e937db621564Steve Block}
962d0825bca7fe65beaee391d30da42e937db621564Steve Block
963d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderThemeQt::adjustSliderThumbStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
964d0825bca7fe65beaee391d30da42e937db621564Steve Block{
965d0825bca7fe65beaee391d30da42e937db621564Steve Block    style->setBoxShadow(0);
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintSearchField(RenderObject* o, const PaintInfo& pi,
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                     const IntRect& r)
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return paintTextField(o, pi, r);
9728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustSearchFieldStyle(CSSStyleSelector* selector, RenderStyle* style,
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                           Element* e) const
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Resetting the style like this leads to differences like:
97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // - RenderTextControl {INPUT} at (2,2) size 168x25 [bgcolor=#FFFFFF] border: (2px inset #000000)]
97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // + RenderTextControl {INPUT} at (2,2) size 166x26
98065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // in layout tests when a CSS style is applied that doesn't affect background color, border or
98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // padding. Just worth keeping in mind!
98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    style->setBackgroundColor(Color::transparent);
98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    style->resetBorder();
98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    style->resetPadding();
98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    computeSizeBasedOnStyle(style);
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustSearchFieldCancelButtonStyle(CSSStyleSelector* selector, RenderStyle* style,
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                       Element* e) const
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
99165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Logic taken from RenderThemeChromium.cpp.
99265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Scale the button size based on the font size.
99365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    float fontScale = style->fontSize() / defaultControlFontPixelSize;
99465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int cancelButtonSize = lroundf(qMin(qMax(minCancelButtonSize, defaultCancelButtonSize * fontScale), maxCancelButtonSize));
99565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    style->setWidth(Length(cancelButtonSize, Fixed));
99665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    style->setHeight(Length(cancelButtonSize, Fixed));
99765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
99865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
99965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Function taken from RenderThemeChromium.cpp
100065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochIntRect RenderThemeQt::convertToPaintingRect(RenderObject* inputRenderer, const RenderObject* partRenderer, IntRect partRect, const IntRect& localOffset) const
100165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
100265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Compute an offset between the part renderer and the input renderer.
100365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntSize offsetFromInputRenderer = -(partRenderer->offsetFromAncestorContainer(inputRenderer));
100465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Move the rect into partRenderer's coords.
100565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    partRect.move(offsetFromInputRenderer);
100665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Account for the local drawing offset.
100765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    partRect.move(localOffset.x(), localOffset.y());
100865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
100965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return partRect;
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1012ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintSearchFieldCancelButton(RenderObject* o, const PaintInfo& pi,
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                 const IntRect& r)
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
101565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Logic copied from RenderThemeChromium.cpp.
101665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
101765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Get the renderer of <input> element.
101865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Node* input = o->node()->shadowAncestorNode();
101965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!input->renderer()->isBox())
102065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
102165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RenderBox* inputRenderBox = toRenderBox(input->renderer());
102265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect inputContentBox = inputRenderBox->contentBoxRect();
102365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
102465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Make sure the scaled button stays square and will fit in its parent's box.
102565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int cancelButtonSize = qMin(inputContentBox.width(), qMin(inputContentBox.height(), r.height()));
102665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Calculate cancel button's coordinates relative to the input element.
102765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Center the button vertically.  Round up though, so if it has to be one pixel off-center, it will
102865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // be one pixel closer to the bottom of the field.  This tends to look better with the text.
102965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect cancelButtonRect(o->offsetFromAncestorContainer(inputRenderBox).width(),
103065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             inputContentBox.y() + (inputContentBox.height() - cancelButtonSize + 1) / 2,
103165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             cancelButtonSize, cancelButtonSize);
103265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntRect paintingRect = convertToPaintingRect(inputRenderBox, o, cancelButtonRect, r);
103365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static Image* cancelImage = Image::loadPlatformResource("searchCancelButton").releaseRef();
103465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static Image* cancelPressedImage = Image::loadPlatformResource("searchCancelButtonPressed").releaseRef();
103565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    pi.context->drawImage(isPressed(o) ? cancelPressedImage : cancelImage,
103665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                 o->style()->colorSpace(), paintingRect);
103765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return false;
10388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustSearchFieldDecorationStyle(CSSStyleSelector* selector, RenderStyle* style,
10418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                     Element* e) const
10428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTheme::adjustSearchFieldDecorationStyle(selector, style, e);
10458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1047ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintSearchFieldDecoration(RenderObject* o, const PaintInfo& pi,
10488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                               const IntRect& r)
10498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return RenderTheme::paintSearchFieldDecoration(o, pi, r);
10528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustSearchFieldResultsDecorationStyle(CSSStyleSelector* selector, RenderStyle* style,
10558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                            Element* e) const
10568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RenderTheme::adjustSearchFieldResultsDecorationStyle(selector, style, e);
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1061ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintSearchFieldResultsDecoration(RenderObject* o, const PaintInfo& pi,
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                      const IntRect& r)
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    notImplemented();
10658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return RenderTheme::paintSearchFieldResultsDecoration(o, pi, r);
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeQt::supportsFocus(ControlPart appearance) const
10698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (appearance) {
10710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case PushButtonPart:
10720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case ButtonPart:
10730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case TextFieldPart:
10740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case TextAreaPart:
10750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case ListboxPart:
10760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case MenulistPart:
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case RadioPart:
10780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case CheckboxPart:
1079d0825bca7fe65beaee391d30da42e937db621564Steve Block    case SliderHorizontalPart:
1080d0825bca7fe65beaee391d30da42e937db621564Steve Block    case SliderVerticalPart:
10810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
10820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    default: // No for all others...
10830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1087d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderThemeQt::setPaletteFromPageClientIfExists(QPalette& palette) const
1088d0825bca7fe65beaee391d30da42e937db621564Steve Block{
108921939df44de1705786c545cd1bf519d47250322dBen Murdoch#if USE(QT_MOBILE_THEME)
10905e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    static QPalette lightGrayPalette(Qt::lightGray);
10915e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    palette = lightGrayPalette;
10925e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return;
10935e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#endif
1094d0825bca7fe65beaee391d30da42e937db621564Steve Block    // If the webview has a custom palette, use it
1095d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!m_page)
1096d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
1097d0825bca7fe65beaee391d30da42e937db621564Steve Block    Chrome* chrome = m_page->chrome();
1098d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!chrome)
1099d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
1100d0825bca7fe65beaee391d30da42e937db621564Steve Block    ChromeClient* chromeClient = chrome->client();
1101d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!chromeClient)
1102d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
1103d0825bca7fe65beaee391d30da42e937db621564Steve Block    QWebPageClient* pageClient = chromeClient->platformPageClient();
1104d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!pageClient)
1105d0825bca7fe65beaee391d30da42e937db621564Steve Block        return;
1106d0825bca7fe65beaee391d30da42e937db621564Steve Block    palette = pageClient->palette();
1107d0825bca7fe65beaee391d30da42e937db621564Steve Block}
1108d0825bca7fe65beaee391d30da42e937db621564Steve Block
1109d0825bca7fe65beaee391d30da42e937db621564Steve BlockControlPart RenderThemeQt::initializeCommonQStyleOptions(QStyleOption& option, RenderObject* o) const
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Default bits: no focus, no mouse over
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    option.state &= ~(QStyle::State_HasFocus | QStyle::State_MouseOver);
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isReadOnlyControl(o))
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Readonly is supported on textfields.
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        option.state |= QStyle::State_ReadOnly;
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118d0825bca7fe65beaee391d30da42e937db621564Steve Block    option.direction = Qt::LeftToRight;
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isHovered(o))
11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        option.state |= QStyle::State_MouseOver;
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1123d0825bca7fe65beaee391d30da42e937db621564Steve Block    setPaletteFromPageClientIfExists(option.palette);
11242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
11252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!isEnabled(o)) {
11262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        option.palette.setCurrentColorGroup(QPalette::Disabled);
11272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        option.state &= ~QStyle::State_Enabled;
11282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
11292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1130d0825bca7fe65beaee391d30da42e937db621564Steve Block    RenderStyle* style = o->style();
1131d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!style)
1132d0825bca7fe65beaee391d30da42e937db621564Steve Block        return NoControlPart;
11335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1134d0825bca7fe65beaee391d30da42e937db621564Steve Block    ControlPart result = style->appearance();
1135d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (supportsFocus(result) && isFocused(o)) {
1136d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.state |= QStyle::State_HasFocus;
1137d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.state |= QStyle::State_KeyboardFocusChange;
1138d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1139d0825bca7fe65beaee391d30da42e937db621564Steve Block
1140d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (style->direction() == WebCore::RTL)
1141d0825bca7fe65beaee391d30da42e937db621564Steve Block        option.direction = Qt::RightToLeft;
11428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (result) {
11440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case PushButtonPart:
11450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case SquareButtonPart:
11460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case ButtonPart:
11470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case ButtonBevelPart:
11480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case ListItemPart:
11490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case MenulistButtonPart:
11500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case SearchFieldResultsButtonPart:
11510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    case SearchFieldCancelButtonPart: {
11520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (isPressed(o))
11530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            option.state |= QStyle::State_Sunken;
115421939df44de1705786c545cd1bf519d47250322dBen Murdoch        else if (result == PushButtonPart || result == ButtonPart)
11550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            option.state |= QStyle::State_Raised;
11560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        break;
11570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1158d0825bca7fe65beaee391d30da42e937db621564Steve Block    case RadioPart:
1159d0825bca7fe65beaee391d30da42e937db621564Steve Block    case CheckboxPart:
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        option.state |= (isChecked(o) ? QStyle::State_On : QStyle::State_Off);
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(VIDEO)
1167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString RenderThemeQt::extraMediaControlsStyleSheet()
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
117065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String result = String(mediaControlsQtUserAgentStyleSheet, sizeof(mediaControlsQtUserAgentStyleSheet));
117165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
117265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_page && m_page->chrome()->requiresFullscreenForVideoPlayback())
117365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result += String(mediaControlsQtFullscreenUserAgentStyleSheet, sizeof(mediaControlsQtFullscreenUserAgentStyleSheet));
117465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
117565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result;
1176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Helper class to transform the painter's world matrix to the object's content area, scaled to 0,0,100,100
11790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass WorldMatrixTransformer {
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
11810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WorldMatrixTransformer(QPainter* painter, RenderObject* renderObject, const IntRect& r) : m_painter(painter)
11820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderStyle* style = renderObject->style();
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_originalTransform = m_painter->transform();
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_painter->translate(r.x() + style->paddingLeft().value(), r.y() + style->paddingTop().value());
11868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_painter->scale((r.width() - style->paddingLeft().value() - style->paddingRight().value()) / 100.0,
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project             (r.height() - style->paddingTop().value() - style->paddingBottom().value()) / 100.0);
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~WorldMatrixTransformer() { m_painter->setTransform(m_originalTransform); }
11918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QPainter* m_painter;
11948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QTransform m_originalTransform;
11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockdouble RenderThemeQt::mediaControlsBaselineOpacity() const
1198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return 0.4;
1200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::paintMediaBackground(QPainter* painter, const IntRect& r) const
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    painter->setPen(Qt::NoPen);
1205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static QColor transparentBlack(0, 0, 0, mediaControlsBaselineOpacity() * 255);
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    painter->setBrush(transparentBlack);
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    painter->drawRoundedRect(r.x(), r.y(), r.width(), r.height(), 5.0, 5.0);
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectQColor RenderThemeQt::getMediaControlForegroundColor(RenderObject* o) const
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    QColor fgColor = platformActiveSelectionBackgroundColor();
12138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (o && o->node()->active())
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fgColor = fgColor.lighter();
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return fgColor;
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1218ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaFullscreenButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HTMLMediaElement* mediaElement = toParentMediaElement(o);
12212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!mediaElement)
12222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
12232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    StylePainter p(this, paintInfo);
12252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!p.isValid())
12262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
12272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    p.painter->setRenderHint(QPainter::Antialiasing, true);
12292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paintMediaBackground(p.painter, r);
12312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WorldMatrixTransformer transformer(p.painter, o, r);
12332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    const QPointF arrowPolygon[9] = { QPointF(20, 0), QPointF(100, 0), QPointF(100, 80),
12342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            QPointF(80, 80), QPointF(80, 30), QPointF(10, 100), QPointF(0, 90), QPointF(70, 20), QPointF(20, 20)};
12352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    p.painter->setBrush(getMediaControlForegroundColor(o));
12372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    p.painter->drawPolygon(arrowPolygon, 9);
12382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return false;
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1242ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaMuteButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HTMLMediaElement* mediaElement = toParentMediaElement(o);
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mediaElement)
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, paintInfo);
12498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
12518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setRenderHint(QPainter::Antialiasing, true);
12538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paintMediaBackground(p.painter, r);
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WorldMatrixTransformer transformer(p.painter, o, r);
12578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const QPointF speakerPolygon[6] = { QPointF(20, 30), QPointF(50, 30), QPointF(80, 0),
12588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            QPointF(80, 100), QPointF(50, 70), QPointF(20, 70)};
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->setBrush(mediaElement->muted() ? Qt::darkRed : getMediaControlForegroundColor(o));
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->drawPolygon(speakerPolygon, 6);
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1266ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaPlayButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HTMLMediaElement* mediaElement = toParentMediaElement(o);
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mediaElement)
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1272d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, paintInfo);
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setRenderHint(QPainter::Antialiasing, true);
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paintMediaBackground(p.painter, r);
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WorldMatrixTransformer transformer(p.painter, o, r);
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setBrush(getMediaControlForegroundColor(o));
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mediaElement->canPlay()) {
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const QPointF playPolygon[3] = { QPointF(0, 0), QPointF(100, 50), QPointF(0, 100)};
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        p.painter->drawPolygon(playPolygon, 3);
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        p.painter->drawRect(0, 0, 30, 100);
12878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        p.painter->drawRect(70, 0, 30, 100);
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1293ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaSeekBackButton(RenderObject*, const PaintInfo&, const IntRect&)
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't want to paint this at the moment.
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1299ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaSeekForwardButton(RenderObject*, const PaintInfo&, const IntRect&)
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // We don't want to paint this at the moment.
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1305ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaCurrentTime(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
1306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    StylePainter p(this, paintInfo);
1308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!p.isValid())
1309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
1310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->setRenderHint(QPainter::Antialiasing, true);
1312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    paintMediaBackground(p.painter, r);
1313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
1315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString RenderThemeQt::formatMediaControlsCurrentTime(float currentTime, float duration) const
1318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return formatMediaControlsTime(currentTime) + " / " + formatMediaControlsTime(duration);
1320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString RenderThemeQt::formatMediaControlsRemainingTime(float currentTime, float duration) const
1323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return String();
1325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1327ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaVolumeSliderTrack(RenderObject *o, const PaintInfo &paintInfo, const IntRect &r)
1328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    StylePainter p(this, paintInfo);
1330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!p.isValid())
1331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
1332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->setRenderHint(QPainter::Antialiasing, true);
1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    paintMediaBackground(p.painter, r);
1336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!o->isSlider())
1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    IntRect b = toRenderBox(o)->contentBoxRect();
1341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Position the outer rectangle
1343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int top = r.y() + b.y();
1344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int left = r.x() + b.x();
1345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int width = b.width();
1346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int height = b.height();
1347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Get the scale color from the page client
1349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QPalette pal = QApplication::palette();
1350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    setPaletteFromPageClientIfExists(pal);
1351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const QColor highlightText = pal.brush(QPalette::Active, QPalette::HighlightedText).color();
1352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const QColor scaleColor(highlightText.red(), highlightText.green(), highlightText.blue(), mediaControlsBaselineOpacity() * 255);
1353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Draw the outer rectangle
1355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->setBrush(scaleColor);
1356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->drawRect(left, top, width, height);
1357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!o->node() || !o->node()->hasTagName(inputTag))
1359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
1360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HTMLInputElement* slider = static_cast<HTMLInputElement*>(o->node());
1362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Position the inner rectangle
1364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    height = height * slider->valueAsNumber();
1365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    top += b.height() - height;
1366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Draw the inner rectangle
1368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->setPen(Qt::NoPen);
1369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->setBrush(getMediaControlForegroundColor(o));
1370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    p.painter->drawRect(left, top, width, height);
1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
1373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1375ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaVolumeSliderThumb(RenderObject *o, const PaintInfo &paintInfo, const IntRect &r)
1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    StylePainter p(this, paintInfo);
1378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!p.isValid())
1379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
1380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Nothing to draw here, this is all done in the track
1382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
1383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1385ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaSliderTrack(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
13868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
13872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HTMLMediaElement* mediaElement = toParentMediaElement(o);
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mediaElement)
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1391d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, paintInfo);
13928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
13938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
13948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setRenderHint(QPainter::Antialiasing, true);
13968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paintMediaBackground(p.painter, r);
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (MediaPlayer* player = mediaElement->player()) {
1400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Get the buffered parts of the media
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        PassRefPtr<TimeRanges> buffered = player->buffered();
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (buffered->length() > 0 && player->duration() < std::numeric_limits<float>::infinity()) {
1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Set the transform and brush
1404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            WorldMatrixTransformer transformer(p.painter, o, r);
1405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            p.painter->setBrush(getMediaControlForegroundColor());
1406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // Paint each buffered section
1408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ExceptionCode ex;
1409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            for (int i = 0; i < buffered->length(); i++) {
1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                float startX = (buffered->start(i, ex) / player->duration()) * 100;
1411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                float width = ((buffered->end(i, ex) / player->duration()) * 100) - startX;
1412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                p.painter->drawRect(startX, 37, width, 26);
1413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
1414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
14178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1420ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeQt::paintMediaSliderThumb(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1422d0825bca7fe65beaee391d30da42e937db621564Steve Block    StylePainter p(this, paintInfo);
14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p.isValid())
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setRenderHint(QPainter::Antialiasing, true);
14278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setPen(Qt::NoPen);
14298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->setBrush(getMediaControlForegroundColor(o));
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p.painter->drawRect(r.x(), r.y(), r.width(), r.height());
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
14338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeQt::adjustSliderThumbSize(RenderObject* o) const
14378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1438d0825bca7fe65beaee391d30da42e937db621564Steve Block    ControlPart part = o->style()->appearance();
1439d0825bca7fe65beaee391d30da42e937db621564Steve Block
1440d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (part == MediaSliderThumbPart) {
14418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RenderStyle* parentStyle = o->parent()->style();
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Q_ASSERT(parentStyle);
14438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int parentHeight = parentStyle->height().value();
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o->style()->setWidth(Length(parentHeight / 3, Fixed));
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o->style()->setHeight(Length(parentHeight, Fixed));
1447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (part == MediaVolumeSliderThumbPart) {
1448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        RenderStyle* parentStyle = o->parent()->style();
1449dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Q_ASSERT(parentStyle);
1450dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int parentWidth = parentStyle->width().value();
1452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o->style()->setHeight(Length(parentWidth / 3, Fixed));
1453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        o->style()->setWidth(Length(parentWidth, Fixed));
1454d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else if (part == SliderThumbHorizontalPart || part == SliderThumbVerticalPart) {
1455d0825bca7fe65beaee391d30da42e937db621564Steve Block        QStyleOptionSlider option;
1456d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (part == SliderThumbVerticalPart)
1457d0825bca7fe65beaee391d30da42e937db621564Steve Block            option.orientation = Qt::Vertical;
1458d0825bca7fe65beaee391d30da42e937db621564Steve Block
1459d0825bca7fe65beaee391d30da42e937db621564Steve Block        QStyle* style = qStyle();
1460d0825bca7fe65beaee391d30da42e937db621564Steve Block
1461d0825bca7fe65beaee391d30da42e937db621564Steve Block        int width = style->pixelMetric(QStyle::PM_SliderLength, &option);
1462d0825bca7fe65beaee391d30da42e937db621564Steve Block        int height = style->pixelMetric(QStyle::PM_SliderThickness, &option);
1463d0825bca7fe65beaee391d30da42e937db621564Steve Block        o->style()->setWidth(Length(width, Fixed));
1464d0825bca7fe65beaee391d30da42e937db621564Steve Block        o->style()->setHeight(Length(height, Fixed));
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectdouble RenderThemeQt::caretBlinkInterval() const
1469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
1470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return  QApplication::cursorFlashTime() / 1000.0 / 2.0;
1471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
1472635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// vim: ts=4 sw=4 et
1476