00001
00023 #include "dom/dom_doc.h"
00024 #include "dom/dom_exception.h"
00025 #include "dom/dom2_events.h"
00026 #include "xml/dom_docimpl.h"
00027 #include "xml/dom_elementimpl.h"
00028 #include "xml/dom2_eventsimpl.h"
00029
00030 #include <qrect.h>
00031
00032 using namespace DOM;
00033
00034 NamedNodeMap::NamedNodeMap()
00035 {
00036 impl = 0;
00037 }
00038
00039 NamedNodeMap::NamedNodeMap(const NamedNodeMap &other)
00040 {
00041 impl = other.impl;
00042 if (impl) impl->ref();
00043 }
00044
00045 NamedNodeMap::NamedNodeMap(NamedNodeMapImpl *i)
00046 {
00047 impl = i;
00048 if (impl) impl->ref();
00049 }
00050
00051 NamedNodeMap &NamedNodeMap::operator = (const NamedNodeMap &other)
00052 {
00053 if ( impl != other.impl ) {
00054 if(impl) impl->deref();
00055 impl = other.impl;
00056 if(impl) impl->ref();
00057 }
00058 return *this;
00059 }
00060
00061 NamedNodeMap::~NamedNodeMap()
00062 {
00063 if(impl) impl->deref();
00064 }
00065
00066 Node NamedNodeMap::getNamedItem( const DOMString &name ) const
00067 {
00068 if (!impl) return 0;
00069 NodeImpl::Id nid = impl->mapId(0, name.implementation(), true);
00070 if (!nid) return 0;
00071 return impl->getNamedItem(nid, false, name.implementation());
00072 }
00073
00074 Node NamedNodeMap::setNamedItem( const Node &arg )
00075 {
00076 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00077 if (!arg.impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00078 int exceptioncode = 0;
00079 Node r = impl->setNamedItem(arg.impl, false,
00080 arg.impl->nodeName().implementation(), exceptioncode);
00081 if (exceptioncode)
00082 throw DOMException(exceptioncode);
00083 return r;
00084 }
00085
00086 Node NamedNodeMap::removeNamedItem( const DOMString &name )
00087 {
00088 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00089 int exceptioncode = 0;
00090 Node r = impl->removeNamedItem(impl->mapId(0, name.implementation(), false),
00091 false, name.implementation(), exceptioncode);
00092 if (exceptioncode)
00093 throw DOMException(exceptioncode);
00094 return r;
00095 }
00096
00097 Node NamedNodeMap::item( unsigned long index ) const
00098 {
00099 if (!impl) return 0;
00100 return impl->item(index);
00101 }
00102
00103 Node NamedNodeMap::getNamedItemNS( const DOMString &namespaceURI, const DOMString &localName ) const
00104 {
00105 if (!impl) return 0;
00106 NodeImpl::Id nid = impl->mapId( namespaceURI.implementation(), localName.implementation(), true );
00107 return impl->getNamedItem(nid, true);
00108 }
00109
00110 Node NamedNodeMap::setNamedItemNS( const Node &arg )
00111 {
00112 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00113 int exceptioncode = 0;
00114 Node r = impl->setNamedItem(arg.impl, true, 0, exceptioncode);
00115 if (exceptioncode)
00116 throw DOMException(exceptioncode);
00117 return r;
00118 }
00119
00120 Node NamedNodeMap::removeNamedItemNS( const DOMString &namespaceURI, const DOMString &localName )
00121 {
00122 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00123 int exceptioncode = 0;
00124 NodeImpl::Id nid = impl->mapId( namespaceURI.implementation(), localName.implementation(), false );
00125 Node r = impl->removeNamedItem(nid, true, 0, exceptioncode);
00126 if (exceptioncode)
00127 throw DOMException(exceptioncode);
00128 return r;
00129 }
00130
00131 unsigned long NamedNodeMap::length() const
00132 {
00133 if (!impl) return 0;
00134 return impl->length();
00135 }
00136
00137
00138
00139 Node::Node(const Node &other)
00140 {
00141 impl = other.impl;
00142 if(impl) impl->ref();
00143 }
00144
00145 Node::Node( NodeImpl *i )
00146 {
00147 impl = i;
00148 if(impl) impl->ref();
00149 }
00150
00151 Node &Node::operator = (const Node &other)
00152 {
00153 if(impl != other.impl) {
00154 if(impl) impl->deref();
00155 impl = other.impl;
00156 if(impl) impl->ref();
00157 }
00158 return *this;
00159 }
00160
00161 bool Node::operator == (const Node &other) const
00162 {
00163 return (impl == other.impl);
00164 }
00165
00166 bool Node::operator != (const Node &other) const
00167 {
00168 return !(impl == other.impl);
00169 }
00170
00171 Node::~Node()
00172 {
00173 if(impl) impl->deref();
00174 }
00175
00176 DOMString Node::nodeName() const
00177 {
00178 if(impl) return impl->nodeName();
00179 return DOMString();
00180 }
00181
00182 DOMString Node::nodeValue() const
00183 {
00184
00185 if(impl) return impl->nodeValue();
00186 return DOMString();
00187 }
00188
00189 void Node::setNodeValue( const DOMString &_str )
00190 {
00191 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00192
00193 int exceptioncode = 0;
00194 if(impl) impl->setNodeValue( _str,exceptioncode );
00195 if (exceptioncode)
00196 throw DOMException(exceptioncode);
00197 }
00198
00199 unsigned short Node::nodeType() const
00200 {
00201 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00202 return impl->nodeType();
00203 }
00204
00205 Node Node::parentNode() const
00206 {
00207 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00208 return impl->parentNode();
00209 }
00210
00211 NodeList Node::childNodes() const
00212 {
00213 if (!impl) return 0;
00214 return impl->childNodes();
00215 }
00216
00217 Node Node::firstChild() const
00218 {
00219 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00220 return impl->firstChild();
00221 }
00222
00223 Node Node::lastChild() const
00224 {
00225 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00226 return impl->lastChild();
00227 }
00228
00229 Node Node::previousSibling() const
00230 {
00231 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00232 return impl->previousSibling();
00233 }
00234
00235 Node Node::nextSibling() const
00236 {
00237 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00238 return impl->nextSibling();
00239 }
00240
00241 NamedNodeMap Node::attributes() const
00242 {
00243 if (!impl || !impl->isElementNode()) return 0;
00244 return static_cast<ElementImpl*>(impl)->attributes();
00245 }
00246
00247 Document Node::ownerDocument() const
00248 {
00249
00250
00251
00252
00253 if (!impl || impl->getDocument() == impl) return Document(false);
00254
00255 return impl->getDocument();
00256 }
00257
00258 Node Node::insertBefore( const Node &newChild, const Node &refChild )
00259 {
00260 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00261 int exceptioncode = 0;
00262 NodeImpl *r = impl->insertBefore( newChild.impl, refChild.impl, exceptioncode );
00263 if (exceptioncode)
00264 throw DOMException(exceptioncode);
00265 if (!newChild.impl->closed()) newChild.impl->close();
00266 return r;
00267 }
00268
00269 Node Node::replaceChild( const Node &newChild, const Node &oldChild )
00270 {
00271 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00272 int exceptioncode = 0;
00273 NodeImpl *r = impl->replaceChild( newChild.impl, oldChild.impl, exceptioncode );
00274 if (exceptioncode)
00275 throw DOMException(exceptioncode);
00276 if (newChild.impl && !newChild.impl->closed()) newChild.impl->close();
00277 return r;
00278 }
00279
00280 Node Node::removeChild( const Node &oldChild )
00281 {
00282 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00283 int exceptioncode = 0;
00284 NodeImpl *r = impl->removeChild( oldChild.impl, exceptioncode );
00285 if (exceptioncode)
00286 throw DOMException(exceptioncode);
00287 return r;
00288 }
00289
00290 Node Node::appendChild( const Node &newChild )
00291 {
00292 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00293 int exceptioncode = 0;
00294 NodeImpl *r = impl->appendChild( newChild.impl, exceptioncode );
00295 if (exceptioncode)
00296 throw DOMException(exceptioncode);
00297 if (!newChild.impl->closed()) newChild.impl->close();
00298 return r;
00299 }
00300
00301 bool Node::hasAttributes()
00302 {
00303 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00304 if (!impl->isElementNode()) return false;
00305 ElementImpl* e = static_cast<ElementImpl*>(impl);
00306 return e->attributes(true) && e->attributes(true)->length();
00307 }
00308
00309 bool Node::hasChildNodes( )
00310 {
00311 if (!impl) return false;
00312 return impl->hasChildNodes();
00313 }
00314
00315 Node Node::cloneNode( bool deep )
00316 {
00317 if (!impl) return 0;
00318 return impl->cloneNode( deep );
00319 }
00320
00321 void Node::normalize ( )
00322 {
00323 if (!impl) return;
00324 impl->normalize();
00325 }
00326
00327 bool Node::isSupported( const DOMString &feature,
00328 const DOMString & ) const
00329 {
00330 DOMString upFeature = feature.upper();
00331 return (upFeature == "HTML" ||
00332 upFeature == "XML" ||
00333 upFeature == "CORE");
00334 }
00335
00336 DOMString Node::namespaceURI( ) const
00337 {
00338 if (!impl) return DOMString();
00339 return impl->namespaceURI();
00340 }
00341
00342 DOMString Node::prefix( ) const
00343 {
00344 if (!impl) return DOMString();
00345 return impl->prefix();
00346 }
00347
00348 void Node::setPrefix(const DOMString &prefix )
00349 {
00350 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00351 int exceptioncode = 0;
00352 impl->setPrefix(prefix,exceptioncode);
00353 if (exceptioncode)
00354 throw DOMException(exceptioncode);
00355 }
00356
00357 DOMString Node::localName( ) const
00358 {
00359 if (!impl) return DOMString();
00360 return impl->localName();
00361 }
00362
00363 void Node::addEventListener(const DOMString &type,
00364 EventListener *listener,
00365 const bool useCapture)
00366 {
00367 if (!impl) return;
00368 if (listener)
00369 impl->addEventListener(EventImpl::typeToId(type),listener,useCapture);
00370 }
00371
00372 void Node::removeEventListener(const DOMString &type,
00373 EventListener *listener,
00374 bool useCapture)
00375 {
00376 if (!impl) return;
00377 impl->removeEventListener(EventImpl::typeToId(type),listener,useCapture);
00378 }
00379
00380 bool Node::dispatchEvent(const Event &evt)
00381 {
00382 if (!impl)
00383 throw DOMException(DOMException::INVALID_STATE_ERR);
00384
00385 if (!evt.handle())
00386 throw DOMException(DOMException::NOT_FOUND_ERR);
00387
00388 int exceptioncode = 0;
00389 impl->dispatchEvent(evt.handle(),exceptioncode);
00390 if (exceptioncode)
00391 throw DOMException(exceptioncode);
00392 return !evt.handle()->defaultPrevented();
00393 }
00394
00395
00396 unsigned int Node::elementId() const
00397 {
00398 if (!impl) return 0;
00399 return impl->id();
00400 }
00401
00402 unsigned long Node::index() const
00403 {
00404 if (!impl) return 0;
00405 return impl->nodeIndex();
00406 }
00407
00408 QString Node::toHTML()
00409 {
00410 if (!impl) return QString::null;
00411 return impl->toString().string();
00412 }
00413
00414 void Node::applyChanges()
00415 {
00416 if (!impl) return;
00417 impl->recalcStyle( NodeImpl::Inherit );
00418 }
00419
00420 void Node::getCursor(int offset, int &_x, int &_y, int &height)
00421 {
00422 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00423 int dummy;
00424 impl->getCaret(offset, false, _x, _y, dummy, height);
00425 }
00426
00427 QRect Node::getRect()
00428 {
00429 if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
00430 return impl->getRect();
00431 }
00432
00433
00434
00435 NodeList::NodeList()
00436 {
00437 impl = 0;
00438 }
00439
00440 NodeList::NodeList(const NodeList &other)
00441 {
00442 impl = other.impl;
00443 if(impl) impl->ref();
00444 }
00445
00446 NodeList::NodeList(const NodeListImpl *i)
00447 {
00448 impl = const_cast<NodeListImpl *>(i);
00449 if(impl) impl->ref();
00450 }
00451
00452 NodeList &NodeList::operator = (const NodeList &other)
00453 {
00454 if ( impl != other.impl ) {
00455 if(impl) impl->deref();
00456 impl = other.impl;
00457 if(impl) impl->ref();
00458 }
00459 return *this;
00460 }
00461
00462 NodeList::~NodeList()
00463 {
00464 if(impl) impl->deref();
00465 }
00466
00467 Node NodeList::item( unsigned long index ) const
00468 {
00469 if (!impl) return 0;
00470 return impl->item(index);
00471 }
00472
00473 unsigned long NodeList::length() const
00474 {
00475 if (!impl) return 0;
00476 return impl->length();
00477 }