diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
commit | 1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch) | |
tree | 4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/rendering/RenderTheme.cpp | |
parent | 9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff) | |
download | external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.zip external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.gz external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.bz2 |
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'WebCore/rendering/RenderTheme.cpp')
-rw-r--r-- | WebCore/rendering/RenderTheme.cpp | 456 |
1 files changed, 351 insertions, 105 deletions
diff --git a/WebCore/rendering/RenderTheme.cpp b/WebCore/rendering/RenderTheme.cpp index 417b1c1..9eb3ac2 100644 --- a/WebCore/rendering/RenderTheme.cpp +++ b/WebCore/rendering/RenderTheme.cpp @@ -22,15 +22,19 @@ #include "config.h" #include "RenderTheme.h" +#include "CSSValueKeywords.h" #include "Document.h" #include "FocusController.h" +#include "FontSelector.h" #include "Frame.h" #include "GraphicsContext.h" #include "HTMLInputElement.h" #include "HTMLNames.h" #include "Page.h" #include "RenderStyle.h" +#include "RenderView.h" #include "SelectionController.h" +#include "Settings.h" // The methods in this file are shared by all themes on every platform. @@ -38,10 +42,18 @@ namespace WebCore { using namespace HTMLNames; +RenderTheme::RenderTheme() +#if USE(NEW_THEME) + : m_theme(platformTheme()) +#endif +{ +} + void RenderTheme::adjustStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e, - bool UAHasAppearance, const BorderData& border, const BackgroundLayer& background, const Color& backgroundColor) + bool UAHasAppearance, const BorderData& border, const FillLayer& background, const Color& backgroundColor) { // Force inline and table display styles to be inline-block (except for table- which is block) + ControlPart part = style->appearance(); if (style->display() == INLINE || style->display() == INLINE_TABLE || style->display() == TABLE_ROW_GROUP || style->display() == TABLE_HEADER_GROUP || style->display() == TABLE_FOOTER_GROUP || style->display() == TABLE_ROW || style->display() == TABLE_COLUMN_GROUP || style->display() == TABLE_COLUMN || @@ -51,52 +63,151 @@ void RenderTheme::adjustStyle(CSSStyleSelector* selector, RenderStyle* style, El style->setDisplay(BLOCK); if (UAHasAppearance && theme()->isControlStyled(style, border, background, backgroundColor)) { - if (style->appearance() == MenulistAppearance) - style->setAppearance(MenulistButtonAppearance); - else - style->setAppearance(NoAppearance); + if (part == MenulistPart) { + style->setAppearance(MenulistButtonPart); + part = MenulistButtonPart; + } else + style->setAppearance(NoControlPart); + } + + if (!style->hasAppearance()) + return; + + // Never support box-shadow on native controls. + style->setBoxShadow(0); + +#if USE(NEW_THEME) + switch (part) { + case CheckboxPart: + case RadioPart: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: { + // Border + LengthBox borderBox(style->borderTopWidth(), style->borderRightWidth(), style->borderBottomWidth(), style->borderLeftWidth()); + borderBox = m_theme->controlBorder(part, style->font(), borderBox, style->effectiveZoom()); + if (borderBox.top().value() != style->borderTopWidth()) { + if (borderBox.top().value()) + style->setBorderTopWidth(borderBox.top().value()); + else + style->resetBorderTop(); + } + if (borderBox.right().value() != style->borderRightWidth()) { + if (borderBox.right().value()) + style->setBorderRightWidth(borderBox.right().value()); + else + style->resetBorderRight(); + } + if (borderBox.bottom().value() != style->borderBottomWidth()) { + style->setBorderBottomWidth(borderBox.bottom().value()); + if (borderBox.bottom().value()) + style->setBorderBottomWidth(borderBox.bottom().value()); + else + style->resetBorderBottom(); + } + if (borderBox.left().value() != style->borderLeftWidth()) { + style->setBorderLeftWidth(borderBox.left().value()); + if (borderBox.left().value()) + style->setBorderLeftWidth(borderBox.left().value()); + else + style->resetBorderLeft(); + } + + // Padding + LengthBox paddingBox = m_theme->controlPadding(part, style->font(), style->paddingBox(), style->effectiveZoom()); + if (paddingBox != style->paddingBox()) + style->setPaddingBox(paddingBox); + + // Whitespace + if (m_theme->controlRequiresPreWhiteSpace(part)) + style->setWhiteSpace(PRE); + + // Width / Height + // The width and height here are affected by the zoom. + // FIXME: Check is flawed, since it doesn't take min-width/max-width into account. + LengthSize controlSize = m_theme->controlSize(part, style->font(), LengthSize(style->width(), style->height()), style->effectiveZoom()); + if (controlSize.width() != style->width()) + style->setWidth(controlSize.width()); + if (controlSize.height() != style->height()) + style->setHeight(controlSize.height()); + + // Min-Width / Min-Height + LengthSize minControlSize = m_theme->minimumControlSize(part, style->font(), style->effectiveZoom()); + if (minControlSize.width() != style->minWidth()) + style->setMinWidth(minControlSize.width()); + if (minControlSize.height() != style->minHeight()) + style->setMinHeight(minControlSize.height()); + + // Font + FontDescription controlFont = m_theme->controlFont(part, style->font(), style->effectiveZoom()); + if (controlFont != style->font().fontDescription()) { + // Reset our line-height + style->setLineHeight(RenderStyle::initialLineHeight()); + + // Now update our font. + if (style->setFontDescription(controlFont)) + style->font().update(0); + } + } + default: + break; } +#endif // Call the appropriate style adjustment method based off the appearance value. switch (style->appearance()) { - case CheckboxAppearance: +#if !USE(NEW_THEME) + case CheckboxPart: return adjustCheckboxStyle(selector, style, e); - case RadioAppearance: + case RadioPart: return adjustRadioStyle(selector, style, e); - case PushButtonAppearance: - case SquareButtonAppearance: - case ButtonAppearance: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: return adjustButtonStyle(selector, style, e); - case TextFieldAppearance: +#endif + case TextFieldPart: return adjustTextFieldStyle(selector, style, e); - case TextAreaAppearance: + case TextAreaPart: return adjustTextAreaStyle(selector, style, e); - case MenulistAppearance: +#ifdef ANDROID_LISTBOX_USES_MENU_LIST + case ListboxPart: + return adjustListboxStyle(selector, style, e); +#endif + case MenulistPart: return adjustMenuListStyle(selector, style, e); - case MenulistButtonAppearance: + case MenulistButtonPart: return adjustMenuListButtonStyle(selector, style, e); - case MediaSliderAppearance: - case SliderHorizontalAppearance: - case SliderVerticalAppearance: + case MediaSliderPart: + case SliderHorizontalPart: + case SliderVerticalPart: return adjustSliderTrackStyle(selector, style, e); - case SliderThumbHorizontalAppearance: - case SliderThumbVerticalAppearance: + case SliderThumbHorizontalPart: + case SliderThumbVerticalPart: return adjustSliderThumbStyle(selector, style, e); - case SearchFieldAppearance: + case SearchFieldPart: return adjustSearchFieldStyle(selector, style, e); - case SearchFieldCancelButtonAppearance: + case SearchFieldCancelButtonPart: return adjustSearchFieldCancelButtonStyle(selector, style, e); - case SearchFieldDecorationAppearance: + case SearchFieldDecorationPart: return adjustSearchFieldDecorationStyle(selector, style, e); - case SearchFieldResultsDecorationAppearance: + case SearchFieldResultsDecorationPart: return adjustSearchFieldResultsDecorationStyle(selector, style, e); - case SearchFieldResultsButtonAppearance: + case SearchFieldResultsButtonPart: return adjustSearchFieldResultsButtonStyle(selector, style, e); default: break; } } +#if !PLATFORM(QT) +void RenderTheme::adjustDefaultStyleSheet(CSSStyleSheet*) +{ +} +#endif + bool RenderTheme::paint(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) { // If painting is disabled, but we aren't updating control tints, then just bail. @@ -110,57 +221,77 @@ bool RenderTheme::paint(RenderObject* o, const RenderObject::PaintInfo& paintInf if (paintInfo.context->paintingDisabled()) return false; + ControlPart part = o->style()->appearance(); + +#if USE(NEW_THEME) + switch (part) { + case CheckboxPart: + case RadioPart: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: + m_theme->paint(part, controlStatesForRenderer(o), const_cast<GraphicsContext*>(paintInfo.context), r, o->style()->effectiveZoom(), o->view()->frameView()); + return false; + default: + break; + } +#endif + // Call the appropriate paint method based off the appearance value. - switch (o->style()->appearance()) { - case CheckboxAppearance: + switch (part) { +#if !USE(NEW_THEME) + case CheckboxPart: return paintCheckbox(o, paintInfo, r); - case RadioAppearance: + case RadioPart: return paintRadio(o, paintInfo, r); - case PushButtonAppearance: - case SquareButtonAppearance: - case ButtonAppearance: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: return paintButton(o, paintInfo, r); - case MenulistAppearance: +#endif + case MenulistPart: return paintMenuList(o, paintInfo, r); - case SliderHorizontalAppearance: - case SliderVerticalAppearance: + case SliderHorizontalPart: + case SliderVerticalPart: return paintSliderTrack(o, paintInfo, r); - case SliderThumbHorizontalAppearance: - case SliderThumbVerticalAppearance: + case SliderThumbHorizontalPart: + case SliderThumbVerticalPart: if (o->parent()->isSlider()) return paintSliderThumb(o, paintInfo, r); // We don't support drawing a slider thumb without a parent slider break; - case MediaFullscreenButtonAppearance: + case MediaFullscreenButtonPart: return paintMediaFullscreenButton(o, paintInfo, r); - case MediaPlayButtonAppearance: + case MediaPlayButtonPart: return paintMediaPlayButton(o, paintInfo, r); - case MediaMuteButtonAppearance: + case MediaMuteButtonPart: return paintMediaMuteButton(o, paintInfo, r); - case MediaSeekBackButtonAppearance: + case MediaSeekBackButtonPart: return paintMediaSeekBackButton(o, paintInfo, r); - case MediaSeekForwardButtonAppearance: + case MediaSeekForwardButtonPart: return paintMediaSeekForwardButton(o, paintInfo, r); - case MediaSliderAppearance: + case MediaSliderPart: return paintMediaSliderTrack(o, paintInfo, r); - case MediaSliderThumbAppearance: + case MediaSliderThumbPart: if (o->parent()->isSlider()) return paintMediaSliderThumb(o, paintInfo, r); break; - case MenulistButtonAppearance: - case TextFieldAppearance: - case TextAreaAppearance: - case ListboxAppearance: + case MenulistButtonPart: + case TextFieldPart: + case TextAreaPart: + case ListboxPart: return true; - case SearchFieldAppearance: + case SearchFieldPart: return paintSearchField(o, paintInfo, r); - case SearchFieldCancelButtonAppearance: + case SearchFieldCancelButtonPart: return paintSearchFieldCancelButton(o, paintInfo, r); - case SearchFieldDecorationAppearance: + case SearchFieldDecorationPart: return paintSearchFieldDecoration(o, paintInfo, r); - case SearchFieldResultsDecorationAppearance: + case SearchFieldResultsDecorationPart: return paintSearchFieldResultsDecoration(o, paintInfo, r); - case SearchFieldResultsButtonAppearance: + case SearchFieldResultsButtonPart: return paintSearchFieldResultsButton(o, paintInfo, r); default: break; @@ -176,28 +307,29 @@ bool RenderTheme::paintBorderOnly(RenderObject* o, const RenderObject::PaintInfo // Call the appropriate paint method based off the appearance value. switch (o->style()->appearance()) { - case TextFieldAppearance: + case TextFieldPart: return paintTextField(o, paintInfo, r); - case ListboxAppearance: - case TextAreaAppearance: + case ListboxPart: + case TextAreaPart: return paintTextArea(o, paintInfo, r); - case MenulistButtonAppearance: + case MenulistButtonPart: return true; - case CheckboxAppearance: - case RadioAppearance: - case PushButtonAppearance: - case SquareButtonAppearance: - case ButtonAppearance: - case MenulistAppearance: - case SliderHorizontalAppearance: - case SliderVerticalAppearance: - case SliderThumbHorizontalAppearance: - case SliderThumbVerticalAppearance: - case SearchFieldAppearance: - case SearchFieldCancelButtonAppearance: - case SearchFieldDecorationAppearance: - case SearchFieldResultsDecorationAppearance: - case SearchFieldResultsButtonAppearance: + case CheckboxPart: + case RadioPart: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: + case MenulistPart: + case SliderHorizontalPart: + case SliderVerticalPart: + case SliderThumbHorizontalPart: + case SliderThumbVerticalPart: + case SearchFieldPart: + case SearchFieldCancelButtonPart: + case SearchFieldDecorationPart: + case SearchFieldResultsDecorationPart: + case SearchFieldResultsButtonPart: default: break; } @@ -212,26 +344,27 @@ bool RenderTheme::paintDecorations(RenderObject* o, const RenderObject::PaintInf // Call the appropriate paint method based off the appearance value. switch (o->style()->appearance()) { - case MenulistButtonAppearance: + case MenulistButtonPart: return paintMenuListButton(o, paintInfo, r); - case TextFieldAppearance: - case TextAreaAppearance: - case ListboxAppearance: - case CheckboxAppearance: - case RadioAppearance: - case PushButtonAppearance: - case SquareButtonAppearance: - case ButtonAppearance: - case MenulistAppearance: - case SliderHorizontalAppearance: - case SliderVerticalAppearance: - case SliderThumbHorizontalAppearance: - case SliderThumbVerticalAppearance: - case SearchFieldAppearance: - case SearchFieldCancelButtonAppearance: - case SearchFieldDecorationAppearance: - case SearchFieldResultsDecorationAppearance: - case SearchFieldResultsButtonAppearance: + case TextFieldPart: + case TextAreaPart: + case ListboxPart: + case CheckboxPart: + case RadioPart: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: + case MenulistPart: + case SliderHorizontalPart: + case SliderVerticalPart: + case SliderThumbHorizontalPart: + case SliderThumbVerticalPart: + case SearchFieldPart: + case SearchFieldCancelButtonPart: + case SearchFieldDecorationPart: + case SearchFieldResultsDecorationPart: + case SearchFieldResultsButtonPart: default: break; } @@ -297,31 +430,36 @@ Color RenderTheme::inactiveListBoxSelectionForegroundColor() const return Color(0, 0, 0); } -short RenderTheme::baselinePosition(const RenderObject* o) const +int RenderTheme::baselinePosition(const RenderObject* o) const { +#if USE(NEW_THEME) + return o->height() + o->marginTop() + m_theme->baselinePositionAdjustment(o->style()->appearance()) * o->style()->effectiveZoom(); +#else return o->height() + o->marginTop(); +#endif } -bool RenderTheme::isControlContainer(EAppearance appearance) const +bool RenderTheme::isControlContainer(ControlPart appearance) const { // There are more leaves than this, but we'll patch this function as we add support for // more controls. - return appearance != CheckboxAppearance && appearance != RadioAppearance; + return appearance != CheckboxPart && appearance != RadioPart; } -bool RenderTheme::isControlStyled(const RenderStyle* style, const BorderData& border, const BackgroundLayer& background, +bool RenderTheme::isControlStyled(const RenderStyle* style, const BorderData& border, const FillLayer& background, const Color& backgroundColor) const { switch (style->appearance()) { - case PushButtonAppearance: - case SquareButtonAppearance: - case ButtonAppearance: - case ListboxAppearance: - case MenulistAppearance: + case PushButtonPart: + case SquareButtonPart: + case DefaultButtonPart: + case ButtonPart: + case ListboxPart: + case MenulistPart: // FIXME: Uncomment this when making search fields style-able. - // case SearchFieldAppearance: - case TextFieldAppearance: - case TextAreaAppearance: + // case SearchFieldPart: + case TextFieldPart: + case TextAreaPart: // Test the style to see if the UA border and background match. return (style->border() != border || *style->backgroundLayers() != background || @@ -331,9 +469,16 @@ bool RenderTheme::isControlStyled(const RenderStyle* style, const BorderData& bo } } +void RenderTheme::adjustRepaintRect(const RenderObject* o, IntRect& r) +{ +#if USE(NEW_THEME) + m_theme->inflateControlPaintRect(o->style()->appearance(), controlStatesForRenderer(o), r, o->style()->effectiveZoom()); +#endif +} + bool RenderTheme::supportsFocusRing(const RenderStyle* style) const { - return (style->hasAppearance() && style->appearance() != TextFieldAppearance && style->appearance() != TextAreaAppearance && style->appearance() != MenulistButtonAppearance && style->appearance() != ListboxAppearance); + return (style->hasAppearance() && style->appearance() != TextFieldPart && style->appearance() != TextAreaPart && style->appearance() != MenulistButtonPart && style->appearance() != ListboxPart); } bool RenderTheme::stateChanged(RenderObject* o, ControlState state) const @@ -351,8 +496,30 @@ bool RenderTheme::stateChanged(RenderObject* o, ControlState state) const return true; } -// FIXME: It would be nice to set this state on the RenderObjects instead of -// having to dig up to the FocusController at paint time. +ControlStates RenderTheme::controlStatesForRenderer(const RenderObject* o) const +{ + ControlStates result = 0; + if (isHovered(o)) + result |= HoverState; + if (isPressed(o)) + result |= PressedState; + if (isFocused(o) && o->style()->outlineStyleIsAuto()) + result |= FocusState; + if (isEnabled(o)) + result |= EnabledState; + if (isChecked(o)) + result |= CheckedState; + if (isReadOnlyControl(o)) + result |= ReadOnlyState; + if (isDefault(o)) + result |= DefaultState; + if (!isActive(o)) + result |= WindowInactiveState; + if (isIndeterminate(o)) + result |= IndeterminateState; + return result; +} + bool RenderTheme::isActive(const RenderObject* o) const { Node* node = o->element(); @@ -398,7 +565,7 @@ bool RenderTheme::isFocused(const RenderObject* o) const return false; Document* document = node->document(); Frame* frame = document->frame(); - return node == document->focusedNode() && frame && frame->selectionController()->isFocusedAndActive(); + return node == document->focusedNode() && frame && frame->selection()->isFocusedAndActive(); } bool RenderTheme::isPressed(const RenderObject* o) const @@ -422,6 +589,19 @@ bool RenderTheme::isHovered(const RenderObject* o) const return o->element()->hovered(); } +bool RenderTheme::isDefault(const RenderObject* o) const +{ + if (!o->document()) + return false; + + Settings* settings = o->document()->settings(); + if (!settings || !settings->inApplicationChromeMode()) + return false; + + return o->style()->appearance() == DefaultButtonPart; +} + +#if !USE(NEW_THEME) void RenderTheme::adjustCheckboxStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const { // A summary of the rules for checkbox designed to match WinIE: @@ -462,6 +642,7 @@ void RenderTheme::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* sty // at all by default. We will still allow the theme a crack at setting up a desired vertical size. setButtonSize(style); } +#endif void RenderTheme::adjustTextFieldStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const { @@ -517,6 +698,71 @@ void RenderTheme::platformColorsDidChange() m_inactiveSelectionColor = Color(); } +Color RenderTheme::systemColor(int cssValueId) const +{ + switch (cssValueId) { + case CSSValueActiveborder: + return 0xFFFFFFFF; + case CSSValueActivecaption: + return 0xFFCCCCCC; + case CSSValueAppworkspace: + return 0xFFFFFFFF; + case CSSValueBackground: + return 0xFF6363CE; + case CSSValueButtonface: + return 0xFFC0C0C0; + case CSSValueButtonhighlight: + return 0xFFDDDDDD; + case CSSValueButtonshadow: + return 0xFF888888; + case CSSValueButtontext: + return 0xFF000000; + case CSSValueCaptiontext: + return 0xFF000000; + case CSSValueGraytext: + return 0xFF808080; + case CSSValueHighlight: + return 0xFFB5D5FF; + case CSSValueHighlighttext: + return 0xFF000000; + case CSSValueInactiveborder: + return 0xFFFFFFFF; + case CSSValueInactivecaption: + return 0xFFFFFFFF; + case CSSValueInactivecaptiontext: + return 0xFF7F7F7F; + case CSSValueInfobackground: + return 0xFFFBFCC5; + case CSSValueInfotext: + return 0xFF000000; + case CSSValueMenu: + return 0xFFC0C0C0; + case CSSValueMenutext: + return 0xFF000000; + case CSSValueScrollbar: + return 0xFFFFFFFF; + case CSSValueText: + return 0xFF000000; + case CSSValueThreeddarkshadow: + return 0xFF666666; + case CSSValueThreedface: + return 0xFFC0C0C0; + case CSSValueThreedhighlight: + return 0xFFDDDDDD; + case CSSValueThreedlightshadow: + return 0xFFC0C0C0; + case CSSValueThreedshadow: + return 0xFF888888; + case CSSValueWindow: + return 0xFFFFFFFF; + case CSSValueWindowframe: + return 0xFFCCCCCC; + case CSSValueWindowtext: + return 0xFF000000; + } + return Color(); +} + Color RenderTheme::platformTextSearchHighlightColor() const { return Color(255, 255, 0); |