| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of the select element renderer in WebCore. | 2 * This file is part of the select element renderer in WebCore. |
| 3 * | 3 * |
| 4 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). | 4 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
| 5 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. | 5 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. |
| 6 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 6 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "core/page/Chrome.h" | 40 #include "core/page/Chrome.h" |
| 41 #include "core/rendering/RenderBR.h" | 41 #include "core/rendering/RenderBR.h" |
| 42 #include "core/rendering/RenderScrollbar.h" | 42 #include "core/rendering/RenderScrollbar.h" |
| 43 #include "core/rendering/RenderTheme.h" | 43 #include "core/rendering/RenderTheme.h" |
| 44 #include "core/rendering/RenderView.h" | 44 #include "core/rendering/RenderView.h" |
| 45 #include "platform/fonts/FontCache.h" | 45 #include "platform/fonts/FontCache.h" |
| 46 #include "platform/geometry/IntSize.h" | 46 #include "platform/geometry/IntSize.h" |
| 47 #include "platform/text/PlatformLocale.h" | 47 #include "platform/text/PlatformLocale.h" |
| 48 #include <math.h> | 48 #include <math.h> |
| 49 | 49 |
| 50 using namespace std; | |
| 51 | |
| 52 namespace WebCore { | 50 namespace WebCore { |
| 53 | 51 |
| 54 using namespace HTMLNames; | 52 using namespace HTMLNames; |
| 55 | 53 |
| 56 RenderMenuList::RenderMenuList(Element* element) | 54 RenderMenuList::RenderMenuList(Element* element) |
| 57 : RenderFlexibleBox(element) | 55 : RenderFlexibleBox(element) |
| 58 , m_buttonText(0) | 56 , m_buttonText(0) |
| 59 , m_innerBlock(0) | 57 , m_innerBlock(0) |
| 60 , m_optionsChanged(true) | 58 , m_optionsChanged(true) |
| 61 , m_optionsWidth(0) | 59 , m_optionsWidth(0) |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 | 172 |
| 175 String text = toHTMLOptionElement(element)->textIndentedToRespectGroupLa
bel(); | 173 String text = toHTMLOptionElement(element)->textIndentedToRespectGroupLa
bel(); |
| 176 applyTextTransform(style(), text, ' '); | 174 applyTextTransform(style(), text, ' '); |
| 177 if (RenderTheme::theme().popupOptionSupportsTextIndent()) { | 175 if (RenderTheme::theme().popupOptionSupportsTextIndent()) { |
| 178 // Add in the option's text indent. We can't calculate percentage v
alues for now. | 176 // Add in the option's text indent. We can't calculate percentage v
alues for now. |
| 179 float optionWidth = 0; | 177 float optionWidth = 0; |
| 180 if (RenderStyle* optionStyle = element->renderStyle()) | 178 if (RenderStyle* optionStyle = element->renderStyle()) |
| 181 optionWidth += minimumValueForLength(optionStyle->textIndent(),
0); | 179 optionWidth += minimumValueForLength(optionStyle->textIndent(),
0); |
| 182 if (!text.isEmpty()) | 180 if (!text.isEmpty()) |
| 183 optionWidth += style()->font().width(text); | 181 optionWidth += style()->font().width(text); |
| 184 maxOptionWidth = max(maxOptionWidth, optionWidth); | 182 maxOptionWidth = std::max(maxOptionWidth, optionWidth); |
| 185 } else if (!text.isEmpty()) | 183 } else if (!text.isEmpty()) { |
| 186 maxOptionWidth = max(maxOptionWidth, style()->font().width(text)); | 184 maxOptionWidth = std::max(maxOptionWidth, style()->font().width(text
)); |
| 185 } |
| 187 } | 186 } |
| 188 | 187 |
| 189 int width = static_cast<int>(ceilf(maxOptionWidth)); | 188 int width = static_cast<int>(ceilf(maxOptionWidth)); |
| 190 if (m_optionsWidth == width) | 189 if (m_optionsWidth == width) |
| 191 return; | 190 return; |
| 192 | 191 |
| 193 m_optionsWidth = width; | 192 m_optionsWidth = width; |
| 194 if (parent()) | 193 if (parent()) |
| 195 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 194 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); |
| 196 } | 195 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 LayoutRect innerBox(additionalOffset.x() + m_innerBlock->x() + m_innerBlock-
>paddingLeft(), | 315 LayoutRect innerBox(additionalOffset.x() + m_innerBlock->x() + m_innerBlock-
>paddingLeft(), |
| 317 additionalOffset.y() + m_innerBlock->y() + m_innerBlock->padd
ingTop(), | 316 additionalOffset.y() + m_innerBlock->y() + m_innerBlock->padd
ingTop(), |
| 318 m_innerBlock->contentWidth(), | 317 m_innerBlock->contentWidth(), |
| 319 m_innerBlock->contentHeight()); | 318 m_innerBlock->contentHeight()); |
| 320 | 319 |
| 321 return intersection(outerBox, innerBox); | 320 return intersection(outerBox, innerBox); |
| 322 } | 321 } |
| 323 | 322 |
| 324 void RenderMenuList::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth,
LayoutUnit& maxLogicalWidth) const | 323 void RenderMenuList::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth,
LayoutUnit& maxLogicalWidth) const |
| 325 { | 324 { |
| 326 maxLogicalWidth = max(m_optionsWidth, RenderTheme::theme().minimumMenuListSi
ze(style())) + m_innerBlock->paddingLeft() + m_innerBlock->paddingRight(); | 325 maxLogicalWidth = std::max(m_optionsWidth, RenderTheme::theme().minimumMenuL
istSize(style())) + m_innerBlock->paddingLeft() + m_innerBlock->paddingRight(); |
| 327 if (!style()->width().isPercent()) | 326 if (!style()->width().isPercent()) |
| 328 minLogicalWidth = maxLogicalWidth; | 327 minLogicalWidth = maxLogicalWidth; |
| 329 } | 328 } |
| 330 | 329 |
| 331 void RenderMenuList::computePreferredLogicalWidths() | 330 void RenderMenuList::computePreferredLogicalWidths() |
| 332 { | 331 { |
| 333 m_minPreferredLogicalWidth = 0; | 332 m_minPreferredLogicalWidth = 0; |
| 334 m_maxPreferredLogicalWidth = 0; | 333 m_maxPreferredLogicalWidth = 0; |
| 335 RenderStyle* styleToUse = style(); | 334 RenderStyle* styleToUse = style(); |
| 336 | 335 |
| 337 if (styleToUse->width().isFixed() && styleToUse->width().value() > 0) | 336 if (styleToUse->width().isFixed() && styleToUse->width().value() > 0) |
| 338 m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentB
oxLogicalWidthForBoxSizing(styleToUse->width().value()); | 337 m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentB
oxLogicalWidthForBoxSizing(styleToUse->width().value()); |
| 339 else | 338 else |
| 340 computeIntrinsicLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferred
LogicalWidth); | 339 computeIntrinsicLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferred
LogicalWidth); |
| 341 | 340 |
| 342 if (styleToUse->minWidth().isFixed() && styleToUse->minWidth().value() > 0)
{ | 341 if (styleToUse->minWidth().isFixed() && styleToUse->minWidth().value() > 0)
{ |
| 343 m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustConte
ntBoxLogicalWidthForBoxSizing(styleToUse->minWidth().value())); | 342 m_maxPreferredLogicalWidth = std::max(m_maxPreferredLogicalWidth, adjust
ContentBoxLogicalWidthForBoxSizing(styleToUse->minWidth().value())); |
| 344 m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustConte
ntBoxLogicalWidthForBoxSizing(styleToUse->minWidth().value())); | 343 m_minPreferredLogicalWidth = std::max(m_minPreferredLogicalWidth, adjust
ContentBoxLogicalWidthForBoxSizing(styleToUse->minWidth().value())); |
| 345 } | 344 } |
| 346 | 345 |
| 347 if (styleToUse->maxWidth().isFixed()) { | 346 if (styleToUse->maxWidth().isFixed()) { |
| 348 m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustConte
ntBoxLogicalWidthForBoxSizing(styleToUse->maxWidth().value())); | 347 m_maxPreferredLogicalWidth = std::min(m_maxPreferredLogicalWidth, adjust
ContentBoxLogicalWidthForBoxSizing(styleToUse->maxWidth().value())); |
| 349 m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustConte
ntBoxLogicalWidthForBoxSizing(styleToUse->maxWidth().value())); | 348 m_minPreferredLogicalWidth = std::min(m_minPreferredLogicalWidth, adjust
ContentBoxLogicalWidthForBoxSizing(styleToUse->maxWidth().value())); |
| 350 } | 349 } |
| 351 | 350 |
| 352 LayoutUnit toAdd = borderAndPaddingWidth(); | 351 LayoutUnit toAdd = borderAndPaddingWidth(); |
| 353 m_minPreferredLogicalWidth += toAdd; | 352 m_minPreferredLogicalWidth += toAdd; |
| 354 m_maxPreferredLogicalWidth += toAdd; | 353 m_maxPreferredLogicalWidth += toAdd; |
| 355 | 354 |
| 356 clearPreferredLogicalWidthsDirty(); | 355 clearPreferredLogicalWidthsDirty(); |
| 357 } | 356 } |
| 358 | 357 |
| 359 void RenderMenuList::showPopup() | 358 void RenderMenuList::showPopup() |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 HTMLElement* element = listItems[listIndex]; | 603 HTMLElement* element = listItems[listIndex]; |
| 605 return isHTMLOptionElement(*element) && toHTMLOptionElement(*element).select
ed(); | 604 return isHTMLOptionElement(*element) && toHTMLOptionElement(*element).select
ed(); |
| 606 } | 605 } |
| 607 | 606 |
| 608 void RenderMenuList::setTextFromItem(unsigned listIndex) | 607 void RenderMenuList::setTextFromItem(unsigned listIndex) |
| 609 { | 608 { |
| 610 setTextFromOption(selectElement()->listToOptionIndex(listIndex)); | 609 setTextFromOption(selectElement()->listToOptionIndex(listIndex)); |
| 611 } | 610 } |
| 612 | 611 |
| 613 } | 612 } |
| OLD | NEW |