Doxygen
Loading...
Searching...
No Matches
DotNode Class Reference

A node in a dot graph. More...

#include <src/dotnode.h>

Collaboration diagram for DotNode:

Public Types

enum class  LabelStyle { Plain , List , Table }
enum  TruncState { Unknown , Truncated , Untruncated }

Public Member Functions

 DotNode (DotGraph *graph, const DString &lab, const DString &tip, const DString &url, bool rootNode=false, const ClassDef *cd=nullptr)
void addChild (DotNode *n, EdgeInfo::Colors edgeColor=EdgeInfo::Purple, EdgeInfo::Styles edgeStyle=EdgeInfo::Solid, const DString &edgeLab=DString(), const DString &edgeURL=DString(), int edgeLabColor=-1)
void addParent (DotNode *n)
void deleteNode (DotNodeRefVector &deletedList)
void removeChild (DotNode *n)
void removeParent (DotNode *n)
int findParent (DotNode *n)
void write (TextStream &t, GraphType gt, GraphOutputFormat f, bool topDown, bool toChildren, bool backArrows)
void writeXML (TextStream &t, bool isClassGraph) const
void writeDocbook (TextStream &t, bool isClassGraph) const
void writeDEF (TextStream &t) const
void writeLabel (TextStream &t, GraphType gt) const
void writeUrl (TextStream &t) const
void writeBox (TextStream &t, GraphType gt, GraphOutputFormat f, bool hasNonReachableChildren) const
void writeArrow (TextStream &t, GraphType gt, GraphOutputFormat f, const DotNode *cn, const EdgeInfo *ei, bool topDown, bool pointBack=true) const
DString label () const
int number () const
bool isVisible () const
TruncState isTruncated () const
int distance () const
int subgraphId () const
bool isRenumbered () const
bool hasDocumentation () const
bool isWritten () const
void clearWriteFlag ()
void renumberNodes (int &number)
void markRenumbered ()
DotNodemarkHasDocumentation ()
void setSubgraphId (int id)
void colorConnectedNodes (int curColor)
void setDistance (int distance)
void markAsVisible (bool b=true)
DotNodemarkAsTruncated (bool b=true)
const DotNodeRefVectorchildren () const
const DotNodeRefVectorparents () const
const EdgeInfoVectoredgeInfo () const
DotNodesetNodeId (int number)

Static Public Member Functions

static void deleteNodes (DotNode *node)
static DString convertLabel (const DString &, LabelStyle=LabelStyle::Plain)

Static Public Attributes

static constexpr auto placeholderUrl = "-"

Private Attributes

DotGraphm_graph
int m_number
DString m_label
 label text
DString m_tooltip
 node's tooltip
DString m_url
 url of the node (format: remote$local)
DotNodeRefVector m_parents
 list of parent nodes (incoming arrows)
DotNodeRefVector m_children
 list of child nodes (outgoing arrows)
EdgeInfoVector m_edgeInfo
 edge info for each child
bool m_deleted = false
 used to mark a node as deleted
bool m_written = false
 used to mark a node as written
bool m_hasDoc = false
 used to mark a node as documented
bool m_isRoot
 indicates if this is a root node
const ClassDefm_classDef
 class representing this node (can be 0)
bool m_visible = false
 is the node visible in the output
TruncState m_truncated = Unknown
 does the node have non-visible children/parents
int m_distance = 1000
 shortest path to the root node
bool m_renumbered = false
 indicates if the node has been renumbered (to prevent endless loops)
int m_subgraphId = -1

Detailed Description

A node in a dot graph.

Definition at line 66 of file dotnode.h.

Member Enumeration Documentation

◆ LabelStyle

enum class DotNode::LabelStyle
strong
Enumerator
Plain 
List 
Table 

Definition at line 69 of file dotnode.h.

69{ Plain, List, Table };

◆ TruncState

Enumerator
Unknown 
Truncated 
Untruncated 

Definition at line 76 of file dotnode.h.

@ Truncated
Definition dotnode.h:76
@ Untruncated
Definition dotnode.h:76
@ Unknown
Definition dotnode.h:76

Constructor & Destructor Documentation

◆ DotNode()

DotNode::DotNode ( DotGraph * graph,
const DString & lab,
const DString & tip,
const DString & url,
bool rootNode = false,
const ClassDef * cd = nullptr )

Definition at line 326 of file dotnode.cpp.

328 : m_graph(graph)
329 , m_number(graph->getNextNodeNumber())
330 , m_label(lab)
331 , m_tooltip(tip)
332 , m_url(url)
333 , m_isRoot(isRoot)
334 , m_classDef(cd)
335{
336}
int getNextNodeNumber()
returns the node number.
Definition dotgraph.h:45
int m_number
Definition dotnode.h:129
bool m_isRoot
indicates if this is a root node
Definition dotnode.h:139
DString m_tooltip
node's tooltip
Definition dotnode.h:131
DString m_label
label text
Definition dotnode.h:130
const ClassDef * m_classDef
class representing this node (can be 0)
Definition dotnode.h:140
DotGraph * m_graph
Definition dotnode.h:128
DString m_url
url of the node (format: remote$local)
Definition dotnode.h:132

References m_classDef, m_graph, m_isRoot, m_label, m_number, m_tooltip, and m_url.

Referenced by addChild(), addParent(), deleteNodes(), findParent(), markAsTruncated(), markHasDocumentation(), removeChild(), removeParent(), setNodeId(), and writeArrow().

Member Function Documentation

◆ addChild()

void DotNode::addChild ( DotNode * n,
EdgeInfo::Colors edgeColor = EdgeInfo::Purple,
EdgeInfo::Styles edgeStyle = EdgeInfo::Solid,
const DString & edgeLab = DString(),
const DString & edgeURL = DString(),
int edgeLabColor = -1 )

Definition at line 338 of file dotnode.cpp.

345{
346 m_children.push_back(n);
347 m_edgeInfo.emplace_back(
348 edgeColor,
349 edgeStyle,
350 edgeLab,
351 edgeURL,
352 edgeLabColor==-1 ? edgeColor : edgeLabColor);
353}
EdgeInfoVector m_edgeInfo
edge info for each child
Definition dotnode.h:135
DotNodeRefVector m_children
list of child nodes (outgoing arrows)
Definition dotnode.h:134

