[Uml-devel] KDE/kdesdk/umbrello/umbrello
Ralf Habacker
ralf.habacker at gmail.com
Thu Mar 15 19:17:05 UTC 2012
SVN commit 1285788 by habacker:
Moved implementation of dotgenerator to dotgenerator.cpp.
M +1 -0 CMakeLists.txt
A dotgenerator.cpp [License: GPL (v2+)]
M +11 -316 dotgenerator.h
--- trunk/KDE/kdesdk/umbrello/umbrello/CMakeLists.txt #1285787:1285788
@@ -418,6 +418,7 @@
cmdlineexportallviewsevent.cpp
codeaccessormethod.cpp
component.cpp
+ dotgenerator.cpp
docwindow.cpp
entity.cpp
entityattribute.cpp
--- trunk/KDE/kdesdk/umbrello/umbrello/dotgenerator.h #1285787:1285788
@@ -10,29 +10,10 @@
#ifndef DOTGENERATOR_H
-// app includes
-#include "associationwidget.h"
-#include "statewidget.h"
-#include "debug_utils.h"
-#include "umlwidget.h"
-
-// qt includes
-#include <QFile>
+class UMLScene;
#include <QHash>
-#include <QProcess>
-#include <QRectF>
-#include <QRegExp>
-#include <QString>
-#include <QTemporaryFile>
-#include <QTextStream>
-#include <QtDebug>
+#include <QPointF>
-// kde includes
-#include <KConfigGroup>
-#include <KDesktopFile>
-#include <KStandardDirs>
-
-
#define DOTGENERATOR_DEBUG
/**
* The class DotGenerator provides export of diagrams as dot files.
@@ -42,293 +23,19 @@
class DotGenerator
{
public:
- /**
- * constructor
- */
- DotGenerator()
- : m_scale(72),
- m_usePosition(false)
- {
- }
+ DotGenerator();
- /**
- * set usage of position attribute in dot file
- *
- * @param state The new state
- */
- void setUsePosition(bool state)
- {
- m_usePosition = state;
- }
+ void setUsePosition(bool state);
+ bool usePosition();
- /**
- * return usage of position attribute
- *
- * @return true if position are used
- */
- bool usePosition()
- {
- return m_usePosition;
- }
+ static bool availableConfigFiles(UMLScene *scene, QHash<QString,QString> &configFiles);
+ bool readConfigFile(QString diagramType, const QString &variant = "default");
- /**
- * Return a list of available templates for a given scene type
- *
- * @param scene The diagram
- * @param configFiles will contain the collected list of config files
- * @return true if collecting succeeds
- */
- static bool availableConfigFiles(UMLScene *scene, QHash<QString,QString> &configFiles)
- {
- QString diagramType = scene->type().toString().toLower();
- KStandardDirs dirs;
+ bool createDotFile(UMLScene *scene, const QString &fileName, const QString &variant = "default");
- QStringList fileNames = dirs.findAllResources("data", QString("umbrello/layouts/%1*.desktop").arg(diagramType));
- foreach(const QString &fileName, fileNames) {
- QFileInfo fi(fileName);
- QString baseName;
- if (fi.baseName().contains("-"))
- baseName = fi.baseName().remove(diagramType + "-");
- else if (fi.baseName() == diagramType)
- baseName = fi.baseName();
- else
- baseName = "default";
- KDesktopFile desktopFile(fileName);
- configFiles[baseName] = desktopFile.readName();
- }
- return true;
- }
-
- /**
- * Read a layout config file
- *
- * @param diagramType String identifing the diagram
- * @param variant String identifing the variant
- * @return true on success
- */
- bool readConfigFile(QString diagramType, const QString &variant = "default")
- {
- QStringList fileNames;
-
- if (!variant.isEmpty())
- fileNames << QString("%1-%2.desktop").arg(diagramType).arg(variant);
- fileNames << QString("%1-default.desktop").arg(diagramType);
- fileNames << "default.desktop";
-
- QString configFileName;
- foreach(const QString &fileName, fileNames) {
- configFileName = KStandardDirs::locate("data", QString("umbrello/layouts/%1").arg(fileName));
- if (!configFileName.isEmpty())
- break;
- }
-
- if (configFileName.isEmpty()) {
- uError() << "could not find layout config file name for diagram type" << diagramType << "and variant" << variant;
- return false;
- }
- uDebug() << "reading config file" << configFileName;
- m_configFileName = configFileName;
- KDesktopFile desktopFile(configFileName);
- KConfigGroup edgesAttributes(&desktopFile,"X-UMBRELLO-Dot-Edges");
- KConfigGroup nodesAttributes(&desktopFile,"X-UMBRELLO-Dot-Nodes");
- KConfigGroup attributes(&desktopFile,"X-UMBRELLO-Dot-Attributes");
- // settings are not needed by dotgenerator
- KConfigGroup settings(&desktopFile,"X-UMBRELLO-Dot-Settings");
-
- m_edgeParameters.clear();
- m_nodeParameters.clear();
- m_dotParameters.clear();
-
- foreach(const QString &key, attributes.keyList()) {
- QString value = attributes.readEntry(key);
- if (!value.isEmpty())
- m_dotParameters[key] = value;
- }
-
- foreach(const QString &key, nodesAttributes.keyList()) {
- QString value = nodesAttributes.readEntry(key);
- m_nodeParameters[key] = value;
- }
-
- foreach(const QString &key, edgesAttributes.keyList()) {
- QString value = edgesAttributes.readEntry(key);
- if (m_edgeParameters.contains(key)) {
- m_edgeParameters[key] += ',' + value;
- } else {
- m_edgeParameters[key] = value;
- }
- }
-
- QString value = settings.readEntry("origin");
- QStringList a = value.split(",");
- if (a.size() == 2)
- m_origin = QPointF(a[0].toDouble(), a[1].toDouble());
- else
- uError() << "illegal format of entry 'origin'" << value;
-
- m_generator = settings.readEntry("generator","dot");
-
-#ifdef LAYOUTGENERATOR_DATA_DEBUG
- uDebug() << m_edgeParameters;
- uDebug() << m_nodeParameters;
- uDebug() << m_dotParameters;
-#endif
- return true;
- }
-
- bool findItem(QStringList ¶ms, const QString &search)
- {
- foreach(const QString &s, params) {
- if (s.startsWith(search))
- return true;
- }
- return false;
- }
-
- /**
- * Create dot file using displayed widgets
- * and associations of the provided scene
- * @note This method could also be used as a base to export diagrams as dot file
- *
- * @param fileName Filename where to create the dot file
- * @param scene The diagram from which the widget informations are fetched
- *
- * @return true if generating finished successfully
- */
- bool createDotFile(UMLScene *scene, const QString &fileName, const QString &variant = "default")
- {
- QFile file(fileName);
- if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
- return false;
-
- QString diagramType = scene->type().toString().toLower();
- if (!readConfigFile(diagramType, variant))
- return false;
-
- QString data;
- QTextStream out(&data);
-
- foreach(UMLWidget *widget, scene->getWidgetList()) {
- QStringList params;
-
- if (m_nodeParameters.contains("all"))
- params << m_nodeParameters["all"].split(',');
-
- if (usePosition())
- params << QString("pos=\"%1,%2\"").arg(widget->getX()+widget->getWidth()/2).arg(widget->getY()+widget->getHeight()/2);
-
- QString type = QString(widget->baseTypeStr()).toLower().remove("wt_");
- QString key = "type::" + type;
-
- if (type == "state") {
- StateWidget *w = static_cast<StateWidget *>(widget);
- type = w->stateTypeStr().toLower();
- }
- key = "type::" + type;
- QString label = widget->name() + "\\n" + type;
-
- if (m_nodeParameters.contains(key))
- params << m_nodeParameters[key].split(',');
- else if (m_nodeParameters.contains("type::default"))
- params << m_nodeParameters["type::default"].split(',');
-
- if (!findItem(params,"label="))
- params << QString("label=\"%1\"").arg(label);
-
- if (!findItem(params,"width="))
- params << QString("width=\"%1\"").arg(widget->getWidth()/m_scale);
-
- if (!findItem(params,"height="))
- params << QString("height=\"%1\"").arg(widget->getHeight()/m_scale);
-
-#ifdef DOTGENERATOR_DATA_DEBUG
- uDebug() << type << params;
-#endif
- QString id = fixID(ID2STR(widget->id()));
- if (widget->baseType() != WidgetBase::wt_Text)
- out << "\"" << id << "\""
- << " [" << params.join(",") << "];\n";
- }
-
- foreach(AssociationWidget *assoc, scene->getAssociationList()) {
- QString type = assoc->associationType().toString().toLower();
- QString key = "type::" + type;
- bool swapId = m_edgeParameters.contains("id::" + key) && m_edgeParameters["id::" + key] == "swap";
-
- QString label = assoc->getName();
-
- QString headLabel = assoc->roleName(swapId ? Uml::B : Uml::A);
- QString tailLabel = assoc->roleName(swapId ? Uml::A : Uml::B);
-
- if (!headLabel.isEmpty())
- headLabel.prepend("+");
- if (!tailLabel.isEmpty())
- tailLabel.prepend("+");
-
- headLabel += QLatin1String(" ") + assoc->multiplicity(swapId ? Uml::B : Uml::A);
- tailLabel += QLatin1String(" ") + assoc->multiplicity(swapId ? Uml::A : Uml::B);
-
- QString edgeParameters;
- QStringList params;
- QString rkey = QLatin1String("ranking::") + key;
- if (m_edgeParameters.contains(rkey))
- edgeParameters = m_edgeParameters[rkey];
- else if (m_edgeParameters.contains("ranking::type::default")) {
- edgeParameters = m_edgeParameters["ranking::type::default"];
- }
- params << edgeParameters.split(',');
-
- QString vkey = QLatin1String("visual::") + key;
- if (m_edgeParameters.contains(vkey))
- edgeParameters = m_edgeParameters[vkey];
- else if (m_edgeParameters.contains("visual::type::default")) {
- edgeParameters = m_edgeParameters["visual::type::default"];
- }
- params << edgeParameters.split(',');
-
- if (!findItem(params,"label="))
- params << QString("label=\"%1\"").arg(label);
-
- if (!findItem(params,"headlabel="))
- params << QString("headlabel=\"%1\"").arg(headLabel);
-
- if (!findItem(params,"taillabel="))
- params << QString("taillabel=\"%1\"").arg(tailLabel);
-
-#ifdef DOTGENERATOR_DATA_DEBUG
- uDebug() << type << params;
-#endif
- QString aID = fixID(ID2STR(assoc->getWidgetID(swapId ? Uml::A : Uml::B)));
- QString bID = fixID(ID2STR(assoc->getWidgetID(swapId ? Uml::B : Uml::A)));
-
- out << "\"" << aID << "\" -> \"" << bID << "\"" << " [" << params.join(",") << "];\n";
- }
-
- QTextStream o(&file);
- o << "# generated from " << m_configFileName << "\n";
- o << "digraph G {\n";
-
- foreach(const QString &key, m_dotParameters.keys()) {
- o << "\t" << key << " [" << m_dotParameters[key] << "];\n";
- }
-
- o << data << "\n";
- o << "}\n";
-
- return true;
- }
-
protected:
- /**
- * There are id wrapped with '"', remove it.
- */
- QString fixID(const QString &_id)
- {
- // FIXME: some widget's ids returned from the list are wrapped with "\"", find and fix them
- QString id(_id);
- id.remove("\"");
- return id;
- }
+ bool findItem(QStringList ¶ms, const QString &search);
+ QString fixID(const QString &_id);
double m_scale; ///< scale factor
QString m_executable; ///< dot executable
@@ -338,21 +45,9 @@
QHash<QString, QString> m_nodeParameters; ///< contains global node parameters
QPointF m_origin;
QString m_generator; ///< name of graphviz generator
- bool m_usePosition;
+ bool m_usePosition; ///< use position tag from dot (not used yet)
friend QDebug operator<<(QDebug out, DotGenerator &c);
};
-#if 0
-static QDebug operator<<(QDebug out, LayoutGenerator &c)
-{
- out << "LayoutGenerator:"
- << "m_boundingRect:" << c.m_boundingRect
- << "m_nodes:" << c.m_nodes
- << "m_edges:" << c.m_edges
- << "m_scale:" << c.m_scale
- << "m_executable:" << c.m_executable;
- return out;
-}
#endif
-#endif
More information about the umbrello-devel
mailing list