summaryrefslogtreecommitdiffstats
path: root/kmymoney2/widgets/kaccounttemplateselector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmymoney2/widgets/kaccounttemplateselector.cpp')
-rw-r--r--kmymoney2/widgets/kaccounttemplateselector.cpp279
1 files changed, 279 insertions, 0 deletions
diff --git a/kmymoney2/widgets/kaccounttemplateselector.cpp b/kmymoney2/widgets/kaccounttemplateselector.cpp
new file mode 100644
index 0000000..8ba6f0a
--- /dev/null
+++ b/kmymoney2/widgets/kaccounttemplateselector.cpp
@@ -0,0 +1,279 @@
+/***************************************************************************
+ kaccounttemplateselector.cpp - description
+ -------------------
+ begin : Tue Feb 5 2008
+ copyright : (C) 2008 by Thomas Baumgart
+ email : Thomas Baumgart <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
+
+#include <qdir.h>
+#include <qheader.h>
+#include <qtimer.h>
+
+// ----------------------------------------------------------------------------
+// KDE Includes
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <klistview.h>
+#include <ktextedit.h>
+
+// ----------------------------------------------------------------------------
+// Project Includes
+
+#include <kmymoney/mymoneytemplate.h>
+
+#include "kaccounttemplateselector.h"
+
+class KTemplateListItem : public KListViewItem
+{
+ public:
+ KTemplateListItem(QListViewItem* parent, const QString& text);
+ void setAvailable(void);
+ public:
+ bool m_isAvailable;
+};
+
+KTemplateListItem::KTemplateListItem(QListViewItem* parent, const QString& text) :
+ KListViewItem(parent, text),
+ m_isAvailable(false)
+{
+}
+
+void KTemplateListItem::setAvailable(void)
+{
+ m_isAvailable = true;
+}
+
+class KAccountTemplateSelector::Private
+{
+ public:
+ Private(KAccountTemplateSelector* p) { m_parent = p; }
+#ifndef KMM_DESIGNER
+ QValueList<MyMoneyTemplate> selectedTemplates(void) const;
+ QListViewItem* hierarchyItem(const QString& parent, const QString& name);
+ void loadHierarchy(void);
+#endif
+
+ public:
+ KAccountTemplateSelector* m_parent;
+ QMap<QString, QListViewItem*> m_templateHierarchy;
+#ifndef KMM_DESIGNER
+ QMap<QString, MyMoneyTemplate> m_templates;
+ QMap<QString, QString> countries;
+ QMap<QString, QString>::iterator it_m;
+ QStringList dirlist;
+ int id;
+#endif
+};
+
+
+#ifndef KMM_DESIGNER
+QListViewItem* KAccountTemplateSelector::Private::hierarchyItem(const QString& parent, const QString& name)
+{
+ if(!m_templateHierarchy.contains(parent)
+ || m_templateHierarchy[parent] == 0) {
+ QRegExp exp("(.*):(.*)");
+ if(exp.search(parent) != -1)
+ m_templateHierarchy[parent] = hierarchyItem(exp.cap(1), exp.cap(2));
+ }
+ return new KTemplateListItem(m_templateHierarchy[parent], name);
+}
+
+void KAccountTemplateSelector::Private::loadHierarchy(void)
+{
+ m_templateHierarchy.clear();
+ QListViewItemIterator it(m_parent->m_groupList, QListViewItemIterator::Selected);
+ QListViewItem* it_v;
+ while((it_v = it.current()) != 0) {
+ m_templates[it_v->text(2)].hierarchy(m_templateHierarchy);
+ ++it;
+ }
+
+ // I need to think about this some more. The code works and shows
+ // the current account hierarchy. It might be usefull, to show
+ // existing accounts dimmed and the new ones in bold or so.
+#if 0
+
+ // add the hierarchy from the MyMoneyFile object
+ QValueList<MyMoneyAccount> aList;
+ QValueList<MyMoneyAccount>::const_iterator it_a;
+ MyMoneyFile* file = MyMoneyFile::instance();
+ file->accountList(aList);
+ if(aList.count() > 0) {
+ m_templateHierarchy[file->accountToCategory(file->asset().id(), true)] = 0;
+ m_templateHierarchy[file->accountToCategory(file->liability().id(), true)] = 0;
+ m_templateHierarchy[file->accountToCategory(file->income().id(), true)] = 0;
+ m_templateHierarchy[file->accountToCategory(file->expense().id(), true)] = 0;
+ m_templateHierarchy[file->accountToCategory(file->equity().id(), true)] = 0;
+ }
+
+ for(it_a = aList.begin(); it_a != aList.end(); ++it_a) {
+ m_templateHierarchy[file->accountToCategory((*it_a).id(), true)] = 0;
+ }
+#endif
+
+ m_parent->m_accountList->clear();
+ QMap<QString, QListViewItem*>::iterator it_m;
+
+ QRegExp exp("(.*):(.*)");
+ for(it_m = m_templateHierarchy.begin(); it_m != m_templateHierarchy.end(); ++it_m) {
+ if(exp.search(it_m.key()) == -1) {
+ (*it_m) = new KListViewItem(m_parent->m_accountList, it_m.key());
+ } else {
+ (*it_m) = hierarchyItem(exp.cap(1), exp.cap(2));
+ }
+ (*it_m)->setOpen(true);
+ }
+
+ m_parent->m_description->clear();
+ if(m_parent->m_groupList->currentItem()) {
+ m_parent->m_description->setText(m_templates[m_parent->m_groupList->currentItem()->text(2)].longDescription());
+ }
+}
+
+QValueList<MyMoneyTemplate> KAccountTemplateSelector::Private::selectedTemplates(void) const
+{
+ QValueList<MyMoneyTemplate> list;
+ QListViewItemIterator it(m_parent->m_groupList, QListViewItemIterator::Selected);
+ QListViewItem* it_v;
+ while((it_v = it.current()) != 0) {
+ list << m_templates[it_v->text(2)];
+ ++it;
+ }
+ return list;
+}
+#endif
+
+
+KAccountTemplateSelector::KAccountTemplateSelector(QWidget* parent, const char* name) :
+ KAccountTemplateSelectorDecl(parent, name),
+ d(new Private(this))
+{
+ m_accountList->header()->hide();
+ connect(m_groupList, SIGNAL(selectionChanged()), this, SLOT(slotLoadHierarchy()));
+
+ // kick off loading of account template data
+ QTimer::singleShot(0, this, SLOT(slotLoadTemplateList()));
+}
+
+KAccountTemplateSelector::~KAccountTemplateSelector()
+{
+ delete d;
+}
+
+void KAccountTemplateSelector::slotLoadTemplateList(void)
+{
+#ifndef KMM_DESIGNER
+ QStringList dirs;
+ // get list of template subdirs and scan them for the list of subdirs
+ d->dirlist = KGlobal::dirs()->findDirs("appdata", "templates");
+ QStringList::iterator it;
+ for(it = d->dirlist.begin(); it != d->dirlist.end(); ++it) {
+ QDir dir(*it);
+ // qDebug("Reading dir '%s' with %d entries", (*it).data(), dir.count());
+ dirs = dir.entryList("*", QDir::Dirs);
+ QStringList::iterator it_d;
+ for(it_d= dirs.begin(); it_d != dirs.end(); ++it_d) {
+ // we don't care about . and ..
+ if((*it_d) == ".." || (*it_d) == "." || (*it_d) == "C")
+ continue;
+ QRegExp exp("(..)_(..)");
+ if(exp.search(*it_d) != -1) {
+ QString country = KGlobal::locale()->twoAlphaToCountryName(exp.cap(2));
+ if(country.isEmpty())
+ country = exp.cap(2);
+ QString lang = KGlobal::locale()->twoAlphaToLanguageName(exp.cap(1));
+ if(d->countries.contains(country)) {
+ if(d->countries[country] != *it_d) {
+ QString oName = d->countries[country];
+ exp.search(oName);
+ QString oCountry = KGlobal::locale()->twoAlphaToCountryName(exp.cap(2));
+ QString oLang = KGlobal::locale()->twoAlphaToLanguageName(exp.cap(1));
+ d->countries.remove(country);
+ d->countries[QString("%1 (%2)").arg(oCountry).arg(oLang)] = oName;
+ d->countries[QString("%1 (%2)").arg(country).arg(lang)] = *it_d;
+ }
+ } else {
+ d->countries[country] = *it_d;
+ }
+ } else if((*it_d).length() == 2) {
+ QString country = KGlobal::locale()->twoAlphaToCountryName((*it_d).upper());
+ d->countries[country] = *it_d;
+ } else {
+ qDebug("'%s/%s' not scanned", (*it).data(), (*it_d).data());
+ }
+ }
+ }
+
+ // now that we know, what we can get at max, we scan everything
+ // and parse the templates into memory
+ m_groupList->clear();
+ d->m_templates.clear();
+ d->it_m = d->countries.begin();
+ d->id = 1;
+ QTimer::singleShot(0, this, SLOT(slotLoadCountry()));
+#endif
+}
+
+void KAccountTemplateSelector::slotLoadCountry(void)
+{
+#ifndef KMM_DESIGNER
+
+ KListViewItem* parent = new KListViewItem(m_groupList, d->it_m.key());
+ parent->setSelectable(false);
+ QStringList::iterator it;
+ for(it = d->dirlist.begin(); it != d->dirlist.end(); ++it) {
+ QStringList::iterator it_f;
+ QDir dir(QString("%1%2").arg(*it).arg(*(d->it_m)));
+ if(dir.exists()) {
+ QStringList files = dir.entryList("*", QDir::Files);
+ for(it_f = files.begin(); it_f != files.end(); ++it_f) {
+ MyMoneyTemplate templ(QString("%1/%2").arg(dir.canonicalPath()).arg(*it_f));
+ d->m_templates[QString("%1").arg(d->id)] = templ;
+ new KListViewItem(parent, templ.title(), templ.shortDescription(), QString("%1").arg(d->id));
+ ++d->id;
+ }
+ }
+ }
+
+ ++d->it_m;
+ if(d->it_m != d->countries.end())
+ QTimer::singleShot(0, this, SLOT(slotLoadCountry()));
+ else {
+ d->loadHierarchy();
+ }
+#endif
+
+}
+
+void KAccountTemplateSelector::slotLoadHierarchy(void)
+{
+#ifndef KMM_DESIGNER
+ d->loadHierarchy();
+#endif
+}
+
+QValueList<MyMoneyTemplate> KAccountTemplateSelector::selectedTemplates(void) const
+{
+#ifndef KMM_DESIGNER
+ return d->selectedTemplates();
+#else
+ return QValueList<MyMoneyTemplate>();
+#endif
+}
+
+#include "kaccounttemplateselector.moc"