References DotNode(), m_children, and m_edgeInfo.

Referenced by DotClassGraph::addClass(), DotGfxHierarchyTable::addHierarchy(), DotCallGraph::buildGraph(), and DotInclDepGraph::buildGraph().

◆ addParent()

void DotNode::addParent ( DotNode * n)

Definition at line 355 of file dotnode.cpp.

356{
357 m_parents.push_back(n);
358}
DotNodeRefVector m_parents
list of parent nodes (incoming arrows)
Definition dotnode.h:133

References DotNode(), and m_parents.

Referenced by DotClassGraph::addClass(), DotCallGraph::buildGraph(), and DotInclDepGraph::buildGraph().

◆ children()

◆ clearWriteFlag()

void DotNode::clearWriteFlag ( )

Definition at line 885 of file dotnode.cpp.

886{
887 m_written=false;
888 for (const auto &pn : m_parents) if (pn->isWritten()) pn->clearWriteFlag();
889 for (const auto &cn : m_children) if (cn->isWritten()) cn->clearWriteFlag();
890}
bool m_written
used to mark a node as written
Definition dotnode.h:137

References m_children, m_parents, and m_written.

Referenced by DotGraph::computeGraph().

◆ colorConnectedNodes()

void DotNode::colorConnectedNodes ( int curColor)

Definition at line 892 of file dotnode.cpp.

893{
894 for (const auto &cn : m_children)
895 {
896 if (cn->subgraphId()==-1) // uncolored child node
897 {
898 cn->setSubgraphId(curColor);
899 cn->markAsVisible();
900 cn->colorConnectedNodes(curColor);
901 //printf("coloring node %s (%p): %d\n",qPrint(cn->label()),cn,cn->subgraphId());
902 }
903 }
904
905 for (const auto &pn : m_parents)
906 {
907 if (pn->subgraphId()==-1) // uncolored parent node
908 {
909 pn->setSubgraphId(curColor);
910 pn->markAsVisible();
911 pn->colorConnectedNodes(curColor);
912 //printf("coloring node %s (%p): %d\n",qPrint(pn->label()),pn,pn->subgraphId());
913 }
914 }
915}

References m_children, and m_parents.

◆ convertLabel()

DString DotNode::convertLabel ( const DString & l,
LabelStyle style = LabelStyle::Plain )
static

Definition at line 196 of file dotnode.cpp.

197{
198 DString bBefore("\\_/<({[: =-+@%#~?$"); // break before character set
199 DString bAfter(">]),:;|"); // break after character set
200 if (l.empty()) return DString();
201 DString result;
202 char pc=0;
203 uint32_t idx = 0;
204 int charsLeft=static_cast<int>(l.length());
205 int sinceLast=0;
206 int foldLen = Config_getInt(DOT_WRAP_THRESHOLD); // ideal text length
207 DString br;
208 DString br1;
209 if (style==LabelStyle::Table)
210 {
211 result += "<<TABLE CELLBORDER=\"0\" BORDER=\"0\"><TR><TD VALIGN=\"top\" ALIGN=\"LEFT\" CELLPADDING=\"1\" CELLSPACING=\"0\">";
212 }
213 if (style==LabelStyle::List)
214 {
215 br = "<BR ALIGN=\"LEFT\"/>";
216 }
217 else if (style==LabelStyle::Table)
218 {
219 br1 = "</TD></TR>\n<TR><TD VALIGN=\"top\" ALIGN=\"LEFT\" CELLPADDING=\"1\" CELLSPACING=\"0\">";
220 br = br1 + "&nbsp;&nbsp;";
221 }
222 else // style==LabelStyle::Plain
223 {
224 br = "\\l";
225 }
226 while (idx < l.length())
227 {
228 char c = l[idx++];
229 char cs[2] = { c, 0 };
230 const char *replacement = cs;
231 if (style!=LabelStyle::Plain)
232 {
233 switch(c)
234 {
235 case '\\': replacement="\\\\"; break;
236 case '\n': replacement="\\n"; break;
237 case '<': replacement="&lt;"; break;
238 case '>': replacement="&gt;"; break;
239 case '"': replacement="&quot;"; break;
240 case '\'': replacement="&apos;"; break;
241 case '&': replacement="&amp;"; break;
242 }
243 }
244 else // style==LabelStyle::Plain
245 {
246 switch(c)
247 {
248 case '\\': replacement="\\\\"; break;
249 case '\n': replacement="\\n"; break;
250 case '<': replacement="\\<"; break;
251 case '>': replacement="\\>"; break;
252 case '"': replacement="\\\""; break;
253 case '|': replacement="\\|"; break;
254 case '{': replacement="\\{"; break;
255 case '}': replacement="\\}"; break;
256 }
257 }
258 // Some heuristics to insert newlines to prevent too long
259 // boxes and at the same time prevent ugly breaks
260 if (c=='\n')
261 {
262 if (style==LabelStyle::Table)
263 {
264 result+=br1;
265 }
266 else
267 {
268 result+=replacement;
269 }
270 foldLen = (3*foldLen+sinceLast+2)/4;
271 sinceLast=1;
272 }
273 else if ((pc!=':' || c!=':') && charsLeft>foldLen/3 && sinceLast>foldLen && bBefore.contains(c))
274 {
275 result+=br;
276 result+=replacement;
277 foldLen = (foldLen+sinceLast+1)/2;
278 sinceLast=1;
279 }
280 else if (charsLeft>1+foldLen/4 && sinceLast>foldLen+foldLen/3 &&
281 !isupper(c) && isupper(l[idx]))
282 {
283 result+=replacement;
284 result+=br;
285 foldLen = (foldLen+sinceLast+1)/2;
286 sinceLast=0;
287 }
288 else if (charsLeft>foldLen/3 && sinceLast>foldLen && bAfter.contains(c) && (c!=':' || l[idx]!=':'))
289 {
290 result+=replacement;
291 result+=br;
292 foldLen = (foldLen+sinceLast+1)/2;
293 sinceLast=0;
294 }
295 else
296 {
297 result+=replacement;
298 sinceLast++;
299 }
300 charsLeft--;
301 pc=c;
302 }
303 if (style==LabelStyle::List)
304 {
305 result = result.stripWhiteSpace();
306 }
307 if (style==LabelStyle::Table)
308 {
309 result += "</TD></TR>\n</TABLE>>";
310 }
311 return result;
312}
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:152
DString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
Definition dstring.h:341
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:155
#define Config_getInt(name)
Definition config.h:34

References Config_getInt, DString::contains(), DString::empty(), DString::length(), List, Plain, DString::stripWhiteSpace(), and Table.

Referenced by drawClusterOpening(), drawDirectory(), DotGroupCollaboration::Edge::write(), writeArrow(), writeBoxMemberList(), and writeLabel().

◆ deleteNode()

void DotNode::deleteNode ( DotNodeRefVector & deletedList)

Definition at line 372 of file dotnode.cpp.

373{
374 if (m_deleted) return; // avoid recursive loops in case the graph has cycles
375 m_deleted=true;
376 // delete all parent nodes of this node
377 for (const auto &pn : m_parents)
378 {
379 pn->deleteNode(deletedList);
380 }
381 // delete all child nodes of this node
382 for (const auto &cn : m_children)
383 {
384 cn->deleteNode(deletedList);
385 }
386 // add this node to the list of deleted nodes.
387 deletedList.push_back(this);
388}
bool m_deleted
used to mark a node as deleted
Definition dotnode.h:136

References m_children, m_deleted, and m_parents.

Referenced by deleteNodes().

◆ deleteNodes()

void DotNode::deleteNodes ( DotNode * node)
static

helper function that deletes all nodes in a connected graph, given one of the graph's nodes

Definition at line 404 of file dotnode.cpp.

405{
406 DotNodeRefVector deletedNodes;
407 node->deleteNode(deletedNodes); // collect nodes to be deleted.
408 for (const auto &dotNode : deletedNodes)
409 {
410 delete dotNode;
411 }
412}
void deleteNode(DotNodeRefVector &deletedList)
Definition dotnode.cpp:372
std::vector< DotNode * > DotNodeRefVector
Definition dotnode.h:62

References deleteNode(), and DotNode().

Referenced by DotCallGraph::~DotCallGraph(), DotClassGraph::~DotClassGraph(), and DotInclDepGraph::~DotInclDepGraph().

◆ distance()

int DotNode::distance ( ) const
inline

Definition at line 106 of file dotnode.h.

106{ return m_distance; }
int m_distance
shortest path to the root node
Definition dotnode.h:143

References m_distance.

Referenced by DotCallGraph::determineVisibleNodes(), DotClassGraph::determineVisibleNodes(), DotInclDepGraph::determineVisibleNodes(), and setDistance().

◆ edgeInfo()

const EdgeInfoVector & DotNode::edgeInfo ( ) const
inline

Definition at line 124 of file dotnode.h.

124{ return m_edgeInfo; }

References m_edgeInfo.

Referenced by writeDEF(), writeDocbook(), and writeXML().

◆ findParent()

int DotNode::findParent ( DotNode * n)
inline

Definition at line 395 of file dotnode.cpp.

396{
397 auto it = std::find(m_parents.begin(),m_parents.end(),n);
398 return it!=m_parents.end() ? static_cast<int>(it-m_parents.begin()) : -1;
399}

References DotNode(), and m_parents.

◆ hasDocumentation()

bool DotNode::hasDocumentation ( ) const
inline

Definition at line 109 of file dotnode.h.

109{ return m_hasDoc; }
bool m_hasDoc
used to mark a node as documented
Definition dotnode.h:138

References m_hasDoc.

◆ isRenumbered()

bool DotNode::isRenumbered ( ) const
inline

Definition at line 108 of file dotnode.h.

108{ return m_renumbered; }
bool m_renumbered
indicates if the node has been renumbered (to prevent endless loops)
Definition dotnode.h:144

References m_renumbered.

Referenced by renumberNodes().

◆ isTruncated()

TruncState DotNode::isTruncated ( ) const
inline

Definition at line 105 of file dotnode.h.

105{ return m_truncated; }
TruncState m_truncated
does the node have non-visible children/parents
Definition dotnode.h:142

References m_truncated.

Referenced by DotCallGraph::determineTruncatedNodes(), DotClassGraph::determineTruncatedNodes(), and DotInclDepGraph::determineTruncatedNodes().

◆ isVisible()

◆ isWritten()

bool DotNode::isWritten ( ) const
inline

Definition at line 110 of file dotnode.h.

110{ return m_written; }

References m_written.

◆ label()

◆ markAsTruncated()

DotNode & DotNode::markAsTruncated ( bool b = true)
inline

◆ markAsVisible()

◆ markHasDocumentation()

DotNode & DotNode::markHasDocumentation ( )
inline

Definition at line 115 of file dotnode.h.

115{ m_hasDoc = true; return *this;}

References DotNode(), and m_hasDoc.

◆ markRenumbered()

void DotNode::markRenumbered ( )
inline

Definition at line 114 of file dotnode.h.

114{ m_renumbered = true; }

References m_renumbered.

Referenced by renumberNodes().

◆ number()

int DotNode::number ( ) const
inline

Definition at line 103 of file dotnode.h.

103{ return m_number; }

References m_number.

Referenced by renumberNodes(), setNodeId(), DotGroupCollaboration::Edge::write(), and writeArrow().

◆ parents()

◆ removeChild()

void DotNode::removeChild ( DotNode * n)

Definition at line 360 of file dotnode.cpp.

361{
362 auto it = std::find(m_children.begin(),m_children.end(),n);
363 if (it!=m_children.end()) m_children.erase(it);
364}

References DotNode(), and m_children.

◆ removeParent()

void DotNode::removeParent ( DotNode * n)

Definition at line 366 of file dotnode.cpp.

367{
368 auto it = std::find(m_parents.begin(),m_parents.end(),n);
369 if (it!=m_parents.end()) m_parents.erase(it);
370}

References DotNode(), and m_parents.

◆ renumberNodes()

void DotNode::renumberNodes ( int & number)

Definition at line 919 of file dotnode.cpp.

