本文整理汇总了C++中OptionElement类的典型用法代码示例。如果您正苦于以下问题:C++ OptionElement类的具体用法?C++ OptionElement怎么用?C++ OptionElement使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了OptionElement类的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: toOptionElement
void SelectElement::reset(SelectElementData& data, Element* element)
{
bool optionSelected = false;
OptionElement* firstOption = 0;
const Vector<Element*>& items = data.listItems(element);
for (unsigned i = 0; i < items.size(); ++i) {
OptionElement* optionElement = toOptionElement(items[i]);
if (!optionElement)
continue;
if (!items[i]->getAttribute(HTMLNames::selectedAttr).isNull()) {
optionElement->setSelectedState(true);
optionSelected = true;
} else
optionElement->setSelectedState(false);
if (!firstOption)
firstOption = optionElement;
}
if (!optionSelected && firstOption && data.usesMenuList())
firstOption->setSelectedState(true);
element->setNeedsStyleRecalc();
}
示例2: ASSERT
void SelectElement::listBoxOnChange(SelectElementData& data, Element* element)
{
ASSERT(!data.usesMenuList());
Vector<bool>& lastOnChangeSelection = data.lastOnChangeSelection();
const Vector<Element*>& items = data.listItems(element);
// If the cached selection list is empty, or the size has changed, then fire dispatchFormControlChangeEvent, and return early.
if (lastOnChangeSelection.isEmpty() || lastOnChangeSelection.size() != items.size()) {
element->dispatchFormControlChangeEvent();
return;
}
// Update lastOnChangeSelection and fire dispatchFormControlChangeEvent
bool fireOnChange = false;
for (unsigned i = 0; i < items.size(); ++i) {
OptionElement* optionElement = toOptionElement(items[i]);
bool selected = optionElement && optionElement->selected();
if (selected != lastOnChangeSelection[i])
fireOnChange = true;
lastOnChangeSelection[i] = selected;
}
if (fireOnChange)
element->dispatchFormControlChangeEvent();
}
示例3: String
void SelectElement::typeAheadFind(SelectElementData& data, Element* element, KeyboardEvent* event)
{
if (event->timeStamp() < data.lastCharTime())
return;
DOMTimeStamp delta = event->timeStamp() - data.lastCharTime();
data.setLastCharTime(event->timeStamp());
UChar c = event->charCode();
String prefix;
int searchStartOffset = 1;
if (delta > typeAheadTimeout) {
prefix = String(&c, 1);
data.setTypedString(prefix);
data.setRepeatingChar(c);
} else {
data.typedString().append(c);
if (c == data.repeatingChar())
// The user is likely trying to cycle through all the items starting with this character, so just search on the character
prefix = String(&c, 1);
else {
data.setRepeatingChar(0);
prefix = data.typedString();
searchStartOffset = 0;
}
}
const Vector<Element*>& items = data.listItems(element);
int itemCount = items.size();
if (itemCount < 1)
return;
int selected = selectedIndex(data, element);
int index = (optionToListIndex(data, element, selected >= 0 ? selected : 0) + searchStartOffset) % itemCount;
ASSERT(index >= 0);
for (int i = 0; i < itemCount; ++i, index = (index + 1) % itemCount) {
OptionElement* optionElement = toOptionElement(items[index]);
if (!optionElement || items[index]->disabled())
continue;
String text = optionElement->textIndentedToRespectGroupLabel();
if (stripLeadingWhiteSpace(text).startsWith(prefix, false)) {
setSelectedIndex(data, element, listToOptionIndex(data, element, index));
if (!data.usesMenuList())
listBoxOnChange(data, element);
element->setNeedsStyleRecalc();
return;
}
}
}
示例4: recalcListItems
void SelectElement::recalcListItems(SelectElementData& data, const Element* element, bool updateSelectedStates)
{
Vector<Element*>& listItems = data.rawListItems();
listItems.clear();
OptionElement* foundSelected = 0;
for (Node* currentNode = element->firstChild(); currentNode;) {
if (!currentNode->isElementNode()) {
currentNode = currentNode->traverseNextSibling(element);
continue;
}
Element* current = static_cast<Element*>(currentNode);
// optgroup tags may not nest. However, both FireFox and IE will
// flatten the tree automatically, so we follow suit.
// (http://www.w3.org/TR/html401/interact/forms.html#h-17.6)
if (isOptionGroupElement(current)) {
listItems.append(current);
if (current->firstChild()) {
currentNode = current->firstChild();
continue;
}
}
if (OptionElement* optionElement = toOptionElement(current)) {
listItems.append(current);
if (updateSelectedStates) {
if (!foundSelected && (data.usesMenuList() || (!data.multiple() && optionElement->selected()))) {
foundSelected = optionElement;
foundSelected->setSelectedState(true);
} else if (foundSelected && !data.multiple() && optionElement->selected()) {
foundSelected->setSelectedState(false);
foundSelected = optionElement;
}
}
}
if (current->hasTagName(HTMLNames::hrTag))
listItems.append(current);
// In conforming HTML code, only <optgroup> and <option> will be found
// within a <select>. We call traverseNextSibling so that we only step
// into those tags that we choose to. For web-compat, we should cope
// with the case where odd tags like a <div> have been added but we
// handle this because such tags have already been removed from the
// <select>'s subtree at this point.
currentNode = currentNode->traverseNextSibling(element);
}
data.setShouldRecalcListItems(false);
}
示例5: toSelectElement
void RenderListBox::paintItemForeground(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);
String itemText;
if (optionElement)
itemText = optionElement->textIndentedToRespectGroupLabel();
else if (OptionGroupElement* optionGroupElement = toOptionGroupElement(element))
itemText = optionGroupElement->groupLabelText();
// Determine where the item text should be placed
IntRect r = itemBoundingBoxRect(tx, ty, listIndex);
r.move(optionsSpacingHorizontal, style()->font().ascent());
RenderStyle* itemStyle = element->renderStyle();
if (!itemStyle)
itemStyle = style();
Color textColor = element->renderStyle() ? element->renderStyle()->color() : style()->color();
if (optionElement && optionElement->selected()) {
if (document()->frame()->selection()->isFocusedAndActive() && document()->focusedNode() == node())
textColor = theme()->activeListBoxSelectionForegroundColor();
// Honor the foreground color for disabled items
else if (!element->disabled())
textColor = theme()->inactiveListBoxSelectionForegroundColor();
}
ColorSpace colorSpace = itemStyle->colorSpace();
paintInfo.context->setFillColor(textColor, colorSpace);
Font itemFont = style()->font();
if (isOptionGroupElement(element)) {
FontDescription d = itemFont.fontDescription();
d.setWeight(d.bolderWeight());
itemFont = Font(d, itemFont.letterSpacing(), itemFont.wordSpacing());
itemFont.update(document()->styleSelector()->fontSelector());
}
unsigned length = itemText.length();
const UChar* string = itemText.characters();
TextRun textRun(string, length, 0, 0, 0, itemStyle->direction() == RTL, itemStyle->unicodeBidi() == Override, false, false);
// Draw the item text
if (itemStyle->visibility() != HIDDEN)
paintInfo.context->drawBidiText(itemFont, textRun, r.location());
}
示例6: characters
bool SelectElement::saveFormControlState(const SelectElementData& data, const Element* element, String& value)
{
const Vector<Element*>& items = data.listItems(element);
int length = items.size();
// FIXME: Change this code to use the new StringImpl::createUninitialized code path.
Vector<char, 1024> characters(length);
for (int i = 0; i < length; ++i) {
OptionElement* optionElement = toOptionElement(items[i]);
bool selected = optionElement && optionElement->selected();
characters[i] = selected ? 'X' : '.';
}
value = String(characters.data(), length);
return true;
}
示例7: wmlPageStateForDocument
void WMLSelectElement::updateVariables()
{
WMLPageState* pageState = wmlPageStateForDocument(document());
if (!pageState)
return;
String name = this->name();
String iname = this->iname();
if (iname.isEmpty() && name.isEmpty())
return;
String nameString;
String inameString;
unsigned optionIndex = 0;
const Vector<Element*>& items = m_data.listItems(this);
for (unsigned i = 0; i < items.size(); ++i) {
OptionElement* optionElement = toOptionElement(items[i]);
if (!optionElement)
continue;
++optionIndex;
if (!optionElement->selected())
continue;
if (!nameString.isEmpty())
nameString += ";";
if (!inameString.isEmpty())
inameString += ";";
nameString += optionElement->value();
inameString += String::number(optionIndex);
}
if (!name.isEmpty())
pageState->storeVariable(name, nameString);
if (!iname.isEmpty())
pageState->storeVariable(iname, inameString);
}
示例8: toSelectElement
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);
}
}
示例9: roundedIntPoint
void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element* element, Event* event, HTMLFormElement* htmlForm)
{
const Vector<Element*>& listItems = data.listItems(element);
if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) {
element->focus();
// Convert to coords relative to the list box if needed.
MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
IntPoint localOffset = roundedIntPoint(element->renderer()->absoluteToLocal(mouseEvent->absoluteLocation(), false, true));
int listIndex = static_cast<RenderListBox*>(element->renderer())->listIndexAtOffset(localOffset.x(), localOffset.y());
if (listIndex >= 0) {
// Save the selection so it can be compared to the new selection when dispatching change events during mouseup, or after autoscroll finishes.
saveLastSelection(data, element);
data.setActiveSelectionState(true);
bool multiSelectKeyPressed = false;
#if PLATFORM(MAC)
multiSelectKeyPressed = mouseEvent->metaKey();
#else
multiSelectKeyPressed = mouseEvent->ctrlKey();
#endif
bool shiftSelect = data.multiple() && mouseEvent->shiftKey();
bool multiSelect = data.multiple() && multiSelectKeyPressed && !mouseEvent->shiftKey();
Element* clickedElement = listItems[listIndex];
OptionElement* option = toOptionElement(clickedElement);
if (option) {
// Keep track of whether an active selection (like during drag selection), should select or deselect
if (option->selected() && multiSelectKeyPressed)
data.setActiveSelectionState(false);
if (!data.activeSelectionState())
option->setSelectedState(false);
}
// If we're not in any special multiple selection mode, then deselect all other items, excluding the clicked option.
// If no option was clicked, then this will deselect all items in the list.
if (!shiftSelect && !multiSelect)
deselectItems(data, element, clickedElement);
// If the anchor hasn't been set, and we're doing a single selection or a shift selection, then initialize the anchor to the first selected index.
if (data.activeSelectionAnchorIndex() < 0 && !multiSelect)
setActiveSelectionAnchorIndex(data, element, selectedIndex(data, element));
// Set the selection state of the clicked option
if (option && !clickedElement->disabled())
option->setSelectedState(true);
// If there was no selectedIndex() for the previous initialization, or
// If we're doing a single selection, or a multiple selection (using cmd or ctrl), then initialize the anchor index to the listIndex that just got clicked.
if (listIndex >= 0 && (data.activeSelectionAnchorIndex() < 0 || !shiftSelect))
setActiveSelectionAnchorIndex(data, element, listIndex);
setActiveSelectionEndIndex(data, listIndex);
updateListBoxSelection(data, element, !multiSelect);
if (Frame* frame = element->document()->frame())
frame->eventHandler()->setMouseDownMayStartAutoscroll();
event->setDefaultHandled();
}
} else if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton && element->document()->frame()->eventHandler()->autoscrollRenderer() != element->renderer())
// This makes sure we fire dispatchFormControlChangeEvent for a single click. For drag selection, onChange will fire when the autoscroll timer stops.
listBoxOnChange(data, element);
else if (event->type() == eventNames().keydownEvent) {
if (!event->isKeyboardEvent())
return;
String keyIdentifier = static_cast<KeyboardEvent*>(event)->keyIdentifier();
int endIndex = 0;
if (data.activeSelectionEndIndex() < 0) {
// Initialize the end index
if (keyIdentifier == "Down")
endIndex = nextSelectableListIndex(data, element, lastSelectedListIndex(data, element));
else if (keyIdentifier == "Up")
endIndex = previousSelectableListIndex(data, element, optionToListIndex(data, element, selectedIndex(data, element)));
} else {
// Set the end index based on the current end index
if (keyIdentifier == "Down")
endIndex = nextSelectableListIndex(data, element, data.activeSelectionEndIndex());
else if (keyIdentifier == "Up")
endIndex = previousSelectableListIndex(data, element, data.activeSelectionEndIndex());
}
if (keyIdentifier == "Down" || keyIdentifier == "Up") {
// Save the selection so it can be compared to the new selection when dispatching change events immediately after making the new selection.
saveLastSelection(data, element);
ASSERT(endIndex >= 0 && (unsigned) endIndex < listItems.size());
setActiveSelectionEndIndex(data, endIndex);
// If the anchor is unitialized, or if we're going to deselect all other options, then set the anchor index equal to the end index.
bool deselectOthers = !data.multiple() || !static_cast<KeyboardEvent*>(event)->shiftKey();
if (data.activeSelectionAnchorIndex() < 0 || deselectOthers) {
data.setActiveSelectionState(true);
if (deselectOthers)
deselectItems(data, element);
//.........这里部分代码省略.........