void RenderMenuList::setTextFromOption(int optionIndex) { SelectElement* select = toSelectElement(static_cast<Element*>(node())); const Vector<Element*>& listItems = select->listItems(); int size = listItems.size(); int i = select->optionToListIndex(optionIndex); String text = ""; if (i >= 0 && i < size) { Element* element = listItems[i]; if (OptionElement* optionElement = toOptionElement(element)) { text = optionElement->textIndentedToRespectGroupLabel(); m_optionStyle = element->renderStyle(); } } setText(text.stripWhiteSpace()); }
PopupMenuStyle RenderMenuList::itemStyle(unsigned listIndex) const { SelectElement* select = toSelectElement(static_cast<Element*>(node())); const Vector<Element*>& listItems = select->listItems(); if (listIndex >= listItems.size()) { // If we are making an out of bounds access, then we want to use the style // of a different option element (index 0). However, if there isn't an option element // before at index 0, we fall back to the menu's style. if (!listIndex) return menuStyle(); // Try to retrieve the style of an option element we know exists (index 0). listIndex = 0; } Element* element = listItems[listIndex]; RenderStyle* style = element->renderStyle() ? element->renderStyle() : element->computedStyle(); return style ? PopupMenuStyle(style->visitedDependentColor(CSSPropertyColor), itemBackgroundColor(listIndex), style->font(), style->visibility() == VISIBLE, style->display() == NONE, style->textIndent(), style->direction(), style->unicodeBidi() == Override) : menuStyle(); }
bool RenderMenuList::itemIsEnabled(unsigned listIndex) const { SelectElement* select = toSelectElement(static_cast<Element*>(node())); const Vector<Element*>& listItems = select->listItems(); if (listIndex >= listItems.size()) return false; Element* element = listItems[listIndex]; if (!isOptionElement(element)) return false; bool groupEnabled = true; if (Element* parentElement = element->parentElement()) { if (isOptionGroupElement(parentElement)) groupEnabled = parentElement->isEnabledFormControl(); } if (!groupEnabled) return false; return element->isEnabledFormControl(); }
Color RenderMenuList::itemBackgroundColor(unsigned listIndex) const { SelectElement* select = toSelectElement(static_cast<Element*>(node())); const Vector<Element*>& listItems = select->listItems(); if (listIndex >= listItems.size()) return style()->visitedDependentColor(CSSPropertyBackgroundColor); Element* element = listItems[listIndex]; Color backgroundColor; if (element->renderStyle()) backgroundColor = element->renderStyle()->visitedDependentColor(CSSPropertyBackgroundColor); // If the item has an opaque background color, return that. if (!backgroundColor.hasAlpha()) return backgroundColor; // Otherwise, the item's background is overlayed on top of the menu background. backgroundColor = style()->visitedDependentColor(CSSPropertyBackgroundColor).blend(backgroundColor); if (!backgroundColor.hasAlpha()) return backgroundColor; // If the menu background is not opaque, then add an opaque white background behind. return Color(Color::white).blend(backgroundColor); }
void RenderListBox::paintItemBackground(PaintInfo& paintInfo, int tx, int ty, int listIndex) { SelectElement* select = toSelectElement(static_cast<Element*>(node())); const Vector<Element*>& listItems = select->listItems(); Element* element = listItems[listIndex]; OptionElement* optionElement = toOptionElement(element); Color backColor; if (optionElement && optionElement->selected()) { if (document()->frame()->selection()->isFocusedAndActive() && document()->focusedNode() == node()) backColor = theme()->activeListBoxSelectionBackgroundColor(); else backColor = theme()->inactiveListBoxSelectionBackgroundColor(); } else backColor = element->renderStyle() ? element->renderStyle()->backgroundColor() : style()->backgroundColor(); // Draw the background for this list box item if (!element->renderStyle() || element->renderStyle()->visibility() != HIDDEN) { IntRect itemRect = itemBoundingBoxRect(tx, ty, listIndex); itemRect.intersect(controlClipRect(tx, ty)); paintInfo.context->fillRect(itemRect, backColor); } }
int RenderMenuList::listSize() const { SelectElement* select = toSelectElement(static_cast<Element*>(node())); return select->listItems().size(); }