⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 khtmlview.cpp

📁 将konqueror浏览器移植到ARM9 2410中
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -