1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/*
* $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)<br>
* 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<GraphObserver*> m_itGList; //! List entry in graphs list of all registered graphobservers
};
} //end namespace ogdf
#endif
|