Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00055 #ifdef _MSC_VER
00056 #pragma once
00057 #endif
00058
00059 #ifndef OGDF_ATTRIBUTED_CLUSTER_GRAPH_H
00060 #define OGDF_ATTRIBUTED_CLUSTER_GRAPH_H
00061
00062 #include <ogdf/basic/HashArray.h>
00063 #include <ogdf/cluster/ClusterArray.h>
00064
00065 #include <ogdf/cluster/ClusterGraph.h>
00066 #include <ogdf/basic/GraphAttributes.h>
00067
00068
00069
00070
00071 namespace ogdf {
00072
00073 class OGDF_EXPORT GmlParser;
00074
00079 class OGDF_EXPORT ClusterInfo
00080 {
00081 public:
00082 ClusterInfo()
00083 {
00084
00085 m_lineStyle = GraphAttributes::esSolid;
00086 }
00087
00088 double m_x, m_y;
00089 double m_w, m_h;
00090
00091 double m_lineWidth;
00092
00093 String m_color;
00094 String m_fillColor;
00095 String m_backColor;
00096 GraphAttributes::EdgeStyle m_lineStyle;
00097 GraphAttributes::BrushPattern m_fillPattern;
00098 String m_label;
00099
00100 int m_clusterID;
00101 };
00102
00103
00117 class OGDF_EXPORT ClusterGraphAttributes : public GraphAttributes
00118 {
00119 private:
00120 ClusterArray<String> m_clusterTemplate;
00121
00122 public:
00124 ClusterGraphAttributes() : GraphAttributes(), m_pClusterGraph(0) {}
00128 ClusterGraphAttributes(ClusterGraph& cg, long initAttributes = 0);
00129
00130 virtual ~ClusterGraphAttributes() {}
00131
00134 virtual void init(ClusterGraph &cg, long initAttributes = 0);
00136 virtual void initAtt(long initAttributes = 0)
00137 {GraphAttributes::initAttributes(initAttributes);}
00138
00139
00140
00141
00143 const ClusterGraph& constClusterGraph() const {return *m_pClusterGraph;}
00144
00146 int clusterID(node v) {return m_pClusterGraph->clusterOf(v)->index();}
00148 cluster clusterOf(node v) {return m_pClusterGraph->clusterOf(v);}
00150 int maxClusterID() const {return m_pClusterGraph->clusterIdCount()-1;}
00151
00153 void updateClusterPositions(double boundaryDist = 1.0);
00154
00155
00156
00158 double clusterXPos(int clusterID) const {return m_clusterInfo[clusterID].m_x;}
00160 double& clusterXPos(int clusterID) {return m_clusterInfo[clusterID].m_x;}
00162 double clusterYPos(int clusterID) const {return m_clusterInfo[clusterID].m_y;}
00164 double& clusterYPos(int clusterID) {return m_clusterInfo[clusterID].m_y;}
00166 double clusterHeight(int clusterID) const {return m_clusterInfo[clusterID].m_h;}
00168 double& clusterHeight(int clusterID) {return m_clusterInfo[clusterID].m_h;}
00170 double clusterWidth(int clusterID) const {return m_clusterInfo[clusterID].m_w;}
00172 double& clusterWidth(int clusterID) {return m_clusterInfo[clusterID].m_w;}
00174 double clusterLineWidth(int clusterID) const
00175 {return m_clusterInfo[clusterID].m_lineWidth;}
00177 double& clusterLineWidth(int clusterID)
00178 {return m_clusterInfo[clusterID].m_lineWidth;}
00180 String clusterFillColor(int clusterID) const
00181 {return m_clusterInfo[clusterID].m_fillColor;}
00183 String& clusterFillColor(int clusterID)
00184 {return m_clusterInfo[clusterID].m_fillColor;}
00186 GraphAttributes::BrushPattern clusterFillPattern(int clusterID) const
00187 {return m_clusterInfo[clusterID].m_fillPattern;}
00189 GraphAttributes::BrushPattern& clusterFillPattern(int clusterID)
00190 {return m_clusterInfo[clusterID].m_fillPattern;}
00191
00193 const String &clusterLabel(int clusterID) const
00194 {return m_clusterInfo[clusterID].m_label;}
00196 String &clusterLabel(int clusterID)
00197 {return m_clusterInfo[clusterID].m_label;}
00199 const ClusterInfo& clusterInfo(int clusterID) const {return m_clusterInfo[clusterID];}
00201 ClusterInfo& clusterInfo(int clusterID) {return m_clusterInfo[clusterID];}
00202
00203
00204
00206 double clusterXPos(cluster c) const {return m_clusterInfo[c->index()].m_x;}
00208 double& clusterXPos(cluster c) {return m_clusterInfo[c->index()].m_x;}
00210 double clusterYPos(cluster c) const {return m_clusterInfo[c->index()].m_y;}
00212 double& clusterYPos(cluster c) {return m_clusterInfo[c->index()].m_y;}
00214 double clusterHeight(cluster c) const {return m_clusterInfo[c->index()].m_h;}
00216 double& clusterHeight(cluster c) {return m_clusterInfo[c->index()].m_h;}
00218 double clusterWidth(cluster c) const {return m_clusterInfo[c->index()].m_w;}
00220 double& clusterWidth(cluster c) {return m_clusterInfo[c->index()].m_w;}
00221
00223 const String &clusterLabel(cluster c) const
00224 {return m_clusterInfo[c->index()].m_label;}
00226 String &clusterLabel(cluster c)
00227 {return m_clusterInfo[c->index()].m_label;}
00228
00230 const String &templateCluster(cluster c) const { return m_clusterTemplate[c]; }
00232 String &templateCluster(cluster c) { return m_clusterTemplate[c]; }
00233
00235 const ClusterInfo& clusterInfo(cluster c) const {return m_clusterInfo[c->index()];}
00237 ClusterInfo& clusterInfo(cluster c) {return m_clusterInfo[c->index()];}
00238
00240 const String &clusterColor(cluster c) const
00241 {return m_clusterInfo[c->index()].m_color;}
00243 String &clusterColor(cluster c)
00244 {return m_clusterInfo[c->index()].m_color;}
00245
00246
00247 const String &clusterFillColor(cluster c) const
00248 {return m_clusterInfo[c->index()].m_fillColor;}
00249
00250 String &clusterFillColor(cluster c)
00251 {return m_clusterInfo[c->index()].m_fillColor;}
00252
00253 const String &clusterBackColor(cluster c) const
00254 {return m_clusterInfo[c->index()].m_backColor;}
00255
00256 String &clusterBackColor(cluster c)
00257 {return m_clusterInfo[c->index()].m_backColor;}
00258
00259
00261 const GraphAttributes::EdgeStyle &clusterLineStyle(cluster c) const
00262 {return m_clusterInfo[c->index()].m_lineStyle;}
00264 GraphAttributes::EdgeStyle &clusterLineStyle(cluster c)
00265 {return m_clusterInfo[c->index()].m_lineStyle;}
00267 const GraphAttributes::BrushPattern &clusterFillPattern(cluster c) const
00268 {return m_clusterInfo[c->index()].m_fillPattern;}
00270 GraphAttributes::BrushPattern &clusterFillPattern(cluster c)
00271 {return m_clusterInfo[c->index()].m_fillPattern;}
00272
00274 const double &clusterLineWidth(cluster c) const
00275 {return m_clusterInfo[c->index()].m_lineWidth;}
00277 double &clusterLineWidth(cluster c)
00278 {return m_clusterInfo[c->index()].m_lineWidth;}
00279
00281 void setClusterFillPattern(cluster c, int i)
00282 {
00283 m_clusterInfo[c->index()].m_fillPattern = intToPattern(i);
00284 }
00286 void setClusterLineStyle(cluster c, int i)
00287 {
00288 m_clusterInfo[c->index()].m_lineStyle = intToStyle(i);
00289 }
00290
00292 const DRect boundingBox() const;
00293
00295 void writeGML(const char *fileName);
00297 void writeGML(ostream& os);
00298
00300 void writeOGML(const char * fileName);
00302 void writeOGML(ostream & os);
00303
00305 bool readClusterGML(const char* fileName,
00306 ClusterGraph& CG,
00307 Graph& G);
00309 bool readClusterGML(istream& is,
00310 ClusterGraph& CG,
00311 Graph& G);
00312
00313
00317 bool readClusterGraphGML(const char* fileName,
00318 ClusterGraph& CG,
00319 Graph& G,
00320 GmlParser& gml);
00322 bool readClusterGraphGML(
00323 ClusterGraph& CG,
00324 Graph& G,
00325 GmlParser& gml);
00327 bool readClusterGraphOGML(const char* fileName,
00328 ClusterGraph& CG,
00329 Graph& G);
00330
00331 protected:
00332 const ClusterGraph* m_pClusterGraph;
00333
00334 private:
00336 HashArray<int, ClusterInfo> m_clusterInfo;
00337
00339 void writeCluster(ostream &os,
00340 NodeArray<int> &nId,
00341 ClusterArray<int> & cId,
00342 int &nextId,
00343 cluster c,
00344 String indent);
00345
00347 void writeGraphWinCluster(ostream &os,
00348 NodeArray<int> &nId,
00349 int &nextId,
00350 cluster c,
00351 String indent);
00353 void writeClusterOGML(ostream &os,
00354 std::ostringstream & osS,
00355 NodeArray<int> & nodeIds,
00356 int & nextNodeId,
00357 int & nextLabelId,
00358 cluster cluster,
00359 int & indentDepth,
00360 int indentDepthS);
00361
00362 };
00363
00364
00365 }
00366
00367
00368 #endif