/*
* $Revision: 2523 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
***************************************************************/
/** \file
* \brief Declaration of base class for drawing constraints.
*
* \author PG478
*
* \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_CONSTRAINTS_H
#define OGDF_CONSTRAINTS_H
#include "Graph.h"
#include "String.h"
namespace ogdf {
class GraphConstraints;
struct XmlTagObject;
/* -------------------------- Constraint ----------------------------------------- */
class Constraint
{
friend class GraphConstraints;
private:
ListIterator listIt;
protected:
String m_Name;
/* */
bool m_UserDisabled;
int m_Status; // OK, Suspended, notOk
/* The Graph this Constraint belongs to. No Constraint without a Graph! */
const Graph *m_pGraph;
/* Will be called by the GraphConstraints when a Node in mGraph is removed. */
virtual void nodeDeleted(node /*v*/) { }
public:
Constraint(const Graph &g) : m_pGraph(&g) { m_Status = 0; m_UserDisabled = false; }
virtual ~Constraint() {}
const Graph& constGraph() const { return *m_pGraph; }
virtual bool isValid() { return (!m_UserDisabled && (m_Status==0)); }
virtual int getInternalStatus() { return m_Status; }
virtual void setInternalStatus(int s) { m_Status = s; }
//virtual bool load(int stuff) = 0;
//virtual bool save(int stuff) = 0;
//virtual bool checkConstraints(List csts) {return true; }
void userEnable() { m_UserDisabled = false; }
void userDisable() { m_UserDisabled = true; }
bool isUserDisabled() { return m_UserDisabled; }
virtual int getType() { return 0; }
static int getStaticType() { return 0; }
void setName(String text) { m_Name = text; }
String getName() { return m_Name; }
//DEBUG
virtual bool buildFromOgml(XmlTagObject * constraintTag, Hashing * nodes);
virtual bool storeToOgml(int id, ostream & os, int indentStep);
//static void generateIndent(char ** indent, const int & indentSize);
OGDF_NEW_DELETE
};
/* -------------------------- GraphConstraints ----------------------------------------- */
/* For each Graph a Set of Constraints*/
class GraphConstraints //: public GraphStructure
{
friend class ConstraintManager;
protected:
/* The Graph this Constraint belongs to. No Constraint without a Graph! */
const Graph *m_pGraph;
/* All Constraints for mGraph */
List m_List;
public:
/* Constructor, GraphStructure */
GraphConstraints(const Graph &g) : m_pGraph(&g), m_List() { }
/* Returns the Graph */
const Graph *constGraph() { return m_pGraph; }
/* adds a Constraint to this Set */
void addConstraint(Constraint *c) { c->listIt = m_List.pushBack(c); }
/* removes a Constraint from this set */
void removeConstraint(Constraint *c) { m_List.del(c->listIt); }
/* returns all Constraints */
List *getConstraints() { return &m_List; }
/* Return Constraint Count */
int numberOfConstraints() { return m_List.size(); }
/* returns all Constraints of Type type */
List getConstraintsOfType(int type);
template void getConstraintsOfType(List *res) {
//List res;
ListConstIterator it;
for(it = m_List.begin(); it.valid(); ++it)
{
Constraint *c = *it;
if (TYP::getStaticType()==c->getType())
{
if (c->isValid()) res->pushBack(static_cast(c));
}
}
//return res;
}
void clear() {
m_List.clear();
}
virtual ~GraphConstraints() {
ListConstIterator it;
for(it = m_List.begin(); it.valid(); ++it)
{
Constraint *c = *it;
delete c;
}
}
virtual void nodeDeleted(node v);
virtual void nodeAdded(node /*v*/) { }
virtual void edgeDeleted(edge /*e*/) { }
virtual void edgeAdded(edge /*e*/) { }
virtual void reInit() { }
virtual void cleared() { }
OGDF_NEW_DELETE
};
/* -------------------------- ConstraintManager ----------------------------------------- */
class ConstraintManager
{
public:
static Constraint *createConstraintByName(const Graph &G, String *name);
static String getClassnameOfConstraint(Constraint *c);
OGDF_NEW_DELETE
};
} // end namespace
#endif