Changeset 23545 in webkit


Ignore:
Timestamp:
Jun 14, 2007 7:31:55 PM (17 years ago)
Author:
staikos
Message:

Add quite a bit of keyboard handling in editing and non-editing mode for
QtWebKit, as well as some focus fixes.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r23539 r23545  
     12007-06-14  George Staikos  <staikos@kde.org>
     2
     3        Reviewed by Lars.
     4
     5        Implement missing tab support and a slight refactor.
     6
     7        * platform/qt/PlatformKeyboardEventQt.cpp:
     8        (WebCore::keyIdentifierForQtKeyCode):
     9        (WebCore::windowsKeyCodeForKeyEvent):
     10        (WebCore::PlatformKeyboardEvent::PlatformKeyboardEvent):
     11
    1122007-06-14  Dave Hyatt  <hyatt@apple.com>
    213
  • trunk/WebCore/platform/qt/PlatformKeyboardEventQt.cpp

    r21445 r23545  
    126126        case Qt::Key_Delete:
    127127            return "U+007F";
     128        case Qt::Key_Tab:
     129            return "U+0009";
     130        case Qt::Key_Backtab:
     131            return "U+0009";
    128132        default:
    129133            return String::format("U+%04X", toupper(keyCode));
     
    169173        case Qt::Key_Backspace:
    170174            return VK_BACK; // (08) BACKSPACE key
     175        case Qt::Key_Backtab:
    171176        case Qt::Key_Tab:
    172177            return VK_TAB; // (09) TAB key
     
    428433PlatformKeyboardEvent::PlatformKeyboardEvent(QKeyEvent* event, bool isKeyUp)
    429434{
     435    const int state = event->modifiers();
    430436    m_text = event->text();
    431437    m_unmodifiedText = event->text(); // FIXME: not correct
     
    433439    m_isKeyUp = isKeyUp;
    434440    m_autoRepeat = event->isAutoRepeat();
     441    m_ctrlKey = (state & Qt::ControlModifier) != 0;
     442    m_altKey = (state & Qt::AltModifier) != 0;
     443    m_metaKey = (state & Qt::MetaModifier) != 0;   
    435444    m_WindowsKeyCode = windowsKeyCodeForKeyEvent(event->key());
    436     m_isKeypad = (event->modifiers() & Qt::KeypadModifier) != 0;
    437     m_shiftKey = (event->modifiers() & Qt::ShiftModifier) != 0;
    438     m_ctrlKey = (event->modifiers() & Qt::ControlModifier) != 0;
    439     m_altKey = (event->modifiers() & Qt::AltModifier) != 0;
    440     m_metaKey = (event->modifiers() & Qt::MetaModifier) != 0;   
     445    m_isKeypad = (state & Qt::KeypadModifier) != 0;
     446    m_shiftKey = (state & Qt::ShiftModifier) != 0 || event->key() == Qt::Key_Backtab; // Simulate Shift+Tab with Key_Backtab
    441447}
    442448
  • trunk/WebKitQt/Api/qwebframe.cpp

    r22027 r23545  
    2626#include "qwebframe_p.h"
    2727
     28#include "FocusController.h"
    2829#include "FrameLoaderClientQt.h"
    2930#include "Frame.h"
     
    3738#include "PlatformWheelEvent.h"
    3839#include "ResourceRequest.h"
     40#include "SelectionController.h"
    3941
    4042#include "markup.h"
     
    5254#include "wtf/HashMap.h"
    5355
     56#include <qdebug.h>
     57#include <qevent.h>
    5458#include <qpainter.h>
    55 #include <qevent.h>
    5659#include <qscrollbar.h>
    57 #include <qdebug.h>
    5860
    5961using namespace WebCore;
     
    6769    q->setFrameShape(QFrame::NoFrame);
    6870    q->setMouseTracking(true);
    69     q->setFocusPolicy(Qt::StrongFocus);
     71    q->setFocusPolicy(Qt::ClickFocus);
    7072    q->verticalScrollBar()->setSingleStep(20);
    7173    q->horizontalScrollBar()->setSingleStep(20);
     
    9799    vbar->setRange(0, docSize.height() - viewportSize.height());
    98100    vbar->setPageStep(viewportSize.height());
    99 }
    100 
    101 void QWebFramePrivate::_q_handleKeyEvent(QKeyEvent *ev, bool isKeyUp)
    102 {
    103     PlatformKeyboardEvent kevent(ev, isKeyUp);
    104 
    105     if (!eventHandler)
    106         return;
    107 
    108     bool handled = eventHandler->keyEvent(kevent);
    109 
    110     ev->setAccepted(handled);
    111101}
    112102
     
    284274        return;
    285275
    286     d->eventHandler->handleMousePressEvent(PlatformMouseEvent(ev, 1));
     276    if (ev->button() == Qt::RightButton)
     277        d->eventHandler->sendContextMenuEvent(PlatformMouseEvent(ev, 1));
     278    else d->eventHandler->handleMousePressEvent(PlatformMouseEvent(ev, 1));
     279    setFocus();
    287280}
    288281
     
    293286
    294287    d->eventHandler->handleMouseReleaseEvent(PlatformMouseEvent(ev, 0));
     288    setFocus();
    295289}
    296290
     
    305299    if (!accepted)
    306300        QAbstractScrollArea::wheelEvent(e);
     301    setFocus();
    307302}
    308303
    309304void QWebFrame::keyPressEvent(QKeyEvent *ev)
    310305{
    311     d->_q_handleKeyEvent(ev, false);
     306    PlatformKeyboardEvent kevent(ev, false);
     307
     308    if (!d->eventHandler)
     309        return;
     310
     311    bool handled = d->eventHandler->keyEvent(kevent);
     312    if (handled) {
     313    } else {
     314        handled = true;
     315        QScrollBar *h, *v;
     316        h = horizontalScrollBar();
     317        v = verticalScrollBar();
     318        switch (ev->key()) {
     319            case Qt::Key_Up:
     320                v->setValue(v->value() - 10);
     321                viewport()->update();
     322                break;
     323            case Qt::Key_Down:
     324                v->setValue(v->value() + 10);
     325                viewport()->update();
     326                break;
     327            case Qt::Key_Left:
     328                h->setValue(h->value() - 10);
     329                viewport()->update();
     330                break;
     331            case Qt::Key_Right:
     332                h->setValue(h->value() + 10);
     333                viewport()->update();
     334                break;
     335            case Qt::Key_PageUp:
     336                v->setValue(v->value() - viewport()->height());
     337                viewport()->update();
     338                break;
     339            case Qt::Key_PageDown:
     340                v->setValue(v->value() + viewport()->height());
     341                viewport()->update();
     342                break;
     343            default:
     344                handled = false;
     345                break;
     346        }
     347    }
     348   
     349    ev->setAccepted(handled);
    312350}
    313351
    314352void QWebFrame::keyReleaseEvent(QKeyEvent *ev)
    315353{
    316     d->_q_handleKeyEvent(ev, true);
     354    if (ev->isAutoRepeat()) {
     355        ev->setAccepted(true);
     356        return;
     357    }
     358
     359    PlatformKeyboardEvent kevent(ev, true);
     360
     361    if (!d->eventHandler)
     362        return;
     363
     364    bool handled = d->eventHandler->keyEvent(kevent);
     365    ev->setAccepted(handled);
     366}
     367
     368void QWebFrame::focusInEvent(QFocusEvent *e)
     369{
     370    if (e->reason() != Qt::PopupFocusReason) {
     371        d->frame->page()->focusController()->setFocusedFrame(d->frame);
     372        d->frame->setIsActive(true);
     373    }
     374    QAbstractScrollArea::focusInEvent(e);
     375}
     376
     377void QWebFrame::focusOutEvent(QFocusEvent *e)
     378{
     379    QAbstractScrollArea::focusOutEvent(e);
     380    if (e->reason() != Qt::PopupFocusReason) {
     381        d->frame->selectionController()->clear();
     382        d->frame->setIsActive(false);
     383    }
     384}
     385
     386bool QWebFrame::focusNextPrevChild(bool next)
     387{
     388    Q_UNUSED(next)
     389    return false;
    317390}
    318391
     
    323396    viewport()->scroll(dx, dy);
    324397}
     398
  • trunk/WebKitQt/Api/qwebframe.h

    r21180 r23545  
    7373    virtual void keyReleaseEvent(QKeyEvent*);
    7474    virtual void scrollContentsBy(int dx, int dy);
     75    virtual void focusInEvent(QFocusEvent *e);
     76    virtual void focusOutEvent(QFocusEvent *e);
     77    virtual bool focusNextPrevChild(bool next);
    7578   
    7679private:
  • trunk/WebKitQt/Api/qwebframe_p.h

    r19823 r23545  
    7373
    7474    void _q_adjustScrollbars();
    75     void _q_handleKeyEvent(QKeyEvent *ev, bool isKeyUp);
    7675
    7776    QWebFrame *q;
  • trunk/WebKitQt/ChangeLog

    r23528 r23545  
     12007-06-14  George Staikos  <staikos@kde.org>
     2
     3        Reviewed by Lars.
     4
     5        Implement most of the editing commands, better focus handling, fix some
     6        keyboard and mouse handling, and add keyboard navigation.  May be
     7        refactored later as the key switches are ugly.
     8
     9        * Api/qwebframe.cpp:
     10        (QWebFramePrivate::init):
     11        (QWebFrame::mousePressEvent):
     12        (QWebFrame::mouseReleaseEvent):
     13        (QWebFrame::wheelEvent):
     14        (QWebFrame::keyPressEvent):
     15        (QWebFrame::keyReleaseEvent):
     16        (QWebFrame::focusInEvent):
     17        (QWebFrame::focusOutEvent):
     18        (QWebFrame::focusNextPrevChild):
     19        * Api/qwebframe.h:
     20        * Api/qwebframe_p.h:
     21        * WebCoreSupport/EditorClientQt.cpp:
     22        (WebCore::EditorClientQt::handleKeypress):
     23
    1242007-06-14  George Staikos  <staikos@kde.org>
    225
  • trunk/WebKitQt/WebCoreSupport/EditorClientQt.cpp

    r21827 r23545  
    3434#include "qwebpage_p.h"
    3535
     36#include "Document.h"
    3637#include "EditCommandQt.h"
    3738#include "Editor.h"
     
    217218{
    218219    Frame* frame = m_page->d->page->focusController()->focusedOrMainFrame();
    219     if (!frame)
     220    if (!frame || !frame->document()->focusedNode())
    220221        return;
    221222
    222223    const PlatformKeyboardEvent* kevent = event->keyEvent();
    223     if (kevent && !kevent->isKeyUp()) {
    224         Node* start = frame->selectionController()->start().node();
    225         if (start && start->isContentEditable()) {
    226             switch(kevent->WindowsKeyCode()) {
     224    if (kevent->isKeyUp())
     225        return;
     226
     227    Node* start = frame->selectionController()->start().node();
     228    if (!start)
     229        return;
     230
     231    // FIXME: refactor all of this to use Actions or something like them
     232    if (start->isContentEditable()) {
     233        switch(kevent->WindowsKeyCode()) {
     234            case VK_RETURN:
     235                frame->editor()->execCommand("InsertLineBreak");
     236                break;
    227237            case VK_BACK:
    228238                frame->editor()->deleteWithDirection(SelectionController::BACKWARD,
    229                                                      CharacterGranularity, false, true);
     239                        CharacterGranularity, false, true);
    230240                break;
    231241            case VK_DELETE:
    232242                frame->editor()->deleteWithDirection(SelectionController::FORWARD,
    233                                                      CharacterGranularity, false, true);
     243                        CharacterGranularity, false, true);
    234244                break;
    235245            case VK_LEFT:
     
    253263                else frame->editor()->execCommand("MoveDown");
    254264                break;
    255             case VK_RETURN:
    256                 frame->editor()->insertLineBreak();
    257                 break;
     265            case VK_PRIOR:  // PageUp
     266                frame->editor()->execCommand("MoveUpByPageAndModifyCaret");
     267                break;
     268            case VK_NEXT:  // PageDown
     269                frame->editor()->execCommand("MoveDownByPageAndModifyCaret");
     270                break;
     271            case VK_TAB:
     272                return;
    258273            default:
    259                 if (!kevent->ctrlKey() && !kevent->altKey())
     274                if (!kevent->ctrlKey() && !kevent->altKey() && !kevent->text().isEmpty()) {
    260275                    frame->editor()->insertText(kevent->text(), event);
    261             }
    262             event->setDefaultHandled();
     276                } else if (kevent->ctrlKey()) {
     277                    switch (kevent->WindowsKeyCode()) {
     278                        case VK_A:
     279                            frame->editor()->execCommand("SelectAll");
     280                            break;
     281                        case VK_B:
     282                            frame->editor()->execCommand("ToggleBold");
     283                            break;
     284                        case VK_C:
     285                            frame->editor()->execCommand("Copy");
     286                            break;
     287                        case VK_I:
     288                            frame->editor()->execCommand("ToggleItalic");
     289                            break;
     290                        case VK_V:
     291                            frame->editor()->execCommand("Paste");
     292                            break;
     293                        case VK_X:
     294                            frame->editor()->execCommand("Cut");
     295                            break;
     296                        case VK_Y:
     297                            frame->editor()->execCommand("Redo");
     298                            break;
     299                        case VK_Z:
     300                            frame->editor()->execCommand("Undo");
     301                            break;
     302                        default:
     303                            return;
     304                    }
     305                } else return;
     306        }
     307    } else {
     308        switch (kevent->WindowsKeyCode()) {
     309            case VK_UP:
     310                frame->editor()->execCommand("MoveUp");
     311                break;
     312            case VK_DOWN:
     313                frame->editor()->execCommand("MoveDown");
     314                break;
     315            case VK_PRIOR:  // PageUp
     316                frame->editor()->execCommand("MoveUpByPageAndModifyCaret");
     317                break;
     318            case VK_NEXT:  // PageDown
     319                frame->editor()->execCommand("MoveDownByPageAndModifyCaret");
     320                break;
     321            case VK_HOME:
     322                if (kevent->ctrlKey())
     323                    frame->editor()->execCommand("MoveToBeginningOfDocument");
     324                break;
     325            case VK_END:
     326                if (kevent->ctrlKey())
     327                    frame->editor()->execCommand("MoveToEndOfDocument");
     328                break;
     329            default:
     330                if (kevent->ctrlKey()) {
     331                    switch(kevent->WindowsKeyCode()) {
     332                        case VK_A:
     333                            frame->editor()->execCommand("SelectAll");
     334                            break;
     335                        case VK_C: case VK_X:
     336                            frame->editor()->execCommand("Copy");
     337                            break;
     338                        default:
     339                            return;
     340                    }
     341                } else return;
    263342        }
    264343    }
     344    event->setDefaultHandled();
    265345}
    266346
Note: See TracChangeset for help on using the changeset viewer.