Home | History | Annotate | Download | only in dom

Lines Matching refs:Element

27 #include "Element.h"
81 // Valid means that it is enabled and an option element.
82 static int nextValidIndex(const Vector<Element*>& listItems, int listIndex, SkipDirection direction, int skip)
98 static int nextSelectableListIndex(SelectElementData& data, Element* element, int startIndex)
100 return nextValidIndex(data.listItems(element), startIndex, SkipForwards, 1);
103 static int previousSelectableListIndex(SelectElementData& data, Element* element, int startIndex)
106 startIndex = data.listItems(element).size();
107 return nextValidIndex(data.listItems(element), startIndex, SkipBackwards, 1);
110 static int firstSelectableListIndex(SelectElementData& data, Element* element)
112 const Vector<Element*>& items = data.listItems(element);
119 static int lastSelectableListIndex(SelectElementData& data, Element* element)
121 return nextValidIndex(data.listItems(element), -1, SkipForwards, INT_MAX);
125 static int nextSelectableListIndexPageAway(SelectElementData& data, Element* element, int startIndex, SkipDirection direction)
127 const Vector<Element*>& items = data.listItems(element);
130 if (element->renderer()->isListBox())
131 pageSize = toRenderListBox(element->renderer())->size() - 1; // -1 so we still show context
141 void SelectElement::selectAll(SelectElementData& data, Element* element)
144 if (!element->renderer() || !data.multiple())
148 saveLastSelection(data, element);
151 setActiveSelectionAnchorIndex(data, element, nextSelectableListIndex(data, element, -1));
152 setActiveSelectionEndIndex(data, previousSelectableListIndex(data, element, -1));
154 updateListBoxSelection(data, element, false);
155 listBoxOnChange(data, element);
158 void SelectElement::saveLastSelection(SelectElementData& data, Element* element)
161 data.setLastOnChangeIndex(selectedIndex(data, element));
168 const Vector<Element*>& items = data.listItems(element);
175 void SelectElement::setActiveSelectionAnchorIndex(SelectElementData& data, Element* element, int index)
183 const Vector<Element*>& items = data.listItems(element);
195 void SelectElement::updateListBoxSelection(SelectElementData& data, Element* element, bool deselectOtherOptions)
197 ASSERT(element->renderer() && (element->renderer()->isListBox() || data.multiple()));
198 ASSERT(!data.listItems(element).size() || data.activeSelectionAnchorIndex() >= 0);
204 const Vector<Element*>& items = data.listItems(element);
218 toSelectElement(element)->updateValidity();
219 scrollToSelection(data, element);
222 void SelectElement::listBoxOnChange(SelectElementData& data, Element* element)
227 const Vector<Element*>& items = data.listItems(element);
231 element->dispatchFormControlChangeEvent();
246 element->dispatchFormControlChangeEvent();
249 void SelectElement::menuListOnChange(SelectElementData& data, Element* element)
253 int selected = selectedIndex(data, element);
257 element->dispatchFormControlChangeEvent();
261 void SelectElement::scrollToSelection(SelectElementData& data, Element* element)
266 if (RenderObject* renderer = element->renderer())
270 void SelectElement::setOptionsChangedOnRenderer(SelectElementData& data, Element* element)
272 if (RenderObject* renderer = element->renderer()) {
280 void SelectElement::setRecalcListItems(SelectElementData& data, Element* element)
284 setOptionsChangedOnRenderer(data, element);
285 element->setNeedsStyleRecalc();
288 void SelectElement::recalcListItems(SelectElementData& data, const Element* element, bool updateSelectedStates)
290 Vector<Element*>& listItems = data.rawListItems();
296 for (Node* currentNode = element->firstChild(); currentNode;) {
298 currentNode = currentNode->traverseNextSibling(element);
302 Element* current = static_cast<Element*>(currentNode);
338 currentNode = currentNode->traverseNextSibling(element);
342 int SelectElement::selectedIndex(const SelectElementData& data, const Element* element)
347 const Vector<Element*>& items = data.listItems(element);
359 void SelectElement::setSelectedIndex(SelectElementData& data, Element* element, int optionIndex, bool deselect, bool fireOnChangeNow, bool userDrivenChange)
362 optionIndex = nextSelectableListIndex(data, element, -1);
366 const Vector<Element*>& items = data.listItems(element);
367 int listIndex = optionToListIndex(data, element, optionIndex);
369 Element* excludeElement = 0;
373 setActiveSelectionAnchorIndex(data, element, listIndex);
380 deselectItems(data, element, excludeElement);
382 // For the menu list case, this is what makes the selected element appear.
383 if (RenderObject* renderer = element->renderer())
386 scrollToSelection(data, element);
392 menuListOnChange(data, element);
393 RenderObject* renderer = element->renderer();
402 if (Frame* frame = element->document()->frame())
403 frame->page()->chrome()->client()->formStateDidChange(element);
406 int SelectElement::optionToListIndex(const SelectElementData& data, const Element* element, int optionIndex)
408 const Vector<Element*>& items = data.listItems(element);
425 int SelectElement::listToOptionIndex(const SelectElementData& data, const Element* element, int listIndex)
427 const Vector<Element*>& items = data.listItems(element);
440 Element* element)
444 saveLastSelection(data, element);
447 void SelectElement::dispatchBlurEvent(SelectElementData& data, Element* element)
452 menuListOnChange(data, element);
455 void SelectElement::deselectItems(SelectElementData& data, Element* element, Element* excludeElement)
457 const Vector<Element*>& items = data.listItems(element);
467 bool SelectElement::saveFormControlState(const SelectElementData& data, const Element* element, String& value)
469 const Vector<Element*>& items = data.listItems(element);
484 void SelectElement::restoreFormControlState(SelectElementData& data, Element* element, const String& state)
486 recalcListItems(data, element);
488 const Vector<Element*>& items = data.listItems(element);
496 setOptionsChangedOnRenderer(data, element);
499 void SelectElement::parseMultipleAttribute(SelectElementData& data, Element* element, Attribute* attribute)
503 toSelectElement(element)->updateValidity();
504 if (oldUsesMenuList != data.usesMenuList() && element->attached()) {
505 element->detach();
506 element->attach();
510 bool SelectElement::appendFormData(SelectElementData& data, Element* element, FormDataList& list)
512 const AtomicString& name = element->formControlName();
517 const Vector<Element*>& items = data.listItems(element);
533 void SelectElement::reset(SelectElementData& data, Element* element)
538 const Vector<Element*>& items = data.listItems(element);
559 setOptionsChangedOnRenderer(data, element);
560 element->setNeedsStyleRecalc();
563 void SelectElement::menuListDefaultEventHandler(SelectElementData& data, Element* element, Event* event, HTMLFormElement* htmlForm)
566 if (!element->renderer() || !event->isKeyboardEvent())
573 if (!isSpatialNavigationEnabled(element->document()->frame())) {
575 element->focus();
577 if (!element->renderer()) // Calling focus() may cause us to lose our renderer, in which case do not want to handle the event.
582 saveLastSelection(data, element);
583 if (RenderMenuList* menuList = toRenderMenuList(element->renderer()))
591 // When using spatial navigation, we want to be able to navigate away from the select element
593 if (isSpatialNavigationEnabled(element->document()->frame()))
598 const Vector<Element*>& listItems = data.listItems(element);
600 int listIndex = optionToListIndex(data, element, selectedIndex(data, element));
622 setSelectedIndex(data, element, listToOptionIndex(data, element, listIndex));
631 if (!element->renderer() || !event->isKeyboardEvent())
637 if (keyCode == ' ' && isSpatialNavigationEnabled(element->document()->frame())) {
646 element->focus();
648 if (!element->renderer()) // Calling focus() may cause us to lose our renderer, in which case do not want to handle the event.
653 saveLastSelection(data, element);
654 if (RenderMenuList* menuList = toRenderMenuList(element->renderer()))
660 element->focus();
662 if (!element->renderer()) // Calling focus() may cause us to lose our renderer, in which case do not want to handle the event.
667 saveLastSelection(data, element);
668 if (RenderMenuList* menuList = toRenderMenuList(element->renderer()))
674 menuListOnChange(data, element);
678 int listIndex = optionToListIndex(data, element, selectedIndex(data, element));
681 setSelectedIndex(data, element, listToOptionIndex(data, element, listIndex), true, true);
690 element->focus();
691 if (element->renderer() && element->renderer()->isMenuList()) {
692 if (RenderMenuList* menuList = toRenderMenuList(element->renderer())) {
698 saveLastSelection(data, element);
707 void SelectElement::updateSelectedState(SelectElementData& data, Element* element, int listIndex,
713 saveLastSelection(data, element);
720 Element* clickedElement = data.listItems(element)[listIndex];
734 deselectItems(data, element, clickedElement);
738 setActiveSelectionAnchorIndex(data, element, selectedIndex(data, element));
747 setActiveSelectionAnchorIndex(data, element, listIndex);
750 updateListBoxSelection(data, element, !multiSelect);
753 void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element* element, Event* event, HTMLFormElement* htmlForm)
755 const Vector<Element*>& listItems = data.listItems(element);
758 element->focus();
760 if (!element->renderer()) // Calling focus() may cause us to lose our renderer, in which case do not want to handle the event.
765 IntPoint localOffset = roundedIntPoint(element->renderer()->absoluteToLocal(mouseEvent->absoluteLocation(), false, true));
766 int listIndex = toRenderListBox(element->renderer())->listIndexAtOffset(localOffset.x(), localOffset.y());
769 updateSelectedState(data, element, listIndex, mouseEvent->metaKey(), mouseEvent->shiftKey());
771 updateSelectedState(data, element, listIndex, mouseEvent->ctrlKey(), mouseEvent->shiftKey());
773 if (Frame* frame = element->document()->frame())
778 } else if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton && element->document()->frame()->eventHandler()->autoscrollRenderer() != element->renderer()) {
780 listBoxOnChange(data, element);
791 int startIndex = lastSelectedListIndex(data, element);
794 endIndex = nextSelectableListIndex(data, element, startIndex);
796 endIndex = nextSelectableListIndexPageAway(data, element, startIndex, SkipForwards);
798 int startIndex = optionToListIndex(data, element, selectedIndex(data, element));
801 endIndex = previousSelectableListIndex(data, element, startIndex);
803 element, startIndex, SkipBackwards);
808 endIndex = nextSelectableListIndex(data, element, data.activeSelectionEndIndex());
811 endIndex = previousSelectableListIndex(data, element, data.activeSelectionEndIndex());
814 endIndex = nextSelectableListIndexPageAway(data, element, data.activeSelectionEndIndex(), SkipForwards);
817 endIndex = nextSelectableListIndexPageAway(data, element, data.activeSelectionEndIndex(), SkipBackwards);
822 endIndex = firstSelectableListIndex(data, element);
825 endIndex = lastSelectableListIndex(data, element);
829 if (isSpatialNavigationEnabled(element->document()->frame()))
836 saveLastSelection(data, element);
841 bool selectNewItem = !data.multiple() || static_cast<KeyboardEvent*>(event)->shiftKey() || !isSpatialNavigationEnabled(element->document()->frame());
848 deselectItems(data, element);
849 setActiveSelectionAnchorIndex(data, element, data.activeSelectionEndIndex());
852 toRenderListBox(element->renderer())->scrollToRevealElementAtListIndex(endIndex);
854 updateListBoxSelection(data, element, deselectOthers);
855 listBoxOnChange(data, element);
857 scrollToSelection(data, element);
870 } else if (data.multiple() && keyCode == ' ' && isSpatialNavigationEnabled(element->document()->frame())) {
873 updateSelectedState(data, element, listToOptionIndex(data, element, data.activeSelectionEndIndex()), true /*multi*/, false /*shift*/);
874 listBoxOnChange(data, element);
880 void SelectElement::defaultEventHandler(SelectElementData& data, Element* element, Event* event, HTMLFormElement* htmlForm)
882 if (!element->renderer())
886 menuListDefaultEventHandler(data, element, event, htmlForm);
888 listBoxDefaultEventHandler(data, element, event, htmlForm);
896 typeAheadFind(data, element, keyboardEvent);
903 int SelectElement::lastSelectedListIndex(const SelectElementData& data, const Element* element)
908 const Vector<Element*>& items = data.listItems(element);
934 void SelectElement::typeAheadFind(SelectElementData& data, Element* element, KeyboardEvent* event)
963 const Vector<Element*>& items = data.listItems(element);
968 int selected = selectedIndex(data, element);
969 int index = (optionToListIndex(data, element, selected >= 0 ? selected : 0) + searchStartOffset) % itemCount;
973 // a matching element. This code uses foldCase to work around the fact that
985 setSelectedIndex(data, element, listToOptionIndex(data, element, index));
987 listBoxOnChange(data, element);
989 setOptionsChangedOnRenderer(data, element);
990 element->setNeedsStyleRecalc();
996 void SelectElement::insertedIntoTree(SelectElementData& data, Element* element)
998 // When the element is created during document parsing, it won't have any items yet - but for innerHTML
1000 recalcListItems(data, element, true);
1003 void SelectElement::accessKeySetSelectedIndex(SelectElementData& data, Element* element, int index)
1006 if (!element->focused())
1007 element->accessKeyAction(false);
1010 const Vector<Element*>& items = data.listItems(element);
1011 int listIndex = optionToListIndex(data, element, index);
1016 setSelectedIndex(data, element, index, false, true);
1020 menuListOnChange(data, element);
1022 listBoxOnChange(data, element);
1024 scrollToSelection(data, element);
1027 unsigned SelectElement::optionCount(const SelectElementData& data, const Element* element)
1031 const Vector<Element*>& items = data.listItems(element);
1058 void SelectElementData::checkListItems(const Element* element) const
1061 Vector<Element*> items = m_listItems;
1062 SelectElement::recalcListItems(*const_cast<SelectElementData*>(this), element, false);
1065 UNUSED_PARAM(element);
1069 Vector<Element*>& SelectElementData::listItems(const Element* element)
1072 SelectElement::recalcListItems(*this, element);
1074 checkListItems(element);
1079 const Vector<Element*>& SelectElementData::listItems(const Element* element) const
1082 SelectElement::recalcListItems(*const_cast<SelectElementData*>(this), element);
1084 checkListItems(element);
1089 SelectElement* toSelectElement(Element* element)
1091 if (element->isHTMLElement() && element->hasTagName(HTMLNames::selectTag))
1092 return static_cast<HTMLSelectElement*>(element);
1095 if (element->isWMLElement() && element->hasTagName(WMLNames::selectTag))
1096 return static_cast<WMLSelectElement*>(element);