920{
921 if (!isRenumbered())
922 {
923#if DEBUG_RENUMBERING
924 static int level = 0;
925 printf("%3d: ",subgraphId());
926 for (int i = 0; i < level; i++) printf(" ");
927 printf("> %s old = %d new = %d\n",qPrint(m_label),m_number,number);
928 level++;
929#endif
930 m_number = number++;
932 for (const auto &cn : m_children)
933 {
934 cn->renumberNodes(number);
935 }
936 for (const auto &pn : m_parents)
937 {
938 pn->renumberNodes(number);
939 }
940#if DEBUG_RENUMBERING
941 level--;
942 printf("%3d: ",subgraphId());
943 for (int i = 0; i < level; i++) printf(" ");
944 printf("< %s assigned = %d\n",qPrint(m_label),m_number);
945#endif
946 }
947}
void markRenumbered()
Definition dotnode.h:114
int number() const
Definition dotnode.h:103
bool isRenumbered() const
Definition dotnode.h:108
int subgraphId() const
Definition dotnode.h:107
const char * qPrint(const char *s)
Definition dstring.h:787

References isRenumbered(), m_children, m_label, m_number, m_parents, markRenumbered(), number(), qPrint(), and subgraphId().

◆ setDistance()

◆ setNodeId()

DotNode & DotNode::setNodeId ( int number)
inline

Definition at line 125 of file dotnode.h.

125{ m_number=number; return *this; }

References DotNode(), m_number, and number().

◆ setSubgraphId()

void DotNode::setSubgraphId ( int id)
inline

Definition at line 116 of file dotnode.h.

116{ m_subgraphId = id; }
int m_subgraphId
Definition dotnode.h:145

References m_subgraphId.

◆ subgraphId()

int DotNode::subgraphId ( ) const
inline

Definition at line 107 of file dotnode.h.

107{ return m_subgraphId; }

References m_subgraphId.

Referenced by DotGfxHierarchyTable::computeTheGraph(), and renumberNodes().

◆ write()

void DotNode::write ( TextStream & t,
GraphType gt,
GraphOutputFormat f,
bool topDown,
bool toChildren,
bool backArrows )

Definition at line 654 of file dotnode.cpp.

660{
661 //printf("DotNode::write(%d) name=%s this=%p written=%d visible=%d\n",m_distance,qPrint(m_label),this,m_written,m_visible);
662 if (m_written) return; // node already written to the output
663 if (!m_visible) return; // node is not visible
664 writeBox(t,gt,format,m_truncated==Truncated);
665 m_written=true;
666 if (toChildren)
667 {
668 auto it = m_edgeInfo.begin();
669 for (const auto &cn : m_children)
670 {
671 if (cn->isVisible())
672 {
673 //printf("write arrow %s%s%s\n",qPrint(label()),backArrows?"<-":"->",qPrint(cn->label()));
674 writeArrow(t,gt,format,cn,&(*it),topDown,backArrows);
675 }
676 cn->write(t,gt,format,topDown,toChildren,backArrows);
677 ++it;
678 }
679 }
680 else // render parents
681 {
682 for (const auto &pn : m_parents)
683 {
684 if (pn->isVisible())
685 {
686 const auto &children = pn->children();
687 auto child_it = std::find(children.begin(),children.end(),this);
688 size_t index = child_it - children.begin();
689 //printf("write arrow %s%s%s\n",qPrint(label()),backArrows?"<-":"->",qPrint(pn->label()));
690 writeArrow(t,
691 gt,
692 format,
693 pn,
694 &pn->edgeInfo()[index],
695 false,
696 backArrows
697 );
698 }
699 pn->write(t,gt,format,true,false,backArrows);
700 }
701 }
702 //printf("end DotNode::write(%d) name=%s\n",distance,qPrint(m_label));
703}
void writeArrow(TextStream &t, GraphType gt, GraphOutputFormat f, const DotNode *cn, const EdgeInfo *ei, bool topDown, bool pointBack=true) const
Definition dotnode.cpp:603
void writeBox(TextStream &t, GraphType gt, GraphOutputFormat f, bool hasNonReachableChildren) const
Definition dotnode.cpp:539
const DotNodeRefVector & children() const
Definition dotnode.h:122

References children(), m_children, m_edgeInfo, m_parents, m_truncated, m_visible, m_written, Truncated, writeArrow(), and writeBox().

Referenced by DotGraph::computeGraph().

◆ writeArrow()

void DotNode::writeArrow ( TextStream & t,
GraphType gt,
GraphOutputFormat f,
const DotNode * cn,
const EdgeInfo * ei,
bool topDown,
bool pointBack = true ) const

Definition at line 603 of file dotnode.cpp.

610{
611 t << " Node";
612 if (topDown)
613 t << cn->number();
614 else
615 t << m_number;
616 t << " -> Node";
617 if (topDown)
618 t << m_number;
619 else
620 t << cn->number();
621 t << " [";
622
623 const EdgeProperties *eProps = Config_getBool(UML_LOOK) ? &umlEdgeProps : &normalEdgeProps;
624 DString aStyle = eProps->arrowStyleMap[ei->color()];
625 bool umlUseArrow = aStyle=="odiamond";
626
627 t << "id=\"edge" << m_graph->getNextEdgeNumber() <<
628 "_Node" << DString().sprintf("%06d",m_number) <<
629 "_Node" << DString().sprintf("%06d",cn->number()) << "\",";
630 if (pointBack && !umlUseArrow) t << "dir=\"back\",";
631 t << "color=\"" << eProps->edgeColorMap[ei->color()] << "\",";
632 t << "style=\"" << eProps->edgeStyleMap[ei->style()] << "\"";
633 t << ",tooltip=\" \""; // space in tooltip is required otherwise still something like 'Node0 -> Node1' is used
634 if (!ei->label().empty())
635 {
636 t << ",label=" << convertLabel(ei->label(),LabelStyle::Table) << " ,fontcolor=\"grey\" ";
637 }
638 if (Config_getBool(UML_LOOK) &&
639 eProps->arrowStyleMap[ei->color()] &&
641 )
642 {
643 bool rev = pointBack;
644 if (umlUseArrow) rev=!rev; // UML use relates has arrow on the start side
645 if (rev)
646 t << ",arrowtail=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
647 else
648 t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->color()] << "\"";
649 }
650
651 t << "];\n";
652}
int getNextEdgeNumber()
returns the edge number.
Definition dotgraph.h:47
static DString convertLabel(const DString &, LabelStyle=LabelStyle::Plain)
Definition dotnode.cpp:196
DString label() const
Definition dotnode.h:40
int style() const
Definition dotnode.h:39
int color() const
Definition dotnode.h:38
#define Config_getBool(name)
Definition config.h:33
@ Collaboration
Definition dotgraph.h:31
@ Inheritance
Definition dotgraph.h:31
static EdgeProperties normalEdgeProps
Definition dotnode.cpp:89
static EdgeProperties umlEdgeProps
Definition dotnode.cpp:94
const char *const * arrowStyleMap
Definition dotnode.cpp:30
const char *const * edgeStyleMap
Definition dotnode.cpp:31
const char *const * edgeColorMap
Definition dotnode.cpp:29

