3
* $Id: icontrato.h 3700 2011-04-15 07:34:44Z tovar $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
22
// <editor-fold defaultstate="collapsed" desc="lista prioritaria">
29
friend class iterator;
31
class iterator : public std::iterator< std::bidirectional_iterator_tag,T,ptrdiff_t> {
32
typename std::list<T>* r;
33
typename std::list<T>::iterator it;
35
iterator(priority_list<T>& otro) { *this = otro; }
36
iterator(std::list<T>& lst, const typename std::list<T>::iterator& i) : r(&lst), it(i) {}
38
bool operator==(const iterator& x) const {
41
bool operator!=(const iterator& x) const {
44
typename std::list<T>::reference operator*() const {
47
iterator& operator=(const iterator& otro) {
51
iterator& operator++() {
55
iterator operator++(int) {
60
iterator& operator--() {
64
iterator operator--(int) {
69
iterator insert(const T& x){
70
return iterator(*r, r->insert(it));
73
return iterator(*r, r->erase(it));
76
void insertar(const T& x) {
78
for (typename std::list<T>::iterator it1 = lst.begin(); !stop && it1 != lst.end(); it1++) {
88
void eliminar(const T& x) {
90
for (typename std::list<T>::iterator it1 = lst.begin(); !stop && it1 != lst.end(); it1++) {
98
return iterator(lst, lst.begin());
101
return iterator(lst, lst.end());
103
int size() { return lst.size(); }
108
class EXTAPI ContratoException : public std::exception {
111
ContratoException(const char* msg)
113
m_Mensaje.assign(msg);
116
ContratoException(std::string& mensaje)
121
ContratoException(std::string mensaje)
126
~ContratoException() throw ()
130
std::string& getCause()
136
std::string m_Mensaje;
139
//------------------------------------------------------------------------
140
/* Interfaz generica de contratos.
141
* Cuidado con la herencia multiple aqui
143
class EXTAPI IContrato {
151
IContrato(TipoContrato tipo = TC_Obligatorio, int prioridad = 0)
154
m_Prioridad = prioridad;
166
bool operator<(const IContrato& otro) const {
167
if (m_Prioridad < otro.m_Prioridad) {
172
bool operator<(const IContrato* otro) const {
173
if (m_Prioridad < otro->m_Prioridad) {
185
//------------------------------------------------------------------------
186
/* Clase de gestion de contratos */
187
template <class TContrato>
190
//region "Interfaz pública de gestion de contratos"
193
typedef TContrato TipoContrato;
194
typedef priority_list<TContrato*> ListaContratos;
195
typedef typename ListaContratos::iterator IteradorListaContratos;
199
/* Registra un contrato asociado a la lista. Los objetos apuntados por pContrato no son nunca liberados por esta clase */
200
void Subscribir(GNC::GCS::IVista* pVista, TContrato* pContrato)
202
/* solo para mostrar errores legibles en tiempo de compilación */
203
GTRACE("IContrato::Subscribir( Herramienta = " << this << ", Vista = " << pVista << ", Contrato = " << pContrato << ")");
204
GNC::GCS::IContrato* c = static_cast<GNC::GCS::IContrato*> (pContrato);
207
IteradorMapaContratos it = m_Contratos.find(pVista);
208
if (it == m_Contratos.end()) { // Insertamos una nueva lista
209
ListaContratos* pLista = new ListaContratos();
210
pLista->insertar(pContrato);
211
m_Contratos[pVista] = pLista;
215
(*it).second->insertar(pContrato);
219
/* DesRegistra un contrato asociado a la lista. El objeto apuntado por pContrato no es liberado nunca por esta clase. */
220
void DesSubscribir(GNC::GCS::IVista* pVista, TContrato* pContrato)
222
GTRACE("IContrato::DesSubscribir( Herramienta = " << this << ", Vista = " << pVista << ", Contrato = " << pContrato << ")");
223
IteradorMapaContratos it = m_Contratos.find(pVista);
224
if (it != m_Contratos.end()) {
225
ListaContratos* pLista = (*it).second;
226
if (pLista != NULL) {
227
pLista->eliminar(pContrato);
230
if (pVista == m_pVistaActiva) {
231
m_pVistaActiva = NULL;
232
m_pListaActiva = NULL;
237
void DesSubscribirsLosDeLaVista(GNC::GCS::IVista* pVista)
239
GTRACE("IContratable::DesSubscribirLosDeLaVista ( this = " << this << ", Vista = " << pVista << ")");
240
if (pVista != NULL) {
241
IteradorMapaContratos it = m_Contratos.find(pVista);
242
if (it != m_Contratos.end()) {
244
m_Contratos.erase(it);
246
if (pVista == m_pVistaActiva) {
247
m_pVistaActiva = NULL;
248
m_pListaActiva = NULL;
253
bool ValidaContrato(GNC::GCS::IVista* pVista) {
254
ListaContratos* lista = NULL;
255
if (pVista != NULL) {
256
lista = ObtenerContratos(pVista);
258
return (lista != NULL && lista->size() > 0);
261
bool ValidaContratoLaVistaActiva() {
262
return m_pListaActiva != NULL && m_pListaActiva->size() > 0;
267
//region "Interfaz privada de gestion de contratos"
269
typedef std::map<IVista*, ListaContratos* > MapaContratos;
270
typedef typename MapaContratos::iterator IteradorMapaContratos;
272
void EstablecerVistaActiva(GNC::GCS::IVista* pVista)
274
m_pVistaActiva = pVista;
275
if (pVista != NULL) {
276
IteradorMapaContratos it = m_Contratos.find(pVista);
277
if (it != m_Contratos.end()) {
278
m_pListaActiva = (*it).second;
281
m_pListaActiva = NULL;
284
m_pListaActiva = NULL;
288
ListaContratos* ObtenerContratos(GNC::GCS::IVista* pVista)
290
ListaContratos* lista = NULL;
291
if (pVista != NULL) {
292
IteradorMapaContratos it = m_Contratos.find(pVista);
293
if (it != m_Contratos.end()) {
294
lista = (*it).second;
300
ListaContratos* ObtenerContratosDeActiva()
302
return m_pListaActiva;
307
for (IteradorMapaContratos it = m_Contratos.begin(); it != m_Contratos.end(); it++) {
309
m_Contratos.erase(it);
314
m_pListaActiva = NULL;
315
m_pVistaActiva = NULL;
320
m_pListaActiva = NULL;
328
MapaContratos m_Contratos;
329
GNC::GCS::IVista* m_pVistaActiva;
330
ListaContratos* m_pListaActiva;
334
#if defined(_WINDOWS)
335
EXTAPI_TEMPLATE template IContratable<IContrato>;