Open
Graph Drawing
Framework

 v.2012.05
 

ClusterGraphAttributes.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
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 //#include <ogdf/GmlParser.h>
00059 
00060 
00061 namespace ogdf {
00062 
00063     class OGDF_EXPORT GmlParser;
00064 
00069     class OGDF_EXPORT ClusterInfo
00070     {
00071         public:
00072             ClusterInfo() 
00073             {
00074                 //&m_fillPattern = GraphAttributes::bpNone; //NoBrush
00075                 m_lineStyle = GraphAttributes::esSolid;
00076             }
00077 
00078             double m_x, m_y; //position of lower left corner 
00079             double m_w, m_h; //width and height
00080 
00081             double m_lineWidth; //width of rectangle border line
00082 
00083             String m_color;  //color of rectangle
00084             String m_fillColor;  //color of fill area
00085             String m_backColor;  //background color
00086             GraphAttributes::EdgeStyle m_lineStyle;  //rectangle line style
00087             GraphAttributes::BrushPattern m_fillPattern; //brush pattern of fill area
00088             String m_label;  //name label
00089 
00090             int m_clusterID; //the ID of the cluster of which the info is stored
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 //          operator const ClusterGraph& () const {return *m_pClusterGraph;}
00130 //          operator const Graph& () const {return m_pClusterGraph->getGraph();}
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             //data access by ID
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             //data access by cluster
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             //Returns const reference to fill color of cluster \a c.
00237             const String &clusterFillColor(cluster c) const 
00238                 {return  m_clusterInfo[c->index()].m_fillColor;}
00239             //Returns reference to fill color of cluster \a c.
00240             String &clusterFillColor(cluster c) 
00241                 {return  m_clusterInfo[c->index()].m_fillColor;}
00242             //Returns const reference to background color of cluster \a c.
00243             const String &clusterBackColor(cluster c) const 
00244                 {return  m_clusterInfo[c->index()].m_backColor;}
00245             //Returns reference to background color of cluster \a c.
00246             String &clusterBackColor(cluster c) 
00247                 {return  m_clusterInfo[c->index()].m_backColor;}
00248 
00249             //pen and brush styles
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             }//setclusterfillpattern
00276             void setClusterLineStyle(cluster c, int i)
00277             {
00278                 m_clusterInfo[c->index()].m_lineStyle = intToStyle(i);
00279             }//setclusterlinestyle
00280 
00282             const DRect boundingBox() const;
00283 
00285             void writeGML(const char *fileName);
00286 
00288             void writeGML(ostream& os);
00289 
00290             //we don't have GraphConstraints yet
00292             void writeOGML(const char * fileName);//, GraphConstraints & GC);
00293 
00295             void writeOGML(ostream & os);//, GraphConstraints & GC);
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, // string stream for styles block
00350                                 //NodeArray<int> & nodeIds, 
00351                                 int & nextNodeId, 
00352                                 int & nextLabelId, 
00353                                 cluster cluster,
00354                                 int & indentDepth, // indent depth for structure block
00355                                 int indentDepthS); // indent depth for styles block
00356 
00357     }; //AttributedCluster
00358 
00359 
00360 } // end namespace ogdf
00361 
00362 
00363 #endif