summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/qt/RenderThemeQt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/qt/RenderThemeQt.cpp')
-rw-r--r--WebCore/platform/qt/RenderThemeQt.cpp947
1 files changed, 0 insertions, 947 deletions
diff --git a/WebCore/platform/qt/RenderThemeQt.cpp b/WebCore/platform/qt/RenderThemeQt.cpp
deleted file mode 100644
index 2a33e45..0000000
--- a/WebCore/platform/qt/RenderThemeQt.cpp
+++ /dev/null
@@ -1,947 +0,0 @@
-/*
- * This file is part of the WebKit project.
- *
- * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
- *
- * Copyright (C) 2006 Zack Rusin <zack@kde.org>
- * 2006 Dirk Mueller <mueller@kde.org>
- * 2006 Nikolas Zimmermann <zimmermann@kde.org>
- *
- * All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-
-#include "qwebpage.h"
-#include "RenderThemeQt.h"
-#include "ChromeClientQt.h"
-#include "NotImplemented.h"
-
-#include <QApplication>
-#include <QColor>
-#include <QDebug>
-#include <QFile>
-#include <QWidget>
-#include <QPainter>
-#include <QPushButton>
-#include <QStyleFactory>
-#include <QStyleOptionButton>
-#include <QStyleOptionFrameV2>
-
-#include "Color.h"
-#include "CSSStyleSheet.h"
-#include "Document.h"
-#include "Page.h"
-#include "Font.h"
-#include "RenderTheme.h"
-#include "GraphicsContext.h"
-#include "HTMLMediaElement.h"
-#include "HTMLNames.h"
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-
-StylePainter::StylePainter(const RenderObject::PaintInfo& paintInfo)
-{
- init(paintInfo.context ? paintInfo.context : 0);
-}
-
-StylePainter::StylePainter(GraphicsContext* context)
-{
- init(context);
-}
-
-void StylePainter::init(GraphicsContext* context)
-{
- painter = static_cast<QPainter*>(context->platformContext());
- widget = 0;
- QPaintDevice* dev = 0;
- if (painter)
- dev = painter->device();
- if (dev && dev->devType() == QInternal::Widget)
- widget = static_cast<QWidget*>(dev);
- style = (widget ? widget->style() : QApplication::style());
-
- if (painter) {
- // the styles often assume being called with a pristine painter where no brush is set,
- // so reset it manually
- oldBrush = painter->brush();
- painter->setBrush(Qt::NoBrush);
-
- // painting the widget with anti-aliasing will make it blurry
- // disable it here and restore it later
- oldAntialiasing = painter->testRenderHint(QPainter::Antialiasing);
- painter->setRenderHint(QPainter::Antialiasing, false);
- }
-}
-
-StylePainter::~StylePainter()
-{
- if (painter) {
- painter->setBrush(oldBrush);
- painter->setRenderHints(QPainter::Antialiasing, oldAntialiasing);
- }
-}
-
-RenderTheme* theme()
-{
- static RenderThemeQt rt;
- return &rt;
-}
-
-RenderThemeQt::RenderThemeQt()
- : RenderTheme()
-{
- QPushButton button;
- button.setAttribute(Qt::WA_MacSmallSize);
- QFont defaultButtonFont = QApplication::font(&button);
- QFontInfo fontInfo(defaultButtonFont);
- m_buttonFontFamily = defaultButtonFont.family();
-#ifdef Q_WS_MAC
- m_buttonFontPixelSize = fontInfo.pixelSize();
-#endif
-
- m_fallbackStyle = 0;
-}
-
-RenderThemeQt::~RenderThemeQt()
-{
- delete m_fallbackStyle;
-}
-
-// for some widget painting, we need to fallback to Windows style
-QStyle* RenderThemeQt::fallbackStyle()
-{
- if(!m_fallbackStyle)
- m_fallbackStyle = QStyleFactory::create(QLatin1String("windows"));
-
- if(!m_fallbackStyle)
- m_fallbackStyle = QApplication::style();
-
- return m_fallbackStyle;
-}
-
-bool RenderThemeQt::supportsHover(const RenderStyle*) const
-{
- return true;
-}
-
-bool RenderThemeQt::supportsFocusRing(const RenderStyle* style) const
-{
- return true; // Qt provides this through the style
-}
-
-int RenderThemeQt::baselinePosition(const RenderObject* o) const
-{
- if (o->style()->appearance() == CheckboxPart ||
- o->style()->appearance() == RadioPart)
- return o->marginTop() + o->height() - 2; // Same as in old khtml
- return RenderTheme::baselinePosition(o);
-}
-
-bool RenderThemeQt::controlSupportsTints(const RenderObject* o) const
-{
- if (!isEnabled(o))
- return false;
-
- // Checkboxes only have tint when checked.
- if (o->style()->appearance() == CheckboxPart)
- return isChecked(o);
-
- // For now assume other controls have tint if enabled.
- return true;
-}
-
-bool RenderThemeQt::supportsControlTints() const
-{
- return true;
-}
-
-static QRect inflateButtonRect(const QRect& originalRect)
-{
- QStyleOptionButton option;
- option.state |= QStyle::State_Small;
- option.rect = originalRect;
-
- QRect layoutRect = QApplication::style()->subElementRect(QStyle::SE_PushButtonLayoutItem,
- &option, 0);
- if (!layoutRect.isNull()) {
- int paddingLeft = layoutRect.left() - originalRect.left();
- int paddingRight = originalRect.right() - layoutRect.right();
- int paddingTop = layoutRect.top() - originalRect.top();
- int paddingBottom = originalRect.bottom() - layoutRect.bottom();
-
- return originalRect.adjusted(-paddingLeft, -paddingTop, paddingRight, paddingBottom);
- } else {
- return originalRect;
- }
-}
-
-void RenderThemeQt::adjustRepaintRect(const RenderObject* o, IntRect& r)
-{
- switch (o->style()->appearance()) {
- case CheckboxPart: {
- break;
- }
- case RadioPart: {
- break;
- }
- case PushButtonPart:
- case ButtonPart: {
- QRect inflatedRect = inflateButtonRect(r);
- r = IntRect(inflatedRect.x(), inflatedRect.y(), inflatedRect.width(), inflatedRect.height());
- break;
- }
- case MenulistPart: {
- break;
- }
- default:
- break;
- }
-}
-
-bool RenderThemeQt::isControlStyled(const RenderStyle* style, const BorderData& border,
- const FillLayer& background, const Color& backgroundColor) const
-{
- if (style->appearance() == TextFieldPart
- || style->appearance() == TextAreaPart
- || style->appearance() == ListboxPart) {
- return style->border() != border;
- }
-
- return RenderTheme::isControlStyled(style, border, background, backgroundColor);
-}
-
-Color RenderThemeQt::platformActiveSelectionBackgroundColor() const
-{
- QPalette pal = QApplication::palette();
- return pal.brush(QPalette::Active, QPalette::Highlight).color();
-}
-
-Color RenderThemeQt::platformInactiveSelectionBackgroundColor() const
-{
- QPalette pal = QApplication::palette();
- return pal.brush(QPalette::Inactive, QPalette::Highlight).color();
-}
-
-Color RenderThemeQt::platformActiveSelectionForegroundColor() const
-{
- QPalette pal = QApplication::palette();
- return pal.brush(QPalette::Active, QPalette::HighlightedText).color();
-}
-
-Color RenderThemeQt::platformInactiveSelectionForegroundColor() const
-{
- QPalette pal = QApplication::palette();
- return pal.brush(QPalette::Inactive, QPalette::HighlightedText).color();
-}
-
-void RenderThemeQt::systemFont(int propId, FontDescription& fontDescription) const
-{
- // no-op
-}
-
-int RenderThemeQt::minimumMenuListSize(RenderStyle*) const
-{
- const QFontMetrics &fm = QApplication::fontMetrics();
- return 7 * fm.width(QLatin1Char('x'));
-}
-
-static void computeSizeBasedOnStyle(RenderStyle* renderStyle)
-{
- // If the width and height are both specified, then we have nothing to do.
- if (!renderStyle->width().isIntrinsicOrAuto() && !renderStyle->height().isAuto())
- return;
-
- QSize size(0, 0);
- const QFontMetrics fm(renderStyle->font().font());
- QStyle* applicationStyle = QApplication::style();
-
- switch (renderStyle->appearance()) {
- case CheckboxPart: {
- QStyleOption styleOption;
- styleOption.state |= QStyle::State_Small;
- int checkBoxWidth = applicationStyle->pixelMetric(QStyle::PM_IndicatorWidth,
- &styleOption);
- size = QSize(checkBoxWidth, checkBoxWidth);
- break;
- }
- case RadioPart: {
- QStyleOption styleOption;
- styleOption.state |= QStyle::State_Small;
- int radioWidth = applicationStyle->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth,
- &styleOption);
- size = QSize(radioWidth, radioWidth);
- break;
- }
- case PushButtonPart:
- case ButtonPart: {
- QStyleOptionButton styleOption;
- styleOption.state |= QStyle::State_Small;
- QSize contentSize = fm.size(Qt::TextShowMnemonic, QString::fromLatin1("X"));
- QSize pushButtonSize = applicationStyle->sizeFromContents(QStyle::CT_PushButton,
- &styleOption,
- contentSize,
- 0);
- styleOption.rect = QRect(0, 0, pushButtonSize.width(), pushButtonSize.height());
- QRect layoutRect = applicationStyle->subElementRect(QStyle::SE_PushButtonLayoutItem,
- &styleOption,
- 0);
- // If the style supports layout rects we use that, and
- // compensate accordingly in paintButton() below.
- if (!layoutRect.isNull()) {
- size.setHeight(layoutRect.height());
- } else {
- size.setHeight(pushButtonSize.height());
- }
-
- break;
- }
- case MenulistPart: {
- QStyleOptionComboBox styleOption;
- styleOption.state |= QStyle::State_Small;
- int contentHeight = qMax(fm.lineSpacing(), 14) + 2;
- QSize menuListSize = applicationStyle->sizeFromContents(QStyle::CT_ComboBox,
- &styleOption,
- QSize(0, contentHeight),
- 0);
- size.setHeight(menuListSize.height());
- break;
- }
- case TextFieldPart: {
- const int verticalMargin = 1;
- const int horizontalMargin = 2;
- int h = qMax(fm.lineSpacing(), 14) + 2*verticalMargin;
- int w = fm.width(QLatin1Char('x')) * 17 + 2*horizontalMargin;
- QStyleOptionFrameV2 opt;
- opt.lineWidth = applicationStyle->pixelMetric(QStyle::PM_DefaultFrameWidth,
- &opt, 0);
- QSize sz = applicationStyle->sizeFromContents(QStyle::CT_LineEdit,
- &opt,
- QSize(w, h).expandedTo(QApplication::globalStrut()),
- 0);
- size.setHeight(sz.height());
- break;
- }
- default:
- break;
- }
-
- // FIXME: Check is flawed, since it doesn't take min-width/max-width into account.
- if (renderStyle->width().isIntrinsicOrAuto() && size.width() > 0)
- renderStyle->setWidth(Length(size.width(), Fixed));
- if (renderStyle->height().isAuto() && size.height() > 0)
- renderStyle->setHeight(Length(size.height(), Fixed));
-}
-
-void RenderThemeQt::setCheckboxSize(RenderStyle* style) const
-{
- computeSizeBasedOnStyle(style);
-}
-
-bool RenderThemeQt::paintCheckbox(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
-{
- return paintButton(o, i, r);
-}
-
-void RenderThemeQt::setRadioSize(RenderStyle* style) const
-{
- computeSizeBasedOnStyle(style);
-}
-
-bool RenderThemeQt::paintRadio(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
-{
- return paintButton(o, i, r);
-}
-
-void RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
-{
- // Ditch the border.
- style->resetBorder();
-
- // Height is locked to auto.
- style->setHeight(Length(Auto));
-
- // White-space is locked to pre
- style->setWhiteSpace(PRE);
-
- FontDescription fontDescription = style->fontDescription();
- fontDescription.setIsAbsoluteSize(true);
-
-#ifdef Q_WS_MAC // Use fixed font size and family on Mac (like Safari does)
- fontDescription.setSpecifiedSize(m_buttonFontPixelSize);
- fontDescription.setComputedSize(m_buttonFontPixelSize);
-#else
- fontDescription.setSpecifiedSize(style->fontSize());
- fontDescription.setComputedSize(style->fontSize());
-#endif
-
- FontFamily fontFamily;
- fontFamily.setFamily(m_buttonFontFamily);
- fontDescription.setFamily(fontFamily);
- style->setFontDescription(fontDescription);
- style->setLineHeight(RenderStyle::initialLineHeight());
-
- setButtonSize(style);
- setButtonPadding(style);
-
- style->setColor(QApplication::palette().text().color());
-}
-
-void RenderThemeQt::setButtonSize(RenderStyle* style) const
-{
- computeSizeBasedOnStyle(style);
-}
-
-void RenderThemeQt::setButtonPadding(RenderStyle* style) const
-{
- QStyleOptionButton styleOption;
- styleOption.state |= QStyle::State_Small;
-
- // Fake a button rect here, since we're just computing deltas
- QRect originalRect = QRect(0, 0, 100, 30);
- styleOption.rect = originalRect;
-
- // Default padding is based on the button margin pixel metric
- int buttonMargin = QApplication::style()->pixelMetric(QStyle::PM_ButtonMargin,
- &styleOption, 0);
- int paddingLeft = buttonMargin;
- int paddingRight = buttonMargin;
- int paddingTop = 1;
- int paddingBottom = 0;
-
- // Then check if the style uses layout margins
- QRect layoutRect = QApplication::style()->subElementRect(QStyle::SE_PushButtonLayoutItem,
- &styleOption, 0);
- if (!layoutRect.isNull()) {
- QRect contentsRect = QApplication::style()->subElementRect(QStyle::SE_PushButtonContents,
- &styleOption, 0);
- paddingLeft = contentsRect.left() - layoutRect.left();
- paddingRight = layoutRect.right() - contentsRect.right();
- paddingTop = contentsRect.top() - layoutRect.top();
-
- // Can't use this right now because we don't have the baseline to compensate
- // paddingBottom = layoutRect.bottom() - contentsRect.bottom();
- }
-
- style->setPaddingLeft(Length(paddingLeft, Fixed));
- style->setPaddingRight(Length(paddingRight, Fixed));
- style->setPaddingTop(Length(paddingTop, Fixed));
- style->setPaddingBottom(Length(paddingBottom, Fixed));
-}
-
-bool RenderThemeQt::paintButton(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
-{
- StylePainter p(i);
- if (!p.isValid())
- return true;
-
- QStyleOptionButton option;
- if (p.widget)
- option.initFrom(p.widget);
-
- option.rect = r;
- option.state |= QStyle::State_Small;
-
- ControlPart appearance = applyTheme(option, o);
- if(appearance == PushButtonPart || appearance == ButtonPart) {
- option.rect = inflateButtonRect(option.rect);
- p.drawControl(QStyle::CE_PushButton, option);
- } else if(appearance == RadioPart) {
- p.drawControl(QStyle::CE_RadioButton, option);
- } else if(appearance == CheckboxPart) {
- p.drawControl(QStyle::CE_CheckBox, option);
- }
-
- return false;
-}
-
-void RenderThemeQt::adjustTextFieldStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
-{
- style->setBackgroundColor(Color::transparent);
- style->setColor(QApplication::palette().text().color());
-}
-
-bool RenderThemeQt::paintTextField(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
-{
- StylePainter p(i);
- if (!p.isValid())
- return true;
-
- QStyleOptionFrameV2 panel;
- if (p.widget)
- panel.initFrom(p.widget);
-
- panel.rect = r;
- panel.lineWidth = p.style->pixelMetric(QStyle::PM_DefaultFrameWidth, &panel, p.widget);
- panel.state |= QStyle::State_Sunken;
- panel.features = QStyleOptionFrameV2::None;
-
- // Get the correct theme data for a text field
- ControlPart appearance = applyTheme(panel, o);
- if (appearance != TextFieldPart
- && appearance != SearchFieldPart
- && appearance != TextAreaPart
- && appearance != ListboxPart)
- return true;
-
- // Now paint the text field.
- p.drawPrimitive(QStyle::PE_PanelLineEdit, panel);
-
- return false;
-}
-
-void RenderThemeQt::adjustTextAreaStyle(CSSStyleSelector* selector, RenderStyle* style, Element* element) const
-{
- adjustTextFieldStyle(selector, style, element);
-}
-
-bool RenderThemeQt::paintTextArea(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
-{
- return paintTextField(o, i, r);
-}
-
-void RenderThemeQt::adjustMenuListStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
-{
- style->resetBorder();
-
- // Height is locked to auto.
- style->setHeight(Length(Auto));
-
- // White-space is locked to pre
- style->setWhiteSpace(PRE);
-
- computeSizeBasedOnStyle(style);
-
- // Add in the padding that we'd like to use.
- setPopupPadding(style);
-
- style->setColor(QApplication::palette().text().color());
-}
-
-void RenderThemeQt::setPopupPadding(RenderStyle* style) const
-{
- const int padding = 8;
- style->setPaddingLeft(Length(padding, Fixed));
-
- QStyleOptionComboBox opt;
- int w = QApplication::style()->pixelMetric(QStyle::PM_ButtonIconSize, &opt, 0);
- style->setPaddingRight(Length(padding + w, Fixed));
-
- style->setPaddingTop(Length(2, Fixed));
- style->setPaddingBottom(Length(0, Fixed));
-}
-
-
-bool RenderThemeQt::paintMenuList(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r)
-{
- StylePainter p(i);
- if (!p.isValid())
- return true;
-
- QStyleOptionComboBox opt;
- if (p.widget)
- opt.initFrom(p.widget);
- ControlPart appearance = applyTheme(opt, o);
-
- const QPoint topLeft = r.topLeft();
- p.painter->translate(topLeft);
- opt.rect.moveTo(QPoint(0,0));
- opt.rect.setSize(r.size());
-
- opt.frame = false;
-
- p.drawComplexControl(QStyle::CC_ComboBox, opt);
- p.painter->translate(-topLeft);
- return false;
-}
-
-void RenderThemeQt::adjustMenuListButtonStyle(CSSStyleSelector* selector, RenderStyle* style,
- Element* e) const
-{
- // WORKAROUND because html4.css specifies -webkit-border-radius for <select> so we override it here
- // see also http://bugs.webkit.org/show_bug.cgi?id=18399
- style->resetBorderRadius();
-
- // Height is locked to auto.
- style->setHeight(Length(Auto));
-
- // White-space is locked to pre
- style->setWhiteSpace(PRE);
-
- computeSizeBasedOnStyle(style);
-
- // Add in the padding that we'd like to use.
- setPopupPadding(style);
-
- style->setColor(QApplication::palette().text().color());
-}
-
-bool RenderThemeQt::paintMenuListButton(RenderObject* o, const RenderObject::PaintInfo& i,
- const IntRect& r)
-{
- StylePainter p(i);
- if (!p.isValid())
- return true;
-
- QStyleOptionComboBox option;
- if (p.widget)
- option.initFrom(p.widget);
- applyTheme(option, o);
- option.rect = r;
-
- // for drawing the combo box arrow, rely only on the fallback style
- p.style = fallbackStyle();
- option.subControls = QStyle::SC_ComboBoxArrow;
- p.drawComplexControl(QStyle::CC_ComboBox, option);
-
- return false;
-}
-
-bool RenderThemeQt::paintSliderTrack(RenderObject* o, const RenderObject::PaintInfo& pi,
- const IntRect& r)
-{
- notImplemented();
- return RenderTheme::paintSliderTrack(o, pi, r);
-}
-
-bool RenderThemeQt::paintSliderThumb(RenderObject* o, const RenderObject::PaintInfo& pi,
- const IntRect& r)
-{
- notImplemented();
- return RenderTheme::paintSliderThumb(o, pi, r);
-}
-
-bool RenderThemeQt::paintSearchField(RenderObject* o, const RenderObject::PaintInfo& pi,
- const IntRect& r)
-{
- paintTextField(o, pi, r);
- return false;
-}
-
-void RenderThemeQt::adjustSearchFieldStyle(CSSStyleSelector* selector, RenderStyle* style,
- Element* e) const
-{
- notImplemented();
- RenderTheme::adjustSearchFieldStyle(selector, style, e);
-}
-
-void RenderThemeQt::adjustSearchFieldCancelButtonStyle(CSSStyleSelector* selector, RenderStyle* style,
- Element* e) const
-{
- notImplemented();
- RenderTheme::adjustSearchFieldCancelButtonStyle(selector, style, e);
-}
-
-bool RenderThemeQt::paintSearchFieldCancelButton(RenderObject* o, const RenderObject::PaintInfo& pi,
- const IntRect& r)
-{
- notImplemented();
- return RenderTheme::paintSearchFieldCancelButton(o, pi, r);
-}
-
-void RenderThemeQt::adjustSearchFieldDecorationStyle(CSSStyleSelector* selector, RenderStyle* style,
- Element* e) const
-{
- notImplemented();
- RenderTheme::adjustSearchFieldDecorationStyle(selector, style, e);
-}
-
-bool RenderThemeQt::paintSearchFieldDecoration(RenderObject* o, const RenderObject::PaintInfo& pi,
- const IntRect& r)
-{
- notImplemented();
- return RenderTheme::paintSearchFieldDecoration(o, pi, r);
-}
-
-void RenderThemeQt::adjustSearchFieldResultsDecorationStyle(CSSStyleSelector* selector, RenderStyle* style,
- Element* e) const
-{
- notImplemented();
- RenderTheme::adjustSearchFieldResultsDecorationStyle(selector, style, e);
-}
-
-bool RenderThemeQt::paintSearchFieldResultsDecoration(RenderObject* o, const RenderObject::PaintInfo& pi,
- const IntRect& r)
-{
- notImplemented();
- return RenderTheme::paintSearchFieldResultsDecoration(o, pi, r);
-}
-
-bool RenderThemeQt::supportsFocus(ControlPart appearance) const
-{
- switch (appearance) {
- case PushButtonPart:
- case ButtonPart:
- case TextFieldPart:
- case TextAreaPart:
- case ListboxPart:
- case MenulistPart:
- case RadioPart:
- case CheckboxPart:
- return true;
- default: // No for all others...
- return false;
- }
-}
-
-ControlPart RenderThemeQt::applyTheme(QStyleOption& option, RenderObject* o) const
-{
- // Default bits: no focus, no mouse over
- option.state &= ~(QStyle::State_HasFocus | QStyle::State_MouseOver);
-
- if (!isEnabled(o))
- option.state &= ~QStyle::State_Enabled;
-
- if (isReadOnlyControl(o))
- // Readonly is supported on textfields.
- option.state |= QStyle::State_ReadOnly;
-
- if (supportsFocus(o->style()->appearance()) && isFocused(o))
- option.state |= QStyle::State_HasFocus;
-
- if (isHovered(o))
- option.state |= QStyle::State_MouseOver;
-
- ControlPart result = o->style()->appearance();
-
- switch (result) {
- case PushButtonPart:
- case SquareButtonPart:
- case ButtonPart:
- case ButtonBevelPart:
- case ListItemPart:
- case MenulistButtonPart:
- case SearchFieldResultsButtonPart:
- case SearchFieldCancelButtonPart: {
- if (isPressed(o))
- option.state |= QStyle::State_Sunken;
- else if (result == PushButtonPart)
- option.state |= QStyle::State_Raised;
- break;
- }
- }
-
- if(result == RadioPart || result == CheckboxPart)
- option.state |= (isChecked(o) ? QStyle::State_On : QStyle::State_Off);
-
- // If the webview has a custom palette, use it
- Page* page = o->document()->page();
- if (page) {
- QWidget* view = static_cast<ChromeClientQt*>(page->chrome()->client())->m_webPage->view();
- if (view)
- option.palette = view->palette();
- }
-
- return result;
-}
-
-void RenderTheme::adjustDefaultStyleSheet(CSSStyleSheet* style)
-{
- QFile platformStyleSheet(":/webcore/resources/html4-adjustments-qt.css");
- if (platformStyleSheet.open(QFile::ReadOnly)) {
- QByteArray sheetData = platformStyleSheet.readAll();
- style->parseString(QString::fromUtf8(sheetData.constData(), sheetData.length()));
- }
-}
-
-#if ENABLE(VIDEO)
-
-// Helper class to transform the painter's world matrix to the object's content area, scaled to 0,0,100,100
-class WorldMatrixTransformer
-{
-public:
- WorldMatrixTransformer(QPainter* painter, RenderObject* renderObject, const IntRect& r) : m_painter(painter) {
- RenderStyle* style = renderObject->style();
- m_originalTransform = m_painter->transform();
- m_painter->translate(r.x() + style->paddingLeft().value(), r.y() + style->paddingTop().value());
- m_painter->scale((r.width() - style->paddingLeft().value() - style->paddingRight().value()) / 100.0,
- (r.height() - style->paddingTop().value() - style->paddingBottom().value()) / 100.0);
- }
-
- ~WorldMatrixTransformer() { m_painter->setTransform(m_originalTransform); }
-
-private:
- QPainter* m_painter;
- QTransform m_originalTransform;
-};
-
-HTMLMediaElement* RenderThemeQt::getMediaElementFromRenderObject(RenderObject* o) const
-{
- Node* node = o->element();
- Node* mediaNode = node ? node->shadowAncestorNode() : 0;
- if (!mediaNode || (!mediaNode->hasTagName(videoTag) && !mediaNode->hasTagName(audioTag)))
- return 0;
-
- return static_cast<HTMLMediaElement*>(mediaNode);
-}
-
-void RenderThemeQt::paintMediaBackground(QPainter* painter, const IntRect& r) const
-{
- painter->setPen(Qt::NoPen);
- static QColor transparentBlack(0,0,0,100);
- painter->setBrush(transparentBlack);
- painter->drawRoundedRect(r.x(), r.y(), r.width(), r.height(), 5.0, 5.0);
-}
-
-QColor RenderThemeQt::getMediaControlForegroundColor(RenderObject* o) const
-{
- QColor fgColor = platformActiveSelectionBackgroundColor();
- if (o && o->element()->active())
- fgColor = fgColor.lighter();
- return fgColor;
-}
-
-bool RenderThemeQt::paintMediaFullscreenButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- return RenderTheme::paintMediaFullscreenButton(o, paintInfo, r);
-}
-
-bool RenderThemeQt::paintMediaMuteButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o);
- if (!mediaElement)
- return false;
-
- StylePainter p(paintInfo);
- if (!p.isValid())
- return true;
-
- p.painter->setRenderHint(QPainter::Antialiasing, true);
-
- paintMediaBackground(p.painter, r);
-
- WorldMatrixTransformer transformer(p.painter, o, r);
- const QPointF speakerPolygon[6] = { QPointF(20, 30), QPointF(50, 30), QPointF(80, 0),
- QPointF(80, 100), QPointF(50, 70), QPointF(20, 70)};
-
- p.painter->setBrush(getMediaControlForegroundColor(o));
- p.painter->drawPolygon(speakerPolygon, 6);
-
- if (mediaElement->muted()) {
- p.painter->setPen(Qt::red);
- p.painter->drawLine(0, 100, 100, 0);
- }
-
- return false;
-}
-
-bool RenderThemeQt::paintMediaPlayButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o);
- if (!mediaElement)
- return false;
-
- StylePainter p(paintInfo);
- if (!p.isValid())
- return true;
-
- p.painter->setRenderHint(QPainter::Antialiasing, true);
-
- paintMediaBackground(p.painter, r);
-
- WorldMatrixTransformer transformer(p.painter, o, r);
- p.painter->setBrush(getMediaControlForegroundColor(o));
- if (mediaElement->canPlay()) {
- const QPointF playPolygon[3] = { QPointF(0, 0), QPointF(100, 50), QPointF(0, 100)};
- p.painter->drawPolygon(playPolygon, 3);
- } else {
- p.painter->drawRect(0, 0, 30, 100);
- p.painter->drawRect(70, 0, 30, 100);
- }
-
- return false;
-}
-
-bool RenderThemeQt::paintMediaSeekBackButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- // We don't want to paint this at the moment.
- return false;
-}
-
-bool RenderThemeQt::paintMediaSeekForwardButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- // We don't want to paint this at the moment.
- return false;
-}
-
-bool RenderThemeQt::paintMediaSliderTrack(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o);
- if (!mediaElement)
- return false;
-
- StylePainter p(paintInfo);
- if (!p.isValid())
- return true;
-
- p.painter->setRenderHint(QPainter::Antialiasing, true);
-
- paintMediaBackground(p.painter, r);
-
- if (MediaPlayer* player = mediaElement->player()) {
- if (player->totalBytesKnown()) {
- float percentLoaded = static_cast<float>(player->bytesLoaded()) / player->totalBytes();
-
- WorldMatrixTransformer transformer(p.painter, o, r);
- p.painter->setBrush(getMediaControlForegroundColor());
- p.painter->drawRect(0, 37, 100 * percentLoaded, 26);
- }
- }
-
- return false;
-}
-
-bool RenderThemeQt::paintMediaSliderThumb(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
-{
- HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o->parent());
- if (!mediaElement)
- return false;
-
- StylePainter p(paintInfo);
- if (!p.isValid())
- return true;
-
- p.painter->setRenderHint(QPainter::Antialiasing, true);
-
- p.painter->setPen(Qt::NoPen);
- p.painter->setBrush(getMediaControlForegroundColor(o));
- p.painter->drawRect(r.x(), r.y(), r.width(), r.height());
-
- return false;
-}
-#endif
-
-void RenderThemeQt::adjustSliderThumbSize(RenderObject* o) const
-{
- if (o->style()->appearance() == MediaSliderThumbPart) {
- RenderStyle* parentStyle = o->parent()->style();
- Q_ASSERT(parentStyle);
-
- int parentHeight = parentStyle->height().value();
- o->style()->setWidth(Length(parentHeight / 3, Fixed));
- o->style()->setHeight(Length(parentHeight, Fixed));
- }
-}
-
-}
-
-// vim: ts=4 sw=4 et