References EdgeProperties::arrowStyleMap, Collaboration, EdgeInfo::color(), Config_getBool, convertLabel(), DotNode(), EdgeProperties::edgeColorMap, EdgeProperties::edgeStyleMap, DString::empty(), DotGraph::getNextEdgeNumber(), Inheritance, EdgeInfo::label(), m_graph, m_number, normalEdgeProps, number(), DString::sprintf(), EdgeInfo::style(), Table, and umlEdgeProps.

Referenced by DotGraph::computeGraph(), and write().

◆ writeBox()

void DotNode::writeBox ( TextStream & t,
GraphType gt,
GraphOutputFormat f,
bool hasNonReachableChildren ) const

Definition at line 539 of file dotnode.cpp.

543{
544 const char *labCol = nullptr;
545 const char *fillCol = "white";
546 if (m_classDef)
547 {
548 if (m_classDef->hasDocumentation() && hasNonReachableChildren)
549 {
550 labCol = "red";
551 fillCol = "#FFF0F0";
552 }
553 else if (m_classDef->hasDocumentation() && !hasNonReachableChildren)
554 {
555 labCol = "gray40";
556 }
557 else if (!m_classDef->hasDocumentation() && hasNonReachableChildren)
558 {
559 labCol = "orangered";
560 }
561 else // (!m_classDef->hasDocumentation() && !hasNonReachableChildren)
562 {
563 labCol = "grey75";
565 {
566 labCol = "gray40";
567 }
568 }
569 }
570 else
571 {
572 labCol = m_url.empty() ? "grey60" : // non link
573 (hasNonReachableChildren ? "red" : "grey40");
574 fillCol = m_url.empty() ? "#E0E0E0" :
575 (hasNonReachableChildren ? "#FFF0F0" : "white");
576 }
577 t << " Node" << m_number << " [";
578 t << "id=\"Node" << DString().sprintf("%06d",m_number) << "\",";
579 writeLabel(t,gt);
580 t << ",height=0.2,width=0.4";
581 if (m_isRoot)
582 {
583 t << ",color=\"gray40\", fillcolor=\"grey60\", style=\"filled\", fontcolor=\"black\"";
584 }
585 else
586 {
587 t << ",color=\"" << labCol << "\"";
588 t << ", fillcolor=\"" << fillCol << "\"";
589 t << ", style=\"filled\"";
590 writeUrl(t);
591 }
592 if (!m_tooltip.empty())
593 {
594 t << ",tooltip=\"" << escapeTooltip(m_tooltip) << "\"";
595 }
596 else
597 {
598 t << ",tooltip=\" \""; // space in tooltip is required otherwise still something like 'Node0' is used
599 }
600 t << "];\n";
601}
virtual bool isImplicitTemplateInstance() const =0
virtual const ClassDef * templateMaster() const =0
Returns the template master of which this class is an instance.
virtual bool hasDocumentation() const =0
void writeUrl(TextStream &t) const
Definition dotnode.cpp:514
void writeLabel(TextStream &t, GraphType gt) const
Definition dotnode.cpp:414
DString escapeTooltip(const DString &tooltip)
Definition dotnode.cpp:99

References DString::empty(), escapeTooltip(), Definition::hasDocumentation(), ClassDef::isImplicitTemplateInstance(), m_classDef, m_isRoot, m_number, m_tooltip, m_url, DString::sprintf(), ClassDef::templateMaster(), writeLabel(), and writeUrl().

Referenced by write().

◆ writeDEF()

void DotNode::writeDEF ( TextStream & t) const

Definition at line 829 of file dotnode.cpp.

830{
831 const char* nodePrefix = " node-";
832
833 t << " node = {\n";
834 t << nodePrefix << "id = " << m_number << ";\n";
835 t << nodePrefix << "label = '" << m_label << "';\n";
836
837 if (!m_url.empty())
838 {
839 DString url(m_url);
840 if (size_t dollarPos = url.find('$'); dollarPos!=DString::npos)
841 {
842 t << nodePrefix << "link = {\n" << " "
843 << nodePrefix << "link-id = '" << url.mid(dollarPos+1) << "';\n";
844 if (dollarPos>0)
845 {
846 t << " " << nodePrefix << "link-external = '"
847 << url.left(dollarPos) << "';\n";
848 }
849 t << " };\n";
850 }
851 }
852 auto it = m_edgeInfo.begin();
853 for (const auto &childNode : m_children)
854 {
855 const EdgeInfo &edgeInfo = *it;
856 t << " node-child = {\n";
857 t << " child-id = '" << childNode->number() << "';\n";
858 t << " relation = ";
859
860 switch (edgeInfo.color())
861 {
862 case EdgeInfo::Blue: t << "public-inheritance"; break;
863 case EdgeInfo::Green: t << "protected-inheritance"; break;
864 case EdgeInfo::Red: t << "private-inheritance"; break;
865 case EdgeInfo::Purple: t << "usage"; break;
866 case EdgeInfo::Orange: t << "template-instance"; break;
867 case EdgeInfo::Orange2: t << "type-constraint"; break;
868 case EdgeInfo::Grey: ASSERT(0); break;
869 }
870 t << ";\n";
871
872 if (!edgeInfo.label().empty())
873 {
874 t << " edgelabel = <<_EnD_oF_dEf_TeXt_\n"
875 << edgeInfo.label() << "\n"
876 << "_EnD_oF_dEf_TeXt_;\n";
877 }
878 t << " }; /* node-child */\n";
879 ++it;
880 }
881 t << " }; /* node */\n";
882}
static constexpr size_t npos
value used to indicate 'not found' or 'to the end of the string', matching std::string::npos
Definition dstring.h:182
const EdgeInfoVector & edgeInfo() const
Definition dotnode.h:124
@ Green
Definition dotnode.h:34
@ Purple
Definition dotnode.h:34
@ Orange2
Definition dotnode.h:34
@ Orange
Definition dotnode.h:34
#define ASSERT(x)
Definition dstring.h:28

