#include "graphhandler.h" class EdgeRelationMapper { public: EdgeRelationMapper() { m_map.insert("public-inheritance", IChildNode::PublicInheritance); m_map.insert("protected-inheritance", IChildNode::ProtectedInheritance); m_map.insert("private-inheritance", IChildNode::PrivateInheritance); m_map.insert("usage", IChildNode::Usage); m_map.insert("template-instance", IChildNode::TemplateInstance); } IChildNode::NodeRelation stringToNodeRelation(const QString &nrStr) { return m_map[nrStr]; } private: QMap m_map; }; static EdgeRelationMapper *s_edgeRelationMapper; void graphhandler_init() { s_edgeRelationMapper = new EdgeRelationMapper; } void graphhandler_exit() { delete s_edgeRelationMapper; } //------------------------------------------------------------------------ GraphHandler::GraphHandler(IBaseHandler *parent,const char *endTag) : m_parent(parent) { addEndHandler(endTag,this,&GraphHandler::endGraph); addStartHandler("node",this,&GraphHandler::startNode); m_nodes.setAutoDelete(TRUE); m_nodeDict = new QDict(1009); } GraphHandler::~GraphHandler() { delete m_nodeDict; } void GraphHandler::startGraph(const QXmlAttributes &) { debug(2,"startGraph\n"); m_parent->setDelegate(this); } void GraphHandler::endGraph() { debug(2,"endGraph\n"); m_parent->setDelegate(0); } void GraphHandler::startNode(const QXmlAttributes &attrib) { NodeHandler *n = new NodeHandler(this); n->startNode(attrib); m_nodes.append(n); m_nodeDict->insert(attrib.value("id").utf8(),n); } INodeIterator *GraphHandler::nodes() const { return new NodeIterator(*this); } NodeHandler *GraphHandler::getNodeById(const QString &id) const { return m_nodeDict->find(id.utf8()); } //------------------------------------------------------------------------ NodeHandler::NodeHandler(GraphHandler *gh) : m_parent(gh), m_graph(gh) { addEndHandler("node",this,&NodeHandler::endNode); addStartHandler("link",this,&NodeHandler::startLink); addEndHandler("link",this,&NodeHandler::endLink); addStartHandler("label",this,&NodeHandler::startLabel); addEndHandler("label",this,&NodeHandler::endLabel); addStartHandler("childnode",this,&NodeHandler::startChildNode); m_children.setAutoDelete(TRUE); } NodeHandler::~NodeHandler() { } void NodeHandler::startNode(const QXmlAttributes &attrib) { debug(2,"startNode\n"); m_parent->setDelegate(this); m_id = attrib.value("id"); } void NodeHandler::endNode() { debug(2,"endNode\n"); m_parent->setDelegate(0); } void NodeHandler::startLink(const QXmlAttributes &attrib) { m_link = attrib.value("refid"); } void NodeHandler::endLink() { } void NodeHandler::startLabel(const QXmlAttributes &/*attrib*/) { m_curString=""; } void NodeHandler::endLabel() { m_label = m_curString; } void NodeHandler::startChildNode(const QXmlAttributes &attrib) { ChildNodeHandler *cnh = new ChildNodeHandler(this,m_graph); cnh->startChildNode(attrib); m_children.append(cnh); } IChildNodeIterator *NodeHandler::children() const { return new ChildNodeIterator(*this); } //------------------------------------------------------------------------ ChildNodeHandler::ChildNodeHandler(IBaseHandler *parent,GraphHandler *gh) : m_parent(parent), m_graph(gh) { addEndHandler("childnode",this,&ChildNodeHandler::endChildNode); addStartHandler("edgelabel",this,&ChildNodeHandler::startEdgeLabel); m_edgeLabels.setAutoDelete(TRUE); } ChildNodeHandler::~ChildNodeHandler() { } void ChildNodeHandler::startChildNode(const QXmlAttributes &attrib) { debug(2,"startChildNode\n"); m_id = attrib.value("refid"); m_relationString = attrib.value("relation"); m_relation = s_edgeRelationMapper->stringToNodeRelation(m_relationString); m_parent->setDelegate(this); } void ChildNodeHandler::endChildNode() { debug(2,"endChildNode\n"); m_parent->setDelegate(0); } void ChildNodeHandler::startEdgeLabel(const QXmlAttributes &attrib) { EdgeLabelHandler *elh = new EdgeLabelHandler(this); elh->startEdgeLabel(attrib); m_edgeLabels.append(elh); } IEdgeLabelIterator *ChildNodeHandler::edgeLabels() const { return new EdgeLabelIterator(*this); } INode *ChildNodeHandler::node() const { return m_graph->getNodeById(m_id); } //----------------------------------------------------------------------- EdgeLabelHandler::EdgeLabelHandler(IBaseHandler *parent) : m_parent(parent) { addEndHandler("edgelabel",this,&EdgeLabelHandler::endEdgeLabel); } EdgeLabelHandler::~EdgeLabelHandler() { } void EdgeLabelHandler::startEdgeLabel(const QXmlAttributes &) { m_parent->setDelegate(this); m_curString=""; } void EdgeLabelHandler::endEdgeLabel() { m_label=m_curString; m_parent->setDelegate(0); }