From: <ibr...@us...> - 2011-10-14 13:45:27
|
Revision: 4116 http://tora.svn.sourceforge.net/tora/?rev=4116&view=rev Author: ibre5041 Date: 2011-10-14 13:45:20 +0000 (Fri, 14 Oct 2011) Log Message: ----------- Sync with KGRAPHVIEWER trunk Modified Paths: -------------- branches/tora-trotl/src/docklets/toastwalk.cpp branches/tora-trotl/src/docklets/toastwalk.h branches/tora-trotl/src/docklets/toquerymodel.cpp branches/tora-trotl/src/docklets/toquerymodel.h branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h branches/tora-trotl/src/ermodel/FontsCache.cpp branches/tora-trotl/src/ermodel/FontsCache.h branches/tora-trotl/src/ermodel/canvasedge.cpp branches/tora-trotl/src/ermodel/canvasedge.h branches/tora-trotl/src/ermodel/canvaselement.cpp branches/tora-trotl/src/ermodel/canvaselement.h branches/tora-trotl/src/ermodel/canvasnode.cpp branches/tora-trotl/src/ermodel/canvasnode.h branches/tora-trotl/src/ermodel/canvassubgraph.cpp branches/tora-trotl/src/ermodel/canvassubgraph.h branches/tora-trotl/src/ermodel/dot2qtconsts.cpp branches/tora-trotl/src/ermodel/dot2qtconsts.h branches/tora-trotl/src/ermodel/dotdefaults.h branches/tora-trotl/src/ermodel/dotgrammar.cpp branches/tora-trotl/src/ermodel/dotgrammar.h branches/tora-trotl/src/ermodel/dotgraph.cpp branches/tora-trotl/src/ermodel/dotgraph.h branches/tora-trotl/src/ermodel/dotgraphview.cpp branches/tora-trotl/src/ermodel/dotgraphview.h branches/tora-trotl/src/ermodel/dotrenderop.h branches/tora-trotl/src/ermodel/fdstream.hpp branches/tora-trotl/src/ermodel/graphedge.cpp branches/tora-trotl/src/ermodel/graphedge.h branches/tora-trotl/src/ermodel/graphelement.cpp branches/tora-trotl/src/ermodel/graphelement.h branches/tora-trotl/src/ermodel/graphexporter.cpp branches/tora-trotl/src/ermodel/graphexporter.h branches/tora-trotl/src/ermodel/graphnode.cpp branches/tora-trotl/src/ermodel/graphnode.h branches/tora-trotl/src/ermodel/graphsubgraph.cpp branches/tora-trotl/src/ermodel/graphsubgraph.h branches/tora-trotl/src/ermodel/kgraphviewer_interface.h branches/tora-trotl/src/ermodel/layoutagraphthread.cpp branches/tora-trotl/src/ermodel/layoutagraphthread.h branches/tora-trotl/src/ermodel/loadagraphthread.cpp branches/tora-trotl/src/ermodel/loadagraphthread.h branches/tora-trotl/src/ermodel/pannerview.cpp branches/tora-trotl/src/ermodel/pannerview.h Removed Paths: ------------- branches/tora-trotl/src/ermodel/simpleprintingcommand.h branches/tora-trotl/src/ermodel/simpleprintingengine.h branches/tora-trotl/src/ermodel/simpleprintingsettings.h Modified: branches/tora-trotl/src/docklets/toastwalk.cpp =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toastwalk.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -7,7 +7,7 @@ #include <QMap> -void toASTWalk(SQLParser::Statement *source, KGraphViewer::DotGraph *target) +void toASTWalk(SQLParser::Statement *source, DotGraph *target) { SQLParser::ObjectCache *o = new SQLParser::ObjectCache(); QList<QString> cols; Modified: branches/tora-trotl/src/docklets/toastwalk.h =================================================================== --- branches/tora-trotl/src/docklets/toastwalk.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toastwalk.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -46,10 +46,10 @@ class Statement; }; -namespace KGraphViewer { +///namespace KGraphViewer { class DotGraph; -}; +///}; -void toASTWalk(SQLParser::Statement *source, KGraphViewer::DotGraph *target); +void toASTWalk(SQLParser::Statement *source, DotGraph *target); #endif Modified: branches/tora-trotl/src/docklets/toquerymodel.cpp =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toquerymodel.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -78,7 +78,7 @@ toEditWidget::addHandler(m_currentEditor); { - m_widget = new KGraphViewer::DotGraphView( NULL /*actionCollection()*/, this); + m_widget = new DotGraphView( NULL /*actionCollection()*/, this); m_widget->initEmpty(); m_widget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); // connect( m_widget, SIGNAL( graphLoaded() ), Modified: branches/tora-trotl/src/docklets/toquerymodel.h =================================================================== --- branches/tora-trotl/src/docklets/toquerymodel.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/docklets/toquerymodel.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -49,9 +49,7 @@ #include <QSortFilterProxyModel> -namespace KGraphViewer { - class DotGraphView; -}; +class DotGraphView; class QTimerEvent; class toQueryModel : public toDocklet @@ -76,7 +74,7 @@ }; private: - KGraphViewer::DotGraphView *m_widget; + DotGraphView *m_widget; editHandlerHolder *m_currentEditor; QString m_lastText; Modified: branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp =================================================================== --- branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/DotGraphParsingHelper.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,344 +1,343 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - - -#include "DotGraphParsingHelper.h" -#include "dotgraph.h" -#include "dotgrammar.h" -#include "dotdefaults.h" -//#include "graphsubgraph.h" -#include "graphnode.h" -#include "graphedge.h" - -#include <boost/throw_exception.hpp> -#include <boost/spirit/core.hpp> -#include <boost/spirit/utility/distinct.hpp> -#include <boost/spirit/utility/loops.hpp> -#include <boost/spirit/utility/confix.hpp> - - -#include <iostream> - -///#include <kdebug.h> - -#include <QFile> -#include <QUuid> - -using namespace std; - -extern KGraphViewer::DotGraphParsingHelper* phelper; - -namespace KGraphViewer -{ -#define KGV_MAX_ITEMS_TO_LOAD std::numeric_limits<int>::max() - -DotGraphParsingHelper::DotGraphParsingHelper(): - attrid(), - valid(), - attributed(), - subgraphid(), - uniq(0), - attributes(), - graphAttributes(), - nodesAttributes(), - edgesAttributes(), - graphAttributesStack(), - nodesAttributesStack(), - edgesAttributesStack(), - edgebounds(), - z(0), - maxZ(0), - graph(0), - gs(0), - gn(0), - ge(0) -{ -} - -void DotGraphParsingHelper::setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes) -{ - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << "\t=\t'" << QString::fromStdString((*it).second) <<"'"; - if ((*it).first=="label") - { - QString label = QString::fromUtf8((*it).second.c_str()); - label.replace("\\n","\n"); - (*ge).attributes()["label"] = label; - } - else - { - (*ge).attributes()[QString::fromStdString((*it).first)] = - QString::fromStdString((*it).second); - } - } - - if (attributes.find("_draw_") != attributes.end()) - { - parse_renderop((attributes.find("_draw_"))->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } - if (attributes.find("_ldraw_") != attributes.end()) - { - parse_renderop(attributes.find("_ldraw_")->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } - if (attributes.find("_hldraw_") != attributes.end()) - { - parse_renderop(attributes.find("_hldraw_")->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } - if (attributes.find("_tldraw_") != attributes.end()) - { - parse_renderop(attributes.find("_tldraw_")->second, ge->renderOperations()); -// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); - } -} - -void DotGraphParsingHelper::setgraphattributes() -{ -// kDebug() << "Attributes for graph are : "; - setgraphelementattributes(graph, graphAttributes); -} - -void DotGraphParsingHelper::setsubgraphattributes() -{ -// kDebug() << "Attributes for subgraph are : "; - gs->setZ(z); -// kDebug() << "z="<<gs->z(); - setgraphelementattributes(gs, graphAttributes); -} - -void DotGraphParsingHelper::setnodeattributes() -{ -// kDebug() << "setnodeattributes with z = " << z; - - if (gn == 0) - { -// kDebug() << "gn is null"; - return; - } -// kDebug() << "Attributes for node " << gn->id() << " are : "; - gn->setZ(z+1); -// kDebug() << "z="<<gn->z(); - setgraphelementattributes(gn, nodesAttributes); -} - -void DotGraphParsingHelper::setedgeattributes() -{ -// kDebug() << "setedgeattributeswith z = " << z; - -// kDebug() << "Attributes for edge " << ge->fromNode()->id() << "->" << ge->toNode()->id() << " are : "; - ge->setZ(z+1); -// kDebug() << "z="<<ge->z(); - setgraphelementattributes(ge, edgesAttributes); - - if (edgesAttributes.find("_tdraw_") != edgesAttributes.end()) - { - parse_renderop(edgesAttributes["_tdraw_"], ge->renderOperations()); -// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); - DotRenderOpVec::const_iterator it, it_end; - it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); - for (; it != it_end; it++) - ge->arrowheads().push_back(*it); - } - if (edgesAttributes.find("_hdraw_") != edgesAttributes.end()) - { - parse_renderop(edgesAttributes["_hdraw_"], ge->renderOperations()); -// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); - DotRenderOpVec::const_iterator it, it_end; - it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); - for (; it != it_end; it++) - ge->arrowheads().push_back(*it); - } -} - -void DotGraphParsingHelper::setattributedlist() -{ -// // kDebug() << "Setting attributes list for " << QString::fromStdString(attributed); - if (attributed == "graph") - { - if (attributes.find("bb") != attributes.end()) - { - std::vector< int > v; - parse_integers(attributes["bb"].c_str(), v); - if (v.size()>=4) - { -// kDebug() << "setting width and height to " << v[2] << v[3]; - graph->width(v[2]); - graph->height(v[3]); - } - } - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); - graphAttributes[(*it).first] = (*it).second; - } - } - else if (attributed == "node") - { - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); - nodesAttributes[(*it).first] = (*it).second; - } - } - else if (attributed == "edge") - { - AttributesMap::const_iterator it, it_end; - it = attributes.begin(); it_end = attributes.end(); - for (; it != it_end; it++) - { -// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); - edgesAttributes[(*it).first] = (*it).second; - } - } - attributes.clear(); -} - -void DotGraphParsingHelper::createnode(const std::string& nodeid) -{ - QString id = QString::fromStdString(nodeid); -// kDebug() << id; - gn = dynamic_cast<GraphNode*>(graph->elementNamed(id)); - if (gn==0 && graph->nodes().size() < KGV_MAX_ITEMS_TO_LOAD) - { -// kDebug() << "Creating a new node" << z << (void*)gs; - gn = new GraphNode(); - gn->setId(id); -// gn->label(QString::fromStdString(nodeid)); - if (z>0 && gs != 0) - { -// kDebug() << "Adding node" << id << "in subgraph" << gs->id(); - gs->content().push_back(gn); - } - else - { -// kDebug() << "Adding node" << id; - graph->nodes()[id] = gn; - } - } - edgebounds.clear(); -} - -void DotGraphParsingHelper::createsubgraph() -{ -// kDebug() ; - if (phelper) - { - std::string str = phelper->subgraphid; - if (str.empty()) - { - std::ostringstream oss; - oss << "kgv_id_" << phelper->uniq++; - str = oss.str(); - } -// kDebug() << QString::fromStdString(str); - if (graph->subgraphs().find(QString::fromStdString(str)) == graph->subgraphs().end()) - { -// kDebug() << "Creating a new subgraph"; - gs = new GraphSubgraph(); - gs->setId(QString::fromStdString(str)); -// gs->label(QString::fromStdString(str)); - graph->subgraphs().insert(QString::fromStdString(str), gs); -// kDebug() << "there is now"<<graph->subgraphs().size()<<"subgraphs in" << graph; - } - else - { -// kDebug() << "Found existing subgraph"; - gs = *(graph->subgraphs().find(QString::fromStdString(str))); - } - phelper->subgraphid = ""; - } -} - -void DotGraphParsingHelper::createedges() -{ -// kDebug(); - std::string node1Name, node2Name; - node1Name = edgebounds.front(); - edgebounds.pop_front(); - while (!edgebounds.empty()) - { - node2Name = edgebounds.front(); - edgebounds.pop_front(); - - if (graph->nodes().size() >= KGV_MAX_ITEMS_TO_LOAD || graph->edges().size() >= KGV_MAX_ITEMS_TO_LOAD) - { - return; - } -// kDebug() << QString::fromStdString(node1Name) << ", " << QString::fromStdString(node2Name); - ge = new GraphEdge(); - GraphElement* gn1 = graph->elementNamed(QString::fromStdString(node1Name)); - if (gn1 == 0) - { -// kDebug() << "new node 1"; - gn1 = new GraphNode(); - gn1->setId(QString::fromStdString(node1Name)); - graph->nodes()[QString::fromStdString(node1Name)] = dynamic_cast<GraphNode*>(gn1); - } - GraphElement* gn2 = graph->elementNamed(QString::fromStdString(node2Name)); - if (gn2 == 0) - { -// kDebug() << "new node 2"; - gn2 = new GraphNode(); - gn2->setId(QString::fromStdString(node2Name)); - graph->nodes()[QString::fromStdString(node2Name)] = dynamic_cast<GraphNode*>(gn2); - } -// kDebug() << "Found gn1="<<gn1<<" and gn2=" << gn2; - if (gn1 == 0 || gn2 == 0) - { - ///kError() << "Unable to find or create edge bound(s) gn1=" << gn1 << "; gn2=" << gn2; - } - ge->setFromNode(gn1); - ge->setToNode(gn2); -// kDebug() << ge->fromNode()->id() << " -> " << ge->toNode()->id(); - setedgeattributes(); -// kDebug() << ge->id(); - if (ge->id().isEmpty()) - { - ge->setId(QString::fromStdString(node1Name)+QString::fromStdString(node2Name)+QUuid::createUuid().toString().remove('{').remove('}').remove('-')); - } -// kDebug() << ge->id(); -// kDebug() << "num before=" << graph->edges().size(); - graph->edges().insert(ge->id(), ge); -// kDebug() << "num after=" << graph->edges().size(); - - - node1Name = node2Name; - } - edgebounds.clear(); -} - -void DotGraphParsingHelper::finalactions() -{ - GraphEdgeMap::iterator it, it_end; - it = graph->edges().begin(); it_end = graph->edges().end(); - for (; it != it_end; it++) - { - (*it)->setZ(maxZ+1); - } -} - -} +/* This file is part of KGraphViewer. + Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + + +#include "DotGraphParsingHelper.h" +#include "dotgraph.h" +#include "dotgrammar.h" +#include "dotdefaults.h" +//#include "graphsubgraph.h" +#include "graphnode.h" +#include "graphedge.h" + +#include <boost/throw_exception.hpp> +#include <boost/spirit/core.hpp> +#include <boost/spirit/utility/distinct.hpp> +#include <boost/spirit/utility/loops.hpp> +#include <boost/spirit/utility/confix.hpp> + + +#include <iostream> + +///#include <kdebug.h> + +#include <QFile> +#include<QUuid> + +using namespace std; + +///namespace KGraphViewer +///{ +#define KGV_MAX_ITEMS_TO_LOAD std::numeric_limits<int>::max() + +extern DotGraphParsingHelper* phelper; + +DotGraphParsingHelper::DotGraphParsingHelper(): + attrid(), + valid(), + attributed(), + subgraphid(), + uniq(0), + attributes(), + graphAttributes(), + nodesAttributes(), + edgesAttributes(), + graphAttributesStack(), + nodesAttributesStack(), + edgesAttributesStack(), + edgebounds(), + z(0), + maxZ(0), + graph(0), + gs(0), + gn(0), + ge(0) +{ +} + +void DotGraphParsingHelper::setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes) +{ + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << "\t=\t'" << QString::fromStdString((*it).second) <<"'"; + if ((*it).first=="label") + { + QString label = QString::fromUtf8((*it).second.c_str()); + label.replace("\\n","\n"); + (*ge).attributes()["label"] = label; + } + else + { + (*ge).attributes()[QString::fromStdString((*it).first)] = + QString::fromStdString((*it).second); + } + } + + if (attributes.find("_draw_") != attributes.end()) + { + parse_renderop((attributes.find("_draw_"))->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } + if (attributes.find("_ldraw_") != attributes.end()) + { + parse_renderop(attributes.find("_ldraw_")->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } + if (attributes.find("_hldraw_") != attributes.end()) + { + parse_renderop(attributes.find("_hldraw_")->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } + if (attributes.find("_tldraw_") != attributes.end()) + { + parse_renderop(attributes.find("_tldraw_")->second, ge->renderOperations()); +// kDebug() << "element renderOperations size is now " << ge->renderOperations().size(); + } +} + +void DotGraphParsingHelper::setgraphattributes() +{ +// kDebug() << "Attributes for graph are : "; + setgraphelementattributes(graph, graphAttributes); +} + +void DotGraphParsingHelper::setsubgraphattributes() +{ +// kDebug() << "Attributes for subgraph are : "; + gs->setZ(z); +// kDebug() << "z="<<gs->z(); + setgraphelementattributes(gs, graphAttributes); +} + +void DotGraphParsingHelper::setnodeattributes() +{ +// kDebug() << "setnodeattributes with z = " << z; + + if (gn == 0) + { +// kDebug() << "gn is null"; + return; + } +// kDebug() << "Attributes for node " << gn->id() << " are : "; + gn->setZ(z+1); +// kDebug() << "z="<<gn->z(); + setgraphelementattributes(gn, nodesAttributes); +} + +void DotGraphParsingHelper::setedgeattributes() +{ +// kDebug() << "setedgeattributeswith z = " << z; + +// kDebug() << "Attributes for edge " << ge->fromNode()->id() << "->" << ge->toNode()->id() << " are : "; + ge->setZ(z+1); +// kDebug() << "z="<<ge->z(); + setgraphelementattributes(ge, edgesAttributes); + + if (edgesAttributes.find("_tdraw_") != edgesAttributes.end()) + { + parse_renderop(edgesAttributes["_tdraw_"], ge->renderOperations()); +// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); + DotRenderOpVec::const_iterator it, it_end; + it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); + for (; it != it_end; it++) + ge->arrowheads().push_back(*it); + } + if (edgesAttributes.find("_hdraw_") != edgesAttributes.end()) + { + parse_renderop(edgesAttributes["_hdraw_"], ge->renderOperations()); +// kDebug() << "edge renderOperations size is now " << ge->renderOperations().size(); + DotRenderOpVec::const_iterator it, it_end; + it = ge->renderOperations().constBegin(); it_end = ge->renderOperations().constEnd(); + for (; it != it_end; it++) + ge->arrowheads().push_back(*it); + } +} + +void DotGraphParsingHelper::setattributedlist() +{ +// // kDebug() << "Setting attributes list for " << QString::fromStdString(attributed); + if (attributed == "graph") + { + if (attributes.find("bb") != attributes.end()) + { + std::vector< int > v; + parse_integers(attributes["bb"].c_str(), v); + if (v.size()>=4) + { +// kDebug() << "setting width and height to " << v[2] << v[3]; + graph->width(v[2]); + graph->height(v[3]); + } + } + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); + graphAttributes[(*it).first] = (*it).second; + } + } + else if (attributed == "node") + { + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); + nodesAttributes[(*it).first] = (*it).second; + } + } + else if (attributed == "edge") + { + AttributesMap::const_iterator it, it_end; + it = attributes.begin(); it_end = attributes.end(); + for (; it != it_end; it++) + { +// kDebug() << " " << QString::fromStdString((*it).first) << " = " << QString::fromStdString((*it).second); + edgesAttributes[(*it).first] = (*it).second; + } + } + attributes.clear(); +} + +void DotGraphParsingHelper::createnode(const std::string& nodeid) +{ + QString id = QString::fromStdString(nodeid); +// kDebug() << id; + gn = dynamic_cast<GraphNode*>(graph->elementNamed(id)); + if (gn==0 && graph->nodes().size() < KGV_MAX_ITEMS_TO_LOAD) + { +// kDebug() << "Creating a new node" << z << (void*)gs; + gn = new GraphNode(); + gn->setId(id); +// gn->label(QString::fromStdString(nodeid)); + if (z>0 && gs != 0) + { +// kDebug() << "Adding node" << id << "in subgraph" << gs->id(); + gs->content().push_back(gn); + } + else + { +// kDebug() << "Adding node" << id; + graph->nodes()[id] = gn; + } + } + edgebounds.clear(); +} + +void DotGraphParsingHelper::createsubgraph() +{ +// kDebug() ; + if (phelper) + { + std::string str = phelper->subgraphid; + if (str.empty()) + { + std::ostringstream oss; + oss << "kgv_id_" << phelper->uniq++; + str = oss.str(); + } +// kDebug() << QString::fromStdString(str); + if (graph->subgraphs().find(QString::fromStdString(str)) == graph->subgraphs().end()) + { +// kDebug() << "Creating a new subgraph"; + gs = new GraphSubgraph(); + gs->setId(QString::fromStdString(str)); +// gs->label(QString::fromStdString(str)); + graph->subgraphs().insert(QString::fromStdString(str), gs); +// kDebug() << "there is now"<<graph->subgraphs().size()<<"subgraphs in" << graph; + } + else + { +// kDebug() << "Found existing subgraph"; + gs = *(graph->subgraphs().find(QString::fromStdString(str))); + } + phelper->subgraphid = ""; + } +} + +void DotGraphParsingHelper::createedges() +{ +// kDebug(); + std::string node1Name, node2Name; + node1Name = edgebounds.front(); + edgebounds.pop_front(); + while (!edgebounds.empty()) + { + node2Name = edgebounds.front(); + edgebounds.pop_front(); + + if (graph->nodes().size() >= KGV_MAX_ITEMS_TO_LOAD || graph->edges().size() >= KGV_MAX_ITEMS_TO_LOAD) + { + return; + } +// kDebug() << QString::fromStdString(node1Name) << ", " << QString::fromStdString(node2Name); + ge = new GraphEdge(); + GraphElement* gn1 = graph->elementNamed(QString::fromStdString(node1Name)); + if (gn1 == 0) + { +// kDebug() << "new node 1"; + gn1 = new GraphNode(); + gn1->setId(QString::fromStdString(node1Name)); + graph->nodes()[QString::fromStdString(node1Name)] = dynamic_cast<GraphNode*>(gn1); + } + GraphElement* gn2 = graph->elementNamed(QString::fromStdString(node2Name)); + if (gn2 == 0) + { +// kDebug() << "new node 2"; + gn2 = new GraphNode(); + gn2->setId(QString::fromStdString(node2Name)); + graph->nodes()[QString::fromStdString(node2Name)] = dynamic_cast<GraphNode*>(gn2); + } +// kDebug() << "Found gn1="<<gn1<<" and gn2=" << gn2; + if (gn1 == 0 || gn2 == 0) + { + ///kError() << "Unable to find or create edge bound(s) gn1=" << gn1 << "; gn2=" << gn2; + } + ge->setFromNode(gn1); + ge->setToNode(gn2); +// kDebug() << ge->fromNode()->id() << " -> " << ge->toNode()->id(); + setedgeattributes(); +// kDebug() << ge->id(); + if (ge->id() == "") + { + ge->setId(QString::fromStdString(node1Name)+QString::fromStdString(node2Name)+QUuid::createUuid().toString().remove("{").remove("}").remove("-")); + } +// kDebug() << ge->id(); +// kDebug() << "num before=" << graph->edges().size(); + graph->edges().insert(ge->id(), ge); +// kDebug() << "num after=" << graph->edges().size(); + + + node1Name = node2Name; + } + edgebounds.clear(); +} + +void DotGraphParsingHelper::finalactions() +{ + GraphEdgeMap::iterator it, it_end; + it = graph->edges().begin(); it_end = graph->edges().end(); + for (; it != it_end; it++) + { + (*it)->setZ(maxZ+1); + } +} +///} Modified: branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h =================================================================== --- branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/DotGraphParsingHelper.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,84 +1,84 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - -#ifndef DOT_GRAPHPARSINGHELPER_H -#define DOT_GRAPHPARSINGHELPER_H - -#include <map> -#include <list> -#include <string> - -namespace KGraphViewer -{ -class DotGraph; -class GraphSubgraph; -class GraphNode; -class GraphEdge; -class GraphElement; - -struct DotGraphParsingHelper -{ - typedef std::map< std::string, std::string > AttributesMap; - - DotGraphParsingHelper(); - - void createnode(const std::string& nodeid); - void createsubgraph(); - void setgraphattributes(); - void setsubgraphattributes(); - void setnodeattributes(); - void setedgeattributes(); - void setattributedlist(); - void createedges(); - void edgebound(const std::string& bound) {edgebounds.push_back(bound);} - void finalactions(); - void setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes); - - std::string attrid; - std::string valid; - std::string attributed; - std::string subgraphid; - - unsigned int uniq; - - AttributesMap attributes; - AttributesMap graphAttributes; - AttributesMap nodesAttributes; - AttributesMap edgesAttributes; - std::list< AttributesMap > graphAttributesStack; - std::list< AttributesMap > nodesAttributesStack; - std::list< AttributesMap > edgesAttributesStack; - - std::list< std::string > edgebounds; - - unsigned int z; - unsigned int maxZ; - - DotGraph* graph; - - GraphSubgraph* gs; - GraphNode* gn; - GraphEdge* ge; -}; - -} - -#endif - - - +/* This file is part of KGraphViewer. + Copyright (C) 2006-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + +#ifndef DOT_GRAPHPARSINGHELPER_H +#define DOT_GRAPHPARSINGHELPER_H + +#include <map> +#include <list> +#include <string> + +///namespace KGraphViewer +///{ + +class DotGraph; +class GraphSubgraph; +class GraphNode; +class GraphEdge; +class GraphElement; + +struct DotGraphParsingHelper +{ + typedef std::map< std::string, std::string > AttributesMap; + + DotGraphParsingHelper(); + + void createnode(const std::string& nodeid); + void createsubgraph(); + void setgraphattributes(); + void setsubgraphattributes(); + void setnodeattributes(); + void setedgeattributes(); + void setattributedlist(); + void createedges(); + void edgebound(const std::string& bound) {edgebounds.push_back(bound);} + void finalactions(); + void setgraphelementattributes(GraphElement* ge, const AttributesMap& attributes); + + std::string attrid; + std::string valid; + std::string attributed; + std::string subgraphid; + + unsigned int uniq; + + AttributesMap attributes; + AttributesMap graphAttributes; + AttributesMap nodesAttributes; + AttributesMap edgesAttributes; + std::list< AttributesMap > graphAttributesStack; + std::list< AttributesMap > nodesAttributesStack; + std::list< AttributesMap > edgesAttributesStack; + + std::list< std::string > edgebounds; + + unsigned int z; + unsigned int maxZ; + + DotGraph* graph; + + GraphSubgraph* gs; + GraphNode* gn; + GraphEdge* ge; +}; + +///} +#endif + + + Modified: branches/tora-trotl/src/ermodel/FontsCache.cpp =================================================================== --- branches/tora-trotl/src/ermodel/FontsCache.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/FontsCache.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,51 +1,51 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - - -#include "FontsCache.h" - -#include "dot2qtconsts.h" - -FontsCache::~FontsCache() -{ - FontsCache::iterator it, it_end; - it = begin(); it_end = end(); - for (; it != it_end; it++) - { - delete (*it); - } -} - -QFont* FontsCache::cachedFont(const QFont& font) -{ - if (find(font.key()) == end()) - { - (*this)[font.key()] = new QFont(font); - } - return (*this)[font.key()]; -} - -QFont* FontsCache::fromName(const QString& fontName) -{ - if (m_namesToFonts.find(fontName) == m_namesToFonts.end()) - { - QFont font(Dot2QtConsts::componentData().qtFont(fontName)); - m_namesToFonts[fontName] = cachedFont(font); - } - return m_namesToFonts[fontName]; -} +/* This file is part of KGraphViewer. + Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + + +#include "FontsCache.h" + +#include "dot2qtconsts.h" + +FontsCache::~FontsCache() +{ + FontsCache::iterator it, it_end; + it = begin(); it_end = end(); + for (; it != it_end; it++) + { + delete (*it); + } +} + +QFont* FontsCache::cachedFont(const QFont& font) +{ + if (find(font.key()) == end()) + { + (*this)[font.key()] = new QFont(font); + } + return (*this)[font.key()]; +} + +QFont* FontsCache::fromName(const QString& fontName) +{ + if (m_namesToFonts.find(fontName) == m_namesToFonts.end()) + { + QFont font(Dot2QtConsts::componentData().qtFont(fontName)); + m_namesToFonts[fontName] = cachedFont(font); + } + return m_namesToFonts[fontName]; +} Modified: branches/tora-trotl/src/ermodel/FontsCache.h =================================================================== --- branches/tora-trotl/src/ermodel/FontsCache.h 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/FontsCache.h 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,53 +1,53 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - - -#ifndef KGRAPHVIEWER_FONTSCACHE_H -#define KGRAPHVIEWER_FONTSCACHE_H - -#include "Singleton.h" - -#include <qfont.h> -#include <qmap.h> -#include <qstring.h> - -/** - * This is a map of fonts used in KgraphViewer - * - * @short A fonts map - * @author Gaël de Chalendar <kl...@fr...> - */ -class FontsCache : - public Singleton<FontsCache>, - public QMap<QString, QFont*> -{ -friend class Singleton<FontsCache>; - -public: - virtual ~FontsCache(); - - QFont* cachedFont(const QFont& font); - QFont* fromName(const QString& font); - -private: - FontsCache() {} - - QMap<QString, QFont*> m_namesToFonts; -}; - -#endif +/* This file is part of KGraphViewer. + Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + + +#ifndef KGRAPHVIEWER_FONTSCACHE_H +#define KGRAPHVIEWER_FONTSCACHE_H + +#include "Singleton.h" + +#include <qfont.h> +#include <qmap.h> +#include <qstring.h> + +/** + * This is a map of fonts used in KgraphViewer + * + * @short A fonts map + * @author Gaël de Chalendar <kl...@fr...> + */ +class FontsCache : + public Singleton<FontsCache>, + public QMap<QString, QFont*> +{ +friend class Singleton<FontsCache>; + +public: + virtual ~FontsCache(); + + QFont* cachedFont(const QFont& font); + QFont* fromName(const QString& font); + +private: + FontsCache() {} + + QMap<QString, QFont*> m_namesToFonts; +}; + +#endif Modified: branches/tora-trotl/src/ermodel/canvasedge.cpp =================================================================== --- branches/tora-trotl/src/ermodel/canvasedge.cpp 2011-10-12 20:14:39 UTC (rev 4115) +++ branches/tora-trotl/src/ermodel/canvasedge.cpp 2011-10-14 13:45:20 UTC (rev 4116) @@ -1,589 +1,575 @@ -/* This file is part of KGraphViewer. - Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> - - KGraphViewer is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. - - This program 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA -*/ - -/* This file was callgraphview.cpp, part of KCachegrind. - Copyright (C) 2003 Josef Weidendorfer <Jos...@gm...> - - KCachegrind is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public - License as published by the Free Software Foundation, version 2. -*/ - - -#include "canvasedge.h" -#include "graphedge.h" -#include "graphnode.h" -#include "dotdefaults.h" -#include "dot2qtconsts.h" -#include "dotgraphview.h" -#include "FontsCache.h" - -///#include <KAction> - -#include <QPainter> -#include <QGraphicsSceneMouseEvent> -#include <QMenu> - -#include <iostream> - -// -// CanvasEdge -// - -namespace KGraphViewer -{ - -CanvasEdge::CanvasEdge(DotGraphView* view, GraphEdge* e, - qreal scaleX, qreal scaleY, - qreal xMargin, qreal yMargin, qreal gh, - qreal wdhcf, qreal hdvcf, - QGraphicsItem* parent) - : QAbstractGraphicsShapeItem(parent), - m_scaleX(scaleX), m_scaleY(scaleY), - m_xMargin(xMargin), m_yMargin(yMargin), - m_gh(/*gh*/0), m_wdhcf(wdhcf), m_hdvcf(hdvcf), m_edge(e), - m_font(0), m_view(view), m_popup(new QMenu()) -{ - ///kDebug() << "edge " << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << m_gh; - setBoundingRegionGranularity(0.9); - m_font = FontsCache::changeable().fromName(e->fontName()); - - computeBoundingRect(); -// kDebug() << "boundingRect computed: " << m_boundingRect; - - QString tipStr = QString("%1 -> %2\nlabel='%3'") - .arg(edge()->fromNode()->id()) - .arg(edge()->toNode()->id()) - .arg(e->label()); - setToolTip(tipStr); - - // the message should be given (or possible to be given) by the part user - /// KAction* removeEdgeAction = new KAction(i18n("Remove selected edge(s)"), this); - /// m_popup->addAction(removeEdgeAction); - /// connect(removeEdgeAction,SIGNAL(triggered(bool)),this,SLOT(slotRemoveEdge())); - - - connect(e,SIGNAL(changed()),this,SLOT(modelChanged())); - connect(this, SIGNAL(selected(CanvasEdge*, Qt::KeyboardModifiers)), view, SLOT(slotEdgeSelected(CanvasEdge*, Qt::KeyboardModifiers))); - - connect(this, SIGNAL(edgeContextMenuEvent(const QString&, const QPoint&)), view, SLOT(slotContextMenuEvent(const QString&, const QPoint&))); - - setAcceptHoverEvents ( true ); - - ///kDebug() << "connect slotElementHoverEnter"; - connect(this, SIGNAL(hoverEnter(CanvasEdge*)), view, SLOT(slotElementHoverEnter(CanvasEdge*))); - connect(this, SIGNAL(hoverLeave(CanvasEdge*)), view, SLOT(slotElementHoverLeave(CanvasEdge*))); - -} - -CanvasEdge::~CanvasEdge() -{ - delete m_popup; -} - - -QRectF CanvasEdge::boundingRect() const -{ - return m_boundingRect; -} - -QPainterPath CanvasEdge::shape () const -{ -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id(); - if (m_boundingRegion.isEmpty()) { - m_boundingRegion.addRegion(boundingRegion(QTransform())); - } - return m_boundingRegion; - /* - foreach (const DotRenderOp& dro, edge()->renderOperations()) - { - if ( dro.renderop == "B" ) - { - for (int splineNum = 0; splineNum < edge()->colors().count() || (splineNum==0 && edge()->colors().count()==0); splineNum++) - { - QPolygonF points(dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - qreal nom = (dro.integers[2*dro.integers[0]]-dro.integers[2]); - qreal denom = (dro.integers[2*dro.integers[0]-1]-dro.integers[1]); - qreal diffX, diffY; - if (nom == 0) - { - diffX = 0; - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - else if (denom ==0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 0; - } - else - { - double pente = nom/denom; - if (pente < 0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = edge()->colors().count()/2 + splineNum; - } - else - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - } - QPointF p( - //NOTE: when uncommenting, fix nested comments in here: - (dro.integers[2*i+1]/ *%m_wdhcf* /*m_scaleX) +m_xMargin + diffX, - (m_gh-dro.integers[2*i+2]/ *%m_hdvcf* /)*m_scaleY + m_yMargin + diffY - ); - points[i] = p; - } - path.moveTo(points[0]); - for (int j = 0; j < (points.size()-1)/3; j++) - { - path.cubicTo(points[3*j + 1],points[3*j+1 + 1], points[3*j+2 + 1]); - } - for (int j = (points.size()-1)/3-3; j >= 0 ; j--) - { - path.cubicTo(points[3*j + 1],points[3*j+1 + 1], points[3*j+2 + 1]); - } - } - } - } - return path; - */ -} - - - -void CanvasEdge::paint(QPainter* p, const QStyleOptionGraphicsItem* option, - QWidget* widget) -{ -// kDebug(); -Q_UNUSED(option) -Q_UNUSED(widget) - if (m_boundingRect == QRectF()) - { - return; - } - /// computes the scaling of line width - qreal widthScaleFactor = (m_scaleX+m_scaleY)/2; - if (widthScaleFactor < 1) - { - widthScaleFactor = 1; - } - - if (edge()->style()=="invis") - { - return; - } - if (edge()->renderOperations().isEmpty()) - { - if ((edge()->fromNode()->canvasElement()!=0) - && (edge()->toNode()->canvasElement()!=0)) - { - p->drawLine( - edge()->fromNode()->canvasElement()->boundingRect().center()+edge()->fromNode()->canvasElement()->pos(), - edge()->toNode()->canvasElement()->boundingRect().center()+edge()->toNode()->canvasElement()->pos()); - } - return; - } - - QColor lineColor = Dot2QtConsts::componentData().qtColor(edge()->color(0)); - QColor backColor; - - QList<QPointF> allPoints; - foreach (const DotRenderOp& dro, edge()->renderOperations()) - { - // kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "renderop" << dro.renderop << "; selected:" << edge()->isSelected(); - if (dro.renderop == "c") - { - QColor c(dro.str.mid(0,7)); - bool ok; - c.setAlpha(255-dro.str.mid(8).toInt(&ok,16)); - lineColor = c; -// kDebug() << "c" << dro.str.mid(0,7) << lineColor; - } - else if (dro.renderop == "C") - { - QColor c(dro.str.mid(0,7)); - bool ok; - c.setAlpha(255-dro.str.mid(8).toInt(&ok,16)); -/* if (m_hovered && m_view->highlighting()) - { - c = c.lighter(); - }*/ - backColor = c; -// kDebug() << "C" << dro.str.mid(0,7) << backColor; - } - else if ( dro.renderop == "T" ) - { - const QString& str = dro.str; - - qreal stringWidthGoal = dro.integers[3] * m_scaleX; - int fontSize = edge()->fontSize(); - m_font->setPointSize(fontSize); - QFontMetrics fm(*m_font); - while (fm.width(str) > stringWidthGoal && fontSize > 1) - { - fontSize--; - m_font->setPointSize(fontSize); - fm = QFontMetrics(*m_font); - } - p->save(); - p->setFont(*m_font); - - p->setPen(Dot2QtConsts::componentData().qtColor(edge()->fontColor())); - - qreal x = (m_scaleX * - ( - (dro.integers[0]) - + (((-dro.integers[2])*(fm.width(dro.str)))/2) - - ( (fm.width(dro.str))/2 ) - ) - ) - + m_xMargin; - qreal y = ((m_gh - (dro.integers[1]))*m_scaleY)+ m_yMargin; - QPointF point(x,y); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawText" << edge()->fontColor() << point; - - p->drawText(point,str); - p->restore(); - } - else if (( dro.renderop == "p" ) || (dro.renderop == "P" )) - { - QPolygonF polygon(dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - QPointF point( - (int(dro.integers[2*i+1])/*%m_wdhcf*/)*m_scaleX +m_xMargin, - (int(m_gh-dro.integers[2*i+2])/*%m_hdvcf*/)*m_scaleY + m_yMargin - ); - polygon[i] = point; -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << point; - allPoints.append(point); - } - if (dro.renderop == "P" ) - { - p->save(); - p->setBrush(lineColor); - p->drawPolygon(polygon); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawPolygon" << edge()->color(0) << polygon; - p->restore(); - } - else - { - p->setBrush(Dot2QtConsts::componentData().qtColor("white")); - } - QPen pen(lineColor); - if (edge()->style() == "bold") - { - pen.setStyle(Qt::SolidLine); - pen.setWidth((int)(2 * widthScaleFactor)); - } - else - { - pen.setWidth((int)(1 * widthScaleFactor)); - pen.setStyle(Dot2QtConsts::componentData().qtPenStyle(edge()->style())); - } - p->save(); - p->setPen(pen); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawPolyline" << edge()->color(0) << polygon; - p->drawPolyline(polygon); - p->restore(); - } - else if (( dro.renderop == "e" ) || (dro.renderop == "E" )) - { - qreal w = m_scaleX * dro.integers[2] * 2; - qreal h = m_scaleY * dro.integers[3] * 2; - qreal x = (m_xMargin + (dro.integers[0]/*%m_wdhcf*/)*m_scaleX) - w/2; - qreal y = ((m_gh - dro.integers[1]/*%m_hdvcf*/)*m_scaleY + m_yMargin) - h/2; - p->save(); - if (dro.renderop == "E" ) - { - p->setBrush(lineColor); - } - else - { - p->setBrush(Dot2QtConsts::componentData().qtColor("white")); - } - QPen pen(lineColor); - if (edge()->style() == "bold") - { - pen.setStyle(Qt::SolidLine); - pen.setWidth(int(2 * widthScaleFactor)); - } - else - { - pen.setWidth(int(1 * widthScaleFactor)); - pen.setStyle(Dot2QtConsts::componentData().qtPenStyle(edge()->style())); - } - p->setPen(pen); - QRectF rect(x,y,w,h); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawEllipse" << edge()->color(0) << rect; - p->drawEllipse(rect); - p->restore(); - } - else if ( dro.renderop == "B" ) - { - uint lineWidth = 1; - QPen pen; - if (edge()->style() == "bold") - { - pen.setStyle(Qt::SolidLine); - pen.setWidth(int(2 * widthScaleFactor)); - } - else if (edge()->style() != "filled") - { - pen.setStyle(Dot2QtConsts::componentData().qtPenStyle(edge()->style())); - } - if (edge()->style().left(12) == "setlinewidth") - { - bool ok; - lineWidth = edge()->style().mid(12, edge()->style().length()-1-12).toInt(&ok); - pen.setWidth(int(lineWidth * widthScaleFactor)); - } - if (edge()->attributes().contains("penwidth")) - { - bool ok; - lineWidth = edge()->attributes()["penwidth"].toInt(&ok); - pen.setWidth(int(lineWidth * widthScaleFactor)); - } - if (edge()->attributes().contains("color")) - { - ///kDebug() << "set edge color to " << QColor(edge()->attributes()["color"]).name(); - lineColor = QColor(edge()->attributes()["color"]); - } - for (int splineNum = 0; splineNum < edge()->colors().count() || (splineNum==0 && edge()->colors().count()==0); splineNum++) - { - QPolygonF points(dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - // computing of diffX and diffY to draw parallel edges - // when asked through the corresponding GraphViz feature - qreal nom = (dro.integers[2*dro.integers[0]]-dro.integers[2]); - qreal denom = (dro.integers[2*dro.integers[0]-1]-dro.integers[1]); - qreal diffX, diffY; - if (nom == 0) - { - diffX = 0; - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - else if (denom ==0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 0; - } - else - { - double pente = nom/denom; - if (pente < 0) - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = edge()->colors().count()/2 + splineNum; - } - else - { - diffX = 2*(edge()->colors().count()/2 - splineNum); - diffY = 2*(edge()->colors().count()/2 - splineNum); - } - } - QPointF p( - (dro.integers[2*i+1]/*%m_wdhcf*/*m_scaleX) +m_xMargin + diffX, - (m_gh-dro.integers[2*i+2]/*%m_hdvcf*/)*m_scaleY + m_yMargin + diffY - ); - points[i] = p; -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << p; - allPoints.append(p); - } - ///kDebug() << "Setting pen color to " << edge()->color(splineNum); - if (splineNum != 0) - lineColor = Dot2QtConsts::componentData().qtColor(edge()->color(splineNum)); - pen.setColor(lineColor); - p->save(); -// p->setBrush(Dot2QtConsts::componentData().qtColor(edge()->color(0))); - p->setBrush(Qt::NoBrush); - p->setPen(pen); - QPainterPath path; - path.moveTo(points[0]); - for (int j = 0; j < (points.size()-1)/3; j++) - { - path.cubicTo(points[3*j + 1],points[3*j+1 + 1], points[3*j+2 + 1]); - } -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "drawPath" << edge()->color(splineNum) << points.first() << points.last(); - p->drawPath(path); - p->restore(); - } - } - } - if (edge()->isSelected()) - { -// kDebug() << "draw square"; -// p->drawRect(m_boundingRect); - qreal maxDist = 0; - QPair<QPointF,QPointF> pointsPair; - foreach(const QPointF& point1, allPoints) - { - foreach(const QPointF& point2, allPoints) - { - if (distance(point1, point2) > maxDist) - { - maxDist = distance(point1, point2); - pointsPair = qMakePair(point1, point2); - } - } - } - if (maxDist>0) - { - p->save(); - // p->setBrush(Dot2QtConsts::componentData().qtColor(edge()->color(0))); - p->setBrush(Qt::black); - p->setPen(Qt::black); - p->drawRect(QRectF(pointsPair.first-QPointF(3,3),QSizeF(6,6))); - p->drawRect(QRectF(pointsPair.second-QPointF(3,3),QSizeF(6,6))); - p->restore(); - } - } -} - -void CanvasEdge::modelChanged() -{ -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id(); - prepareGeometryChange(); - computeBoundingRect(); -} - -void CanvasEdge::computeBoundingRect() -{ -// kDebug(); - //invalidate bounding region cache - m_boundingRegion = QPainterPath(); - if (edge()->renderOperations().isEmpty()) - { - if ((edge()->fromNode()->canvasElement()==0) - || (edge()->toNode()->canvasElement()==0) - || edge()->style()=="invis") - { - m_boundingRect = QRectF(); - } - else - { - QRectF br( - edge()->fromNode()->canvasElement()->boundingRect().center()+edge()->fromNode()->canvasElement()->pos(), - edge()->toNode()->canvasElement()->boundingRect().center()+edge()->toNode()->canvasElement()->pos()); -// kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() <<br; - m_boundingRect = br; - } - } - else - { - QPolygonF points; - foreach (const DotRenderOp& dro, edge()->renderOperations()) - { -// kDebug() << dro.renderop << ", "; - if ( (dro.renderop != "B") && (dro.renderop != "p") && (dro.renderop != "P") ) continue; - uint previousSize = points.size(); - points.resize(previousSize+dro.integers[0]); - for (int i = 0; i < dro.integers[0]; i++) - { - QPointF p( - ((dro.integers[2*i+1]/*%m_wdhcf*/)*m_scaleX) +m_xMargin, - ((m_gh-dro.integers[2*i+2]/*%m_hdvcf*/)*m_scaleY) + m_yMargin - ); - points[previousSize+i] = p; - } - } -// kDebug() << points.size() << "points"; - if (points.size() == 0) return; - - int len = points.count(); - QPolygonF a = points, b = points; - a.translate(-1, -1); - b.translate(1, 1); - a.resize(2*len); - for (int i=0;i<len;i++) - { - a[len+i] = b[i]; - } -// kDebug() << a.size() << "points"; - - m_boundingRect = a.boundingRect(); - } - ///kDebug() << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << "New bounding rect is:" << m_boundingRect; -} - -void CanvasEdge::mousePressEvent(QGraphicsSceneMouseEvent * event) -{ - ///kDebug() << event; - if (m_view->isReadOnly()) - { - return; - } - if (event->button() == Qt::LeftButton) - { - edge()->setSelected(!edge()->isSelected()); - if (edge()->isSelected()) - { - emit(selected(this,event->modifiers())); - } - update(); - } - else if (event->button() == Qt::RightButton) - { - if (!edge()->isSelected()) - { - edge()->setSelected(true); - emit(selected(this,event->modifiers())); - update(); - } - ///kDebug() << "emiting edgeContextMenuEvent("<<m_edge->id()<<","<<event->screenPos()<<")"; - emit(edgeContextMenuEvent(m_edge->id(), event->screenPos() )); -// opens the selected edge contextual menu and if necessary select the edge -/* kDebug() << "opens the contextual menu"; - m_popup->exec(event->screenPos());*/ - } -} - -qreal CanvasEdge::distance(const QPointF& point1, const QPointF& point2) -{ - return sqrt(pow(point1.x()-point2.x(),2)+pow(point1.y()-point2.y(),2)); -} - -void CanvasEdge::slotRemoveEdge() -{ - ///kDebug(); - m_view->removeSelectedElements(); -} - -void CanvasEdge::hoverEnterEvent( QGraphicsSceneHoverEvent * event ) -{ - Q_UNUSED(event) - ///kDebug() << edge()->id(); - emit hoverEnter(this); -} - -void CanvasEdge::hoverLeaveEvent( QGraphicsSceneHoverEvent * event ) -{ - Q_UNUSED(event) - ///kDebug() << edge()->id(); - emit hoverLeave(this); -} - -} - -//#include "canvasedge.moc" +/* This file is part of KGraphViewer. + Copyright (C) 2005-2007 Gael de Chalendar <kl...@fr...> + + KGraphViewer is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. + + This program 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA +*/ + +/* This file was callgraphview.cpp, part of KCachegrind. + Copyright (C) 2003 Josef Weidendorfer <Jos...@gm...> + + KCachegrind is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation, version 2. +*/ + + +#include "canvasedge.h" +#include "graphedge.h" +#include "graphnode.h" +#include "dotdefaults.h" +#include "dot2qtconsts.h" +#include "dotgraphview.h" +#include "FontsCache.h" + +///#include <KAction> + +#include <QPainter> +#include <QGraphicsSceneMouseEvent> +#include <QMenu> + +#include <iostream> + +// +// CanvasEdge +// + +///namespace KGraphViewer +///{ +CanvasEdge::CanvasEdge(DotGraphView* view, GraphEdge* e, + qreal scaleX, qreal scaleY, + qreal xMargin, qreal yMargin, qreal gh, + qreal wdhcf, qreal hdvcf, + QGraphicsItem* parent) + : QAbstractGraphicsShapeItem(parent), + m_scaleX(scaleX), m_scaleY(scaleY), + m_xMargin(xMargin), m_yMargin(yMargin), + m_gh(/*gh*/0), m_wdhcf(wdhcf), m_hdvcf(hdvcf), m_edge(e), + m_font(0), m_view(view), m_popup(new QMenu()) +{ + ///kDebug() << "edge " << edge()->fromNode()->id() << "->" << edge()->toNode()->id() << m_gh; + setBoundingRegionGranularity(0.9); + m_font = FontsCache::changeable().fromName(e->fontName()); + + computeBoundingRect(); +// kDebug() << "boundingRect computed: " << m_boundingRect; + + QString tipStr = QString("%1 -> %2\nlabel='%3'") + .arg(edge()->fromNode()->id()) + .arg(edge()->toNode()->id()) + .arg(e->label()); + setToolTip(tipStr); + + // the message should be given (or possible to be given) by the part user + /// KAction* removeEdgeAction = new KActi... [truncated message content] |