You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/ksvg/impl/SVGEcma.cpp

843 lines
28 KiB

/*
Copyright (C) 2002-2003 KSVG Team
This file is part of the KDE project
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 <typeinfo>
#include <kdebug.h>
#include <dom/dom_exception.h>
#include "CanvasItem.h"
#include "KSVGCanvas.h"
#include "SVGEcma.h"
#include "SVGShapeImpl.h"
#include "SVGHelperImpl.h"
#include "SVGDocumentImpl.h"
#include "SVGSVGElementImpl.h"
using namespace KSVG;
#include "SVGEcma.lut.h"
#include "ksvg_scriptinterpreter.h"
#include "ksvg_ecmaeventlistener.h"
#include "ksvg_window.h"
#include "ksvg_ecma.h"
// SVGDOMNodeBridge
/*
@namespace KSVG
@begin SVGDOMNodeBridge::s_hashTable 17
nodeName SVGDOMNodeBridge::NodeName DontDelete|ReadOnly
nodeValue SVGDOMNodeBridge::NodeValue DontDelete
nodeType SVGDOMNodeBridge::NodeType DontDelete|ReadOnly
parentNode SVGDOMNodeBridge::ParentNode DontDelete|ReadOnly
childNodes SVGDOMNodeBridge::ChildNodes DontDelete|ReadOnly
firstChild SVGDOMNodeBridge::FirstChild DontDelete|ReadOnly
lastChild SVGDOMNodeBridge::LastChild DontDelete|ReadOnly
previousSibling SVGDOMNodeBridge::PreviousSibling DontDelete|ReadOnly
nextSibling SVGDOMNodeBridge::NextSibling DontDelete|ReadOnly
attributes SVGDOMNodeBridge::Attributes DontDelete|ReadOnly
namespaceURI SVGDOMNodeBridge::NamespaceURI DontDelete|ReadOnly
prefix SVGDOMNodeBridge::Prefix DontDelete
localName SVGDOMNodeBridge::LocalName DontDelete|ReadOnly
ownerDocument SVGDOMNodeBridge::OwnerDocument DontDelete|ReadOnly
@end
@namespace KSVG
@begin SVGDOMNodeBridgeProto::s_hashTable 29
insertBefore SVGDOMNodeBridge::InsertBefore DontDelete|Function 2
replaceChild SVGDOMNodeBridge::ReplaceChild DontDelete|Function 2
removeChild SVGDOMNodeBridge::RemoveChild DontDelete|Function 1
appendChild SVGDOMNodeBridge::AppendChild DontDelete|Function 1
hasAttributes SVGDOMNodeBridge::HasAttributes DontDelete|Function 0
hasChildNodes SVGDOMNodeBridge::HasChildNodes DontDelete|Function 0
cloneNode SVGDOMNodeBridge::CloneNode DontDelete|Function 1
normalize SVGDOMNodeBridge::Normalize DontDelete|Function 0
isSupported SVGDOMNodeBridge::IsSupported DontDelete|Function 2
addEventListener SVGDOMNodeBridge::AddEventListener DontDelete|Function 3
removeEventListener SVGDOMNodeBridge::RemoveEventListener DontDelete|Function 3
contains SVGDOMNodeBridge::Contains DontDelete|Function 1
getNodeName SVGDOMNodeBridge::GetNodeName DontDelete|Function 0
getNodeValue SVGDOMNodeBridge::GetNodeValue DontDelete|Function 0
getNodeType SVGDOMNodeBridge::GetNodeType DontDelete|Function 0
getParentNode SVGDOMNodeBridge::GetParentNode DontDelete|Function 0
getChildNodes SVGDOMNodeBridge::GetChildNodes DontDelete|Function 0
getFirstChild SVGDOMNodeBridge::GetFirstChild DontDelete|Function 0
getLastChild SVGDOMNodeBridge::GetLastChild DontDelete|Function 0
getPreviousSibling SVGDOMNodeBridge::GetPreviousSibling DontDelete|Function 0
getNextSibling SVGDOMNodeBridge::GetNextSibling DontDelete|Function 0
getAttributes SVGDOMNodeBridge::GetAttributes DontDelete|Function 0
getNamespaceURI SVGDOMNodeBridge::GetNamespaceURI DontDelete|Function 0
getPrefix SVGDOMNodeBridge::GetPrefix DontDelete|Function 0
getLocalName SVGDOMNodeBridge::GetLocalName DontDelete|Function 0
getOwnerDocument SVGDOMNodeBridge::GetOwnerDocument DontDelete|Function 0
@end
*/
KSVG_IMPLEMENT_PROTOTYPE("DOMNode", SVGDOMNodeBridgeProto, SVGDOMNodeBridgeProtoFunc)
Value SVGDOMNodeBridge::getValueProperty(ExecState *exec, int token) const
{
switch(token)
{
case NodeName:
return getString(m_impl.nodeName());
case NodeValue:
return getString(m_impl.nodeValue());
case NodeType:
return Number(m_impl.nodeType());
case ParentNode:
return getDOMNode(exec, m_impl.parentNode());
case ChildNodes:
return (new SVGDOMNodeListBridge(m_impl.childNodes()))->cache(exec);
case FirstChild:
return getDOMNode(exec, m_impl.firstChild());
case LastChild:
return getDOMNode(exec, m_impl.lastChild());
case PreviousSibling:
return getDOMNode(exec, m_impl.previousSibling());
case NextSibling:
return getDOMNode(exec, m_impl.nextSibling());
// case Attributes: // TODO
case NamespaceURI:
return getString(m_impl.namespaceURI());
case Prefix:
return getString(m_impl.prefix());
case LocalName:
return getString(m_impl.localName());
case OwnerDocument:
return getDOMNode(exec, m_impl.ownerDocument());
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}
void SVGDOMNodeBridge::putValueProperty(ExecState *exec, int token, const Value &value, int)
{
switch(token)
{
case NodeValue:
m_impl.setNodeValue(value.toString(exec).string());
break;
case Prefix:
m_impl.setPrefix(value.toString(exec).string());
break;
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
}
}
// Special variantion to update the <text> element,
// triggered by one of the child nodes
void updateTextItem(ExecState *exec, const DOM::Node node)
{
DOM::Node parent;
while(!(parent = node.parentNode()).isNull())
{
DOM::DOMString name = parent.nodeName();
if(name == "text" || name == "tspan" || name == "tref")
{
SVGHelperImpl::updateItem(exec, parent);
break;
}
}
}
// Remove item from canvas
void removeItem(ExecState *exec, DOM::Node &node)
{
// Get document
SVGDocumentImpl *doc = KSVG::Window::retrieveActive(exec)->doc();
// Update canvas
SVGShapeImpl *shape = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(node.handle()));
if(shape && shape->item())
doc->canvas()->removeItem(shape->item());
}
// parseXML + getURL() need all these 5 functions to work properly
void correctHandles(SVGElementImpl *main, DOM::Node &node)
{
DOM::Element old(node.handle());
DOM::Element *replace = static_cast<DOM::Element *>(main->ownerDoc()->getElementFromHandle(node.handle()));
if(replace && node.nodeType() == DOM::Node::ELEMENT_NODE)
*replace = old;
if(node.hasChildNodes())
{
for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
correctHandles(main, iterate);
}
}
void integrateTree(SVGElementImpl *main, DOM::Node &node, DOM::Node &newNode, SVGElementImpl *obj, SVGDocumentImpl *doc)
{
if(!obj)
return;
// Add to global element dicts
doc->addToElemDict(newNode.handle(), obj);
doc->addToElemDict(node.handle(), obj);
if(node.hasChildNodes())
{
DOM::Node iterate2 = newNode.firstChild();
for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
{
integrateTree(main, iterate, iterate2, obj->ownerDoc()->getElementFromHandle(iterate2.handle()), doc);
iterate2 = iterate2.nextSibling();
}
}
}
void correctDocument(SVGElementImpl *main, DOM::Node &node, SVGElementImpl *obj, SVGDocumentImpl *doc)
{
if(!obj)
return;
// Correct document
obj->setOwnerDoc(main->ownerDoc());
// Correct rootElement
if(!obj->ownerSVGElement())
obj->setOwnerSVGElement(main->ownerSVGElement());
// Correct viewportElement
if(!obj->viewportElement())
obj->setViewportElement(main->viewportElement());
// Properly (re-)register events in the current active document
obj->setupEventListeners(main->ownerDoc(), doc);
if(node.hasChildNodes())
{
for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
correctDocument(main, iterate, doc->getElementFromHandle(iterate.handle()), doc);
}
}
void registerAdditional(ExecState *exec, SVGDocumentImpl *doc, DOM::Node node)
{
// Register ID in rootElement!
SVGElementImpl *resultElement = doc->getElementFromHandle(node.handle());
if(resultElement && resultElement->hasAttribute("id"))
doc->rootElement()->addToIdMap(resultElement->getAttribute("id").string(), resultElement);
if(node.hasChildNodes())
{
for(DOM::Node iterate = node.firstChild(); !iterate.isNull(); iterate = iterate.nextSibling())
registerAdditional(exec, doc, iterate);
}
}
Value appendHelper(ExecState *exec, DOM::Node node, DOM::Node newNode)
{
// This is quite tricky code by me (Niko)
// Don't even try to modify it.
if(!(node.ownerDocument() == newNode.ownerDocument()))
{
// Get document
SVGDocumentImpl *doc = KSVG::Window::retrieveActive(exec)->doc();
// Detect ownerDoc() of newNode
SVGDocumentImpl *newDoc = doc->getDocumentFromHandle(newNode.ownerDocument().handle());
// Get some SVGElementImpl's
SVGElementImpl *nodeElement = doc->getElementFromHandle(node.handle());
SVGElementImpl *newNodeElement = newDoc->getElementFromHandle(newNode.handle());
// Import node into document
DOM::Node result = doc->importNode(newNode, true);
// Associate the imported node 'result' with the
// 'newNodeElement' which belongs to 'newDoc'
integrateTree(nodeElement, result, newNode, newNodeElement, doc);
// Correct handles in SVG* elements
correctHandles(nodeElement, result);
// Correct ownerDoc() etc..
correctDocument(nodeElement, newNode, newNodeElement, newDoc);
// Register ID in global map
registerAdditional(exec, doc, result);
// Recalc style
newNodeElement->setAttributes();
// Append + create + update element
Value retVal = getDOMNode(exec, node.appendChild(result));
doc->syncCachedMatrices();
newNodeElement->createItem(doc->canvas());
SVGHelperImpl::updateItem(exec, *newNodeElement);
return retVal;
}
else
{
Value retVal = getDOMNode(exec, node.appendChild(newNode));
// Get document
SVGDocumentImpl *doc = KSVG::Window::retrieveActive(exec)->doc();
doc->syncCachedMatrices();
// Get some SVGElementImpl's
SVGElementImpl *nodeElement = doc->getElementFromHandle(newNode.handle());
// TODO : extra check needed to see if the new elements parent is already appended
// in the doc. Not really nice, should be some other way? (Rob)
if(nodeElement && !nodeElement->parentNode().parentNode().isNull())
{
nodeElement->setAttributes(true);
nodeElement->createItem();
SVGHelperImpl::updateItem(exec, newNode);
}
return retVal;
}
}
Value SVGDOMNodeBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
{
KSVG_CHECK_THIS(SVGDOMNodeBridge)
DOM::Node node = obj->impl();
switch(id)
{
case SVGDOMNodeBridge::InsertBefore:
{
DOM::Node newChild = toNode(args[0]);
DOM::Node beforeChild = toNode(args[1]);
Value retVal = getDOMNode(exec, node.insertBefore(newChild, beforeChild));
// Get document
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
// Get some SVGElementImpl's
SVGShapeImpl *newShape = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(newChild.handle()));
SVGElementImpl *newElement = doc->getElementFromHandle(newChild.handle());
SVGShapeImpl *beforeElement = dynamic_cast<SVGShapeImpl *>(doc->getElementFromHandle(beforeChild.handle()));
if(newShape && beforeElement && beforeElement->item())
{
int z = beforeElement->item()->zIndex();
newElement->createItem();
doc->canvas()->insert(newShape->item(), z);
}
SVGHelperImpl::updateItem(exec, newChild);
return retVal;
}
case SVGDOMNodeBridge::ReplaceChild:
{
DOM::Node newChild = toNode(args[0]);
Value retVal = getDOMNode(exec, node.replaceChild(newChild, toNode(args[1])));
SVGHelperImpl::updateItem(exec, newChild);
return retVal;
}
case SVGDOMNodeBridge::RemoveChild:
{
DOM::Node remove = toNode(args[0]);
if(remove.isNull())
return Undefined();
// New removeChild logic:
// - remove from DOM tree
// - delete element (also deletes it's child element's)
removeItem(exec, remove);
Value retVal = getDOMNode(exec, node.removeChild(remove));
return retVal;
}
case SVGDOMNodeBridge::AppendChild:
return appendHelper(exec, node, toNode(args[0]));
case SVGDOMNodeBridge::HasAttributes:
{
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(node.handle());
if(!element)
return Undefined();
return Boolean(element->hasAttributes());
}
case SVGDOMNodeBridge::HasChildNodes:
return Boolean(node.hasChildNodes());
case SVGDOMNodeBridge::CloneNode:
{
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(node.handle());
SVGElementImpl *newElement = element->cloneNode(args[0].toBoolean(exec));
return getDOMNode(exec, *newElement);
}
case SVGDOMNodeBridge::Normalize:
{
node.normalize();
return Undefined();
}
case SVGDOMNodeBridge::IsSupported:
return Boolean(node.isSupported(args[0].toString(exec).string(), args[1].toString(exec).string()));
case SVGDOMNodeBridge::AddEventListener:
{
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(node.handle());
if(element)
{
SVGEvent::EventId eventId = SVGEvent::typeToId(args[0].toString(exec).string());
if(eventId != SVGEvent::UNKNOWN_EVENT)
element->setEventListener(eventId, new KSVGEcmaEventListener(Object::dynamicCast(args[1]), TQString(), doc->ecmaEngine()));
}
return Undefined();
}
case SVGDOMNodeBridge::RemoveEventListener:
{
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(node.handle());
if(element)
{
SVGEvent::EventId eventId = SVGEvent::typeToId(args[0].toString(exec).string());
if(eventId != SVGEvent::UNKNOWN_EVENT)
element->removeEventListener((int) eventId);
}
return Undefined();
}
// case SVGDOMNodeBridge::Contains: // TODO
case SVGDOMNodeBridge::GetNodeName:
return getString(node.nodeName());
case SVGDOMNodeBridge::GetNodeValue:
return getString(node.nodeValue());
case SVGDOMNodeBridge::GetNodeType:
return Number(node.nodeType());
case SVGDOMNodeBridge::GetParentNode:
return getDOMNode(exec, node.parentNode());
case SVGDOMNodeBridge::GetChildNodes:
return (new SVGDOMNodeListBridge(node.childNodes()))->cache(exec);
case SVGDOMNodeBridge::GetFirstChild:
return getDOMNode(exec, node.firstChild());
case SVGDOMNodeBridge::GetLastChild:
return getDOMNode(exec, node.lastChild());
case SVGDOMNodeBridge::GetPreviousSibling:
return getDOMNode(exec, node.previousSibling());
case SVGDOMNodeBridge::GetNextSibling:
return getDOMNode(exec, node.nextSibling());
// case SVGDOMNodeBridge::GetAttributes: // TODO
case SVGDOMNodeBridge::GetNamespaceURI:
return getString(node.namespaceURI());
case SVGDOMNodeBridge::GetPrefix:
return getString(node.prefix());
case SVGDOMNodeBridge::GetLocalName:
return getString(node.localName());
case SVGDOMNodeBridge::GetOwnerDocument:
return getDOMNode(exec, node.ownerDocument());
default:
kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
break;
}
return Undefined();
}
// SVGDOMElementBridge
/*
@namespace KSVG
@begin SVGDOMElementBridge::s_hashTable 2
tagName SVGDOMElementBridge::TagName DontDelete|ReadOnly
@end
@namespace KSVG
@begin SVGDOMElementBridgeProto::s_hashTable 17
getAttribute SVGDOMElementBridge::GetAttribute DontDelete|Function 1
setAttribute SVGDOMElementBridge::SetAttribute DontDelete|Function 2
removeAttribute SVGDOMElementBridge::RemoveAttribute DontDelete|Function 1
getAttributeNode SVGDOMElementBridge::GetAttributeNode DontDelete|Function 1
setAttributeNode SVGDOMElementBridge::SetAttributeNode DontDelete|Function 2
removeAttributeNode SVGDOMElementBridge::RemoveAttributeNode DontDelete|Function 1
getElementsByTagName SVGDOMElementBridge::GetElementsByTagName DontDelete|Function 1
hasAttribute SVGDOMElementBridge::HasAttribute DontDelete|Function 1
getAttributeNS SVGDOMElementBridge::GetAttributeNS DontDelete|Function 2
setAttributeNS SVGDOMElementBridge::SetAttributeNS DontDelete|Function 3
removeAttributeNS SVGDOMElementBridge::RemoveAttributeNS DontDelete|Function 2
getAttributeNodeNS SVGDOMElementBridge::GetAttributeNodeNS DontDelete|Function 2
setAttributeNodeNS SVGDOMElementBridge::SetAttributeNodeNS DontDelete|Function 1
getElementByTagNameNS SVGDOMElementBridge::GetElementsByTagNameNS DontDelete|Function 2
hasAttributeNS SVGDOMElementBridge::HasAttributeNS DontDelete|Function 2
@end
*/
KSVG_IMPLEMENT_PROTOTYPE("DOMElement", SVGDOMElementBridgeProto, SVGDOMElementBridgeProtoFunc)
Value SVGDOMElementBridge::getValueProperty(ExecState *, int token) const
{
switch(token)
{
case TagName:
return getString(m_impl.tagName());
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}
Value SVGDOMElementBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
{
KSVG_CHECK_THIS(SVGDOMElementBridge)
DOM::Element elem = obj->impl();
switch(id)
{
case SVGDOMElementBridge::GetAttribute:
{
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
if(element)
return String(element->getAttribute(args[0].toString(exec).string()));
else
return Undefined();
}
case SVGDOMElementBridge::SetAttribute:
{
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
if(element)
{
element->setAttribute(args[0].toString(exec).string(), args[1].toString(exec).string());
element->setAttributeInternal(args[0].toString(exec).string(), args[1].toString(exec).string());
SVGHelperImpl::updateItem(exec, elem);
}
return Undefined();
}
case SVGDOMElementBridge::RemoveAttribute:
{
elem.removeAttribute(args[0].toString(exec).string());
return Undefined();
}
case SVGDOMElementBridge::GetAttributeNode:
return getDOMNode(exec, elem.getAttributeNode(args[0].toString(exec).string()));
case SVGDOMElementBridge::SetAttributeNode: // TODO: Correct?
return getDOMNode(exec, elem.setAttributeNode(toNode(args[0])));
case SVGDOMElementBridge::RemoveAttributeNode: // TODO: Correct?
return getDOMNode(exec, elem.removeAttributeNode(toNode(args[0])));
case SVGDOMElementBridge::GetElementsByTagName:
return (new SVGDOMNodeListBridge(elem.getElementsByTagName(args[0].toString(exec).string())))->cache(exec);
case SVGDOMElementBridge::GetAttributeNS:
{
// This just skips NS! (Rob)
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
if(element)
return String(element->getAttribute(args[1].toString(exec).string()));
else
return Undefined();
}
case SVGDOMElementBridge::SetAttributeNS:
{
// For now, we strip the NS part (Rob)
DOM::DOMString attr = args[1].toString(exec).string();
int pos = attr.string().find(':');
if(pos > -1)
attr = attr.string().mid(pos + 1);
SVGDocumentImpl *doc = Window::retrieveActive(exec)->doc();
SVGElementImpl *element = doc->getElementFromHandle(elem.handle());
if(element)
{
element->setAttribute(attr.string(), args[2].toString(exec).string());
element->setAttributeInternal(attr.string(), args[2].toString(exec).string());
SVGHelperImpl::updateItem(exec, *element);
}
return Undefined();
}
case SVGDOMElementBridge::RemoveAttributeNS:
{
elem.removeAttributeNS(args[0].toString(exec).string(), args[1].toString(exec).string());
return Undefined();
}
case SVGDOMElementBridge::GetAttributeNodeNS:
return getDOMNode(exec, elem.getAttributeNodeNS(args[0].toString(exec).string(), args[1].toString(exec).string()));
case SVGDOMElementBridge::SetAttributeNodeNS: // TODO: Correct?
return getDOMNode(exec, elem.setAttributeNodeNS(toNode(args[0])));
case SVGDOMElementBridge::GetElementsByTagNameNS:
return (new SVGDOMNodeListBridge(elem.getElementsByTagNameNS(args[0].toString(exec).string(), args[1].toString(exec).string())))->cache(exec);
case SVGDOMElementBridge::HasAttribute:
return Boolean(elem.hasAttribute(args[0].toString(exec).string()));
case SVGDOMElementBridge::HasAttributeNS:
return Boolean(elem.hasAttributeNS(args[0].toString(exec).string(), args[1].toString(exec).string()));
default:
kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
break;
}
return Undefined();
}
// SVGDOMNodeListBridge
/*
@namespace KSVG
@begin SVGDOMNodeListBridge::s_hashTable 2
length SVGDOMNodeListBridge::Length DontDelete
@end
@namespace KSVG
@begin SVGDOMNodeListBridgeProto::s_hashTable 3
getLength SVGDOMNodeListBridge::GetLength DontDelete|Function 0
item SVGDOMNodeListBridge::Item DontDelete|Function 1
@end
*/
KSVG_IMPLEMENT_PROTOTYPE("DOMNodeList", SVGDOMNodeListBridgeProto, SVGDOMNodeListBridgeProtoFunc)
Value SVGDOMNodeListBridge::getValueProperty(ExecState *, int token) const
{
switch(token)
{
case Length:
return Number(m_impl.length());
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}
Value SVGDOMNodeListBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
{
KSVG_CHECK_THIS(SVGDOMNodeListBridge)
DOM::NodeList nodeList = obj->impl();
switch(id)
{
case SVGDOMNodeListBridge::GetLength:
return Number(nodeList.length());
case SVGDOMNodeListBridge::Item:
return getDOMNode(exec, nodeList.item((unsigned long)args[0].toNumber(exec)));
default:
kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
break;
}
return Undefined();
}
// SVGDOMCharacterDataBridge
/*
@namespace KSVG
@begin SVGDOMCharacterDataBridge::s_hashTable 3
data SVGDOMCharacterDataBridge::Data DontDelete
length SVGDOMCharacterDataBridge::Length DontDelete|ReadOnly
@end
@namespace KSVG
@begin SVGDOMCharacterDataBridgeProto::s_hashTable 11
getData SVGDOMCharacterDataBridge::GetData DontDelete|Function 0
setData SVGDOMCharacterDataBridge::SetData DontDelete|Function 1
getLength SVGDOMCharacterDataBridge::GetLength DontDelete|Function 0
substringData SVGDOMCharacterDataBridge::SubstringData DontDelete|Function 2
appendData SVGDOMCharacterDataBridge::AppendData DontDelete|Function 1
insertData SVGDOMCharacterDataBridge::InsertData DontDelete|Function 2
deleteData SVGDOMCharacterDataBridge::DeleteData DontDelete|Function 2
replaceData SVGDOMCharacterDataBridge::ReplaceData DontDelete|Function 2
@end
*/
KSVG_IMPLEMENT_PROTOTYPE("DOMCharacterData", SVGDOMCharacterDataBridgeProto, SVGDOMCharacterDataBridgeProtoFunc)
Value SVGDOMCharacterDataBridge::getValueProperty(ExecState *, int token) const
{
switch(token)
{
case Data:
return String(m_impl.data());
case Length:
return Number(m_impl.length());
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}
void SVGDOMCharacterDataBridge::putValueProperty(ExecState *exec, int token, const Value &value, int)
{
switch(token)
{
case Data:
m_impl.setData(value.toString(exec).string());
updateTextItem(exec, m_impl);
break;
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
}
}
Value SVGDOMCharacterDataBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
{
KSVG_CHECK_THIS(SVGDOMCharacterDataBridge)
DOM::CharacterData node = obj->impl();
switch(id)
{
case SVGDOMCharacterDataBridge::GetData:
return String(node.data());
case SVGDOMCharacterDataBridge::SetData:
node.setData(args[0].toString(exec).string());
updateTextItem(exec, node);
return Undefined();
case SVGDOMCharacterDataBridge::GetLength:
return Number(node.length());
case SVGDOMCharacterDataBridge::SubstringData:
{
DOM::DOMString ret = node.substringData(args[0].toInteger(exec), args[1].toInteger(exec));
updateTextItem(exec, node);
return String(ret);
}
case SVGDOMCharacterDataBridge::AppendData:
node.appendData(args[0].toString(exec).string());
updateTextItem(exec, node);
return Undefined();
case SVGDOMCharacterDataBridge::InsertData:
node.insertData(args[0].toInteger(exec), args[1].toString(exec).string());
updateTextItem(exec, node);
return Undefined();
case SVGDOMCharacterDataBridge::DeleteData:
node.deleteData(args[0].toInteger(exec), args[1].toInteger(exec));
updateTextItem(exec, node);
return Undefined();
case SVGDOMCharacterDataBridge::ReplaceData:
node.replaceData(args[0].toInteger(exec), args[1].toInteger(exec), args[2].toString(exec).string());
updateTextItem(exec, node);
return Undefined();
default:
kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
break;
}
return Undefined();
}
// SVGDOMTextBridge
/*
@namespace KSVG
@begin SVGDOMTextBridge::s_hashTable 2
dummy SVGDOMTextBridge::Dummy DontDelete|ReadOnly
@end
@namespace KSVG
@begin SVGDOMTextBridgeProto::s_hashTable 2
splitText SVGDOMTextBridge::SplitText DontDelete|Function 1
@end
*/
KSVG_IMPLEMENT_PROTOTYPE("DOMText", SVGDOMTextBridgeProto, SVGDOMTextBridgeProtoFunc)
Value SVGDOMTextBridge::getValueProperty(ExecState *, int token) const
{
switch(token)
{
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}
Value SVGDOMTextBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
{
KSVG_CHECK_THIS(SVGDOMTextBridge)
DOM::Text node = obj->impl();
switch(id)
{
case SVGDOMTextBridge::SplitText:
return getDOMNode(exec, node.splitText(args[0].toInteger(exec)));
default:
kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
break;
}
return Undefined();
}
// SVGDOMDOMImplementationBridge
/*
@namespace KSVG
@begin SVGDOMDOMImplementationBridge::s_hashTable 2
dummy SVGDOMDOMImplementationBridge::Dummy DontDelete|ReadOnly
@end
@namespace KSVG
@begin SVGDOMDOMImplementationBridgeProto::s_hashTable 2
hasFeature SVGDOMDOMImplementationBridge::HasFeature DontDelete|Function 2
@end
*/
KSVG_IMPLEMENT_PROTOTYPE("DOMDOMImplementation", SVGDOMDOMImplementationBridgeProto, SVGDOMDOMImplementationBridgeProtoFunc)
Value SVGDOMDOMImplementationBridge::getValueProperty(ExecState *, int token) const
{
switch(token)
{
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}
Value SVGDOMDOMImplementationBridgeProtoFunc::call(ExecState *exec, Object &thisObj, const List &args)
{
KSVG_CHECK_THIS(SVGDOMDOMImplementationBridge)
DOM::DOMImplementation node = obj->impl();
switch(id)
{
case SVGDOMDOMImplementationBridge::HasFeature:
return Boolean(node.hasFeature(args[0].toString(exec).string(), args[1].toString(exec).string()));
default:
kdWarning() << "Unhandled function id in " << k_funcinfo << " : " << id << endl;
break;
}
return Undefined();
}
// SVGDOMDocumentFragmentBridge
/*
@namespace KSVG
@begin SVGDOMDocumentFragmentBridge::s_hashTable 2
dummy SVGDOMDocumentFragmentBridge::Dummy DontDelete|ReadOnly
@end
*/
Value SVGDOMDocumentFragmentBridge::getValueProperty(ExecState *, int token) const
{
switch(token)
{
default:
kdWarning() << "Unhandled token in " << k_funcinfo << " : " << token << endl;
return Undefined();
}
}