📄 khtmlview.cpp
字号:
viewportToContents(_mouse->x(), _mouse->y(), xm, ym); //kdDebug( 6000 ) << "mouseDblClickEvent: x=" << xm << ", y=" << ym << endl; d->isDoubleClick = true; DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MouseDblClick ); m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, 0, 0, &mev ); // We do the same thing as viewportMousePressEvent() here, since the DOM does not treat // single and double-click events as separate (only the detail, i.e. number of clicks differs) // In other words an even detail value for a mouse click event means a double click, and an // odd detail value means a single click if (d->clickCount > 0 && d->clickX == xm && d->clickY == ym) // ### support mouse threshold d->clickCount++; else { d->clickCount = 1; d->clickX = xm; d->clickY = ym; } dispatchMouseEvent(EventImpl::MOUSEDOWN_EVENT,mev.innerNode.handle(),true, d->clickCount,_mouse,true,DOM::NodeImpl::MouseDblClick); if (mev.innerNode.handle()) mev.innerNode.handle()->setPressed(); khtml::MouseDoubleClickEvent event( _mouse, xm, ym, mev.url, mev.innerNode ); event.setNodePos( mev.nodeAbsX, mev.nodeAbsY ); QApplication::sendEvent( m_part, &event ); // ### //if ( url.length() ) //emit doubleClick( url.string(), _mouse->button() );}void KHTMLView::viewportMouseMoveEvent( QMouseEvent * _mouse ){ if(!m_part->xmlDocImpl()) return; int xm, ym; viewportToContents(_mouse->x(), _mouse->y(), xm, ym); DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MouseMove ); m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, 0, 0, &mev ); dispatchMouseEvent(EventImpl::MOUSEMOVE_EVENT,mev.innerNode.handle(),false, 0,_mouse,true,DOM::NodeImpl::MouseMove); if (d->clickCount > 0 && QPoint(d->clickX-xm,d->clickY-ym).manhattanLength() > QApplication::startDragDistance()) { d->clickCount = 0; // moving the mouse outside the threshold invalidates the click } // execute the scheduled script. This is to make sure the mouseover events come after the mouseout events m_part->executeScheduledScript(); QCursor c = KCursor::arrowCursor(); if ( !mev.innerNode.isNull() && mev.innerNode.handle()->style() ) { khtml::RenderStyle* style = mev.innerNode.handle()->style(); if ((style->cursor() == CURSOR_AUTO) && (style->cursorImage()) && !(style->cursorImage()->pixmap().isNull())) { /* First of all it works: Check out http://www.iam.unibe.ch/~schlpbch/cursor.html * * But, I don't know what exactly we have to do here: rescale to 32*32, change to monochrome.. */ //kdDebug( 6000 ) << "using custom cursor" << endl; const QPixmap p = style->cursorImage()->pixmap(); // ### fix c = QCursor(p); } else { switch ( style->cursor() ) { case CURSOR_AUTO: if ( mev.url.length() && const_cast<KHTMLSettings *>(m_part->settings())->changeCursor() ) c = m_part->urlCursor(); break; case CURSOR_CROSS: c = KCursor::crossCursor(); break; case CURSOR_POINTER: c = m_part->urlCursor(); break; case CURSOR_MOVE: c = KCursor::sizeAllCursor(); break; case CURSOR_E_RESIZE: case CURSOR_W_RESIZE: c = KCursor::sizeHorCursor(); break; case CURSOR_N_RESIZE: case CURSOR_S_RESIZE: c = KCursor::sizeVerCursor(); break; case CURSOR_NE_RESIZE: case CURSOR_SW_RESIZE: c = KCursor::sizeBDiagCursor(); break; case CURSOR_NW_RESIZE: case CURSOR_SE_RESIZE: c = KCursor::sizeFDiagCursor(); break; case CURSOR_TEXT: c = KCursor::ibeamCursor(); break; case CURSOR_WAIT: c = KCursor::waitCursor(); break; case CURSOR_HELP: case CURSOR_DEFAULT: break; } } } viewport()->setCursor( c ); d->prevMouseX = xm; d->prevMouseY = ym; khtml::MouseMoveEvent event( _mouse, xm, ym, mev.url, mev.innerNode ); event.setNodePos( mev.nodeAbsX, mev.nodeAbsY ); QApplication::sendEvent( m_part, &event );}void KHTMLView::viewportMouseReleaseEvent( QMouseEvent * _mouse ){ if ( !m_part->xmlDocImpl() ) return; int xm, ym; viewportToContents(_mouse->x(), _mouse->y(), xm, ym); //kdDebug( 6000 ) << "\nmouseReleaseEvent: x=" << xm << ", y=" << ym << endl; DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MouseRelease ); m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, 0, 0, &mev ); dispatchMouseEvent(EventImpl::MOUSEUP_EVENT,mev.innerNode.handle(),true, d->clickCount,_mouse,false,DOM::NodeImpl::MouseRelease); if (d->clickCount > 0 && QPoint(d->clickX-xm,d->clickY-ym).manhattanLength() <= QApplication::startDragDistance()) dispatchMouseEvent(EventImpl::CLICK_EVENT,mev.innerNode.handle(),true, d->clickCount,_mouse,true,DOM::NodeImpl::MouseRelease); if (mev.innerNode.handle()) mev.innerNode.handle()->setPressed(false); khtml::MouseReleaseEvent event( _mouse, xm, ym, mev.url, mev.innerNode ); event.setNodePos( mev.nodeAbsX, mev.nodeAbsY ); QApplication::sendEvent( m_part, &event );}void KHTMLView::keyPressEvent( QKeyEvent *_ke ){// if(m_part->keyPressHook(_ke)) return; int offs = (clipper()->height() < 30) ? clipper()->height() : 30; if (_ke->state()&ShiftButton) switch(_ke->key()) { case Key_Space: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( 0, -clipper()->height() - offs ); break; } else switch ( _ke->key() ) { case Key_Down: case Key_J: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( 0, 10 ); break; case Key_Space: case Key_Next: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( 0, clipper()->height() - offs ); break; case Key_Up: case Key_K: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( 0, -10 ); break; case Key_Prior: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( 0, -clipper()->height() + offs ); break; case Key_Right: case Key_L: if ( d->hmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( 10, 0 ); break; case Key_Left: case Key_H: if ( d->hmode == QScrollView::AlwaysOff ) _ke->accept(); else scrollBy( -10, 0 ); break; case Key_Enter: case Key_Return: // ### FIXME: // move this code to HTMLAnchorElementImpl::setPressed(false), // or even better to HTMLAnchorElementImpl::event() if (m_part->xmlDocImpl()) { ElementImpl *e = m_part->xmlDocImpl()->focusNode(); if (e) e->setActive(); d->originalNode = e; } break; case Key_Home: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else setContentsPos( 0, 0 ); break; case Key_End: if ( d->vmode == QScrollView::AlwaysOff ) _ke->accept(); else setContentsPos( 0, contentsHeight() - visibleHeight() ); break; default: _ke->ignore(); return; } _ke->accept();}void KHTMLView::keyReleaseEvent( QKeyEvent *_ke ){ switch(_ke->key()) { case Key_Enter: case Key_Return: // ### FIXME: // move this code to HTMLAnchorElementImpl::setPressed(false), // or even better to HTMLAnchorElementImpl::event() if (m_part->xmlDocImpl()) { ElementImpl *e = m_part->xmlDocImpl()->focusNode(); if (e && e==d->originalNode && (e->id()==ID_A || e->id()==ID_AREA)) { HTMLAnchorElementImpl *a = static_cast<HTMLAnchorElementImpl *>(e); emit m_part->urlSelected( a->areaHref().string(), LeftButton, 0, a->targetRef().string() ); } if (e) e->setActive(false); } return; break; } // if(m_part->keyReleaseHook(_ke)) return; QScrollView::keyReleaseEvent( _ke);}bool KHTMLView::focusNextPrevChild( bool next ){ if (focusWidget()!=this) setFocus(); if (m_part->xmlDocImpl() && gotoLink(next)) return true; if (m_part->parentPart() && m_part->parentPart()->view()) return m_part->parentPart()->view()->focusNextPrevChild(next); m_part->overURL(QString(), 0); return QWidget::focusNextPrevChild(next);}void KHTMLView::doAutoScroll(){ QPoint pos = QCursor::pos(); pos = viewport()->mapFromGlobal( pos ); int xm, ym; viewportToContents(pos.x(), pos.y(), xm, ym); pos = QPoint(pos.x() - viewport()->x(), pos.y() - viewport()->y()); if ( (pos.y() < 0) || (pos.y() > visibleHeight()) || (pos.x() < 0) || (pos.x() > visibleWidth()) ) { ensureVisible( xm, ym, 0, 5 ); }}DOM::NodeImpl *KHTMLView::nodeUnderMouse() const{ return d->underMouse;}bool KHTMLView::scrollTo(const QRect &bounds){ int x, y, xe, ye; x = bounds.left(); y = bounds.top(); xe = bounds.right(); ye = bounds.bottom(); kdDebug(6000)<<"scrolling coords: x="<<x<<" y="<<y<<" width="<<xe-x<<" height="<<ye-y<<endl; int deltax; int deltay; int curHeight = visibleHeight(); int curWidth = visibleWidth(); if (ye-y>curHeight-d->borderY) ye = y + curHeight - d->borderY; if (xe-x>curWidth-d->borderX) xe = x + curWidth - d->borderX; // is xpos of target left of the view's border? if (x < contentsX() + d->borderX ) deltax = x - contentsX() - d->borderX; // is xpos of target right of the view's right border? else if (xe + d->borderX > contentsX() + curWidth) deltax = xe + d->borderX - ( contentsX() + curWidth ); else deltax = 0; // is ypos of target above upper border? if (y < contentsY() + d->borderY) deltay = y - contentsY() - d->borderY; // is ypos of target below lower border? else if (ye + d->borderY > contentsY() + curHeight) deltay = ye + d->borderY - ( contentsY() + curHeight ); else deltay = 0; int maxx = curWidth-d->borderX; int maxy = curHeight-d->borderY; int scrollX,scrollY; scrollX = deltax > 0 ? (deltax > maxx ? maxx : deltax) : deltax == 0 ? 0 : (deltax>-maxx ? deltax : -maxx); scrollY = deltay > 0 ? (deltay > maxy ? maxy : deltay) : deltay == 0 ? 0 : (deltay>-maxy ? deltay : -maxy); if (contentsX() + scrollX < 0) scrollX = -contentsX(); else if (contentsWidth() - visibleWidth() - contentsX() < scrollX) scrollX = contentsWidth() - visibleWidth() - contentsX(); if (contentsY() + scrollY < 0) scrollY = -contentsY(); else if (contentsHeight() - visibleHeight() - contentsY() < scrollY) scrollY = contentsHeight() - visibleHeight() - contentsY(); scrollBy(scrollX, scrollY); // generate abs(scroll.) if (scrollX<0) scrollX=-scrollX; if (scrollY<0) scrollY=-scrollY; if ( (scrollX!=maxx) && (scrollY!=maxy) ) return true; else return false;}bool KHTMLView::gotoLink(bool forward){ if (!m_part->xmlDocImpl()) return false; ElementImpl *currentNode = m_part->xmlDocImpl()->focusNode(); ElementImpl *nextTarget = m_part->xmlDocImpl()->findNextLink(currentNode, forward); if (!currentNode && !d->borderTouched) { d->borderStart = forward; d->borderTouched = true; if (contentsY() != (forward?0:(contentsHeight()-visibleHeight()))) { setContentsPos(contentsX(), (forward?0:contentsHeight())); if (nextTarget) { QRect nextRect = nextTarget->getRect(); if (nextRect.top() < contentsY() || nextRect.bottom() > contentsY()+visibleHeight()) return true; } else return true; } } if (!nextTarget || (!currentNode && d->borderStart != forward)) nextTarget = 0; QRect nextRect; if (nextTarget) nextRect = nextTarget->getRect(); else nextRect = QRect(contentsX()+visibleWidth()/2, (forward?contentsHeight():0), 0, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -