Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00045 #ifdef _MSC_VER
00046 #pragma once
00047 #endif
00048
00049 #ifndef OGDF_ATTRIBUTED_CLUSTER_GRAPH_H
00050 #define OGDF_ATTRIBUTED_CLUSTER_GRAPH_H
00051
00052 #include <ogdf/basic/HashArray.h>
00053 #include <ogdf/cluster/ClusterArray.h>
00054
00055 #include <ogdf/cluster/ClusterGraph.h>
00056 #include <ogdf/basic/GraphAttributes.h>
00057
00058
00059
00060
00061 namespace ogdf {
00062
00063 class OGDF_EXPORT GmlParser;
00064
00069 class OGDF_EXPORT ClusterInfo
00070 {
00071 public:
00072 ClusterInfo()
00073 {
00074
00075 m_lineStyle = GraphAttributes::esSolid;
00076 }
00077
00078 double m_x, m_y;
00079 double m_w, m_h;
00080
00081 double m_lineWidth;
00082
00083 String m_color;
00084 String m_fillColor;
00085 String m_backColor;
00086 GraphAttributes::EdgeStyle m_lineStyle;
00087 GraphAttributes::BrushPattern m_fillPattern;
00088 String m_label;
00089
00090 int m_clusterID;
00091 };
00092
00093
00107 class OGDF_EXPORT ClusterGraphAttributes : public GraphAttributes
00108 {
00109 private:
00110 ClusterArray<String> m_clusterTemplate;
00111
00112 public:
00114 ClusterGraphAttributes() : GraphAttributes(), m_pClusterGraph(0) {}
00118 ClusterGraphAttributes(ClusterGraph& cg, long initAttributes = 0);
00119
00120 virtual ~ClusterGraphAttributes() {}
00121
00124 virtual void init(ClusterGraph &cg, long initAttributes = 0);
00126 virtual void initAtt(long initAttributes = 0)
00127 {GraphAttributes::initAttributes(initAttributes);}
00128
00129
00130
00131
00133 const ClusterGraph& constClusterGraph() const {return *m_pClusterGraph;}
00134
00136 int clusterID(node v) {return m_pClusterGraph->clusterOf(v)->index();}
00138 cluster clusterOf(node v) {return m_pClusterGraph->clusterOf(v);}
00140 int maxClusterID() const {return m_pClusterGraph->clusterIdCount()-1;}
00141
00143 void updateClusterPositions(double boundaryDist = 1.0);
00144
00145
00146
00148 double clusterXPos(int clusterID) const {return m_clusterInfo[clusterID].m_x;}
00150 double& clusterXPos(int clusterID) {return m_clusterInfo[clusterID].m_x;}
00152 double clusterYPos(int clusterID) const {return m_clusterInfo[clusterID].m_y;}
00154 double& clusterYPos(int clusterID) {return m_clusterInfo[clusterID].m_y;}
00156 double clusterHeight(int clusterID) const {return m_clusterInfo[clusterID].m_h;}
00158 double& clusterHeight(int clusterID) {return m_clusterInfo[clusterID].m_h;}
00160 double clusterWidth(int clusterID) const {return m_clusterInfo[clusterID].m_w;}
00162 double& clusterWidth(int clusterID) {return m_clusterInfo[clusterID].m_w;}
00164 double clusterLineWidth(int clusterID) const
00165 {return m_clusterInfo[clusterID].m_lineWidth;}
00167 double& clusterLineWidth(int clusterID)
00168 {return m_clusterInfo[clusterID].m_lineWidth;}
00170 String clusterFillColor(int clusterID) const
00171 {return m_clusterInfo[clusterID].m_fillColor;}
00173 String& clusterFillColor(int clusterID)
00174 {return m_clusterInfo[clusterID].m_fillColor;}
00176 GraphAttributes::BrushPattern clusterFillPattern(int clusterID) const
00177 {return m_clusterInfo[clusterID].m_fillPattern;}
00179 GraphAttributes::BrushPattern& clusterFillPattern(int clusterID)
00180 {return m_clusterInfo[clusterID].m_fillPattern;}
00181
00183 const String &clusterLabel(int clusterID) const
00184 {return m_clusterInfo[clusterID].m_label;}
00186 String &clusterLabel(int clusterID)
00187 {return m_clusterInfo[clusterID].m_label;}
00189 const ClusterInfo& clusterInfo(int clusterID) const {return m_clusterInfo[clusterID];}
00191 ClusterInfo& clusterInfo(int clusterID) {return m_clusterInfo[clusterID];}
00192
00193
00194
00196 double clusterXPos(cluster c) const {return m_clusterInfo[c->index()].m_x;}
00198 double& clusterXPos(cluster c) {return m_clusterInfo[c->index()].m_x;}
00200 double clusterYPos(cluster c) const {return m_clusterInfo[c->index()].m_y;}
00202 double& clusterYPos(cluster c) {return m_clusterInfo[c->index()].m_y;}
00204 double clusterHeight(cluster c) const {return m_clusterInfo[c->index()].m_h;}
00206 double& clusterHeight(cluster c) {return m_clusterInfo[c->index()].m_h;}
00208 double clusterWidth(cluster c) const {return m_clusterInfo[c->index()].m_w;}
00210 double& clusterWidth(cluster c) {return m_clusterInfo[c->index()].m_w;}
00211
00213 const String &clusterLabel(cluster c) const
00214 {return m_clusterInfo[c->index()].m_label;}
00216 String &clusterLabel(cluster c)
00217 {return m_clusterInfo[c->index()].m_label;}
00218
00220 const String &templateCluster(cluster c) const { return m_clusterTemplate[c]; }
00222 String &templateCluster(cluster c) { return m_clusterTemplate[c]; }
00223
00225 const ClusterInfo& clusterInfo(cluster c) const {return m_clusterInfo[c->index()];}
00227 ClusterInfo& clusterInfo(cluster c) {return m_clusterInfo[c->index()];}
00228
00230 const String &clusterColor(cluster c) const
00231 {return m_clusterInfo[c->index()].m_color;}
00233 String &clusterColor(cluster c)
00234 {return m_clusterInfo[c->index()].m_color;}
00235
00236
00237 const String &clusterFillColor(cluster c) const
00238 {return m_clusterInfo[c->index()].m_fillColor;}
00239
00240 String &clusterFillColor(cluster c)
00241 {return m_clusterInfo[c->index()].m_fillColor;}
00242
00243 const String &clusterBackColor(cluster c) const
00244 {return m_clusterInfo[c->index()].m_backColor;}
00245
00246 String &clusterBackColor(cluster c)
00247 {return m_clusterInfo[c->index()].m_backColor;}
00248
00249
00251 const GraphAttributes::EdgeStyle &clusterLineStyle(cluster c) const
00252 {return m_clusterInfo[c->index()].m_lineStyle;}
00254 GraphAttributes::EdgeStyle &clusterLineStyle(cluster c)
00255 {return m_clusterInfo[c->index()].m_lineStyle;}
00257 const GraphAttributes::BrushPattern &clusterFillPattern(cluster c) const
00258 {return m_clusterInfo[c->index()].m_fillPattern;}
00260 GraphAttributes::BrushPattern &clusterFillPattern(cluster c)
00261 {return m_clusterInfo[c->index()].m_fillPattern;}
00262
00264 const double &clusterLineWidth(cluster c) const
00265 {return m_clusterInfo[c->index()].m_lineWidth;}
00267 double &clusterLineWidth(cluster c)
00268 {return m_clusterInfo[c->index()].m_lineWidth;}
00269
00271 void setClusterFillPattern(cluster c, int i)
00272 {
00273 m_clusterInfo[c->index()].m_fillPattern = intToPattern(i);
00274 }
00276 void setClusterLineStyle(cluster c, int i)
00277 {
00278 m_clusterInfo[c->index()].m_lineStyle = intToStyle(i);
00279 }
00280
00282 const DRect boundingBox() const;
00283
00285 void writeGML(const char *fileName);
00286
00288 void writeGML(ostream& os);
00289
00290
00292 void writeOGML(const char * fileName);
00293
00295 void writeOGML(ostream & os);
00296
00298 bool readClusterGML(const char* fileName,
00299 ClusterGraph& CG,
00300 Graph& G);
00301
00303 bool readClusterGML(istream& is,
00304 ClusterGraph& CG,
00305 Graph& G);
00306
00308 bool readClusterGraphOGML(const char* fileName,
00309 ClusterGraph& CG,
00310 Graph& G);
00311
00312 protected:
00313 const ClusterGraph* m_pClusterGraph;
00314
00315 private:
00317 HashArray<int, ClusterInfo> m_clusterInfo;
00318
00322 bool readClusterGraphGML(const char* fileName,
00323 ClusterGraph& CG,
00324 Graph& G,
00325 GmlParser& gml);
00326
00328 bool readClusterGraphGML(
00329 ClusterGraph& CG,
00330 Graph& G,
00331 GmlParser& gml);
00332
00334 void writeCluster(ostream &os,
00335 NodeArray<int> &nId,
00336 ClusterArray<int> & cId,
00337 int &nextId,
00338 cluster c,
00339 String indent);
00340
00342 void writeGraphWinCluster(ostream &os,
00343 NodeArray<int> &nId,
00344 int &nextId,
00345 cluster c,
00346 String indent);
00348 void writeClusterOGML(ostream &os,
00349 std::ostringstream & osS,
00350
00351 int & nextNodeId,
00352 int & nextLabelId,
00353 cluster cluster,
00354 int & indentDepth,
00355 int indentDepthS);
00356
00357 };
00358
00359
00360 }
00361
00362
00363 #endif