References ASSERT, EdgeInfo::Blue, EdgeInfo::color(), edgeInfo(), DString::empty(), DString::find(), EdgeInfo::Green, EdgeInfo::Grey, EdgeInfo::label(), DString::left(), m_children, m_edgeInfo, m_label, m_number, m_url, DString::mid(), DString::npos, EdgeInfo::Orange, EdgeInfo::Orange2, EdgeInfo::Purple, and EdgeInfo::Red.

◆ writeDocbook()

void DotNode::writeDocbook ( TextStream & t,
bool isClassGraph ) const

Definition at line 767 of file dotnode.cpp.

768{
769 t << " <node id=\"" << m_number << "\">\n";
770 t << " <label>" << convertToXML(m_label) << "</label>\n";
771 if (!m_url.empty())
772 {
773 DString url(m_url);
774 if (size_t dollarPos = url.find('$'); dollarPos!=DString::npos)
775 {
776 t << " <link refid=\"" << convertToXML(url.mid(dollarPos+1)) << "\"";
777 if (dollarPos>0)
778 {
779 t << " external=\"" << convertToXML(url.left(dollarPos)) << "\"";
780 }
781 t << "/>\n";
782 }
783 }
784 auto it = m_edgeInfo.begin();
785 for (const auto &childNode : m_children)
786 {
787 const EdgeInfo &edgeInfo = *it;
788 t << " <childnode refid=\"" << childNode->number() << "\" relation=\"";
789 if (isClassGraph)
790 {
791 switch(edgeInfo.color())
792 {
793 case EdgeInfo::Blue: t << "public-inheritance"; break;
794 case EdgeInfo::Green: t << "protected-inheritance"; break;
795 case EdgeInfo::Red: t << "private-inheritance"; break;
796 case EdgeInfo::Purple: t << "usage"; break;
797 case EdgeInfo::Orange: t << "template-instance"; break;
798 case EdgeInfo::Orange2: t << "type-constraint"; break;
799 case EdgeInfo::Grey: ASSERT(0); break;
800 }
801 }
802 else // include graph
803 {
804 t << "include";
805 }
806 t << "\">\n";
807 if (!edgeInfo.label().empty())
808 {
809 size_t p=0;
810 size_t ni=0;
811 while ((ni=edgeInfo.label().find('\n',p))!=DString::npos)
812 {
813 t << " <edgelabel>"
814 << convertToXML(edgeInfo.label().mid(p,ni-p))
815 << "</edgelabel>\n";
816 p=ni+1;
817 }
818 t << " <edgelabel>"
820 << "</edgelabel>\n";
821 }
822 t << " </childnode>\n";
823 ++it;
824 }
825 t << " </node>\n";
826}
DString mid(size_t index, size_t len=npos) const
Definition dstring.h:322
size_t find(char c, size_t pos=0) const
Definition dstring.h:243
DString convertToXML(const DString &s, bool keepEntities, const bool citeEntry)
Definition util.cpp:3234

References ASSERT, EdgeInfo::Blue, EdgeInfo::color(), convertToXML(), edgeInfo(), DString::empty(), DString::find(), EdgeInfo::Green, EdgeInfo::Grey, EdgeInfo::label(), DString::left(), m_children, m_edgeInfo, m_label, m_number, m_url, DString::mid(), DString::npos, EdgeInfo::Orange, EdgeInfo::Orange2, EdgeInfo::Purple, and EdgeInfo::Red.

◆ writeLabel()

void DotNode::writeLabel ( TextStream & t,
GraphType gt ) const

Definition at line 414 of file dotnode.cpp.

