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

📄 dom2_traversalimpl.cpp

📁 将konqueror浏览器移植到ARM9 2410中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/** * This file is part of the DOM implementation for KDE. * * (C) 1999 Lars Knoll (knoll@kde.org) * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) * (C) 2001 Peter Kelly (pmk@post.com) * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * $Id: dom2_traversalimpl.cpp,v 1.9 2001/03/16 12:42:00 pmk Exp $ */#include "dom2_traversal.h"#include "dom_node.h"#include "dom_exception.h"#include "dom2_traversalimpl.h"#include "dom_docimpl.h"using namespace DOM;NodeIteratorImpl::NodeIteratorImpl(NodeImpl *_root, unsigned long _whatToShow,				   NodeFilter _filter, bool _entityReferenceExpansion){    m_root = _root;    m_whatToShow = _whatToShow;    m_filter = _filter;    m_expandEntityReferences = _entityReferenceExpansion;    m_referenceNode = _root;    m_inFront = false;    if (_root->nodeType() == Node::DOCUMENT_NODE)	m_doc = static_cast<DocumentImpl*>(m_root);    else	m_doc = m_root->ownerDocument();    m_doc->attachNodeIterator(this);    m_doc->ref();    m_detached = false;}NodeIteratorImpl::~NodeIteratorImpl(){    m_doc->detachNodeIterator(this);    m_doc->deref();}NodeImpl *NodeIteratorImpl::root(){    return m_root;}unsigned long NodeIteratorImpl::whatToShow(){    return m_whatToShow;}NodeFilter NodeIteratorImpl::filter(){    return m_filter;}bool NodeIteratorImpl::expandEntityReferences(){    return m_expandEntityReferences;}NodeImpl *NodeIteratorImpl::nextNode( int &exceptioncode ){    if (m_detached) {	exceptioncode = DOMException::INVALID_STATE_ERR;	return 0;    }    if (!m_referenceNode) {	m_inFront = true;	return 0;    }    if (!m_inFront) {	m_inFront = true;	if (isAccepted(m_referenceNode) == NodeFilter::FILTER_ACCEPT)	    return m_referenceNode;    }    NodeImpl *_tempCurrent = getNextNode(m_referenceNode);    while( _tempCurrent ) {	m_referenceNode = _tempCurrent;	if(isAccepted(_tempCurrent) == NodeFilter::FILTER_ACCEPT)	    return m_referenceNode;      _tempCurrent = getNextNode(_tempCurrent);    }    return 0;}NodeImpl *NodeIteratorImpl::getNextNode(NodeImpl *n){  /*  1. my first child   *  2. my next sibling   *  3. my parents sibling, or their parents sibling (loop)   *  4. not found   */  if( !n )    return 0;  if( n->hasChildNodes() )    return n->firstChild();  if( n->nextSibling() )    return n->nextSibling();  if( m_root == n)     return 0;  NodeImpl *parent = n->parentNode();  while( parent )    {      n = parent->nextSibling();      if( n )        return n;      if( m_root == parent )        return 0;      parent = parent->parentNode();    }  return 0;}NodeImpl *NodeIteratorImpl::previousNode( int &exceptioncode ){    if (m_detached) {	exceptioncode = DOMException::INVALID_STATE_ERR;	return 0;    }    if (!m_referenceNode) {	m_inFront = false;	return 0;    }    if (m_inFront) {	m_inFront = false;	if (isAccepted(m_referenceNode) == NodeFilter::FILTER_ACCEPT)	    return m_referenceNode;    }    NodeImpl *_tempCurrent = getPreviousNode(m_referenceNode);    while( _tempCurrent ) {	m_referenceNode = _tempCurrent;	if(isAccepted(_tempCurrent) == NodeFilter::FILTER_ACCEPT)	    return m_referenceNode;	_tempCurrent = getPreviousNode(_tempCurrent);    }    return 0;}NodeImpl *NodeIteratorImpl::getPreviousNode(NodeImpl *n){/* 1. my previous sibling.lastchild * 2. my previous sibling * 3. my parent */  NodeImpl *_tempCurrent;  if( !n )    return 0;  _tempCurrent = n->previousSibling();  if( _tempCurrent )    {      if( _tempCurrent->lastChild() )        {          while( _tempCurrent->lastChild() )            _tempCurrent = _tempCurrent->lastChild();          return _tempCurrent;        }      else        return _tempCurrent;    }  if(n == m_root)    return 0;  return n->parentNode();}void NodeIteratorImpl::detach(int &/*exceptioncode*/){    m_doc->detachNodeIterator(this);    m_detached = true;}void NodeIteratorImpl::notifyBeforeNodeRemoval(NodeImpl *removed){    // make sure the deleted node is with the root (but not the root itself)    if (removed == m_root)	return;    NodeImpl *maybeRoot = removed->parentNode();    while (maybeRoot && maybeRoot != m_root)	maybeRoot = maybeRoot->parentNode();    if (!maybeRoot)	return;    // did I get deleted, or one of my parents?    NodeImpl *_tempDeleted = m_referenceNode;    while( _tempDeleted && _tempDeleted != removed)        _tempDeleted = _tempDeleted->parentNode();    if( !_tempDeleted )  // someone that didn't consern me got deleted        return;    if( !m_inFront)    {        NodeImpl *_next = getNextNode(_tempDeleted);        if( _next )            m_referenceNode = _next;        else        {	    // deleted node was at end of list            m_inFront = true;            m_referenceNode = getPreviousNode(_tempDeleted);        }    }    else {	NodeImpl *_prev = getPreviousNode(_tempDeleted);	if ( _prev )	    m_referenceNode = _prev;	else	{	    // deleted node was at start of list	    m_inFront = false;	    m_referenceNode = getNextNode(_tempDeleted);	}    }}short NodeIteratorImpl::isAccepted(NodeImpl *n){  // if XML is implemented we have to check expandEntityRerefences in this function  if( ( ( 1 << n->nodeType()-1) & m_whatToShow) != 0 )    {        if(!m_filter.isNull())            return m_filter.acceptNode(n);        else	    return NodeFilter::FILTER_ACCEPT;    }    return NodeFilter::FILTER_SKIP;}// --------------------------------------------------------------NodeFilterImpl::NodeFilterImpl(){    m_customNodeFilter = 0;}NodeFilterImpl::~NodeFilterImpl(){    if (m_customNodeFilter)	m_customNodeFilter->deref();}short NodeFilterImpl::acceptNode(const Node &n){    if (m_customNodeFilter)	return m_customNodeFilter->acceptNode(n);    else	return NodeFilter::FILTER_ACCEPT;}void NodeFilterImpl::setCustomNodeFilter(CustomNodeFilter *custom){    m_customNodeFilter = custom;    if (m_customNodeFilter)	m_customNodeFilter->ref();}CustomNodeFilter *NodeFilterImpl::customNodeFilter(){    return m_customNodeFilter;}// --------------------------------------------------------------TreeWalkerImpl::TreeWalkerImpl(){    filter = 0;    whatToShow = 0x0000FFFF;    expandEntityReferences = true;}TreeWalkerImpl::TreeWalkerImpl(const TreeWalkerImpl &other) : DomShared(){    expandEntityReferences = other.expandEntityReferences;    filter = other.filter;    whatToShow = other.whatToShow;    currentNode = other.currentNode;    rootNode = other.rootNode;}TreeWalkerImpl::TreeWalkerImpl(Node n, NodeFilter *f){  currentNode = n;  rootNode = n;  whatToShow = 0x0000FFFF;  filter = f;}TreeWalkerImpl::TreeWalkerImpl(Node n, long _whatToShow, NodeFilter *f){  currentNode = n;  rootNode = n;  whatToShow = _whatToShow;  filter = f;}TreeWalkerImpl &TreeWalkerImpl::operator = (const TreeWalkerImpl &other){  expandEntityReferences = other.expandEntityReferences;  filter = other.filter;  whatToShow = other.whatToShow;  currentNode = other.currentNode;  return *this;}TreeWalkerImpl::~TreeWalkerImpl(){    if(filter)      {        delete filter;        filter = 0;      }}

⌨️ 快捷键说明

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