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

📄 render_canvas.cpp

📁 konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版本源码包.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
static QRect enclosingPositionedRect (RenderObject *n){    RenderObject *enclosingParent =  n->containingBlock();    QRect rect(0,0,0,0);    if (enclosingParent) {        int ox, oy;        enclosingParent->absolutePosition(ox, oy);        rect.setX(ox);        rect.setY(oy);        rect.setWidth (enclosingParent->effectiveWidth());        rect.setHeight (enclosingParent->effectiveHeight());    }    return rect;}QRect RenderCanvas::selectionRect() const{    RenderObject *r = m_selectionStart;    if (!r)        return QRect();    QRect selectionRect = enclosingPositionedRect(r);    while (r && r != m_selectionEnd)    {        RenderObject* n;        if ( !(n = r->firstChild()) ){            if ( !(n = r->nextSibling()) )            {                n = r->parent();                while (n && !n->nextSibling())                    n = n->parent();                if (n)                    n = n->nextSibling();            }        }        r = n;        if (r) {            selectionRect = selectionRect.unite(enclosingPositionedRect(r));        }    }    return selectionRect;}void RenderCanvas::setSelection(RenderObject *s, int sp, RenderObject *e, int ep){    // Check we got valid renderobjects. www.msnbc.com and clicking    // around, to find the case where this happened.    if ( !s || !e )    {        kdWarning(6040) << "RenderCanvas::setSelection() called with start=" << s << " end=" << e << endl;        return;    }//     kdDebug( 6040 ) << "RenderCanvas::setSelection(" << s << "," << sp << "," << e << "," << ep << ")" << endl;    bool changedSelectionBorder = ( s != m_selectionStart || e != m_selectionEnd );    // Cut out early if the selection hasn't changed.    if ( !changedSelectionBorder && m_selectionStartPos == sp && m_selectionEndPos == ep )        return;    // Record the old selected objects.  Will be used later    // to delta against the selected objects.    RenderObject *oldStart = m_selectionStart;    int oldStartPos = m_selectionStartPos;    RenderObject *oldEnd = m_selectionEnd;    int oldEndPos = m_selectionEndPos;    QPtrList<RenderObject> oldSelectedInside;    QPtrList<RenderObject> newSelectedInside;    RenderObject *os = oldStart;    while (os && os != oldEnd)    {        RenderObject* no;        if ( !(no = os->firstChild()) ){            if ( !(no = os->nextSibling()) )            {                no = os->parent();                while (no && !no->nextSibling())                    no = no->parent();                if (no)                    no = no->nextSibling();            }        }        if (os->selectionState() == SelectionInside && !oldSelectedInside.containsRef(os))            oldSelectedInside.append(os);        os = no;    }    if (changedSelectionBorder)        clearSelection(false);    while (s->firstChild())        s = s->firstChild();    while (e->lastChild())        e = e->lastChild();#if 0    bool changedSelectionBorder = ( s != m_selectionStart || e != m_selectionEnd );    if ( !changedSelectionBorder && m_selectionStartPos == sp && m_selectionEndPos = ep )        return;#endif    // set selection start    if (m_selectionStart)        m_selectionStart->setIsSelectionBorder(false);    m_selectionStart = s;    if (m_selectionStart)        m_selectionStart->setIsSelectionBorder(true);    m_selectionStartPos = sp;    // set selection end    if (m_selectionEnd)        m_selectionEnd->setIsSelectionBorder(false);    m_selectionEnd = e;    if (m_selectionEnd)        m_selectionEnd->setIsSelectionBorder(true);    m_selectionEndPos = ep;#if 0    kdDebug( 6040 ) << "old selection (" << oldStart << "," << oldStartPos << "," << oldEnd << "," << oldEndPos << ")" << endl;    kdDebug( 6040 ) << "new selection (" << s << "," << sp << "," << e << "," << ep << ")" << endl;#endif    // update selection status of all objects between m_selectionStart and m_selectionEnd    RenderObject* o = s;    while (o && o!=e)    {        o->setSelectionState(SelectionInside);//      kdDebug( 6040 ) << "setting selected " << o << ", " << o->isText() << endl;        RenderObject* no;        if ( !(no = o->firstChild()) )            if ( !(no = o->nextSibling()) )            {                no = o->parent();                while (no && !no->nextSibling())                    no = no->parent();                if (no)                    no = no->nextSibling();            }        if (o->selectionState() == SelectionInside && !newSelectedInside.containsRef(o))            newSelectedInside.append(o);        o=no;    }    s->setSelectionState(SelectionStart);    e->setSelectionState(SelectionEnd);    if(s == e) s->setSelectionState(SelectionBoth);    if (!m_view)        return;    newSelectedInside.removeRef(s);    newSelectedInside.removeRef(e);    QRect updateRect;    // Don't use repaint() because it will cause all rects to    // be united (see khtmlview::scheduleRepaint()).  Instead    // just draw damage rects for objects that have a change    // in selection state.    // ### for Qt, updateContents will unite them, too. This has to be    // circumvented somehow (LS)    // Are any of the old fully selected objects not in the new selection?    // If so we have to draw them.    // Could be faster by building list of non-intersecting rectangles rather    // than unioning rectangles.    QPtrListIterator<RenderObject> oldIterator(oldSelectedInside);    bool firstRect = true;    for (; oldIterator.current(); ++oldIterator){        if (!newSelectedInside.containsRef(oldIterator.current())){            if (firstRect){                updateRect = enclosingPositionedRect(oldIterator.current());                firstRect = false;            }            else                updateRect = updateRect.unite(enclosingPositionedRect(oldIterator.current()));        }    }    if (!firstRect){        m_view->updateContents( updateRect );    }    // Are any of the new fully selected objects not in the previous selection?    // If so we have to draw them.    // Could be faster by building list of non-intersecting rectangles rather    // than unioning rectangles.    QPtrListIterator<RenderObject> newIterator(newSelectedInside);    firstRect = true;    for (; newIterator.current(); ++newIterator){        if (!oldSelectedInside.containsRef(newIterator.current())){            if (firstRect){                updateRect = enclosingPositionedRect(newIterator.current());                firstRect = false;            }            else                updateRect = updateRect.unite(enclosingPositionedRect(newIterator.current()));        }    }    if (!firstRect) {        m_view->updateContents( updateRect );    }    // Is the new starting object different, or did the position in the starting    // element change?  If so we have to draw it.    if (oldStart != m_selectionStart ||        (oldStart == oldEnd && (oldStartPos != m_selectionStartPos || oldEndPos != m_selectionEndPos)) ||        (oldStart == m_selectionStart && oldStartPos != m_selectionStartPos)){        m_view->updateContents( enclosingPositionedRect(m_selectionStart) );    }    // Draw the old selection start object if it's different than the new selection    // start object.    if (oldStart && oldStart != m_selectionStart){        m_view->updateContents( enclosingPositionedRect(oldStart) );    }    // Does the selection span objects and is the new end object different, or did the position    // in the end element change?  If so we have to draw it.    if (/*(oldStart != oldEnd || !oldEnd) &&*/        (oldEnd != m_selectionEnd ||        (oldEnd == m_selectionEnd && oldEndPos != m_selectionEndPos))){        m_view->updateContents( enclosingPositionedRect(m_selectionEnd) );    }    // Draw the old selection end object if it's different than the new selection    // end object.    if (oldEnd && oldEnd != m_selectionEnd){        m_view->updateContents( enclosingPositionedRect(oldEnd) );    }}void RenderCanvas::clearSelection(bool doRepaint){    // update selection status of all objects between m_selectionStart and m_selectionEnd    RenderObject* o = m_selectionStart;    while (o && o!=m_selectionEnd)    {        if (o->selectionState()!=SelectionNone)            if (doRepaint)                o->repaint();        o->setSelectionState(SelectionNone);        o->repaint();        RenderObject* no;        if ( !(no = o->firstChild()) )            if ( !(no = o->nextSibling()) )            {                no = o->parent();                while (no && !no->nextSibling())                    no = no->parent();                if (no)                    no = no->nextSibling();            }        o=no;    }    if (m_selectionEnd) {        m_selectionEnd->setSelectionState(SelectionNone);        if (doRepaint)            m_selectionEnd->repaint();    }    // set selection start & end to 0    if (m_selectionStart)        m_selectionStart->setIsSelectionBorder(false);    m_selectionStart = 0;    m_selectionStartPos = -1;    if (m_selectionEnd)        m_selectionEnd->setIsSelectionBorder(false);    m_selectionEnd = 0;    m_selectionEndPos = -1;}void RenderCanvas::selectionStartEnd(int& spos, int& epos){    spos = m_selectionStartPos;    epos = m_selectionEndPos;}QRect RenderCanvas::viewRect() const{    if (m_pagedMode)        if (m_pageTop == m_pageBottom) {            kdDebug(6040) << "viewRect: " << QRect(0, m_pageTop, m_width, m_height) << endl;            return QRect(0, m_pageTop, m_width, m_height);        }        else {            kdDebug(6040) << "viewRect: " << QRect(0, m_pageTop, m_width, m_pageBottom - m_pageTop) << endl;            return QRect(0, m_pageTop, m_width, m_pageBottom - m_pageTop);        }    else if (m_view)        return QRect(m_view->contentsX(),            m_view->contentsY(),            m_view->visibleWidth(),            m_view->visibleHeight());    else        return QRect(0,0,m_rootWidth,m_rootHeight);}int RenderCanvas::docHeight() const{    int h;    if (m_pagedMode || !m_view)        h = m_height;    else        h = 0;    RenderObject *fc = firstChild();    if(fc) {        int dh = fc->overflowHeight() + fc->marginTop() + fc->marginBottom();        int lowestPos = fc->lowestPosition(false);// kdDebug(6040) << "h " << h << " lowestPos " << lowestPos << " dh " << dh << " fc->rh " << fc->effectiveHeight() << " fc->height() " << fc->height() << endl;        if( lowestPos > dh )            dh = lowestPos;        lowestPos = lowestAbsolutePosition();        if( lowestPos > dh )            dh = lowestPos;        if( dh > h )            h = dh;    }    RenderLayer *layer = m_layer;    h = kMax( h, layer->yPos() + layer->height() );// kdDebug(6040) << "h " << h << " layer(" << layer->renderer()->renderName() << "@" << layer->renderer() << ")->height " << layer->height() << " lp " << (layer->yPos() + layer->height()) << " height() " << layer->renderer()->height() << " rh " << layer->renderer()->effectiveHeight() << endl;    return h;}int RenderCanvas::docWidth() const{    int w;    if (m_pagedMode || !m_view)        w = m_width;    else        w = 0;    RenderObject *fc = firstChild();    if(fc) {        int dw = fc->effectiveWidth() + fc->marginLeft() + fc->marginRight();        int rightmostPos = fc->rightmostPosition(false);// kdDebug(6040) << "w " << w << " rightmostPos " << rightmostPos << " dw " << dw << " fc->rw " << fc->effectiveWidth() << " fc->width() " << fc->width() << endl;        if( rightmostPos > dw )            dw = rightmostPos;        rightmostPos = rightmostAbsolutePosition();        if ( rightmostPos > dw )            dw = rightmostPos;        if( dw > w )            w = dw;    }    RenderLayer *layer = m_layer;    w = kMax( w, layer->xPos() + layer->width() );// kdDebug(6040) << "w " << w << " layer(" << layer->renderer()->renderName() << ")->width " << layer->width() << " rm " << (layer->xPos() + layer->width()) << " width() " << layer->renderer()->width() << " rw " << layer->renderer()->effectiveWidth() << endl;    return w;}RenderPage* RenderCanvas::page() {    if (!m_page) m_page = new RenderPage(this);    return m_page;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -