| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
| 3 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 3 * 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 HTMLElement* element = listItems[i]; | 121 HTMLElement* element = listItems[i]; |
| 122 String text; | 122 String text; |
| 123 Font itemFont = style()->font(); | 123 Font itemFont = style()->font(); |
| 124 if (element->hasTagName(optionTag)) { | 124 if (element->hasTagName(optionTag)) { |
| 125 text = toHTMLOptionElement(element)->textIndentedToRespectGroupL
abel(); | 125 text = toHTMLOptionElement(element)->textIndentedToRespectGroupL
abel(); |
| 126 } else if (isHTMLOptGroupElement(element)) { | 126 } else if (isHTMLOptGroupElement(element)) { |
| 127 text = toHTMLOptGroupElement(element)->groupLabelText(); | 127 text = toHTMLOptGroupElement(element)->groupLabelText(); |
| 128 FontDescription d = itemFont.fontDescription(); | 128 FontDescription d = itemFont.fontDescription(); |
| 129 d.setWeight(d.bolderWeight()); | 129 d.setWeight(d.bolderWeight()); |
| 130 itemFont = Font(d, itemFont.letterSpacing(), itemFont.wordSpacin
g()); | 130 itemFont = Font(d, itemFont.letterSpacing(), itemFont.wordSpacin
g()); |
| 131 itemFont.update(document()->styleResolver()->fontSelector()); | 131 itemFont.update(document().styleResolver()->fontSelector()); |
| 132 } | 132 } |
| 133 | 133 |
| 134 if (!text.isEmpty()) { | 134 if (!text.isEmpty()) { |
| 135 applyTextTransform(style(), text, ' '); | 135 applyTextTransform(style(), text, ' '); |
| 136 // FIXME: Why is this always LTR? Can't text direction affect th
e width? | 136 // FIXME: Why is this always LTR? Can't text direction affect th
e width? |
| 137 TextRun textRun = constructTextRun(this, itemFont, text, style()
, TextRun::AllowTrailingExpansion); | 137 TextRun textRun = constructTextRun(this, itemFont, text, style()
, TextRun::AllowTrailingExpansion); |
| 138 textRun.disableRoundingHacks(); | 138 textRun.disableRoundingHacks(); |
| 139 float textWidth = itemFont.width(textRun); | 139 float textWidth = itemFont.width(textRun); |
| 140 width = max(width, textWidth); | 140 width = max(width, textWidth); |
| 141 } | 141 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 157 void RenderListBox::selectionChanged() | 157 void RenderListBox::selectionChanged() |
| 158 { | 158 { |
| 159 repaint(); | 159 repaint(); |
| 160 if (!m_inAutoscroll) { | 160 if (!m_inAutoscroll) { |
| 161 if (m_optionsChanged || needsLayout()) | 161 if (m_optionsChanged || needsLayout()) |
| 162 m_scrollToRevealSelectionAfterLayout = true; | 162 m_scrollToRevealSelectionAfterLayout = true; |
| 163 else | 163 else |
| 164 scrollToRevealSelection(); | 164 scrollToRevealSelection(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 if (AXObjectCache* cache = document()->existingAXObjectCache()) | 167 if (AXObjectCache* cache = document().existingAXObjectCache()) |
| 168 cache->selectedChildrenChanged(this); | 168 cache->selectedChildrenChanged(this); |
| 169 } | 169 } |
| 170 | 170 |
| 171 void RenderListBox::layout() | 171 void RenderListBox::layout() |
| 172 { | 172 { |
| 173 RenderBlock::layout(); | 173 RenderBlock::layout(); |
| 174 | 174 |
| 175 if (m_vBar) { | 175 if (m_vBar) { |
| 176 bool enabled = numVisibleItems() < numItems(); | 176 bool enabled = numVisibleItems() < numItems(); |
| 177 m_vBar->setEnabled(enabled); | 177 m_vBar->setEnabled(enabled); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 String itemText; | 400 String itemText; |
| 401 bool isOptionElement = element->hasTagName(optionTag); | 401 bool isOptionElement = element->hasTagName(optionTag); |
| 402 if (isOptionElement) | 402 if (isOptionElement) |
| 403 itemText = toHTMLOptionElement(element)->textIndentedToRespectGroupLabel
(); | 403 itemText = toHTMLOptionElement(element)->textIndentedToRespectGroupLabel
(); |
| 404 else if (isHTMLOptGroupElement(element)) | 404 else if (isHTMLOptGroupElement(element)) |
| 405 itemText = toHTMLOptGroupElement(element)->groupLabelText(); | 405 itemText = toHTMLOptGroupElement(element)->groupLabelText(); |
| 406 applyTextTransform(style(), itemText, ' '); | 406 applyTextTransform(style(), itemText, ' '); |
| 407 | 407 |
| 408 Color textColor = element->renderStyle() ? resolveColor(element->renderStyle
(), CSSPropertyColor) : resolveColor(CSSPropertyColor); | 408 Color textColor = element->renderStyle() ? resolveColor(element->renderStyle
(), CSSPropertyColor) : resolveColor(CSSPropertyColor); |
| 409 if (isOptionElement && toHTMLOptionElement(element)->selected()) { | 409 if (isOptionElement && toHTMLOptionElement(element)->selected()) { |
| 410 if (frame()->selection()->isFocusedAndActive() && document()->focusedEle
ment() == node()) | 410 if (frame()->selection()->isFocusedAndActive() && document().focusedElem
ent() == node()) |
| 411 textColor = RenderTheme::theme().activeListBoxSelectionForegroundCol
or(); | 411 textColor = RenderTheme::theme().activeListBoxSelectionForegroundCol
or(); |
| 412 // Honor the foreground color for disabled items | 412 // Honor the foreground color for disabled items |
| 413 else if (!element->isDisabledFormControl() && !select->isDisabledFormCon
trol()) | 413 else if (!element->isDisabledFormControl() && !select->isDisabledFormCon
trol()) |
| 414 textColor = RenderTheme::theme().inactiveListBoxSelectionForegroundC
olor(); | 414 textColor = RenderTheme::theme().inactiveListBoxSelectionForegroundC
olor(); |
| 415 } | 415 } |
| 416 | 416 |
| 417 paintInfo.context->setFillColor(textColor); | 417 paintInfo.context->setFillColor(textColor); |
| 418 | 418 |
| 419 TextRun textRun(itemText, 0, 0, TextRun::AllowTrailingExpansion, itemStyle->
direction(), isOverride(itemStyle->unicodeBidi()), true, TextRun::NoRounding); | 419 TextRun textRun(itemText, 0, 0, TextRun::AllowTrailingExpansion, itemStyle->
direction(), isOverride(itemStyle->unicodeBidi()), true, TextRun::NoRounding); |
| 420 Font itemFont = style()->font(); | 420 Font itemFont = style()->font(); |
| 421 LayoutRect r = itemBoundingBoxRect(paintOffset, listIndex); | 421 LayoutRect r = itemBoundingBoxRect(paintOffset, listIndex); |
| 422 r.move(itemOffsetForAlignment(textRun, itemStyle, itemFont, r)); | 422 r.move(itemOffsetForAlignment(textRun, itemStyle, itemFont, r)); |
| 423 | 423 |
| 424 if (isHTMLOptGroupElement(element)) { | 424 if (isHTMLOptGroupElement(element)) { |
| 425 FontDescription d = itemFont.fontDescription(); | 425 FontDescription d = itemFont.fontDescription(); |
| 426 d.setWeight(d.bolderWeight()); | 426 d.setWeight(d.bolderWeight()); |
| 427 itemFont = Font(d, itemFont.letterSpacing(), itemFont.wordSpacing()); | 427 itemFont = Font(d, itemFont.letterSpacing(), itemFont.wordSpacing()); |
| 428 itemFont.update(document()->styleResolver()->fontSelector()); | 428 itemFont.update(document().styleResolver()->fontSelector()); |
| 429 } | 429 } |
| 430 | 430 |
| 431 // Draw the item text | 431 // Draw the item text |
| 432 TextRunPaintInfo textRunPaintInfo(textRun); | 432 TextRunPaintInfo textRunPaintInfo(textRun); |
| 433 textRunPaintInfo.bounds = r; | 433 textRunPaintInfo.bounds = r; |
| 434 paintInfo.context->drawBidiText(itemFont, textRunPaintInfo, roundedIntPoint(
r.location())); | 434 paintInfo.context->drawBidiText(itemFont, textRunPaintInfo, roundedIntPoint(
r.location())); |
| 435 } | 435 } |
| 436 | 436 |
| 437 void RenderListBox::paintItemBackground(PaintInfo& paintInfo, const LayoutPoint&
paintOffset, int listIndex) | 437 void RenderListBox::paintItemBackground(PaintInfo& paintInfo, const LayoutPoint&
paintOffset, int listIndex) |
| 438 { | 438 { |
| 439 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); | 439 const Vector<HTMLElement*>& listItems = selectElement()->listItems(); |
| 440 HTMLElement* element = listItems[listIndex]; | 440 HTMLElement* element = listItems[listIndex]; |
| 441 | 441 |
| 442 Color backColor; | 442 Color backColor; |
| 443 if (element->hasTagName(optionTag) && toHTMLOptionElement(element)->selected
()) { | 443 if (element->hasTagName(optionTag) && toHTMLOptionElement(element)->selected
()) { |
| 444 if (frame()->selection()->isFocusedAndActive() && document()->focusedEle
ment() == node()) | 444 if (frame()->selection()->isFocusedAndActive() && document().focusedElem
ent() == node()) |
| 445 backColor = RenderTheme::theme().activeListBoxSelectionBackgroundCol
or(); | 445 backColor = RenderTheme::theme().activeListBoxSelectionBackgroundCol
or(); |
| 446 else | 446 else |
| 447 backColor = RenderTheme::theme().inactiveListBoxSelectionBackgroundC
olor(); | 447 backColor = RenderTheme::theme().inactiveListBoxSelectionBackgroundC
olor(); |
| 448 } else { | 448 } else { |
| 449 backColor = element->renderStyle() ? resolveColor(element->renderStyle()
, CSSPropertyBackgroundColor) : resolveColor(CSSPropertyBackgroundColor); | 449 backColor = element->renderStyle() ? resolveColor(element->renderStyle()
, CSSPropertyBackgroundColor) : resolveColor(CSSPropertyBackgroundColor); |
| 450 } | 450 } |
| 451 | 451 |
| 452 // Draw the background for this list box item | 452 // Draw the background for this list box item |
| 453 if (!element->renderStyle() || element->renderStyle()->visibility() != HIDDE
N) { | 453 if (!element->renderStyle() || element->renderStyle()->visibility() != HIDDE
N) { |
| 454 LayoutRect itemRect = itemBoundingBoxRect(paintOffset, listIndex); | 454 LayoutRect itemRect = itemBoundingBoxRect(paintOffset, listIndex); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 scrollTo(offset.y()); | 631 scrollTo(offset.y()); |
| 632 } | 632 } |
| 633 | 633 |
| 634 void RenderListBox::scrollTo(int newOffset) | 634 void RenderListBox::scrollTo(int newOffset) |
| 635 { | 635 { |
| 636 if (newOffset == m_indexOffset) | 636 if (newOffset == m_indexOffset) |
| 637 return; | 637 return; |
| 638 | 638 |
| 639 m_indexOffset = newOffset; | 639 m_indexOffset = newOffset; |
| 640 repaint(); | 640 repaint(); |
| 641 node()->document()->eventQueue()->enqueueOrDispatchScrollEvent(node(), Docum
entEventQueue::ScrollEventElementTarget); | 641 node()->document().eventQueue()->enqueueOrDispatchScrollEvent(node(), Docume
ntEventQueue::ScrollEventElementTarget); |
| 642 } | 642 } |
| 643 | 643 |
| 644 LayoutUnit RenderListBox::itemHeight() const | 644 LayoutUnit RenderListBox::itemHeight() const |
| 645 { | 645 { |
| 646 return style()->fontMetrics().height() + rowSpacing; | 646 return style()->fontMetrics().height() + rowSpacing; |
| 647 } | 647 } |
| 648 | 648 |
| 649 int RenderListBox::verticalScrollbarWidth() const | 649 int RenderListBox::verticalScrollbarWidth() const |
| 650 { | 650 { |
| 651 return m_vBar && !m_vBar->isOverlayScrollbar() ? m_vBar->width() : 0; | 651 return m_vBar && !m_vBar->isOverlayScrollbar() ? m_vBar->width() : 0; |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 PassRefPtr<Scrollbar> RenderListBox::createScrollbar() | 872 PassRefPtr<Scrollbar> RenderListBox::createScrollbar() |
| 873 { | 873 { |
| 874 RefPtr<Scrollbar> widget; | 874 RefPtr<Scrollbar> widget; |
| 875 bool hasCustomScrollbarStyle = style()->hasPseudoStyle(SCROLLBAR); | 875 bool hasCustomScrollbarStyle = style()->hasPseudoStyle(SCROLLBAR); |
| 876 if (hasCustomScrollbarStyle) | 876 if (hasCustomScrollbarStyle) |
| 877 widget = RenderScrollbar::createCustomScrollbar(this, VerticalScrollbar,
this->node()); | 877 widget = RenderScrollbar::createCustomScrollbar(this, VerticalScrollbar,
this->node()); |
| 878 else { | 878 else { |
| 879 widget = Scrollbar::createNativeScrollbar(this, VerticalScrollbar, Rende
rTheme::theme().scrollbarControlSizeForPart(ListboxPart)); | 879 widget = Scrollbar::createNativeScrollbar(this, VerticalScrollbar, Rende
rTheme::theme().scrollbarControlSizeForPart(ListboxPart)); |
| 880 didAddVerticalScrollbar(widget.get()); | 880 didAddVerticalScrollbar(widget.get()); |
| 881 } | 881 } |
| 882 document()->view()->addChild(widget.get()); | 882 document().view()->addChild(widget.get()); |
| 883 return widget.release(); | 883 return widget.release(); |
| 884 } | 884 } |
| 885 | 885 |
| 886 void RenderListBox::destroyScrollbar() | 886 void RenderListBox::destroyScrollbar() |
| 887 { | 887 { |
| 888 if (!m_vBar) | 888 if (!m_vBar) |
| 889 return; | 889 return; |
| 890 | 890 |
| 891 if (!m_vBar->isCustomScrollbar()) | 891 if (!m_vBar->isCustomScrollbar()) |
| 892 ScrollableArea::willRemoveVerticalScrollbar(m_vBar.get()); | 892 ScrollableArea::willRemoveVerticalScrollbar(m_vBar.get()); |
| 893 m_vBar->removeFromParent(); | 893 m_vBar->removeFromParent(); |
| 894 m_vBar->disconnectFromScrollableArea(); | 894 m_vBar->disconnectFromScrollableArea(); |
| 895 m_vBar = 0; | 895 m_vBar = 0; |
| 896 } | 896 } |
| 897 | 897 |
| 898 void RenderListBox::setHasVerticalScrollbar(bool hasScrollbar) | 898 void RenderListBox::setHasVerticalScrollbar(bool hasScrollbar) |
| 899 { | 899 { |
| 900 if (hasScrollbar == (m_vBar != 0)) | 900 if (hasScrollbar == (m_vBar != 0)) |
| 901 return; | 901 return; |
| 902 | 902 |
| 903 if (hasScrollbar) | 903 if (hasScrollbar) |
| 904 m_vBar = createScrollbar(); | 904 m_vBar = createScrollbar(); |
| 905 else | 905 else |
| 906 destroyScrollbar(); | 906 destroyScrollbar(); |
| 907 | 907 |
| 908 if (m_vBar) | 908 if (m_vBar) |
| 909 m_vBar->styleChanged(); | 909 m_vBar->styleChanged(); |
| 910 | 910 |
| 911 // Force an update since we know the scrollbars have changed things. | 911 // Force an update since we know the scrollbars have changed things. |
| 912 if (document()->hasAnnotatedRegions()) | 912 if (document().hasAnnotatedRegions()) |
| 913 document()->setAnnotatedRegionsDirty(true); | 913 document().setAnnotatedRegionsDirty(true); |
| 914 } | 914 } |
| 915 | 915 |
| 916 } // namespace WebCore | 916 } // namespace WebCore |
| OLD | NEW |