diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-07-04 22:38:03 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2011-07-04 22:38:03 +0000 |
commit | dadc34655c3ab961b0b0b94a10eaaba710f0b5e8 (patch) | |
tree | 99e72842fe687baea16376a147619b6048d7e441 /kmymoney2/mymoney/mymoneyobjectcontainer.cpp | |
download | kmymoney-dadc34655c3ab961b0b0b94a10eaaba710f0b5e8.tar.gz kmymoney-dadc34655c3ab961b0b0b94a10eaaba710f0b5e8.zip |
Added kmymoney
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kmymoney@1239792 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kmymoney2/mymoney/mymoneyobjectcontainer.cpp')
-rw-r--r-- | kmymoney2/mymoney/mymoneyobjectcontainer.cpp | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/kmymoney2/mymoney/mymoneyobjectcontainer.cpp b/kmymoney2/mymoney/mymoneyobjectcontainer.cpp new file mode 100644 index 0000000..666da3b --- /dev/null +++ b/kmymoney2/mymoney/mymoneyobjectcontainer.cpp @@ -0,0 +1,218 @@ +/*************************************************************************** + 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. * + * * + ***************************************************************************/ + +// ---------------------------------------------------------------------------- +// QT Includes + +// ---------------------------------------------------------------------------- +// Project Includes + +#include <kmymoney/mymoneyobjectcontainer.h> + +MyMoneyObjectContainer::MyMoneyObjectContainer() +{ +} + +MyMoneyObjectContainer::~MyMoneyObjectContainer() +{ + clear(); +} + +void MyMoneyObjectContainer::clear(IMyMoneyStorage* storage) +{ + // delete all objects + QMap<QString, MyMoneyObject const *>::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 QString& id) +{ + QMap<QString, MyMoneyObject const *>::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(QValueList<T>& list) \ +{ \ + QMap<QString, const MyMoneyObject*>::const_iterator it; \ + for(it = m_map.begin(); it != m_map.end(); ++it) { \ + const T* node = dynamic_cast<const T*>(*it); \ + if(node) { \ + list.append(*node); \ + } \ + } \ +} + +#define preloadListMethod(a, T) \ +void MyMoneyObjectContainer::preload##a(const QValueList<T>& list) \ +{ \ + QValueList<T>::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 QString& id) \ +{ \ + static T nullElement; \ + if(id.isEmpty()) \ + return nullElement; \ + QMap<QString, MyMoneyObject const *>::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<const T&>(*m_map[id]); \ + } \ + return dynamic_cast<const T&>(*(*it)); \ +} + +void MyMoneyObjectContainer::account(QValueList<MyMoneyAccount>& list) +{ + QMap<QString, const MyMoneyObject*>::const_iterator it; + for(it = m_map.begin(); it != m_map.end(); ++it) { + const MyMoneyAccount* node = dynamic_cast<const MyMoneyAccount*>(*it); + if(node) { + assignFraction(const_cast<MyMoneyAccount*>(node)); + list.append(*node); + } + } +} + +const MyMoneyAccount& MyMoneyObjectContainer::account(const QString& id) +{ + static MyMoneyAccount nullElement; + if(id.isEmpty()) + return nullElement; + QMap<QString, MyMoneyObject const *>::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<MyMoneyAccount*>(item)); + m_map[id] = item; + return dynamic_cast<const MyMoneyAccount&>(*m_map[id]); + } + assignFraction(dynamic_cast<MyMoneyAccount*> (const_cast<MyMoneyObject*>(*it))); + return dynamic_cast<const MyMoneyAccount&>(*(*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 QString& name) const +{ + static MyMoneyAccount nullElement; + QMap<QString, MyMoneyObject const *>::const_iterator it; + for(it = m_map.begin(); it != m_map.end(); ++it) { + const MyMoneyAccount* node = dynamic_cast<const MyMoneyAccount *>(*it); + if(node) { + if(node->name() == name) + return dynamic_cast<const MyMoneyAccount &>(*(*it)); + } + } + return nullElement; +} + +void MyMoneyObjectContainer::refresh(const QString& id) +{ + if(id.isEmpty()) + return; + + QMap<QString, MyMoneyObject const *>::const_iterator it; + it = m_map.find(id); + if(it != m_map.end()) { + const MyMoneyAccount* account = dynamic_cast<const MyMoneyAccount *>(*it); + const MyMoneyPayee* payee = dynamic_cast<const MyMoneyPayee *>(*it); + const MyMoneySecurity* security = dynamic_cast<const MyMoneySecurity *>(*it); + const MyMoneyInstitution* institution = dynamic_cast<const MyMoneyInstitution *>(*it); + const MyMoneySchedule* schedule = dynamic_cast<const MyMoneySchedule *>(*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 { + qWarning("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" |