415{
417 {
418 // Set shape to the plain type.
419 // the UML properties and methods are rendered using dot' HTML like table format
420 t << "shape=plain,label=";
421 // add names shown as relations to a set, so we don't show
422 // them as attributes as well
423 StringUnorderedSet arrowNames;
424 // for each edge
425 for (const auto &ei : m_edgeInfo)
426 {
427 if (!ei.label().empty()) // labels joined by \n
428 {
429 size_t i=0;
430 size_t p=0;
431 DString lab;
432 while ((i=ei.label().find('\n',p))!=DString::npos)
433 {
434 lab = stripProtectionPrefix(ei.label().mid(p,i-p));
435 arrowNames.insert(lab.str());
436 p=i+1;
437 }
438 lab = stripProtectionPrefix(ei.label().right(ei.label().length()-p));
439 arrowNames.insert(lab.str());
440 }
441 }
442
443 constexpr auto hr_start = "<TR><TD COLSPAN=\"2\" CELLPADDING=\"1\" CELLSPACING=\"0\">";
444 constexpr auto hr_end = "</TD></TR>\n";
445 constexpr auto sep = "<HR/>\n";
446 constexpr auto empty_line = "<TR><TD COLSPAN=\"2\" CELLPADDING=\"1\" CELLSPACING=\"0\">&nbsp;</TD></TR>\n";
447 //printf("DotNode::writeBox for %s\n",qPrint(m_classDef->name()));
448 t << "<<TABLE CELLBORDER=\"0\" BORDER=\"1\">";
449 t << hr_start << convertLabel(m_label,LabelStyle::List) << hr_end;
450 auto dotUmlDetails = Config_getEnum(DOT_UML_DETAILS);
451 if (dotUmlDetails!=DOT_UML_DETAILS_t::NONE)
452 {
453 bool lineWritten = false;
454 t << sep;
455 writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType::PubAttribs()),m_classDef,lineWritten,false,&arrowNames);
456 writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType::PubStaticAttribs()),m_classDef,lineWritten,true,&arrowNames);
457 writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType::Properties()),m_classDef,lineWritten,false,&arrowNames);
458 writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType::PacAttribs()),m_classDef,lineWritten,false,&arrowNames);
459 writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType::PacStaticAttribs()),m_classDef,lineWritten,true,&arrowNames);
460 writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType::ProAttribs()),m_classDef,lineWritten,false,&arrowNames);
461 writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType::ProStaticAttribs()),m_classDef,lineWritten,true,&arrowNames);
462 if (Config_getBool(EXTRACT_PRIVATE))
463 {
464 writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType::PriAttribs()),m_classDef,lineWritten,false,&arrowNames);
465 writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType::PriStaticAttribs()),m_classDef,lineWritten,true,&arrowNames);
466 }
467 if (!lineWritten) t << empty_line;
468 t << sep;
469 lineWritten = false;
470 writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType::PubMethods()),m_classDef,lineWritten);
471 writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType::PubStaticMethods()),m_classDef,lineWritten,true);
472 writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberListType::PubSlots()),m_classDef,lineWritten);
473 writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType::PacMethods()),m_classDef,lineWritten);
474 writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberListType::PacStaticMethods()),m_classDef,lineWritten,true);
475 writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType::ProMethods()),m_classDef,lineWritten);
476 writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType::ProStaticMethods()),m_classDef,lineWritten,true);
477 writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberListType::ProSlots()),m_classDef,lineWritten);
478 if (Config_getBool(EXTRACT_PRIVATE))
479 {
480 writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType::PriMethods()),m_classDef,lineWritten);
481 writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType::PriStaticMethods()),m_classDef,lineWritten,true);
482 writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberListType::PriSlots()),m_classDef,lineWritten);
483 }
484 if (m_classDef->getLanguage()!=SrcLangExt::Fortran)
485 {
486 for (const auto &mg : m_classDef->getMemberGroups())
487 {
488 if (!mg->members().empty())
489 {
490 writeBoxMemberList(t,'*',&mg->members(),m_classDef,lineWritten,false,&arrowNames);
491 }
492 }
493 }
494 if (!lineWritten) t << empty_line;
495 }
496 t << "</TABLE>>\n";
497 }
498 else if (Config_getString(DOT_NODE_ATTR).contains("shape=plain"))
499 {
500 t << "label=";
501 if (m_isRoot)
502 t << "<<b>" << convertToXML(m_label) << "</b>>";
503 else if (m_truncated == Truncated)
504 t << "<<i>" << convertToXML(m_label) << "</i>>";
505 else
506 t << '"' << convertLabel(m_label,LabelStyle::Plain) << '"';
507 }
508 else // standard look
509 {
510 t << "label=" << '"' << convertLabel(m_label,LabelStyle::Plain) << '"';
511 }
512}
virtual MemberList * getMemberList(MemberListType lt) const =0
Returns the members in the list identified by lt.
virtual const MemberGroupList & getMemberGroups() const =0
Returns the member groups defined for this class.
const std::string & str() const
Definition dstring.h:649
virtual SrcLangExt getLanguage() const =0
Returns the programming language this definition was written in.
#define Config_getString(name)
Definition config.h:32
#define Config_getEnum(name)
Definition config.h:35
std::unordered_set< std::string > StringUnorderedSet
Definition containers.h:29
static DString stripProtectionPrefix(const DString &s)
Definition dotnode.cpp:314
static void writeBoxMemberList(TextStream &t, char prot, const MemberList *ml, const ClassDef *scope, bool &lineWritten, bool isStatic=false, const StringUnorderedSet *skipNames=nullptr)
Definition dotnode.cpp:117

References Collaboration, Config_getBool, Config_getEnum, Config_getString, convertLabel(), convertToXML(), Definition::getLanguage(), ClassDef::getMemberGroups(), ClassDef::getMemberList(), Inheritance, List, m_classDef, m_edgeInfo, m_isRoot, m_label, m_truncated, DString::npos, Plain, DString::str(), stripProtectionPrefix(), Truncated, and writeBoxMemberList().

Referenced by writeBox().

◆ writeUrl()

void DotNode::writeUrl ( TextStream & t) const

Definition at line 514 of file dotnode.cpp.

515{
516 if (m_url.empty() || m_url == DotNode::placeholderUrl) return;
517 size_t tagPos = m_url.rfind('$');
518 t << ",URL=\"";
519 DString noTagURL = m_url;
520 if (tagPos!=DString::npos)
521 {
522 t << m_url.left(tagPos);
523 noTagURL = m_url.mid(tagPos);
524 }
525 size_t anchorPos = noTagURL.rfind('#');
526 if (anchorPos==DString::npos)
527 {
529 t << noTagURL << "\"";
530 }
531 else // insert extensiom before anchor
532 {
533 DString fn = noTagURL.left(anchorPos);
535 t << fn << noTagURL.mid(anchorPos) << "\"";
536 }
537}
size_t rfind(char c, size_t pos=npos) const
Definition dstring.h:248
DString left(size_t len) const
Definition dstring.h:310
static constexpr auto placeholderUrl
Definition dotnode.h:70
void addHtmlExtensionIfMissing(DString &fName)
Definition util.cpp:3933

References addHtmlExtensionIfMissing(), DString::empty(), DString::left(), m_url, DString::mid(), DString::npos, placeholderUrl, and DString::rfind().

Referenced by writeBox().

◆ writeXML()

void DotNode::writeXML ( TextStream & t,
bool isClassGraph ) const

Definition at line 705 of file dotnode.cpp.

