//---------------------------------------------------------------------------- // EgalTech 2013-2013 //---------------------------------------------------------------------------- // File : GdbObj.cpp Data : 05.03.14 Versione : 1.5c1 // Contenuto : Implementazione della classe GdbObj. // // // // Modifiche : 28.11.13 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "GdbObj.h" #include "GdbGroup.h" #include "Attribs.h" #include "/EgtDev/Include/EGnStringUtils.h" #include using namespace std ; //---------------------------------------------------------------------------- GdbObj::GdbObj( void) : m_nId( GDB_ID_NULL), m_pAttribs( nullptr), m_pNext( nullptr), m_pPrev( nullptr), m_pParent( nullptr) { } //---------------------------------------------------------------------------- GdbObj::~GdbObj( void) { if ( m_pAttribs != nullptr) delete m_pAttribs ; m_pAttribs = nullptr ; } //---------------------------------------------------------------------------- bool GdbObj::Copy( const GdbObj* pSou) { // elimino eventuali attributi pre-esistenti if ( m_pAttribs != nullptr) delete m_pAttribs ; m_pAttribs = nullptr ; // se l'oggetto sorgente non esiste if ( pSou == nullptr) { m_nId = GDB_ID_NULL ; return false ; } // copio Id m_nId = pSou->m_nId ; // copio gli attributi if ( pSou->m_pAttribs != nullptr) { m_pAttribs = pSou->m_pAttribs->Clone() ; if ( m_pAttribs == nullptr) return false ; } return true ; } //---------------------------------------------------------------------------- // Node //---------------------------------------------------------------------------- int GdbObj::GetParentId( void) const { if ( m_pParent != nullptr) return m_pParent->m_nId ; else return GDB_ID_NULL ; } //---------------------------------------------------------------------------- bool GdbObj::AddTail( GdbGroup* pParent) { // se il padre non è definito, errore if ( pParent == nullptr) return false ; // se non ci sono figli if ( pParent->m_pLastObj == nullptr) { pParent->m_pLastObj = this ; pParent->m_pFirstObj = this ; m_pParent = pParent ; m_pNext = nullptr ; m_pPrev = nullptr ; m_pParent->ObjCountInc() ; return true ; } // caso standard return InsertAfter( pParent->m_pLastObj) ; } //---------------------------------------------------------------------------- bool GdbObj::AddHead( GdbGroup* pParent) { // se il padre non è definito, errore if ( pParent == nullptr) return false ; // se non ci sono figli if ( pParent->m_pFirstObj == nullptr) { pParent->m_pFirstObj = this ; pParent->m_pLastObj = this ; m_pParent = pParent ; m_pNext = nullptr ; m_pPrev = nullptr ; m_pParent->ObjCountInc() ; return true ; } // caso standard return InsertBefore( pParent->m_pFirstObj) ; } //---------------------------------------------------------------------------- bool GdbObj::InsertAfter( GdbObj* pRef) { // se riferimento non definito, errore if ( pRef == nullptr) return false ; // sistemazione puntatori di elemento inserito m_pNext = pRef->m_pNext ; m_pPrev = pRef ; m_pParent = pRef->m_pParent ; // sistemazione puntatori di elemento di riferimento pRef->m_pNext = this ; // sistemazione puntatori di eventuale elemento successivo if ( m_pNext != nullptr) m_pNext->m_pPrev = this ; // sistemazione dell'eventuale padre if ( m_pParent != nullptr) { // se nuovo ultimo nodo if ( m_pParent->m_pLastObj == pRef) m_pParent->m_pLastObj = this ; m_pParent->ObjCountInc() ; } return true ; } //---------------------------------------------------------------------------- bool GdbObj::InsertBefore( GdbObj* pRef) { // se riferimento non definito, errore if ( pRef == nullptr) return false ; // sistemazione puntatori di elemento inserito m_pNext = pRef ; m_pPrev = pRef->m_pPrev ; m_pParent = pRef->m_pParent ; // sistemazione puntatori di elemento corrente pRef->m_pPrev = this ; // sistemazione puntatori di eventuale elemento precedente if ( m_pPrev != nullptr) m_pPrev->m_pNext = this ; // sistemazione dell'eventuale padre if ( m_pParent != nullptr) { // se nuovo primo nodo if ( m_pParent->m_pFirstObj == pRef) m_pParent->m_pFirstObj = this ; m_pParent->ObjCountInc() ; } return true ; } /*-------------------------------------------------------------------------*/ bool GdbObj::Remove( void) { // sistemazione dell'eventuale padre if ( m_pParent != nullptr) { if ( m_pParent->m_pFirstObj == this) m_pParent->m_pFirstObj = m_pNext ; if ( m_pParent->m_pLastObj == this) m_pParent->m_pLastObj = m_pPrev ; m_pParent->ObjCountDec() ; } // sistemazione di eventuale precedente if ( m_pPrev != nullptr) m_pPrev->m_pNext = m_pNext ; // sistemazione di eventuale successivo if ( m_pNext != nullptr) m_pNext->m_pPrev = m_pPrev ; return true ; } //---------------------------------------------------------------------------- // Attribs //---------------------------------------------------------------------------- bool GdbObj::SaveAttribs( std::ostream& osOut) const { if ( m_pAttribs != nullptr) return m_pAttribs->Save( osOut) ; return true ; } //---------------------------------------------------------------------------- bool GdbObj::LoadAttribs( Scanner& TheScanner) { if ( GetSafeAttribs() == nullptr) return false ; return m_pAttribs->Load( TheScanner) ; } //---------------------------------------------------------------------------- Attribs* GdbObj::GetSafeAttribs( void) { if ( m_pAttribs == nullptr) { Attribs* pAttribs = new (nothrow) Attribs ; if ( pAttribs == nullptr) return nullptr ; m_pAttribs = pAttribs ; } return m_pAttribs ; } //---------------------------------------------------------------------------- bool GdbObj::SetColor( Color cCol) { // recupero gli attributi (se non ci sono, vengono creati) Attribs* pAttribs = GetSafeAttribs() ; if ( pAttribs == nullptr) return false ; // assegno il colore pAttribs->SetColor( cCol) ; return true ; } //---------------------------------------------------------------------------- bool GdbObj::GetColor( Color& cCol) const { // se non ci sono attributi o ci si deve riferire al padre if ( m_pAttribs == nullptr || m_pAttribs->GetMaterial() == Attribs::MAT_PARENT) { if ( GetParent() != nullptr) return GetParent()->GetColor( cCol) ; else return false ; } // se il colore è definito if ( m_pAttribs->GetMaterial() != Attribs::MAT_NULL) { cCol = m_pAttribs->GetColor() ; return true ; } return false ; } //---------------------------------------------------------------------------- bool GdbObj::SetName( const string& sName) { // recupero gli attributi (se non ci sono, vengono creati) Attribs* pAttribs = GetSafeAttribs() ; if ( pAttribs == nullptr) return false ; // assegno il nome return pAttribs->SetName( sName) ; } //---------------------------------------------------------------------------- bool GdbObj::GetName( string& sName) const { // se non ci sono attributi if ( m_pAttribs == nullptr) return false ; // restituisco il nome return m_pAttribs->GetName( sName) ; } //---------------------------------------------------------------------------- bool GdbObj::RemoveName( void) { // se non ci sono attributi if ( m_pAttribs == nullptr) return false ; // cancello il nome return m_pAttribs->RemoveName() ; } //---------------------------------------------------------------------------- bool GdbObj::SetInfo( const string& sKey, const string& sInfo) { // recupero gli attributi (se non ci sono, vengono creati) Attribs* pAttribs = GetSafeAttribs() ; if ( pAttribs == nullptr) return false ; // assegno il nome return pAttribs->SetInfo( sKey, sInfo) ; } //---------------------------------------------------------------------------- bool GdbObj::GetInfo( const string& sKey, string& sInfo) const { // se non ci sono attributi if ( m_pAttribs == nullptr) return false ; // restituisco il nome return m_pAttribs->GetInfo( sKey, sInfo) ; } //---------------------------------------------------------------------------- bool GdbObj::RemoveInfo( const string& sKey) { // se non ci sono attributi if ( m_pAttribs == nullptr) return false ; // cancello il nome return m_pAttribs->RemoveInfo( sKey) ; }