|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#ifndef _DOT_H
|
|
Packit |
1c1d7e |
#define _DOT_H
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qlist.h>
|
|
Packit |
1c1d7e |
#include <qdict.h>
|
|
Packit |
1c1d7e |
#include <qwaitcondition.h>
|
|
Packit |
1c1d7e |
#include <qmutex.h>
|
|
Packit |
1c1d7e |
#include <qqueue.h>
|
|
Packit |
1c1d7e |
#include <qthread.h>
|
|
Packit |
1c1d7e |
#include "sortdict.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class ClassDef;
|
|
Packit |
1c1d7e |
class FileDef;
|
|
Packit |
1c1d7e |
class FTextStream;
|
|
Packit |
1c1d7e |
class DotNodeList;
|
|
Packit |
1c1d7e |
class ClassSDict;
|
|
Packit |
1c1d7e |
class MemberDef;
|
|
Packit |
1c1d7e |
class Definition;
|
|
Packit |
1c1d7e |
class DirDef;
|
|
Packit |
1c1d7e |
class GroupDef;
|
|
Packit |
1c1d7e |
class DotGroupCollaboration;
|
|
Packit |
1c1d7e |
class DotRunnerQueue;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
enum GraphOutputFormat { GOF_BITMAP, GOF_EPS };
|
|
Packit |
1c1d7e |
enum EmbeddedOutputFormat { EOF_Html, EOF_LaTeX, EOF_Rtf, EOF_DocBook };
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Attributes of an edge of a dot graph */
|
|
Packit |
1c1d7e |
struct EdgeInfo
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
enum Colors { Blue=0, Green=1, Red=2, Purple=3, Grey=4, Orange=5, Orange2=6 };
|
|
Packit |
1c1d7e |
enum Styles { Solid=0, Dashed=1 };
|
|
Packit |
1c1d7e |
EdgeInfo() : m_color(0), m_style(0), m_labColor(0) {}
|
|
Packit |
1c1d7e |
~EdgeInfo() {}
|
|
Packit |
1c1d7e |
int m_color;
|
|
Packit |
1c1d7e |
int m_style;
|
|
Packit |
1c1d7e |
QCString m_label;
|
|
Packit |
1c1d7e |
QCString m_url;
|
|
Packit |
1c1d7e |
int m_labColor;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** A node in a dot graph */
|
|
Packit |
1c1d7e |
class DotNode
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
enum GraphType { Dependency, Inheritance, Collaboration, Hierarchy, CallGraph };
|
|
Packit |
1c1d7e |
enum TruncState { Unknown, Truncated, Untruncated };
|
|
Packit |
1c1d7e |
DotNode(int n,const char *lab,const char *tip,const char *url,
|
|
Packit |
1c1d7e |
bool rootNode=FALSE,ClassDef *cd=0);
|
|
Packit |
1c1d7e |
~DotNode();
|
|
Packit |
1c1d7e |
void addChild(DotNode *n,
|
|
Packit |
1c1d7e |
int edgeColor=EdgeInfo::Purple,
|
|
Packit |
1c1d7e |
int edgeStyle=EdgeInfo::Solid,
|
|
Packit |
1c1d7e |
const char *edgeLab=0,
|
|
Packit |
1c1d7e |
const char *edgeURL=0,
|
|
Packit |
1c1d7e |
int edgeLabCol=-1
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
void addParent(DotNode *n);
|
|
Packit |
1c1d7e |
void deleteNode(DotNodeList &deletedList,SDict<DotNode> *skipNodes=0);
|
|
Packit |
1c1d7e |
void removeChild(DotNode *n);
|
|
Packit |
1c1d7e |
void removeParent(DotNode *n);
|
|
Packit |
1c1d7e |
int findParent( DotNode *n );
|
|
Packit |
1c1d7e |
void write(FTextStream &t,GraphType gt,GraphOutputFormat f,
|
|
Packit |
1c1d7e |
bool topDown,bool toChildren,bool backArrows);
|
|
Packit |
1c1d7e |
int m_subgraphId;
|
|
Packit |
1c1d7e |
void clearWriteFlag();
|
|
Packit |
1c1d7e |
void writeXML(FTextStream &t,bool isClassGraph);
|
|
Packit |
1c1d7e |
void writeDocbook(FTextStream &t,bool isClassGraph);
|
|
Packit |
1c1d7e |
void writeDEF(FTextStream &t);
|
|
Packit |
1c1d7e |
QCString label() const { return m_label; }
|
|
Packit |
1c1d7e |
int number() const { return m_number; }
|
|
Packit |
1c1d7e |
bool isVisible() const { return m_visible; }
|
|
Packit |
1c1d7e |
TruncState isTruncated() const { return m_truncated; }
|
|
Packit |
1c1d7e |
int distance() const { return m_distance; }
|
|
Packit |
1c1d7e |
void renumberNodes(int &number);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
void colorConnectedNodes(int curColor);
|
|
Packit |
1c1d7e |
void writeBox(FTextStream &t,GraphType gt,GraphOutputFormat f,
|
|
Packit |
1c1d7e |
bool hasNonReachableChildren);
|
|
Packit |
1c1d7e |
void writeArrow(FTextStream &t,GraphType gt,GraphOutputFormat f,DotNode *cn,
|
|
Packit |
1c1d7e |
EdgeInfo *ei,bool topDown, bool pointBack=TRUE);
|
|
Packit |
1c1d7e |
void setDistance(int distance);
|
|
Packit |
1c1d7e |
const DotNode *findDocNode() const; // only works for acyclic graphs!
|
|
Packit |
1c1d7e |
void markAsVisible(bool b=TRUE) { m_visible=b; }
|
|
Packit |
1c1d7e |
void markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; }
|
|
Packit |
1c1d7e |
int m_number;
|
|
Packit |
1c1d7e |
QCString m_label; //!< label text
|
|
Packit |
1c1d7e |
QCString m_tooltip; //!< node's tooltip
|
|
Packit |
1c1d7e |
QCString m_url; //!< url of the node (format: remote$local)
|
|
Packit |
1c1d7e |
QList<DotNode> *m_parents; //!< list of parent nodes (incoming arrows)
|
|
Packit |
1c1d7e |
QList<DotNode> *m_children; //!< list of child nodes (outgoing arrows)
|
|
Packit |
1c1d7e |
QList<EdgeInfo> *m_edgeInfo; //!< edge info for each child
|
|
Packit |
1c1d7e |
bool m_deleted; //!< used to mark a node as deleted
|
|
Packit |
1c1d7e |
bool m_written; //!< used to mark a node as written
|
|
Packit |
1c1d7e |
bool m_hasDoc; //!< used to mark a node as documented
|
|
Packit |
1c1d7e |
bool m_isRoot; //!< indicates if this is a root node
|
|
Packit |
1c1d7e |
ClassDef * m_classDef; //!< class representing this node (can be 0)
|
|
Packit |
1c1d7e |
bool m_visible; //!< is the node visible in the output
|
|
Packit |
1c1d7e |
TruncState m_truncated; //!< does the node have non-visible children/parents
|
|
Packit |
1c1d7e |
int m_distance; //!< shortest path to the root node
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
friend class DotGfxHierarchyTable;
|
|
Packit |
1c1d7e |
friend class DotClassGraph;
|
|
Packit |
1c1d7e |
friend class DotInclDepGraph;
|
|
Packit |
1c1d7e |
friend class DotNodeList;
|
|
Packit |
1c1d7e |
friend class DotCallGraph;
|
|
Packit |
1c1d7e |
friend class DotGroupCollaboration;
|
|
Packit |
1c1d7e |
friend class DotInheritanceGraph;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
friend QCString computeMd5Signature(
|
|
Packit |
1c1d7e |
DotNode *root, GraphType gt,
|
|
Packit |
1c1d7e |
GraphOutputFormat f,
|
|
Packit |
1c1d7e |
bool lrRank, bool renderParents,
|
|
Packit |
1c1d7e |
bool backArrows,
|
|
Packit |
1c1d7e |
const QCString &title,
|
|
Packit |
1c1d7e |
QCString &graphStr
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Class representing a list of DotNode objects. */
|
|
Packit |
1c1d7e |
class DotNodeList : public QList<DotNode>
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotNodeList() : QList<DotNode>() {}
|
|
Packit |
1c1d7e |
~DotNodeList() {}
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
int compareValues(const DotNode *n1,const DotNode *n2) const;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Represents a graphical class hierarchy */
|
|
Packit |
1c1d7e |
class DotGfxHierarchyTable
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotGfxHierarchyTable();
|
|
Packit |
1c1d7e |
~DotGfxHierarchyTable();
|
|
Packit |
1c1d7e |
void writeGraph(FTextStream &t,const char *path, const char *fileName) const;
|
|
Packit |
1c1d7e |
void createGraph(DotNode *rootNode,FTextStream &t,const char *path,const char *fileName,int id) const;
|
|
Packit |
1c1d7e |
const DotNodeList *subGraphs() const { return m_rootSubgraphs; }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
void addHierarchy(DotNode *n,ClassDef *cd,bool hide);
|
|
Packit |
1c1d7e |
void addClassList(ClassSDict *cl);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QList<DotNode> *m_rootNodes;
|
|
Packit |
1c1d7e |
QDict<DotNode> *m_usedNodes;
|
|
Packit |
1c1d7e |
int m_curNodeNumber;
|
|
Packit |
1c1d7e |
DotNodeList *m_rootSubgraphs;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Representation of a class inheritance or dependency graph */
|
|
Packit |
1c1d7e |
class DotClassGraph
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotClassGraph(ClassDef *cd,DotNode::GraphType t);
|
|
Packit |
1c1d7e |
~DotClassGraph();
|
|
Packit |
1c1d7e |
bool isTrivial() const;
|
|
Packit |
1c1d7e |
bool isTooBig() const;
|
|
Packit |
1c1d7e |
QCString writeGraph(FTextStream &t,GraphOutputFormat gf,EmbeddedOutputFormat ef,
|
|
Packit |
1c1d7e |
const char *path, const char *fileName, const char *relPath,
|
|
Packit |
1c1d7e |
bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeXML(FTextStream &t);
|
|
Packit |
1c1d7e |
void writeDocbook(FTextStream &t);
|
|
Packit |
1c1d7e |
void writeDEF(FTextStream &t);
|
|
Packit |
1c1d7e |
static void resetNumbering();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
void buildGraph(ClassDef *cd,DotNode *n,bool base,int distance);
|
|
Packit |
1c1d7e |
bool determineVisibleNodes(DotNode *rootNode,int maxNodes,bool includeParents);
|
|
Packit |
1c1d7e |
void determineTruncatedNodes(QList<DotNode> &queue,bool includeParents);
|
|
Packit |
1c1d7e |
void addClass(ClassDef *cd,DotNode *n,int prot,const char *label,
|
|
Packit |
1c1d7e |
const char *usedName,const char *templSpec,
|
|
Packit |
1c1d7e |
bool base,int distance);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotNode * m_startNode;
|
|
Packit |
1c1d7e |
QDict<DotNode> * m_usedNodes;
|
|
Packit |
1c1d7e |
static int m_curNodeNumber;
|
|
Packit |
1c1d7e |
DotNode::GraphType m_graphType;
|
|
Packit |
1c1d7e |
QCString m_collabFileName;
|
|
Packit |
1c1d7e |
QCString m_inheritFileName;
|
|
Packit |
1c1d7e |
bool m_lrRank;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Representation of an include dependency graph */
|
|
Packit |
1c1d7e |
class DotInclDepGraph
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotInclDepGraph(FileDef *fd,bool inverse);
|
|
Packit |
1c1d7e |
~DotInclDepGraph();
|
|
Packit |
1c1d7e |
QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef,
|
|
Packit |
1c1d7e |
const char *path,const char *fileName,const char *relPath,
|
|
Packit |
1c1d7e |
bool writeImageMap=TRUE,int graphId=-1) const;
|
|
Packit |
1c1d7e |
bool isTrivial() const;
|
|
Packit |
1c1d7e |
bool isTooBig() const;
|
|
Packit |
1c1d7e |
QCString diskName() const;
|
|
Packit |
1c1d7e |
void writeXML(FTextStream &t);
|
|
Packit |
1c1d7e |
void writeDocbook(FTextStream &t);
|
|
Packit |
1c1d7e |
static void resetNumbering();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
void buildGraph(DotNode *n,FileDef *fd,int distance);
|
|
Packit |
1c1d7e |
void determineVisibleNodes(QList<DotNode> &queue,int &maxNodes);
|
|
Packit |
1c1d7e |
void determineTruncatedNodes(QList<DotNode> &queue);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotNode *m_startNode;
|
|
Packit |
1c1d7e |
QDict<DotNode> *m_usedNodes;
|
|
Packit |
1c1d7e |
static int m_curNodeNumber;
|
|
Packit |
1c1d7e |
QCString m_inclDepFileName;
|
|
Packit |
1c1d7e |
QCString m_inclByDepFileName;
|
|
Packit |
1c1d7e |
bool m_inverse;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Representation of an call graph */
|
|
Packit |
1c1d7e |
class DotCallGraph
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotCallGraph(MemberDef *md,bool inverse);
|
|
Packit |
1c1d7e |
~DotCallGraph();
|
|
Packit |
1c1d7e |
QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef,
|
|
Packit |
1c1d7e |
const char *path,const char *fileName,
|
|
Packit |
1c1d7e |
const char *relPath,bool writeImageMap=TRUE,
|
|
Packit |
1c1d7e |
int graphId=-1) const;
|
|
Packit |
1c1d7e |
void buildGraph(DotNode *n,MemberDef *md,int distance);
|
|
Packit |
1c1d7e |
bool isTrivial() const;
|
|
Packit |
1c1d7e |
bool isTooBig() const;
|
|
Packit |
1c1d7e |
void determineVisibleNodes(QList<DotNode> &queue, int &maxNodes);
|
|
Packit |
1c1d7e |
void determineTruncatedNodes(QList<DotNode> &queue);
|
|
Packit |
1c1d7e |
static void resetNumbering();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
DotNode *m_startNode;
|
|
Packit |
1c1d7e |
static int m_curNodeNumber;
|
|
Packit |
1c1d7e |
QDict<DotNode> *m_usedNodes;
|
|
Packit |
1c1d7e |
bool m_inverse;
|
|
Packit |
1c1d7e |
QCString m_diskName;
|
|
Packit |
1c1d7e |
Definition * m_scope;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Representation of an directory dependency graph */
|
|
Packit |
1c1d7e |
class DotDirDeps
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotDirDeps(DirDef *dir);
|
|
Packit |
1c1d7e |
~DotDirDeps();
|
|
Packit |
1c1d7e |
bool isTrivial() const;
|
|
Packit |
1c1d7e |
QCString writeGraph(FTextStream &out,
|
|
Packit |
1c1d7e |
GraphOutputFormat gf,
|
|
Packit |
1c1d7e |
EmbeddedOutputFormat ef,
|
|
Packit |
1c1d7e |
const char *path,
|
|
Packit |
1c1d7e |
const char *fileName,
|
|
Packit |
1c1d7e |
const char *relPath,
|
|
Packit |
1c1d7e |
bool writeImageMap=TRUE,
|
|
Packit |
1c1d7e |
int graphId=-1,
|
|
Packit |
1c1d7e |
bool linkRelations=TRUE) const;
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
DirDef *m_dir;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Representation of a group collaboration graph */
|
|
Packit |
1c1d7e |
class DotGroupCollaboration
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public :
|
|
Packit |
1c1d7e |
enum EdgeType
|
|
Packit |
1c1d7e |
{ tmember = 0,
|
|
Packit |
1c1d7e |
tclass,
|
|
Packit |
1c1d7e |
tnamespace,
|
|
Packit |
1c1d7e |
tfile,
|
|
Packit |
1c1d7e |
tpages,
|
|
Packit |
1c1d7e |
tdir,
|
|
Packit |
1c1d7e |
thierarchy
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class Link
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
Link(const QCString lab,const QCString &u) : label(lab), url(u) {}
|
|
Packit |
1c1d7e |
QCString label;
|
|
Packit |
1c1d7e |
QCString url;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class Edge
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public :
|
|
Packit |
1c1d7e |
Edge(DotNode *start,DotNode *end,EdgeType type)
|
|
Packit |
1c1d7e |
: pNStart(start), pNEnd(end), eType(type)
|
|
Packit |
1c1d7e |
{ links.setAutoDelete(TRUE); }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotNode* pNStart;
|
|
Packit |
1c1d7e |
DotNode* pNEnd;
|
|
Packit |
1c1d7e |
EdgeType eType;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QList<Link> links;
|
|
Packit |
1c1d7e |
void write( FTextStream &t ) const;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotGroupCollaboration(GroupDef* gd);
|
|
Packit |
1c1d7e |
~DotGroupCollaboration();
|
|
Packit |
1c1d7e |
QCString writeGraph(FTextStream &t, GraphOutputFormat gf,EmbeddedOutputFormat ef,
|
|
Packit |
1c1d7e |
const char *path,const char *fileName,const char *relPath,
|
|
Packit |
1c1d7e |
bool writeImageMap=TRUE,int graphId=-1) const;
|
|
Packit |
1c1d7e |
void buildGraph(GroupDef* gd);
|
|
Packit |
1c1d7e |
bool isTrivial() const;
|
|
Packit |
1c1d7e |
static void resetNumbering();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private :
|
|
Packit |
1c1d7e |
void addCollaborationMember( Definition* def, QCString& url, EdgeType eType );
|
|
Packit |
1c1d7e |
void addMemberList( class MemberList* ml );
|
|
Packit |
1c1d7e |
void writeGraphHeader(FTextStream &t,const QCString &title) const;
|
|
Packit |
1c1d7e |
Edge* addEdge( DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType,
|
|
Packit |
1c1d7e |
const QCString& _label, const QCString& _url );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
DotNode *m_rootNode;
|
|
Packit |
1c1d7e |
static int m_curNodeNumber;
|
|
Packit |
1c1d7e |
QDict<DotNode> *m_usedNodes;
|
|
Packit |
1c1d7e |
QCString m_diskName;
|
|
Packit |
1c1d7e |
QList<Edge> m_edges;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Minimal constant string class that is thread safe, once initialized. */
|
|
Packit |
1c1d7e |
class DotConstString
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotConstString() { m_str=0; }
|
|
Packit |
1c1d7e |
~DotConstString() { delete[] m_str; }
|
|
Packit |
1c1d7e |
DotConstString(const QCString &s) : m_str(0) { set(s); }
|
|
Packit |
1c1d7e |
DotConstString(const DotConstString &s) : m_str(0) { set(s.data()); }
|
|
Packit |
1c1d7e |
const char *data() const { return m_str; }
|
|
Packit |
1c1d7e |
bool isEmpty() const { return m_str==0 || m_str[0]=='\0'; }
|
|
Packit |
1c1d7e |
void set(const QCString &s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
delete[] m_str;
|
|
Packit |
1c1d7e |
m_str=0;
|
|
Packit |
1c1d7e |
if (!s.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_str=new char[s.length()+1];
|
|
Packit |
1c1d7e |
qstrcpy(m_str,s.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
DotConstString &operator=(const DotConstString &);
|
|
Packit |
1c1d7e |
char *m_str;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Helper class to run dot from doxygen.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
class DotRunner
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
struct CleanupItem
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DotConstString path;
|
|
Packit |
1c1d7e |
DotConstString file;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Creates a runner for a dot \a file. */
|
|
Packit |
1c1d7e |
DotRunner(const QCString &file,const QCString &fontPath,bool checkResult,
|
|
Packit |
1c1d7e |
const QCString &imageName = QCString());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Adds an additional job to the run.
|
|
Packit |
1c1d7e |
* Performing multiple jobs one file can be faster.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void addJob(const char *format,const char *output);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void addPostProcessing(const char *cmd,const char *args);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void preventCleanUp() { m_cleanUp = FALSE; }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Runs dot for all jobs added. */
|
|
Packit |
1c1d7e |
bool run();
|
|
Packit |
1c1d7e |
const CleanupItem &cleanup() const { return m_cleanupItem; }
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
DotConstString m_dotExe;
|
|
Packit |
1c1d7e |
bool m_multiTargets;
|
|
Packit |
1c1d7e |
QList<DotConstString> m_jobs;
|
|
Packit |
1c1d7e |
DotConstString m_postArgs;
|
|
Packit |
1c1d7e |
DotConstString m_postCmd;
|
|
Packit |
1c1d7e |
DotConstString m_file;
|
|
Packit |
1c1d7e |
DotConstString m_path;
|
|
Packit |
1c1d7e |
bool m_checkResult;
|
|
Packit |
1c1d7e |
DotConstString m_imageName;
|
|
Packit |
1c1d7e |
DotConstString m_imgExt;
|
|
Packit |
1c1d7e |
bool m_cleanUp;
|
|
Packit |
1c1d7e |
CleanupItem m_cleanupItem;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Helper class to insert a set of map file into an output file */
|
|
Packit |
1c1d7e |
class DotFilePatcher
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
struct Map
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString mapFile;
|
|
Packit |
1c1d7e |
QCString relPath;
|
|
Packit |
1c1d7e |
bool urlOnly;
|
|
Packit |
1c1d7e |
QCString context;
|
|
Packit |
1c1d7e |
QCString label;
|
|
Packit |
1c1d7e |
bool zoomable;
|
|
Packit |
1c1d7e |
int graphId;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
DotFilePatcher(const char *patchFile);
|
|
Packit |
1c1d7e |
int addMap(const QCString &mapFile,const QCString &relPath,
|
|
Packit |
1c1d7e |
bool urlOnly,const QCString &context,const QCString &label);
|
|
Packit |
1c1d7e |
int addFigure(const QCString &baseName,
|
|
Packit |
1c1d7e |
const QCString &figureName,bool heightCheck);
|
|
Packit |
1c1d7e |
int addSVGConversion(const QCString &relPath,bool urlOnly,
|
|
Packit |
1c1d7e |
const QCString &context,bool zoomable,int graphId);
|
|
Packit |
1c1d7e |
int addSVGObject(const QCString &baseName, const QCString &figureName,
|
|
Packit |
1c1d7e |
const QCString &relPath);
|
|
Packit |
1c1d7e |
bool run();
|
|
Packit |
1c1d7e |
QCString file() const;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
QList<Map> m_maps;
|
|
Packit |
1c1d7e |
QCString m_patchFile;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Queue of dot jobs to run. */
|
|
Packit |
1c1d7e |
class DotRunnerQueue
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
void enqueue(DotRunner *runner);
|
|
Packit |
1c1d7e |
DotRunner *dequeue();
|
|
Packit |
1c1d7e |
uint count() const;
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
QWaitCondition m_bufferNotEmpty;
|
|
Packit |
1c1d7e |
QQueue<DotRunner> m_queue;
|
|
Packit |
1c1d7e |
mutable QMutex m_mutex;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Worker thread to execute a dot run */
|
|
Packit |
1c1d7e |
class DotWorkerThread : public QThread
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
DotWorkerThread(DotRunnerQueue *queue);
|
|
Packit |
1c1d7e |
void run();
|
|
Packit |
1c1d7e |
void cleanup();
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
DotRunnerQueue *m_queue;
|
|
Packit |
1c1d7e |
QList<DotRunner::CleanupItem> m_cleanupItems;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Singleton that manages dot relation actions */
|
|
Packit |
1c1d7e |
class DotManager
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
static DotManager *instance();
|
|
Packit |
1c1d7e |
void addRun(DotRunner *run);
|
|
Packit |
1c1d7e |
int addMap(const QCString &file,const QCString &mapFile,
|
|
Packit |
1c1d7e |
const QCString &relPath,bool urlOnly,
|
|
Packit |
1c1d7e |
const QCString &context,const QCString &label);
|
|
Packit |
1c1d7e |
int addFigure(const QCString &file,const QCString &baseName,
|
|
Packit |
1c1d7e |
const QCString &figureName,bool heightCheck);
|
|
Packit |
1c1d7e |
int addSVGConversion(const QCString &file,const QCString &relPath,
|
|
Packit |
1c1d7e |
bool urlOnly,const QCString &context,bool zoomable,int graphId);
|
|
Packit |
1c1d7e |
int addSVGObject(const QCString &file,const QCString &baseName,
|
|
Packit |
1c1d7e |
const QCString &figureNAme,const QCString &relPath);
|
|
Packit |
1c1d7e |
bool run();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
DotManager();
|
|
Packit |
1c1d7e |
virtual ~DotManager();
|
|
Packit |
1c1d7e |
QList<DotRunner> m_dotRuns;
|
|
Packit |
1c1d7e |
SDict<DotFilePatcher> m_dotMaps;
|
|
Packit |
1c1d7e |
static DotManager *m_theInstance;
|
|
Packit |
1c1d7e |
DotRunnerQueue *m_queue;
|
|
Packit |
1c1d7e |
QList<DotWorkerThread> m_workers;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Generated a graphs legend page */
|
|
Packit |
1c1d7e |
void generateGraphLegend(const char *path);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeDotGraphFromFile(const char *inFile,const char *outDir,
|
|
Packit |
1c1d7e |
const char *outFile,GraphOutputFormat format);
|
|
Packit |
1c1d7e |
void writeDotImageMapFromFile(FTextStream &t,
|
|
Packit |
1c1d7e |
const QCString& inFile, const QCString& outDir,
|
|
Packit |
1c1d7e |
const QCString& relPath,const QCString& baseName,
|
|
Packit |
1c1d7e |
const QCString& context,int graphId=-1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void resetDotNodeNumbering();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#endif
|