706{
707 t << " <node id=\"" << m_number << "\">\n";
708 t << " <label>" << convertToXML(m_label) << "</label>\n";
709 if (!m_url.empty())
710 {
711 DString url(m_url);
712 size_t dollarPos = url.find('$');
713 if (dollarPos!=DString::npos)
714 {
715 t << " <link refid=\"" << convertToXML(url.mid(dollarPos+1)) << "\"";
716 if (dollarPos>0)
717 {
718 t << " external=\"" << convertToXML(url.left(dollarPos)) << "\"";
719 }
720 t << "/>\n";
721 }
722 }
723 auto it = m_edgeInfo.begin();
724 for (const auto &childNode : m_children)
725 {
726 const EdgeInfo &edgeInfo = *it;
727 t << " <childnode refid=\"" << childNode->number() << "\" relation=\"";
728 if (isClassGraph)
729 {
730 switch(edgeInfo.color())
731 {
732 case EdgeInfo::Blue: t << "public-inheritance"; break;
733 case EdgeInfo::Green: t << "protected-inheritance"; break;
734 case EdgeInfo::Red: t << "private-inheritance"; break;
735 case EdgeInfo::Purple: t << "usage"; break;
736 case EdgeInfo::Orange: t << "template-instance"; break;
737 case EdgeInfo::Orange2: t << "type-constraint"; break;
738 case EdgeInfo::Grey: ASSERT(0); break;
739 }
740 }
741 else // include graph
742 {
743 t << "include";
744 }
745 t << "\">\n";
746 if (!edgeInfo.label().empty())
747 {
748 size_t p=0;
749 size_t ni=0;
750 while ((ni=edgeInfo.label().find('\n',p))!=DString::npos)
751 {
752 t << " <edgelabel>"
753 << convertToXML(edgeInfo.label().mid(p,ni-p))
754 << "</edgelabel>\n";
755 p=ni+1;
756 }
757 t << " <edgelabel>"
759 << "</edgelabel>\n";
760 }
761 t << " </childnode>\n";
762 ++it;
763 }
764 t << " </node>\n";
765}
DString right(size_t len) const
Definition dstring.h:315

References ASSERT, EdgeInfo::Blue, EdgeInfo::color(), convertToXML(), edgeInfo(), DString::empty(), DString::find(), EdgeInfo::Green, EdgeInfo::Grey, EdgeInfo::label(), DString::left(), DString::length(), m_children, m_edgeInfo, m_label, m_number, m_url, DString::mid(), DString::npos, EdgeInfo::Orange, EdgeInfo::Orange2, EdgeInfo::Purple, EdgeInfo::Red, and DString::right().

Member Data Documentation

◆ m_children

DotNodeRefVector DotNode::m_children
private

list of child nodes (outgoing arrows)

Definition at line 134 of file dotnode.h.

Referenced by addChild(), children(), clearWriteFlag(), colorConnectedNodes(), deleteNode(), removeChild(), renumberNodes(), write(), writeDEF(), writeDocbook(), and writeXML().

◆ m_classDef

const ClassDef* DotNode::m_classDef
private

class representing this node (can be 0)

Definition at line 140 of file dotnode.h.

Referenced by DotNode(), writeBox(), and writeLabel().

◆ m_deleted

bool DotNode::m_deleted = false
private

used to mark a node as deleted

Definition at line 136 of file dotnode.h.

Referenced by deleteNode().

◆ m_distance

int DotNode::m_distance = 1000
private

shortest path to the root node

Definition at line 143 of file dotnode.h.

Referenced by distance(), and setDistance().

◆ m_edgeInfo

EdgeInfoVector DotNode::m_edgeInfo
private

edge info for each child

Definition at line 135 of file dotnode.h.

Referenced by addChild(), edgeInfo(), write(), writeDEF(), writeDocbook(), writeLabel(), and writeXML().

◆ m_graph

DotGraph* DotNode::m_graph
private

Definition at line 128 of file dotnode.h.

Referenced by DotNode(), and writeArrow().

◆ m_hasDoc

bool DotNode::m_hasDoc = false
private

used to mark a node as documented

Definition at line 138 of file dotnode.h.

Referenced by hasDocumentation(), and markHasDocumentation().

◆ m_isRoot

bool DotNode::m_isRoot
private

indicates if this is a root node

Definition at line 139 of file dotnode.h.

Referenced by DotNode(), writeBox(), and writeLabel().

◆ m_label

DString DotNode::m_label
private

label text

Definition at line 130 of file dotnode.h.

Referenced by DotNode(), label(), renumberNodes(), writeDEF(), writeDocbook(), writeLabel(), and writeXML().

◆ m_number

int DotNode::m_number
private

◆ m_parents

DotNodeRefVector DotNode::m_parents
private

list of parent nodes (incoming arrows)

Definition at line 133 of file dotnode.h.

Referenced by addParent(), clearWriteFlag(), colorConnectedNodes(), deleteNode(), findParent(), parents(), removeParent(), renumberNodes(), and write().

◆ m_renumbered

bool DotNode::m_renumbered = false
private

indicates if the node has been renumbered (to prevent endless loops)

Definition at line 144 of file dotnode.h.

Referenced by isRenumbered(), and markRenumbered().

◆ m_subgraphId

int DotNode::m_subgraphId = -1
private

Definition at line 145 of file dotnode.h.

Referenced by setSubgraphId(), and subgraphId().

◆ m_tooltip

DString DotNode::m_tooltip
private

node's tooltip

Definition at line 131 of file dotnode.h.

Referenced by DotNode(), and writeBox().

◆ m_truncated

TruncState DotNode::m_truncated = Unknown
private

does the node have non-visible children/parents

Definition at line 142 of file dotnode.h.

Referenced by isTruncated(), markAsTruncated(), write(), and writeLabel().

◆ m_url

DString DotNode::m_url
private

url of the node (format: remote$local)

Definition at line 132 of file dotnode.h.

Referenced by DotNode(), writeBox(), writeDEF(), writeDocbook(), writeUrl(), and writeXML().

◆ m_visible

bool DotNode::m_visible = false
private

is the node visible in the output

Definition at line 141 of file dotnode.h.

Referenced by isVisible(), markAsVisible(), and write().

◆ m_written

bool DotNode::m_written = false
private

used to mark a node as written

Definition at line 137 of file dotnode.h.

Referenced by clearWriteFlag(), isWritten(), and write().

◆ placeholderUrl

auto DotNode::placeholderUrl = "-"
staticconstexpr

Definition at line 70 of file dotnode.h.

Referenced by DotLegendGraph::computeTheGraph(), and writeUrl().


The documentation for this class was generated from the following files: