亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? selection.cpp

?? It is WEB browser core module with source code. Very good!
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
    setModifyBias(alter, dir);

    VisiblePosition pos;
    switch (dir) {
        // EDIT FIXME: These need to handle bidi
        case RIGHT:
        case FORWARD:
            if (alter == EXTEND)
                pos = modifyExtendingRightForward(granularity);
            else
                pos = modifyMovingRightForward(granularity);
            break;
        case LEFT:
        case BACKWARD:
            if (alter == EXTEND)
                pos = modifyExtendingLeftBackward(granularity);
            else
                pos = modifyMovingLeftBackward(granularity);
            break;
    }

    if (pos.isNull())
        return false;

    switch (alter) {
        case MOVE:
            moveTo(pos);
            break;
        case EXTEND:
            setExtent(pos);
            break;
    }

    setNeedsLayout();

    return true;
}

// FIXME: Maybe baseline would be better?
static bool caretY(const VisiblePosition &c, int &y)
{
    Position p = c.deepEquivalent();
    NodeImpl *n = p.node();
    if (!n)
        return false;
    RenderObject *r = p.node()->renderer();
    if (!r)
        return false;
    QRect rect = r->caretRect(p.offset());
    if (rect.isEmpty())
        return false;
    y = rect.y() + rect.height() / 2;
    return true;
}

bool Selection::modify(EAlter alter, int verticalDistance)
{
    if (verticalDistance == 0)
        return false;

    bool up = verticalDistance < 0;
    if (up)
        verticalDistance = -verticalDistance;

    // can dump this UPSTREAM when we have m_extentAffinity
    m_affinity = UPSTREAM;
    setModifyBias(alter, up ? BACKWARD : FORWARD);

    VisiblePosition pos;
    int xPos = 0;
    switch (alter) {
        case MOVE:
            pos = VisiblePosition(up ? m_start : m_end, m_affinity);
            xPos = xPosForVerticalArrowNavigation(up ? START : END, isRange());
            break;
        case EXTEND:
            pos = VisiblePosition(m_extent, m_affinity);
            xPos = xPosForVerticalArrowNavigation(EXTENT);
            break;
    }

    int startY;
    if (!caretY(pos, startY))
        return false;
    if (up)
        startY = -startY;
    int lastY = startY;

    VisiblePosition result;
    VisiblePosition next;
    for (VisiblePosition p = pos; ; p = next) {
        next = (up ? previousLinePosition : nextLinePosition)(p, xPos);
        if (next.isNull() || next == p)
            break;
        int nextY;
        if (!caretY(next, nextY))
            break;
        if (up)
            nextY = -nextY;
        if (nextY - startY > verticalDistance)
            break;
        if (nextY >= lastY) {
            lastY = nextY;
            result = next;
        }
    }

    if (result.isNull())
        return false;

    switch (alter) {
        case MOVE:
            moveTo(result);
            break;
        case EXTEND:
            setExtent(result);
            break;
    }

    return true;
}

bool Selection::expandUsingGranularity(ETextGranularity granularity)
{
    if (isNone())
        return false;
    validate(granularity);
    return true;
}

int Selection::xPosForVerticalArrowNavigation(EPositionType type, bool recalc) const
{
    int x = 0;

    if (isNone())
        return x;

    Position pos;
    switch (type) {
        case START:
            pos = m_start;
            break;
        case END:
            pos = m_end;
            break;
        case BASE:
            pos = m_base;
            break;
        case EXTENT:
            pos = m_extent;
            break;
    }

    KHTMLPart *part = pos.node()->getDocument()->part();
    if (!part)
        return x;
        
    if (recalc || part->xPosForVerticalArrowNavigation() == KHTMLPart::NoXPosForVerticalArrowNavigation) {
        switch (m_affinity) {
            case DOWNSTREAM:
                pos = VisiblePosition(pos, m_affinity).downstreamDeepEquivalent();
                break;
            case UPSTREAM:
                pos = VisiblePosition(pos, m_affinity).deepEquivalent();
                break;
        }
        x = pos.node()->renderer()->caretRect(pos.offset(), m_affinity).x();
        part->setXPosForVerticalArrowNavigation(x);
    }
    else {
        x = part->xPosForVerticalArrowNavigation();
    }
    return x;
}

