summaryrefslogtreecommitdiffstats
path: root/khtml/xml/dom_textimpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'khtml/xml/dom_textimpl.cpp')
-rw-r--r--khtml/xml/dom_textimpl.cpp522
1 files changed, 0 insertions, 522 deletions
diff --git a/khtml/xml/dom_textimpl.cpp b/khtml/xml/dom_textimpl.cpp
deleted file mode 100644
index 86317293d..000000000
--- a/khtml/xml/dom_textimpl.cpp
+++ /dev/null
@@ -1,522 +0,0 @@
-/**
- * This file is part of the DOM implementation for KDE.
- *
- * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
- * (C) 2001-2003 Dirk Mueller (mueller@kde.org)
- * (C) 1999 Antti Koivisto (koivisto@kde.org)
- * (C) 2002-2003 Apple Computer, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "dom/dom_exception.h"
-#include "css/cssstyleselector.h"
-#include "xml/dom2_eventsimpl.h"
-#include "xml/dom_textimpl.h"
-#include "xml/dom_docimpl.h"
-
-#include "misc/htmlhashes.h"
-#include "rendering/render_text.h"
-#include "rendering/render_flow.h"
-
-#include <kdebug.h>
-
-using namespace DOM;
-using namespace khtml;
-
-static DOMString escapeHTML( const DOMString& in )
-{
- return in.implementation()->escapeHTML();
-}
-
-CharacterDataImpl::CharacterDataImpl(DocumentImpl *doc, DOMStringImpl* _text)
- : NodeImpl(doc)
-{
- str = _text ? _text : new DOMStringImpl(0, 0);
- str->ref();
-}
-
-CharacterDataImpl::~CharacterDataImpl()
-{
- if(str) str->deref();
-}
-
-void CharacterDataImpl::setData( const DOMString &_data, int &exceptioncode )
-{
- // NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly
- if (isReadOnly()) {
- exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
- return;
- }
-
- if(str == _data.impl) return; // ### fire DOMCharacterDataModified if modified?
- DOMStringImpl *oldStr = str;
- str = _data.impl;
- if(str) str->ref();
- if (m_render)
- (static_cast<RenderText*>(m_render))->setText(str);
- setChanged(true);
-
- dispatchModifiedEvent(oldStr);
- if(oldStr) oldStr->deref();
-}
-
-unsigned long CharacterDataImpl::length() const
-{
- return str->l;
-}
-
-DOMString CharacterDataImpl::substringData( const unsigned long offset, const unsigned long count, int &exceptioncode )
-{
- exceptioncode = 0;
- if ((long)count < 0)
- exceptioncode = DOMException::INDEX_SIZE_ERR;
- else
- checkCharDataOperation(offset, exceptioncode);
- if (exceptioncode)
- return DOMString();
-
- return str->substring(offset,count);
-}
-
-void CharacterDataImpl::appendData( const DOMString &arg, int &exceptioncode )
-{
- exceptioncode = 0;
-
- // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly
- if (isReadOnly()) {
- exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
- return;
- }
-
- DOMStringImpl *oldStr = str;
- str = str->copy();
- str->ref();
- str->append(arg.impl);
- if (m_render)
- (static_cast<RenderText*>(m_render))->setText(str);
- setChanged(true);
-
- dispatchModifiedEvent(oldStr);
- oldStr->deref();
-}
-
-void CharacterDataImpl::insertData( const unsigned long offset, const DOMString &arg, int &exceptioncode )
-{
- exceptioncode = 0;
- checkCharDataOperation(offset, exceptioncode);
- if (exceptioncode)
- return;
-
- DOMStringImpl *oldStr = str;
- str = str->copy();
- str->ref();
- str->insert(arg.impl, offset);
- if (m_render)
- (static_cast<RenderText*>(m_render))->setText(str);
- setChanged(true);
-
- dispatchModifiedEvent(oldStr);
- oldStr->deref();
-}
-
-void CharacterDataImpl::deleteData( const unsigned long offset, const unsigned long count, int &exceptioncode )
-{
- exceptioncode = 0;
- if ((long)count < 0)
- exceptioncode = DOMException::INDEX_SIZE_ERR;
- else
- checkCharDataOperation(offset, exceptioncode);
- if (exceptioncode)
- return;
-
- DOMStringImpl *oldStr = str;
- str = str->copy();
- str->ref();
- str->remove(offset,count);
- if (m_render)
- (static_cast<RenderText*>(m_render))->setText(str);
- setChanged(true);
-
- dispatchModifiedEvent(oldStr);
- oldStr->deref();
-}
-
-void CharacterDataImpl::replaceData( const unsigned long offset, const unsigned long count, const DOMString &arg, int &exceptioncode )
-{
- exceptioncode = 0;
- if ((long)count < 0)
- exceptioncode = DOMException::INDEX_SIZE_ERR;
- else
- checkCharDataOperation(offset, exceptioncode);
- if (exceptioncode)
- return;
-
- unsigned long realCount;
- if (offset + count > str->l)
- realCount = str->l-offset;
- else
- realCount = count;
-
- DOMStringImpl *oldStr = str;
- str = str->copy();
- str->ref();
- str->remove(offset,realCount);
- str->insert(arg.impl, offset);
- if (m_render)
- (static_cast<RenderText*>(m_render))->setText(str);
- setChanged(true);
-
- dispatchModifiedEvent(oldStr);
- oldStr->deref();
-}
-
-DOMString CharacterDataImpl::nodeValue() const
-{
- return str;
-}
-
-bool CharacterDataImpl::containsOnlyWhitespace() const
-{
- return str->containsOnlyWhitespace();
-}
-
-void CharacterDataImpl::setNodeValue( const DOMString &_nodeValue, int &exceptioncode )
-{
- // NO_MODIFICATION_ALLOWED_ERR: taken care of by setData()
- setData(_nodeValue, exceptioncode);
-}
-
-void CharacterDataImpl::dispatchModifiedEvent(DOMStringImpl *prevValue)
-{
- if (parentNode())
- parentNode()->childrenChanged();
- if (!getDocument()->hasListenerType(DocumentImpl::DOMCHARACTERDATAMODIFIED_LISTENER))
- return;
-
- DOMStringImpl *newValue = str->copy();
- newValue->ref();
- int exceptioncode = 0;
- MutationEventImpl* const evt = new MutationEventImpl(EventImpl::DOMCHARACTERDATAMODIFIED_EVENT,true,false,0,prevValue,newValue,DOMString(),0);
- evt->ref();
- dispatchEvent(evt,exceptioncode);
- evt->deref();
- newValue->deref();
- dispatchSubtreeModifiedEvent();
-}
-
-void CharacterDataImpl::checkCharDataOperation( const unsigned long offset, int &exceptioncode )
-{
- exceptioncode = 0;
-
- // INDEX_SIZE_ERR: Raised if the specified offset is negative or greater than the number of 16-bit
- // units in data.
- if (offset > str->l) {
- exceptioncode = DOMException::INDEX_SIZE_ERR;
- return;
- }
-
- // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly
- if (isReadOnly()) {
- exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
- return;
- }
-}
-
-long CharacterDataImpl::minOffset() const
-{
- RenderText *r = static_cast<RenderText *>(renderer());
- if (!r || !r->isText()) return 0;
-
- // take :first-letter into consideration
-#ifdef __GNUC__
-#warning FIXME
-#endif
-#if 0
- if (r->forcedMinOffset()) {
- RenderFlow *firstLetter = static_cast<RenderFlow *>(r->previousSibling());
- if (firstLetter && firstLetter->isFlow() && firstLetter->isFirstLetter()) {
- RenderText *letterText = static_cast<RenderText *>(firstLetter->firstChild());
- return letterText->minOffset();
- }
- }
-#endif
-
- return r->minOffset();
-}
-
-long CharacterDataImpl::maxOffset() const
-{
- RenderText *r = static_cast<RenderText *>(renderer());
- if (!r || !r->isText()) return (long)length();
- return r->maxOffset();
-}
-
-DOMStringImpl* CharacterDataImpl::textContent() const
-{
- return new DOMStringImpl(str->s, str->l);
-}
-
-void CharacterDataImpl::setTextContent( const DOMString &str, int& exceptioncode )
-{
- setData(str, exceptioncode);
-}
-
-// ---------------------------------------------------------------------------
-
-DOMString CommentImpl::nodeName() const
-{
- return "#comment";
-}
-
-unsigned short CommentImpl::nodeType() const
-{
- return Node::COMMENT_NODE;
-}
-
-NodeImpl *CommentImpl::cloneNode(bool /*deep*/)
-{
- return getDocument()->createComment( str );
-}
-
-NodeImpl::Id CommentImpl::id() const
-{
- return ID_COMMENT;
-}
-
-// DOM Section 1.1.1
-bool CommentImpl::childTypeAllowed( unsigned short /*type*/ )
-{
- return false;
-}
-
-DOMString CommentImpl::toString() const
-{
- // FIXME: substitute entity references as needed!
- return DOMString("<!--") + escapeHTML( nodeValue() ) + "-->";
-}
-
-// ---------------------------------------------------------------------------
-
-TextImpl *TextImpl::splitText( const unsigned long offset, int &exceptioncode )
-{
- exceptioncode = 0;
-
- // INDEX_SIZE_ERR: Raised if the specified offset is negative or greater than
- // the number of 16-bit units in data.
-
- // ### we explicitly check for a negative long that has been cast to an unsigned long
- // ... this can happen if JS code passes in -1 - we need to catch this earlier! (in the
- // kjs bindings)
- if (offset > str->l || (long)offset < 0) {
- exceptioncode = DOMException::INDEX_SIZE_ERR;
- return 0;
- }
-
- // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
- if (isReadOnly()) {
- exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
- return 0;
- }
-
- DOMStringImpl *oldStr = str;
- TextImpl *newText = createNew(str->substring(offset,str->l-offset));
- str = str->copy();
- str->ref();
- str->remove(offset,str->l-offset);
-
- dispatchModifiedEvent(oldStr);
- oldStr->deref();
-
- if (parentNode())
- parentNode()->insertBefore(newText,nextSibling(), exceptioncode );
- if ( exceptioncode )
- return 0;
-
- if (m_render)
- (static_cast<RenderText*>(m_render))->setText(str);
- setChanged(true);
- return newText;
-}
-
-DOMString TextImpl::nodeName() const
-{
- return "#text";
-}
-
-unsigned short TextImpl::nodeType() const
-{
- return Node::TEXT_NODE;
-}
-
-NodeImpl *TextImpl::cloneNode(bool /*deep*/)
-{
- return getDocument()->createTextNode(str);
-}
-
-bool TextImpl::rendererIsNeeded(RenderStyle *style)
-{
- if (!CharacterDataImpl::rendererIsNeeded(style)) {
- return false;
- }
- bool onlyWS = containsOnlyWhitespace();
- if (!onlyWS) {
- return true;
- }
-
- RenderObject *par = parentNode()->renderer();
-
- if (par->isTable() || par->isTableRow() || par->isTableSection()) {
- return false;
- }
-
- if (style->preserveWS() || style->preserveLF()) {
- return true;
- }
-
- RenderObject *prev = previousRenderer();
- if (par->isInlineFlow()) {
- // <span><div/> <div/></span>
- if (prev && !prev->isInline()) {
- return false;
- }
- } else {
- if (par->isRenderBlock() && !par->childrenInline() && (!prev || !prev->isInline())) {
- return false;
- }
-
- RenderObject *first = par->firstChild();
- while (first && first->isFloatingOrPositioned())
- first = first->nextSibling();
- RenderObject *next = nextRenderer();
- if (!first || next == first) {
- // Whitespace at the start of a block just goes away. Don't even
- // make a render object for this text.
- return false;
- }
- }
-
- return true;
-}
-
-RenderObject *TextImpl::createRenderer(RenderArena *arena, RenderStyle *style)
-{
- return new (arena) RenderText(this, str);
-}
-
-void TextImpl::attach()
-{
- createRendererIfNeeded();
- CharacterDataImpl::attach();
-}
-
-NodeImpl::Id TextImpl::id() const
-{
- return ID_TEXT;
-}
-
-void TextImpl::recalcStyle( StyleChange change )
-{
-// tqDebug("textImpl::recalcStyle");
- // Create renderer if now needed
- if ( changed() && !m_render) {
- createRendererIfNeeded();
- }
- if (change != NoChange && parentNode()) {
-// tqDebug("DomText::recalcStyle");
- if(m_render)
- m_render->setStyle(parentNode()->renderer()->style());
- }
- if ( changed() && m_render && m_render->isText() )
- static_cast<RenderText*>(m_render)->setText(str);
- setChanged( false );
-}
-
-// DOM Section 1.1.1
-bool TextImpl::childTypeAllowed( unsigned short /*type*/ )
-{
- return false;
-}
-
-TextImpl *TextImpl::createNew(DOMStringImpl *_str)
-{
- return new TextImpl(docPtr(),_str);
-}
-
-DOMStringImpl* TextImpl::renderString() const
-{
- if (renderer())
- return static_cast<RenderText*>(renderer())->string();
- else
- return string();
-}
-
-DOMString TextImpl::toString() const
-{
- // FIXME: substitute entity references as needed!
- return escapeHTML( nodeValue() );
-}
-
-DOMString TextImpl::toString(long long startOffset, long long endOffset) const
-{
- // FIXME: substitute entity references as needed!
-
- DOMString str = nodeValue();
- if(endOffset >=0 || startOffset >0)
- str = str.copy(); //we are going to modify this, so make a copy. I hope I'm doing this right.
- if(endOffset >= 0)
- str.truncate(endOffset);
- if(startOffset > 0) //note the order of these 2 'if' statements so that it works right when n==m_startContainer==m_endContainer
- str.remove(0, startOffset);
- return escapeHTML( str );
-}
-
-// ---------------------------------------------------------------------------
-
-DOMString CDATASectionImpl::nodeName() const
-{
- return "#cdata-section";
-}
-
-unsigned short CDATASectionImpl::nodeType() const
-{
- return Node::CDATA_SECTION_NODE;
-}
-
-NodeImpl *CDATASectionImpl::cloneNode(bool /*deep*/)
-{
- return getDocument()->createCDATASection(str);
-}
-
-// DOM Section 1.1.1
-bool CDATASectionImpl::childTypeAllowed( unsigned short /*type*/ )
-{
- return false;
-}
-
-TextImpl *CDATASectionImpl::createNew(DOMStringImpl *_str)
-{
- return new CDATASectionImpl(docPtr(),_str);
-}
-
-DOMString CDATASectionImpl::toString() const
-{
- // FIXME: substitute entity references as needed!
- return DOMString("<![CDATA[") + nodeValue() + "]]>";
-}
-
-
-