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

📄 rendertextcontrol.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    return TextIterator::rangeLength(range.get());}void RenderTextControl::subtreeHasChanged(){    m_edited = true;    m_userEdited = true;}String RenderTextControl::finishText(Vector<UChar>& result) const{    // Remove one trailing newline; there's always one that's collapsed out by rendering.    size_t size = result.size();    if (size && result[size - 1] == '\n')        result.shrink(--size);    // Convert backslash to currency symbol.    document()->displayBufferModifiedByEncoding(result.data(), result.size());        return String::adopt(result);}String RenderTextControl::text(){    if (!m_innerText)        return "";     Frame* frame = document()->frame();    Text* compositionNode = frame ? frame->editor()->compositionNode() : 0;    Vector<UChar> result;    for (Node* n = m_innerText.get(); n; n = n->traverseNextNode(m_innerText.get())) {        if (n->hasTagName(brTag))            result.append(&newlineCharacter, 1);        else if (n->isTextNode()) {            Text* text = static_cast<Text*>(n);            String data = text->data();            unsigned length = data.length();            if (text != compositionNode)                result.append(data.characters(), length);            else {                unsigned compositionStart = min(frame->editor()->compositionStart(), length);                unsigned compositionEnd = min(max(compositionStart, frame->editor()->compositionEnd()), length);                result.append(data.characters(), compositionStart);                result.append(data.characters() + compositionEnd, length - compositionEnd);            }        }    }    return finishText(result);}static void getNextSoftBreak(RootInlineBox*& line, Node*& breakNode, unsigned& breakOffset){    RootInlineBox* next;    for (; line; line = next) {        next = line->nextRootBox();        if (next && !line->endsWithBreak()) {            ASSERT(line->lineBreakObj());            breakNode = line->lineBreakObj()->node();            breakOffset = line->lineBreakPos();            line = next;            return;        }    }    breakNode = 0;}String RenderTextControl::textWithHardLineBreaks(){    if (!m_innerText)        return "";    Node* firstChild = m_innerText->firstChild();    if (!firstChild)        return "";    document()->updateLayout();    RenderObject* renderer = firstChild->renderer();    if (!renderer)        return "";    InlineBox* box = renderer->isText() ? toRenderText(renderer)->firstTextBox() : toRenderBox(renderer)->inlineBoxWrapper();    if (!box)        return "";    Frame* frame = document()->frame();    Text* compositionNode = frame ? frame->editor()->compositionNode() : 0;    Node* breakNode;    unsigned breakOffset;    RootInlineBox* line = box->root();    getNextSoftBreak(line, breakNode, breakOffset);    Vector<UChar> result;    for (Node* n = firstChild; n; n = n->traverseNextNode(m_innerText.get())) {        if (n->hasTagName(brTag))            result.append(&newlineCharacter, 1);        else if (n->isTextNode()) {            Text* text = static_cast<Text*>(n);            String data = text->data();            unsigned length = data.length();            unsigned compositionStart = (text == compositionNode)                ? min(frame->editor()->compositionStart(), length) : 0;            unsigned compositionEnd = (text == compositionNode)                ? min(max(compositionStart, frame->editor()->compositionEnd()), length) : 0;            unsigned position = 0;            while (breakNode == n && breakOffset < compositionStart) {                result.append(data.characters() + position, breakOffset - position);                position = breakOffset;                result.append(&newlineCharacter, 1);                getNextSoftBreak(line, breakNode, breakOffset);            }            result.append(data.characters() + position, compositionStart - position);            position = compositionEnd;            while (breakNode == n && breakOffset <= length) {                if (breakOffset > position) {                    result.append(data.characters() + position, breakOffset - position);                    position = breakOffset;                    result.append(&newlineCharacter, 1);                }                getNextSoftBreak(line, breakNode, breakOffset);            }            result.append(data.characters() + position, length - position);        }        while (breakNode == n)            getNextSoftBreak(line, breakNode, breakOffset);    }    return finishText(result);}int RenderTextControl::scrollbarThickness() const{    // FIXME: We should get the size of the scrollbar from the RenderTheme instead.    return ScrollbarTheme::nativeTheme()->scrollbarThickness();}void RenderTextControl::calcHeight(){    setHeight(m_innerText->renderBox()->borderTop() + m_innerText->renderBox()->borderBottom() +              m_innerText->renderBox()->paddingTop() + m_innerText->renderBox()->paddingBottom() +              m_innerText->renderBox()->marginTop() + m_innerText->renderBox()->marginBottom());    adjustControlHeightBasedOnLineHeight(m_innerText->renderer()->lineHeight(true, true));    setHeight(height() + paddingTop() + paddingBottom() + borderTop() + borderBottom());    // We are able to have a horizontal scrollbar if the overflow style is scroll, or if its auto and there's no word wrap.    if (m_innerText->renderer()->style()->overflowX() == OSCROLL ||  (m_innerText->renderer()->style()->overflowX() == OAUTO && m_innerText->renderer()->style()->wordWrap() == NormalWordWrap))        setHeight(height() + scrollbarThickness());    RenderBlock::calcHeight();}void RenderTextControl::hitInnerTextBlock(HitTestResult& result, int xPos, int yPos, int tx, int ty){    result.setInnerNode(m_innerText.get());    result.setLocalPoint(IntPoint(xPos - tx - x() - m_innerText->renderBox()->x(),                                  yPos - ty - y() - m_innerText->renderBox()->y()));}void RenderTextControl::forwardEvent(Event* event){    if (event->type() == eventNames().blurEvent || event->type() == eventNames().focusEvent)        return;    m_innerText->defaultEventHandler(event);}IntRect RenderTextControl::controlClipRect(int tx, int ty) const{    IntRect clipRect = contentBoxRect();    clipRect.move(tx, ty);    return clipRect;}void RenderTextControl::calcPrefWidths(){    ASSERT(prefWidthsDirty());    m_minPrefWidth = 0;    m_maxPrefWidth = 0;    if (style()->width().isFixed() && style()->width().value() > 0)        m_minPrefWidth = m_maxPrefWidth = calcContentBoxWidth(style()->width().value());    else {        // Figure out how big a text control needs to be for a given number of characters        // (using "0" as the nominal character).        const UChar ch = '0';        float charWidth = style()->font().floatWidth(TextRun(&ch, 1, false, 0, 0, false, false, false));        m_maxPrefWidth = preferredContentWidth(charWidth) + m_innerText->renderBox()->paddingLeft() + m_innerText->renderBox()->paddingRight();    }    if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) {        m_maxPrefWidth = max(m_maxPrefWidth, calcContentBoxWidth(style()->minWidth().value()));        m_minPrefWidth = max(m_minPrefWidth, calcContentBoxWidth(style()->minWidth().value()));    } else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent()))        m_minPrefWidth = 0;    else        m_minPrefWidth = m_maxPrefWidth;    if (style()->maxWidth().isFixed() && style()->maxWidth().value() != undefinedLength) {        m_maxPrefWidth = min(m_maxPrefWidth, calcContentBoxWidth(style()->maxWidth().value()));        m_minPrefWidth = min(m_minPrefWidth, calcContentBoxWidth(style()->maxWidth().value()));    }    int toAdd = paddingLeft() + paddingRight() + borderLeft() + borderRight();    m_minPrefWidth += toAdd;    m_maxPrefWidth += toAdd;    setPrefWidthsDirty(false);}void RenderTextControl::selectionChanged(bool userTriggered){    cacheSelection(selectionStart(), selectionEnd());    if (Frame* frame = document()->frame()) {        if (frame->selection()->isRange() && userTriggered)            node()->dispatchEventForType(eventNames().selectEvent, true, false);    }}void RenderTextControl::addFocusRingRects(GraphicsContext* graphicsContext, int tx, int ty){    graphicsContext->addFocusRingRect(IntRect(tx, ty, width(), height()));}void RenderTextControl::autoscroll(){    RenderLayer* layer = m_innerText->renderBox()->layer();    if (layer)        layer->autoscroll();}int RenderTextControl::scrollWidth() const{    if (m_innerText)        return m_innerText->scrollWidth();    return RenderBlock::scrollWidth();}int RenderTextControl::scrollHeight() const{    if (m_innerText)        return m_innerText->scrollHeight();    return RenderBlock::scrollHeight();}int RenderTextControl::scrollLeft() const{    if (m_innerText)        return m_innerText->scrollLeft();    return RenderBlock::scrollLeft();}int RenderTextControl::scrollTop() const{    if (m_innerText)        return m_innerText->scrollTop();    return RenderBlock::scrollTop();}void RenderTextControl::setScrollLeft(int newLeft){    if (m_innerText)        m_innerText->setScrollLeft(newLeft);}void RenderTextControl::setScrollTop(int newTop){    if (m_innerText)        m_innerText->setScrollTop(newTop);}bool RenderTextControl::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier){    RenderLayer* layer = m_innerText->renderBox()->layer();    if (layer && layer->scroll(direction, granularity, multiplier))        return true;    return RenderBlock::scroll(direction, granularity, multiplier);}HTMLElement* RenderTextControl::innerTextElement() const{    return m_innerText.get();}FormControlElement* RenderTextControl::formControlElement() const{    return toFormControlElement(static_cast<Element*>(node()));}} // namespace WebCore

⌨️ 快捷键说明

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