void Selection::clear()
{
    m_affinity = SEL_DEFAULT_AFFINITY;
    m_base.clear();
    m_extent.clear();
    validate();
}

void Selection::setBase(const VisiblePosition &pos)
{
    m_affinity = pos.affinity();
    m_base = pos.deepEquivalent();
    validate();
}

void Selection::setExtent(const VisiblePosition &pos)
{
    // FIXME: Support extentAffinity
    m_extent = pos.deepEquivalent();
    validate();
}

void Selection::setBaseAndExtent(const VisiblePosition &base, const VisiblePosition &extent)
{
    // FIXME: Support extentAffinity
    m_affinity = base.affinity();
    m_base = base.deepEquivalent();
    m_extent = extent.deepEquivalent();
    validate();
}


void Selection::setBase(const Position &pos, EAffinity baseAffinity)
{
    m_affinity = baseAffinity;
    m_base = pos;
    validate();
}

void Selection::setExtent(const Position &pos, EAffinity extentAffinity)
{
    // FIXME: Support extentAffinity for real
    m_affinity = extentAffinity;
    m_extent = pos;
    validate();
}

void Selection::setBaseAndExtent(const Position &base, EAffinity baseAffinity, const Position &extent, EAffinity extentAffinity)
{
    // FIXME: extentAffinity
    m_affinity = baseAffinity;
    m_base = base;
    m_extent = extent;
    validate();
}

void Selection::setNeedsLayout(bool flag)
{
    m_needsLayout = flag;
}

Range Selection::toRange() const
{
    if (isNone())
        return Range();

    // Make sure we have an updated layout since this function is called
    // in the course of running edit commands which modify the DOM.
    // Failing to call this can result in equivalentXXXPosition calls returning
    // incorrect results.
    m_start.node()->getDocument()->updateLayout();

    Position s, e;
    if (isCaret()) {
        // If the selection is a caret, move the range start upstream. This helps us match
        // the conventions of text editors tested, which make style determinations based
        // on the character before the caret, if any. 
        s = m_start.upstream(StayInBlock).equivalentRangeCompliantPosition();
        e = s;
    }
    else {
        // If the selection is a range, select the minimum range that encompasses the selection.
        // Again, this is to match the conventions of text editors tested, which make style 
        // determinations based on the first character of the selection. 
        // For instance, this operation helps to make sure that the "X" selected below is the 
        // only thing selected. The range should not be allowed to "leak" out to the end of the 
        // previous text node, or to the beginning of the next text node, each of which has a 
        // different style.
        // 
        // On a treasure map, <b>X</b> marks the spot.
        //                       ^ selected
        //
        ASSERT(isRange());
        s = m_start.downstream(StayInBlock);
        e = m_end.upstream(StayInBlock);
        if (RangeImpl::compareBoundaryPoints(s.node(), s.offset(), e.node(), e.offset()) > 0) {
            // Make sure the start is before the end.
            // The end can wind up before the start if collapsed whitespace is the only thing selected.
            Position tmp = s;
            s = e;
            e = tmp;
        }
        s = s.equivalentRangeCompliantPosition();
        e = e.equivalentRangeCompliantPosition();
    }

    // Use this roundabout way of creating the Range in order to have defined behavior
    // when there is a DOM exception.
    int exceptionCode = 0;
    Range result(s.node()->getDocument());
    RangeImpl *handle = result.handle();
    ASSERT(handle);
    handle->setStart(s.node(), s.offset(), exceptionCode);
    if (exceptionCode) {
        ERROR("Exception setting Range start from Selection: %d", exceptionCode);
        return Range();
    }
    handle->setEnd(e.node(), e.offset(), exceptionCode);
    if (exceptionCode) {
        ERROR("Exception setting Range end from Selection: %d", exceptionCode);
        return Range();
    }
    return result;
}

