📄 dom2_traversalimpl.cpp
字号:
/** * 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 + -