Open
Graph Drawing
Framework

 v.2010.10
 

ClusterGraphAttributes.h

Go to the documentation of this file.
00001 /*
00002  * $Revision: 2056 $
00003  * 
00004  * last checkin:
00005  *   $Author: klein $ 
00006  *   $Date: 2010-10-16 16:27:46 +0200 (Sat, 16 Oct 2010) $ 
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 //#include <ogdf/GmlParser.h>
00069 
00070 
00071 namespace ogdf {
00072 
00073     class OGDF_EXPORT GmlParser;
00074 
00079     class OGDF_EXPORT ClusterInfo
00080     {
00081         public:
00082             ClusterInfo() 
00083             {
00084                 //&m_fillPattern = GraphAttributes::bpNone; //NoBrush
00085                 m_lineStyle = GraphAttributes::esSolid;
00086             }
00087 
00088             double m_x, m_y; //position of lower left corner 
00089             double m_w, m_h; //width and height
00090 
00091             double m_lineWidth; //width of rectangle border line
00092 
00093             String m_color;  //color of rectangle
00094             String m_fillColor;  //color of fill area
00095             String m_backColor;  //background color
00096             GraphAttributes::EdgeStyle m_lineStyle;  //rectangle line style
00097             GraphAttributes::BrushPattern m_fillPattern; //brush pattern of fill area
00098             String m_label;  //name label
00099 
00100             int m_clusterID; //the ID of the cluster of which the info is stored
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 //          operator const ClusterGraph& () const {return *m_pClusterGraph;}
00140 //          operator const Graph& () const {return m_pClusterGraph->getGraph();}
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             //data access by ID
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             //data access by cluster
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             //Returns const reference to fill color of cluster \a c.
00247             const String &clusterFillColor(cluster c) const 
00248                 {return  m_clusterInfo[c->index()].m_fillColor;}
00249             //Returns reference to fill color of cluster \a c.
00250             String &clusterFillColor(cluster c) 
00251                 {return  m_clusterInfo[c->index()].m_fillColor;}
00252             //Returns const reference to background color of cluster \a c.
00253             const String &clusterBackColor(cluster c) const 
00254                 {return  m_clusterInfo[c->index()].m_backColor;}
00255             //Returns reference to background color of cluster \a c.
00256             String &clusterBackColor(cluster c) 
00257                 {return  m_clusterInfo[c->index()].m_backColor;}
00258 
00259             //pen and brush styles
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             }//setclusterfillpattern
00286             void setClusterLineStyle(cluster c, int i)
00287             {
00288                 m_clusterInfo[c->index()].m_lineStyle = intToStyle(i);
00289             }//setclusterlinestyle
00290 
00292             const DRect boundingBox() const;
00293 
00295             void writeGML(const char *fileName);
00297             void writeGML(ostream& os);
00298             //we don't have GraphConstraints yet
00300             void writeOGML(const char * fileName);//, GraphConstraints & GC);
00302             void writeOGML(ostream & os);//, GraphConstraints & GC);
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             //will be private
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, // string stream for styles block
00355                                 NodeArray<int> & nodeIds, 
00356                                 int & nextNodeId, 
00357                                 int & nextLabelId, 
00358                                 cluster cluster,
00359                                 int & indentDepth, // indent depth for structure block
00360                                 int indentDepthS); // indent depth for styles block
00361 
00362     }; //AttributedCluster
00363 
00364 
00365 } // end namespace ogdf
00366 
00367 
00368 #endif