void Selection::layout()
{
    if (isNone() || !m_start.node()->inDocument() || !m_end.node()->inDocument()) {
        m_caretRect = QRect();
        m_expectedVisibleRect = QRect();
        return;
    }

    m_start.node()->getDocument()->updateRendering();
        
    if (isCaret()) {
        Position pos = m_start;
        switch (m_affinity) {
            case DOWNSTREAM:
                pos = VisiblePosition(m_start, m_affinity).downstreamDeepEquivalent();
                break;
            case UPSTREAM:
                pos = VisiblePosition(m_start, m_affinity).deepEquivalent();
                break;
        }
        if (pos.isNotNull()) {
            ASSERT(pos.node()->renderer());
            m_caretRect = pos.node()->renderer()->caretRect(pos.offset(), m_affinity);
            m_expectedVisibleRect = m_caretRect;
        }
        else {
            m_caretRect = QRect();
            m_expectedVisibleRect = QRect();
        }
    }
    else {
        // Calculate which position to use based on whether the base is the start.
        // We want the position, start or end, that was calculated using the extent. 
        // This makes the selection follow the extent position while scrolling as a 
        // result of arrow navigation. 
        //
        // Note: no need to get additional help from VisiblePosition. The m_start and
        // m_end positions should already be visible, and we're only interested in 
        // a rectangle for m_expectedVisibleRect, hence affinity is not a factor
        // like it is when drawing a caret.
        //
        Position pos = m_baseIsStart ? m_end : m_start;
        ASSERT(pos.node()->renderer()); 
        m_expectedVisibleRect = pos.node()->renderer()->caretRect(pos.offset(), m_affinity);
        m_caretRect = QRect();
    }

    m_needsLayout = false;
}

QRect Selection::caretRect() const
{
    if (m_needsLayout) {
        const_cast<Selection *>(this)->layout();
    }

    return m_caretRect;
}

QRect Selection::expectedVisibleRect() const
{
    if (m_needsLayout) {
        const_cast<Selection *>(this)->layout();
    }

    return m_expectedVisibleRect;
}

