/*
* $Revision: 2564 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
***************************************************************/
/** \file
* \brief Declares ClusterGraphAttributes, an extension of class
* GraphAttributes, to store clustergraph layout informations
* like cluster cage positions and sizes that can be accessed
* over the cluster/cluster ID
*
* \author Karsten Klein
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifdef _MSC_VER
#pragma once
#endif
#ifndef OGDF_CLUSTER_GRAPH_ATTRIBUTES_H
#define OGDF_CLUSTER_GRAPH_ATTRIBUTES_H
#include "../basic/HashArray.h"
#include "ClusterArray.h"
#include "ClusterGraph.h"
#include "../basic/GraphAttributes.h"
namespace ogdf {
class GmlParser;
/**
* \brief Stores information associated with a cluster.
*
*/
class OGDF_EXPORT ClusterInfo
{
public:
ClusterInfo()
{
//&m_fillPattern = GraphAttributes::bpNone; //NoBrush
m_lineStyle = GraphAttributes::esSolid;
}
double m_x, m_y; //position of lower left corner
double m_w, m_h; //width and height
double m_lineWidth; //width of rectangle border line
String m_color; //color of rectangle
String m_fillColor; //color of fill area
String m_backColor; //background color
GraphAttributes::EdgeStyle m_lineStyle; //rectangle line style
GraphAttributes::BrushPattern m_fillPattern; //brush pattern of fill area
String m_label; //name label
int m_clusterID; //the ID of the cluster of which the info is stored
};
/**
* \brief Stores additional attributes of a clustered graph (like layout information).
*
* Attributes are simply stored in node or edge arrays; for memory consumption
* reasons, only a subset of these arrays is in fact initialized for the graph;
* non-initialized arrays require only a few bytes of extra memory.
*
* Which arrays are initialized is specified by a bit vector; each bit in this
* bit vector corresponds to one or more attributes. E.g., \a #nodeGraphics
* corresponds to the attributes \a #m_x, \a #m_y, \a #m_width, and \a #m_height;
* whereas \a #edgeDoubleWeight only corresponds to the attribute \a #m_doubleWeight.
*
*/
class OGDF_EXPORT ClusterGraphAttributes : public GraphAttributes
{
private:
ClusterArray m_clusterTemplate; //!< Name of cluster template.
public:
//! Initializes new instance of class ClusterGraphAttributes.
ClusterGraphAttributes() : GraphAttributes(), m_pClusterGraph(0) { }
//! Initializes new instance of class ClusterGraphAttributes.
//! Uses \a initAttributes, which are enriched by node and edge
//! graphics.
ClusterGraphAttributes(ClusterGraph& cg, long initAttributes = 0);
virtual ~ClusterGraphAttributes() { }
//! Initializes the instance with ClusterGraph \a cg.
//! Sets the attributes to \a initAttributes
using GraphAttributes::init;
virtual void init(ClusterGraph &cg, long initAttributes = 0);
//! Initializes the attributes according to \a initAttributes.
virtual void initAtt(long initAttributes = 0) {
GraphAttributes::initAttributes(initAttributes);
}
// operator const ClusterGraph& () const {return *m_pClusterGraph;}
// operator const Graph& () const {return m_pClusterGraph->getGraph();}
//! Returns the ClusterGraph.
const ClusterGraph& constClusterGraph() const { return *m_pClusterGraph; }
//! Returns the index of the parent cluster of node \a v.
int clusterID(node v) { return m_pClusterGraph->clusterOf(v)->index(); }
//! Returns the parent cluster of node \a v.
cluster clusterOf(node v) { return m_pClusterGraph->clusterOf(v); }
//! Returns the maximum cluster index used.
int maxClusterID() const { return m_pClusterGraph->clusterIdCount()-1; }
//! Updates positions of cluster boundaries wrt to children and child clusters
void updateClusterPositions(double boundaryDist = 1.0);
//*****************************************************************
//data access by ID
//! Returns x position of the cluster cages lower left corner.
double clusterXPos(int clusterID) const { return m_clusterInfo[clusterID].m_x; }
//! Returns x position of the cluster cages lower left corner.
double& clusterXPos(int clusterID) { return m_clusterInfo[clusterID].m_x; }
//! Returns y position of the cluster cages lower left corner.
double clusterYPos(int clusterID) const { return m_clusterInfo[clusterID].m_y; }
//! Returns y position of the cluster cages lower left corner.
double& clusterYPos(int clusterID) { return m_clusterInfo[clusterID].m_y; }
//! Returns cluster cage height.
double clusterHeight(int clusterID) const { return m_clusterInfo[clusterID].m_h; }
//! Returns cluster cage height.
double& clusterHeight(int clusterID) { return m_clusterInfo[clusterID].m_h; }
//! Returns cluster cage width.
double clusterWidth(int clusterID) const { return m_clusterInfo[clusterID].m_w; }
//! Returns cluster cage width.
double& clusterWidth(int clusterID) { return m_clusterInfo[clusterID].m_w; }
//! Returns cluster line width.
double clusterLineWidth(int clusterID) const {
return m_clusterInfo[clusterID].m_lineWidth;
}
//! Returns cluster line width.
double& clusterLineWidth(int clusterID) {
return m_clusterInfo[clusterID].m_lineWidth;
}
//! Returns cluster fill color.
const String &clusterFillColor(int clusterID) const {
return m_clusterInfo[clusterID].m_fillColor;
}
//! Returns cluster fill color.
String& clusterFillColor(int clusterID) {
return m_clusterInfo[clusterID].m_fillColor;
}
//! Returns cluster fill pattern.
GraphAttributes::BrushPattern clusterFillPattern(int clusterID) const {
return m_clusterInfo[clusterID].m_fillPattern;
}
//! Returns cluster fill pattern.
GraphAttributes::BrushPattern& clusterFillPattern(int clusterID) {
return m_clusterInfo[clusterID].m_fillPattern;
}
//! Returns label of cluster c.
const String &clusterLabel(int clusterID) const {
return m_clusterInfo[clusterID].m_label;
}
//! Returns label of cluster c.
String &clusterLabel(int clusterID) {
return m_clusterInfo[clusterID].m_label;
}
//! Returns structure containing information on cluster with ID \a clusterID.
const ClusterInfo& clusterInfo(int clusterID) const {
return m_clusterInfo[clusterID];
}
//! Returns structure containing information on cluster with ID \a clusterID.
ClusterInfo& clusterInfo(int clusterID) { return m_clusterInfo[clusterID]; }
//*****************************************************************
//data access by cluster
//! Returns x position of the cluster cages lower left corner.
double clusterXPos(cluster c) const { return m_clusterInfo[c->index()].m_x; }
//! Returns x position of the cluster cages lower left corner.
double& clusterXPos(cluster c) { return m_clusterInfo[c->index()].m_x; }
//! Returns y position of the cluster cages lower left corner.
double clusterYPos(cluster c) const { return m_clusterInfo[c->index()].m_y; }
//! Returns y position of the cluster cages lower left corner.
double& clusterYPos(cluster c) { return m_clusterInfo[c->index()].m_y; }
//! Returns cluster cage height.
double clusterHeight(cluster c) const { return m_clusterInfo[c->index()].m_h; }
//! Returns cluster cage height.
double& clusterHeight(cluster c) { return m_clusterInfo[c->index()].m_h; }
//! Returns cluster cage width.
double clusterWidth(cluster c) const { return m_clusterInfo[c->index()].m_w; }
//! Returns cluster cage width.
double& clusterWidth(cluster c) { return m_clusterInfo[c->index()].m_w; }
//! Returns label of cluster c.
const String &clusterLabel(cluster c) const {
return m_clusterInfo[c->index()].m_label;
}
//! Returns label of cluster c.
String &clusterLabel(cluster c) {
return m_clusterInfo[c->index()].m_label;
}
//! Returns const reference to template of cluster c.
const String &templateCluster(cluster c) const { return m_clusterTemplate[c]; }
//! Returns reference to template of cluster c.
String &templateCluster(cluster c) { return m_clusterTemplate[c]; }
//! Returns const reference to structure containing information on cluster \a c.
const ClusterInfo& clusterInfo(cluster c) const { return m_clusterInfo[c->index()]; }
//! Returns reference to structure containing information on cluster \a c.
ClusterInfo& clusterInfo(cluster c) { return m_clusterInfo[c->index()]; }
//! Returns line color stored for cluster \a c in string format.
const String &clusterColor(cluster c) const {
return m_clusterInfo[c->index()].m_color;
}
//! Returns line color of cluster \a c in string format.
String &clusterColor(cluster c) {
return m_clusterInfo[c->index()].m_color;
}
//Returns const reference to fill color of cluster \a c.
const String &clusterFillColor(cluster c) const {
return m_clusterInfo[c->index()].m_fillColor;
}
//Returns reference to fill color of cluster \a c.
String &clusterFillColor(cluster c) {
return m_clusterInfo[c->index()].m_fillColor;
}
//Returns const reference to background color of cluster \a c.
const String &clusterBackColor(cluster c) const {
return m_clusterInfo[c->index()].m_backColor;
}
//Returns reference to background color of cluster \a c.
String &clusterBackColor(cluster c) {
return m_clusterInfo[c->index()].m_backColor;
}
//pen and brush styles
//! Returns edge style of cluster \a c.
const GraphAttributes::EdgeStyle &clusterLineStyle(cluster c) const {
return m_clusterInfo[c->index()].m_lineStyle;
}
//! Returns line style of cluster \a c.
GraphAttributes::EdgeStyle &clusterLineStyle(cluster c) {
return m_clusterInfo[c->index()].m_lineStyle;
}
//! Returns brush pattern of cluster \a c.
const GraphAttributes::BrushPattern &clusterFillPattern(cluster c) const {
return m_clusterInfo[c->index()].m_fillPattern;
}
//! Returns brush pattern of cluster c.
GraphAttributes::BrushPattern &clusterFillPattern(cluster c) {
return m_clusterInfo[c->index()].m_fillPattern;
}
//! Returns line width of cluster \a c.
const double &clusterLineWidth(cluster c) const {
return m_clusterInfo[c->index()].m_lineWidth;
}
//! Returns line width of cluster c.
double &clusterLineWidth(cluster c) {
return m_clusterInfo[c->index()].m_lineWidth;
}
//! Set fill pattern \a i for cluster \a c.
void setClusterFillPattern(cluster c, int i) {
m_clusterInfo[c->index()].m_fillPattern = intToPattern(i);
}
//! Set style \a i for cluster \a c.
void setClusterLineStyle(cluster c, int i) {
m_clusterInfo[c->index()].m_lineStyle = intToStyle(i);
}
//! Returns bounding box.
const DRect boundingBox() const;
//! Writes attributed clustergraph in GML format to file fileName.
void writeGML(const char *fileName);
//! Writes attributed clustergraph in GML format to output stream \a os.
void writeGML(ostream& os);
//we don't have GraphConstraints yet
//! Writes attributed clustergraph in OGML format to file fileName
void writeOGML(const char * fileName);//, GraphConstraints & GC);
//! Writes attributed clustergraph in OGML format to output stream \a os.
void writeOGML(ostream & os);//, GraphConstraints & GC);
//! Reads attributed clustergraph in GML format from file fileName.
bool readClusterGML(
const char* fileName,
ClusterGraph& CG,
Graph& G);
//! Reads attributed clustergraph in GML format from input stream \a is.
bool readClusterGML(
istream& is,
ClusterGraph& CG,
Graph& G);
//! Reads clustered graph from OGML-file.
bool readClusterGraphOGML(
const char* fileName,
ClusterGraph& CG,
Graph& G);
protected:
const ClusterGraph* m_pClusterGraph;//!< Only points to existing graphs.
private:
//! Information on the cluster positions, index is cluster ID.
HashArray m_clusterInfo;
//! Reads Cluster Graph with Attributes, base graph \a G, from \a fileName
//! with a given gmlparser \a gml (has objecttree).
//! Input stream given by parser.
bool readClusterGraphGML(
const char* fileName,
ClusterGraph& CG,
Graph& G,
GmlParser& gml);
//! Reads clustered graph from input stream of GmlParser.
bool readClusterGraphGML(
ClusterGraph& CG,
Graph& G,
GmlParser& gml);
//! Recursively writes the cluster structure in GML format into output stream \a os.
void writeCluster(
ostream &os,
NodeArray &nId,
ClusterArray & cId,
int &nextId,
cluster c,
String indent);
//! Recursively writes the cluster structure in GraphWin GML format.
void writeGraphWinCluster(
ostream &os,
NodeArray &nId,
int &nextId,
cluster c,
String indent);
//! Recursively writes the cluster structure in OGML.
void writeClusterOGML(
ostream &os,
std::ostringstream & osS, // string stream for styles block
int & nextLabelId,
cluster cluster,
int & indentDepth, // indent depth for structure block
int indentDepthS); // indent depth for styles block
};
} // end namespace ogdf
#endif