/*************************************************************************** mymoneyobjectcontainer.cpp ------------------- copyright : (C) 2006 by Thomas Baumagrt email : ipwizard@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include #endif // ---------------------------------------------------------------------------- // QT Includes // ---------------------------------------------------------------------------- // Project Includes #include MyMoneyObjectContainer::MyMoneyObjectContainer() { } MyMoneyObjectContainer::~MyMoneyObjectContainer() { clear(); } void MyMoneyObjectContainer::clear(IMyMoneyStorage* storage) { // delete all objects TQMap::const_iterator it; for(it = m_map.begin(); it != m_map.end(); ++it) { delete (*it); } // then delete the pointers to them m_map.clear(); if(storage) m_storage = storage; } void MyMoneyObjectContainer::clear(const TQString& id) { TQMap::iterator it; it = m_map.find(id); if(it != m_map.end()) { delete (*it); m_map.erase(it); } } #define listMethod(a, T) \ void MyMoneyObjectContainer::a(TQValueList& list) \ { \ TQMap::const_iterator it; \ for(it = m_map.begin(); it != m_map.end(); ++it) { \ const T* node = dynamic_cast(*it); \ if(node) { \ list.append(*node); \ } \ } \ } #define preloadListMethod(a, T) \ void MyMoneyObjectContainer::preload##a(const TQValueList& list) \ { \ TQValueList::const_iterator it; \ for(it = list.begin(); it != list.end(); ++it) { \ delete m_map[(*it).id()]; \ m_map[(*it).id()] = new T(*it); \ } \ } #define preloadMethod(a, T) \ void MyMoneyObjectContainer::preload##a(const T& obj) \ { \ delete m_map[obj.id()]; \ m_map[obj.id()] = new T(obj); \ } #define objectAccessMethod(a, T) \ const T& MyMoneyObjectContainer::a(const TQString& id) \ { \ static T nullElement; \ if(id.isEmpty()) \ return nullElement; \ TQMap::const_iterator it; \ it = m_map.find(id); \ if(it == m_map.end()) { \ /* not found, need to load from engine */ \ T x = m_storage->a(id); \ m_map[id] = new T(x); \ return dynamic_cast(*m_map[id]); \ } \ return dynamic_cast(*(*it)); \ } void MyMoneyObjectContainer::account(TQValueList& list) { TQMap::const_iterator it; for(it = m_map.begin(); it != m_map.end(); ++it) { const MyMoneyAccount* node = dynamic_cast(*it); if(node) { assignFraction(const_cast(node)); list.append(*node); } } } const MyMoneyAccount& MyMoneyObjectContainer::account(const TQString& id) { static MyMoneyAccount nullElement; if(id.isEmpty()) return nullElement; TQMap::iterator it; it = m_map.find(id); if(it == m_map.end()) { /* not found, need to load from engine */ MyMoneyAccount x = m_storage->account(id); MyMoneyAccount* item = new MyMoneyAccount(x); assignFraction(dynamic_cast(item)); m_map[id] = item; return dynamic_cast(*m_map[id]); } assignFraction(dynamic_cast (const_cast(*it))); return dynamic_cast(*(*it)); } void MyMoneyObjectContainer::assignFraction(MyMoneyAccount* acc) { if(acc != 0 && acc->m_fraction == -1) { const MyMoneySecurity& sec = security(acc->currencyId()); acc->fraction(sec); } } const MyMoneyAccount& MyMoneyObjectContainer::accountByName(const TQString& name) const { static MyMoneyAccount nullElement; TQMap::const_iterator it; for(it = m_map.begin(); it != m_map.end(); ++it) { const MyMoneyAccount* node = dynamic_cast(*it); if(node) { if(node->name() == name) return dynamic_cast(*(*it)); } } return nullElement; } void MyMoneyObjectContainer::refresh(const TQString& id) { if(id.isEmpty()) return; TQMap::const_iterator it; it = m_map.find(id); if(it != m_map.end()) { const MyMoneyAccount* account = dynamic_cast(*it); const MyMoneyPayee* payee = dynamic_cast(*it); const MyMoneySecurity* security = dynamic_cast(*it); const MyMoneyInstitution* institution = dynamic_cast(*it); const MyMoneySchedule* schedule = dynamic_cast(*it); delete *it; if(account) { const MyMoneyAccount& a = m_storage->account(id); m_map[id] = new MyMoneyAccount(a); } else if(security) { const MyMoneySecurity& s = m_storage->security(id); if(s.id().isEmpty()) { const MyMoneySecurity& c = m_storage->currency(id); m_map[id] = new MyMoneySecurity(c); } else { m_map[id] = new MyMoneySecurity(s); } } else if(payee) { const MyMoneyPayee& p = m_storage->payee(id); m_map[id] = new MyMoneyPayee(p); } else if(institution) { const MyMoneyInstitution& i = m_storage->institution(id); m_map[id] = new MyMoneyInstitution(i); } else if(schedule) { const MyMoneySchedule& s = m_storage->schedule(id); m_map[id] = new MyMoneySchedule(s); } else { tqWarning("Ooops, should preload an unknown object with id '%s'", id.data()); } return; } } objectAccessMethod(schedule, MyMoneySchedule) objectAccessMethod(payee, MyMoneyPayee) objectAccessMethod(security, MyMoneySecurity) objectAccessMethod(institution, MyMoneyInstitution) preloadListMethod(Account, MyMoneyAccount) preloadListMethod(Payee, MyMoneyPayee) preloadListMethod(Institution, MyMoneyInstitution) preloadListMethod(Security, MyMoneySecurity) preloadListMethod(Schedule, MyMoneySchedule) preloadMethod(Account, MyMoneyAccount) preloadMethod(Security, MyMoneySecurity) preloadMethod(Payee, MyMoneyPayee) preloadMethod(Institution, MyMoneyInstitution) listMethod(payee, MyMoneyPayee) listMethod(institution, MyMoneyInstitution) #include "mymoneyobjectcontainer.moc"