QRect Selection::caretRepaintRect() const
{
    // FIXME: Add one pixel of slop on each side to make sure we don't leave behind artifacts.
    QRect r = caretRect();
    if (r.isEmpty())
        return QRect();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品水蜜桃av综合天堂| 国产亚洲一本大道中文在线| 91浏览器入口在线观看| 国产不卡在线播放| 国产精品一区二区久激情瑜伽| 美国三级日本三级久久99| 日本欧美大码aⅴ在线播放| 亚洲午夜视频在线| 亚洲v中文字幕| 久久激五月天综合精品| 国产乱妇无码大片在线观看| 激情都市一区二区| 成人精品在线视频观看| 色综合久久久久综合体桃花网| 成人激情开心网| 91黄色免费看| 欧美一区二区精品| 久久一日本道色综合| 国产蜜臀av在线一区二区三区| 中文字幕日韩一区| 亚洲永久精品国产| 久久国产麻豆精品| 99国产精品久久| 欧美一区二区三区四区高清| 国产日韩欧美综合在线| 亚洲色图在线看| 美女视频黄 久久| www.日韩大片| 在线播放国产精品二区一二区四区| 日韩丝袜美女视频| 中文字幕欧美国产| 日韩在线一区二区| 成av人片一区二区| 欧美一区二区三区影视| 国产清纯在线一区二区www| 亚洲激情自拍偷拍| 国模一区二区三区白浆| 色综合色综合色综合| 欧美高清精品3d| 日本一区二区视频在线观看| 日韩在线一二三区| av中文一区二区三区| 日韩欧美一区二区久久婷婷| 自拍偷拍亚洲欧美日韩| 国产综合久久久久久鬼色 | 久草在线在线精品观看| 99国产精品久久久久久久久久久| 91精品国产手机| 亚洲黄色小说网站| 成人av在线资源网站| 精品国产乱码久久久久久浪潮| 一区二区三区波多野结衣在线观看| 国产一区二区视频在线| 777午夜精品免费视频| 日韩毛片一二三区| 国产成人夜色高潮福利影视| 91精品国产综合久久婷婷香蕉| 国产精品入口麻豆九色| 极品少妇一区二区| 日韩欧美在线网站| 亚洲大片免费看| 欧美系列亚洲系列| 亚洲精品五月天| 99精品黄色片免费大全| 欧美激情一区二区三区在线| 国产原创一区二区三区| 日韩精品影音先锋| 奇米影视一区二区三区| 777午夜精品视频在线播放| 亚洲国产美女搞黄色| 色婷婷av一区二区三区大白胸| 国产精品人成在线观看免费 | 中文字幕中文字幕一区二区| 国产成人精品网址| 国产无遮挡一区二区三区毛片日本| 日本成人超碰在线观看| 欧美久久久久久蜜桃| 亚洲成人黄色小说| 91精品国产综合久久久久久久| 亚洲va天堂va国产va久| 正在播放亚洲一区| 三级久久三级久久久| 欧美一区二区视频观看视频| 久久se这里有精品| 国产无一区二区| 99久久er热在这里只有精品15 | 91精品国产综合久久精品app| 亚洲va欧美va天堂v国产综合| 777xxx欧美| 国产美女久久久久| 国产精品久久久久久久久免费桃花 | 亚洲同性gay激情无套| 色综合亚洲欧洲| 日韩精品乱码av一区二区| 91麻豆精品91久久久久同性| 蜜桃在线一区二区三区| 欧美韩日一区二区三区| 91国偷自产一区二区开放时间| 日韩av电影天堂| 欧美高清一级片在线观看| 一本色道久久综合狠狠躁的推荐 | 亚洲欧美视频在线观看| 欧美日韩精品三区| 国模冰冰炮一区二区| 亚洲欧洲精品一区二区三区不卡| 欧美日韩精品二区第二页| 免费一级欧美片在线观看| 国产日韩欧美精品电影三级在线 | 秋霞午夜鲁丝一区二区老狼| 久久久综合精品| 日本乱码高清不卡字幕| 久久国产夜色精品鲁鲁99| 自拍偷拍亚洲激情| 91精品国产日韩91久久久久久| 国产91丝袜在线播放| 五月综合激情日本mⅴ| 国产精品天美传媒| 欧美久久久久免费| www.欧美精品一二区| 日本网站在线观看一区二区三区| 国产精品免费视频一区| 欧美一区二区成人| 91看片淫黄大片一级在线观看| 麻豆视频观看网址久久| 亚洲少妇屁股交4| 久久久久国产精品厨房| 91精品国产美女浴室洗澡无遮挡| 99精品偷自拍| 国产成人精品亚洲日本在线桃色| 日韩高清一级片| 亚洲一区二区三区国产| 国产精品―色哟哟| 精品国产91乱码一区二区三区| 欧美猛男超大videosgay| 99视频国产精品| 福利一区在线观看| 经典三级一区二区| 日韩综合在线视频| 亚洲bdsm女犯bdsm网站| 一区二区成人在线观看| 国产精品欧美一级免费| 国产欧美精品一区| 久久久蜜桃精品| 精品成人佐山爱一区二区| 91精品一区二区三区在线观看| 在线视频中文字幕一区二区| 91视视频在线观看入口直接观看www| 国产一区在线观看视频| 精品在线视频一区| 久88久久88久久久| 久久精品99国产国产精| 老司机精品视频一区二区三区| 日韩成人伦理电影在线观看| 日产欧产美韩系列久久99| 午夜电影久久久| 蜜臀av在线播放一区二区三区| 蜜臀a∨国产成人精品| 麻豆久久久久久| 国内精品久久久久影院薰衣草| 国产在线精品不卡| 国产馆精品极品| 成人av资源在线| 色丁香久综合在线久综合在线观看| 91视频免费观看| 欧美性色黄大片手机版| 91精品国产综合久久精品麻豆 | 亚洲美腿欧美偷拍| 亚洲综合色自拍一区| 亚洲影院免费观看| 首页国产欧美久久| 国产真实乱偷精品视频免| 国产成人亚洲精品狼色在线| av福利精品导航| 欧美在线不卡视频| 91精品蜜臀在线一区尤物| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲成人动漫精品| 麻豆一区二区三区| 成人sese在线| 9191久久久久久久久久久| 精品91自产拍在线观看一区| 国产精品私人影院| 亚洲愉拍自拍另类高清精品| 久久精品国产精品亚洲综合| 岛国精品一区二区| 欧美美女直播网站| 久久色视频免费观看| 亚洲你懂的在线视频| 久久99热99| 色94色欧美sute亚洲线路一久| 日韩欧美高清一区| 亚洲男同性视频| 国产一区二区调教| 91黄色免费看| 久久久久国色av免费看影院| 怡红院av一区二区三区| 精品一区二区三区久久| 欧美性猛片aaaaaaa做受| 精品国内二区三区| 亚洲午夜羞羞片|