Improve popup menu behavior.
* html/HTMLSelectElement.cpp:
(WebCore::HTMLSelectElement::HTMLSelectElement): Cache
m_lastOnChangeIndex so we know when to fire onChange.
(WebCore::HTMLSelectElement::setSelectedIndex): Added parameter to
specify whether we should fire onChange.
(WebCore::HTMLSelectElement::dispatchBlurEvent): Fire onChange on blur.
(WebCore::HTMLSelectElement::menuListDefaultEventHandler): Fire
onChange when using the Enter key to change the selection.
* html/HTMLSelectElement.h:
* rendering/RenderMenuList.cpp:
(WebCore::RenderMenuList::updateFromElement): Extract setText logic
into its own method.
(WebCore::RenderMenuList::setTextFromOption): New method.
(WebCore::RenderMenuList::valueChanged): Let setSelectedIndex call
onChange instead of calling it directly here.
* rendering/RenderMenuList.h:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16977
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-10-10 Adam Roben <aroben@apple.com>
+
+ Reviewed by Adele.
+
+ Improve popup menu behavior.
+
+ * html/HTMLSelectElement.cpp:
+ (WebCore::HTMLSelectElement::HTMLSelectElement): Cache
+ m_lastOnChangeIndex so we know when to fire onChange.
+ (WebCore::HTMLSelectElement::setSelectedIndex): Added parameter to
+ specify whether we should fire onChange.
+ (WebCore::HTMLSelectElement::dispatchBlurEvent): Fire onChange on blur.
+ (WebCore::HTMLSelectElement::menuListDefaultEventHandler): Fire
+ onChange when using the Enter key to change the selection.
+ * html/HTMLSelectElement.h:
+ * rendering/RenderMenuList.cpp:
+ (WebCore::RenderMenuList::updateFromElement): Extract setText logic
+ into its own method.
+ (WebCore::RenderMenuList::setTextFromOption): New method.
+ (WebCore::RenderMenuList::valueChanged): Let setSelectedIndex call
+ onChange instead of calling it directly here.
+ * rendering/RenderMenuList.h:
+
2006-10-10 Adele Peterson <adele@apple.com>
Reviewed by Beth.
, m_size(0)
, m_multiple(false)
, m_recalcListItems(false)
+ , m_lastOnChangeIndex(0)
{
document()->registerFormElementWithState(this);
}
}
}
-void HTMLSelectElement::setSelectedIndex(int index, bool deselect)
+void HTMLSelectElement::setSelectedIndex(int index, bool deselect, bool fireOnChange)
{
const Vector<HTMLElement*>& items = listItems();
int listIndex = optionToListIndex(index);
}
if (deselect)
deselectItems(element);
+ if (fireOnChange) {
+ m_lastOnChangeIndex = index;
+ onChange();
+ }
}
int HTMLSelectElement::length() const
setChanged(true);
}
+void HTMLSelectElement::dispatchBlurEvent()
+{
+#if !ARROW_KEYS_POP_MENU
+ if (selectedIndex() != m_lastOnChangeIndex) {
+ m_lastOnChangeIndex = selectedIndex();
+ onChange();
+ }
+#endif
+ HTMLGenericFormElement::dispatchBlurEvent();
+}
void HTMLSelectElement::defaultEventHandler(Event* evt)
{
if (usesMenuList())
if (index > 0)
setSelectedIndex(--index);
handled = true;
+ } else if (keyIdentifier == "Enter" && index != m_lastOnChangeIndex) {
+ setSelectedIndex(index, true, true);
}
+
#endif
if (handled)
evt->setDefaultHandled();
virtual void recalcStyle(StyleChange);
+ virtual void dispatchBlurEvent();
+
int selectedIndex() const;
- void setSelectedIndex(int index, bool deselect = true);
+ void setSelectedIndex(int index, bool deselect = true, bool fireOnChange = false);
void notifyOptionSelected(HTMLOptionElement* selectedOption, bool selected);
virtual bool isEnumeratable() const { return true; }
int m_size;
bool m_multiple;
mutable bool m_recalcListItems;
+ int m_lastOnChangeIndex;
HTMLCollection::CollectionInfo m_collectionInfo;
};
m_optionsChanged = false;
}
- int i = select->optionToListIndex(select->selectedIndex());
+ setTextFromOption(select->selectedIndex());
+}
+
+void RenderMenuList::setTextFromOption(int optionIndex)
+{
+ HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node());
+ const Vector<HTMLElement*>& listItems = select->listItems();
+ int size = listItems.size();
+
+ int i = select->optionToListIndex(optionIndex);
String text = "";
if (i >= 0 && i < size) {
HTMLElement* element = listItems[i];
m_popupIsVisible = false;
}
-void RenderMenuList::valueChanged(unsigned listIndex)
+void RenderMenuList::valueChanged(unsigned listIndex, bool fireOnChange)
{
HTMLSelectElement* select = static_cast<HTMLSelectElement*>(node());
- select->setSelectedIndex(select->listToOptionIndex(listIndex));
- select->onChange();
+ select->setSelectedIndex(select->listToOptionIndex(listIndex), true, fireOnChange);
}
}
void hidePopup();
void setOptionsChanged(bool c) { m_optionsChanged = c; }
- void valueChanged(unsigned listIndex);
+ void valueChanged(unsigned listIndex, bool fireOnChange = true);
String text();
+ void setTextFromOption(int optionIndex);
protected:
virtual bool hasLineIfEmpty() const { return true; }