CVS commit by tanton: - allow labels to get focused - let labels react on space, return and enter release events by activating their target - make textarea activation work when the accesskey of the corresponding label is pressed M +6 -1 khtmlview.cpp 1.644 M +20 -10 html/html_formimpl.cpp 1.374 M +2 -1 html/html_formimpl.h 1.154 --- kdelibs/khtml/khtmlview.cpp #1.643:1.644 @@ -1870,4 +1870,9 @@ bool KHTMLView::focusNodeWithAccessKey( Node guard( node ); if( node->isSelectable()) { + if (node->id()==ID_LABEL) { + // if Accesskey is a label, give focus to the label's referrer. + node=static_cast(static_cast< HTMLLabelElementImpl* >( node )->getFormElement()); + if (!node) return true; + } // Set focus node on the document m_part->xmlDocImpl()->setFocusNode(node); @@ -1898,5 +1903,5 @@ bool KHTMLView::focusNodeWithAccessKey( break; case ID_TEXTAREA: - break; // just focusing it is enough + m_part->xmlDocImpl()->setFocusNode(node); case ID_LEGEND: // TODO --- kdelibs/khtml/html/html_formimpl.cpp #1.373:1.374 @@ -1603,10 +1603,19 @@ return newNode; void HTMLLabelElementImpl::defaultEventHandler(EventImpl *evt) - { - if ( !m_disabled && - evt->isMouseEvent() && evt->id() == EventImpl::CLICK_EVENT){ +{ + if ( !m_disabled ) { + bool act = false; + if ( evt->id() == EventImpl::CLICK_EVENT ) { + act = true; + } + else if ( evt->id() == EventImpl::KEYUP_EVENT ) { + QKeyEvent *ke = static_cast(evt)->qKeyEvent; + if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Space)) + act = true; + } + + if (act) { NodeImpl *formNode=getFormElement(); - if (formNode) - { + if (formNode) { getDocument()->setFocusNode(formNode); if (formNode->id()==ID_INPUT) @@ -1615,4 +1624,5 @@ void HTMLLabelElementImpl::defaultEventH evt->setDefaultHandled(); } + } HTMLGenericFormElementImpl::defaultEventHandler(evt); } --- kdelibs/khtml/html/html_formimpl.h #1.153:1.154 @@ -321,4 +321,5 @@ public: virtual void attach(); virtual void defaultEventHandler(EventImpl *evt); + virtual bool isSelectable() const { return true; } NodeImpl* getFormElement();