/*
* $Revision: 2615 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
***************************************************************/
/** \file
* \brief Abstract base class for structures on graphs, that need
* to be informed about graph changes (e.g. cluster graphs).
*
* Follows the observer pattern: graphs are observable
* objects that can inform observers on changes made to their
* structure.
*
* \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_GRAPH_STRUCTURE_H
#define OGDF_GRAPH_STRUCTURE_H
#include "List.h"
#include "Graph.h"
namespace ogdf {
//
// in embedded graphs, adjacency lists are given in clockwise order.
//
//----------------------------------------------------------
// GraphObserver
//----------------------------------------------------------
/**
* \brief Abstract Base class for classes that need to keep track
* of changes in the graph like addition/deletion of nodes
* or edges.
* derived classes have to overload nodeDeleted, nodeAdded
* edgeDeleted, edgeAdded
* these functions should be called by Graph before (delete)
*
*/
class OGDF_EXPORT GraphObserver {
friend class Graph;
public:
//! Constructs instance of GraphObserver class
GraphObserver() : m_pGraph(0) { }
/**
*\brief Constructs instance of GraphObserver class
* \param G is the graph to be watched
*/
GraphObserver(const Graph* G) : m_pGraph(G)
{
m_itGList = G->registerStructure(this);
}//constructor
//! Destroys the instance, unregisters it from watched graph
virtual ~GraphObserver()
{
if (m_pGraph) m_pGraph->unregisterStructure(m_itGList);
}//destructor
//! Associates observer instance with graph \a G
void reregister(const Graph *pG) {
//small speedup: check if == m_pGraph
if (m_pGraph) m_pGraph->unregisterStructure(m_itGList);
if ((m_pGraph = pG) != 0) m_itGList = pG->registerStructure(this);
}
//! Called by watched graph when a node is deleted
//! Has to be implemented by derived classes
virtual void nodeDeleted(node v) = 0;
//! Called by watched graph when a node is added
//! Has to be implemented by derived classes
virtual void nodeAdded(node v) = 0;
//! Called by watched graph when an edge is deleted
//! Has to be implemented by derived classes
virtual void edgeDeleted(edge e) = 0;
//! Called by watched graph when an edge is added
//! Has to be implemented by derived classes
virtual void edgeAdded(edge e) = 0;
//! Called by watched graph when it is reinitialized
//! Has to be implemented by derived classes
virtual void reInit() = 0;
//! Called by watched graph when its clear function is called
//! Has to be implemented by derived classes
virtual void cleared() = 0;
const Graph* getGraph() const { return m_pGraph; }
protected:
const Graph* m_pGraph; //! watched graph
ListIterator m_itGList; //! List entry in graphs list of all registered graphobservers
};
} //end namespace ogdf
#endif