📄 khtmlview.cpp.orig
字号:
} m_part->setStatusBarText(status.arg(d->findString.lower()), KHTMLPart::BarDefaultText);}void KHTMLView::updateFindAheadTimeout(){ if( d->typeAheadActivated ) d->timer.start( 3000, true );}#endif // KHTML_NO_TYPE_AHEAD_FINDvoid KHTMLView::keyReleaseEvent(QKeyEvent *_ke){#ifndef KHTML_NO_TYPE_AHEAD_FIND if(d->typeAheadActivated) { _ke->accept(); return; }#endif if (d->m_caretViewContext && d->m_caretViewContext->keyReleasePending) { //caretKeyReleaseEvent(_ke); d->m_caretViewContext->keyReleasePending = false; return; } if( d->scrollSuspendPreActivate && _ke->key() != Key_Shift ) d->scrollSuspendPreActivate = false; if( _ke->key() == Key_Shift && d->scrollSuspendPreActivate && _ke->state() == Qt::ShiftButton && !(KApplication::keyboardMouseState() & Qt::ShiftButton)) if (d->scrollTimerId) d->scrollSuspended = !d->scrollSuspended; if (d->accessKeysEnabled) { if (d->accessKeysPreActivate && _ke->key() != Key_Control) d->accessKeysPreActivate=false; if (d->accessKeysPreActivate && _ke->state() == Qt::ControlButton && !(KApplication::keyboardMouseState() & Qt::ControlButton)) { displayAccessKeys(); m_part->setStatusBarText(i18n("Access Keys activated"),KHTMLPart::BarOverrideText); d->accessKeysActivated = true; d->accessKeysPreActivate = false; _ke->accept(); return; } else if (d->accessKeysActivated) { accessKeysTimeout(); _ke->accept(); return; } } // Send keyup event if ( dispatchKeyEvent( _ke ) ) { _ke->accept(); return; } QScrollView::keyReleaseEvent(_ke);}void KHTMLView::contentsContextMenuEvent ( QContextMenuEvent * /*ce*/ ){// ### what kind of c*** is that ?#if 0 if (!m_part->xmlDocImpl()) return; int xm = _ce->x(); int ym = _ce->y(); DOM::NodeImpl::MouseEvent mev( _ce->state(), DOM::NodeImpl::MouseMove ); // ### not a mouse event! m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, &mev ); NodeImpl *targetNode = mev.innerNode.handle(); if (targetNode && targetNode->renderer() && targetNode->renderer()->isWidget()) { int absx = 0; int absy = 0; targetNode->renderer()->absolutePosition(absx,absy); QPoint pos(xm-absx,ym-absy); QWidget *w = static_cast<RenderWidget*>(targetNode->renderer())->widget(); QContextMenuEvent cme(_ce->reason(),pos,_ce->globalPos(),_ce->state()); setIgnoreEvents(true); QApplication::sendEvent(w,&cme); setIgnoreEvents(false); }#endif}bool KHTMLView::focusNextPrevChild( bool next ){ // Now try to find the next child if (m_part->xmlDocImpl() && focusNextPrevNode(next)) { if (m_part->xmlDocImpl()->focusNode()) kdDebug() << "focusNode.name: " << m_part->xmlDocImpl()->focusNode()->nodeName().string() << endl; return true; // focus node found } // If we get here, pass tabbing control up to the next/previous child in our parent d->pseudoFocusNode = KHTMLViewPrivate::PFNone; if (m_part->parentPart() && m_part->parentPart()->view()) return m_part->parentPart()->view()->focusNextPrevChild(next); 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 );#ifndef KHTML_NO_SELECTION // extend the selection while scrolling DOM::Node innerNode; if (m_part->isExtendingSelection()) { RenderObject::NodeInfo renderInfo(true/*readonly*/, false/*active*/); m_part->xmlDocImpl()->renderer()->layer() ->nodeAtPoint(renderInfo, xm, ym); innerNode = renderInfo.innerNode(); }/*end if*/ if (innerNode.handle() && innerNode.handle()->renderer()) { int absX, absY; innerNode.handle()->renderer()->absolutePosition(absX, absY); m_part->extendSelectionTo(xm, ym, absX, absY, innerNode); }/*end if*/#endif // KHTML_NO_SELECTION }}class HackWidget : public QWidget{ public: inline void setNoErase() { setWFlags(getWFlags()|WRepaintNoErase); }};bool KHTMLView::eventFilter(QObject *o, QEvent *e){ if ( e->type() == QEvent::AccelOverride ) { QKeyEvent* ke = (QKeyEvent*) e;//kdDebug(6200) << "QEvent::AccelOverride" << endl; if (m_part->isEditable() || m_part->isCaretMode() || (m_part->xmlDocImpl() && m_part->xmlDocImpl()->focusNode() && m_part->xmlDocImpl()->focusNode()->contentEditable())) {//kdDebug(6200) << "editable/navigable" << endl; if ( (ke->state() & ControlButton) || (ke->state() & ShiftButton) ) { switch ( ke->key() ) { case Key_Left: case Key_Right: case Key_Up: case Key_Down: case Key_Home: case Key_End: ke->accept();//kdDebug(6200) << "eaten" << endl; return true; default: break; } } } } if ( e->type() == QEvent::Leave && d->cursor_icon_widget ) d->cursor_icon_widget->hide(); QWidget *view = viewport(); if (o == view) { // we need to install an event filter on all children of the viewport to // be able to get correct stacking of children within the document. if(e->type() == QEvent::ChildInserted) { QObject *c = static_cast<QChildEvent *>(e)->child(); if (c->isWidgetType()) { QWidget *w = static_cast<QWidget *>(c); // don't install the event filter on toplevels if (w->parentWidget(true) == view) { if (!strcmp(w->name(), "__khtml")) { w->installEventFilter(this); w->unsetCursor(); if (!::qt_cast<QFrame*>(w)) w->setBackgroundMode( QWidget::NoBackground ); static_cast<HackWidget *>(w)->setNoErase(); if (w->children()) { QObjectListIterator it(*w->children()); for (; it.current(); ++it) { QWidget *widget = ::qt_cast<QWidget *>(it.current()); if (widget && !widget->isTopLevel()) { if (!::qt_cast<QFrame*>(w)) widget->setBackgroundMode( QWidget::NoBackground ); static_cast<HackWidget *>(widget)->setNoErase(); widget->installEventFilter(this); } } } } } } } } else if (o->isWidgetType()) { QWidget *v = static_cast<QWidget *>(o); QWidget *c = v; while (v && v != view) { c = v; v = v->parentWidget(true); } if (v && !strcmp(c->name(), "__khtml")) { bool block = false; QWidget *w = static_cast<QWidget *>(o); switch(e->type()) { case QEvent::Paint: if (!allowWidgetPaintEvents) { // eat the event. Like this we can control exactly when the widget // get's repainted. block = true; int x = 0, y = 0; QWidget *v = w; while (v && v != view) { x += v->x(); y += v->y(); v = v->parentWidget(); } viewportToContents( x, y, x, y ); QPaintEvent *pe = static_cast<QPaintEvent *>(e); bool asap = !d->contentsMoving && ::qt_cast<QScrollView *>(c); // QScrollView needs fast repaints if ( asap && !d->painting && m_part->xmlDocImpl() && m_part->xmlDocImpl()->renderer() && !static_cast<khtml::RenderCanvas *>(m_part->xmlDocImpl()->renderer())->needsLayout() ) { repaintContents(x + pe->rect().x(), y + pe->rect().y(), pe->rect().width(), pe->rect().height(), true); } else { scheduleRepaint(x + pe->rect().x(), y + pe->rect().y(), pe->rect().width(), pe->rect().height(), asap); } } break; case QEvent::MouseMove: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: { if (w->parentWidget() == view && !::qt_cast<QScrollBar *>(w)) { QMouseEvent *me = static_cast<QMouseEvent *>(e); QPoint pt = (me->pos() + w->pos()); QMouseEvent me2(me->type(), pt, me->button(), me->state()); if (e->type() == QEvent::MouseMove) viewportMouseMoveEvent(&me2); else if(e->type() == QEvent::MouseButtonPress) viewportMousePressEvent(&me2); else if(e->type() == QEvent::MouseButtonRelease) viewportMouseReleaseEvent(&me2); else viewportMouseDoubleClickEvent(&me2); block = true; } break; } case QEvent::KeyPress: case QEvent::KeyRelease: if (w->parentWidget() == view && !::qt_cast<QScrollBar *>(w)) { QKeyEvent *ke = static_cast<QKeyEvent *>(e); if (e->type() == QEvent::KeyPress) keyPressEvent(ke); else keyReleaseEvent(ke); block = true; } default: break; } if (block) { //qDebug("eating event"); return true; } } }// kdDebug(6000) <<"passing event on to sv event filter object=" << o->className() << " event=" << e->type() << endl; return QScrollView::eventFilter(o, e);}DOM::NodeImpl *KHTMLView::nodeUnderMouse() const{ return d->underMouse;}DOM::NodeImpl *KHTMLView::nonSharedNodeUnderMouse() const{ return d->underMouseNonShared;}bool KHTMLView::scrollTo(const QRect &bounds){ d->scrollingSelf = true; // so scroll events get ignored 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); d->scrollingSelf = false; if ( (abs(deltax)<=maxx) && (abs(deltay)<=maxy) ) return true; else return false;}bool KHTMLView::focusNextPrevNode(bool next){ // Sets the focus node of the document to be the node after (or if // next is false, before) the current focus node. Only nodes that // are selectable (i.e. for which isFocusable() returns true) are // taken into account, and the order used is that specified in the // HTML spec (see DocumentImpl::nextFocusNode() and // DocumentImpl::previousFocusNode() for details). DocumentImpl *doc = m_part->xmlDocImpl(); NodeImpl *oldFocusNode = doc->focusNode();#if 1 // If the user has scrolled the document, then instead of picking // the next focusable node in the document, use the first one that // is within the visible area (if possible). if (d->scrollBarMoved) { NodeImpl *toFocus; if (next) toFocus = doc->nextFocusNode(oldFocusNode); else toFocus = doc->previousFocusNode(oldFocusNode); if (!toFocus && oldFocusNode) if (next)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -