/*************************************************************************** kaccounttemplateselector.cpp - description ------------------- begin : Tue Feb 5 2008 copyright : (C) 2008 by Thomas Baumgart email : Thomas Baumgart ***************************************************************************/ /*************************************************************************** * * * 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 #include #include // ---------------------------------------------------------------------------- // KDE Includes #include #include #include #include #include // ---------------------------------------------------------------------------- // Project Includes #include #include "kaccounttemplateselector.h" class KTemplateListItem : public KListViewItem { public: KTemplateListItem(TQListViewItem* tqparent, const TQString& text); void setAvailable(void); public: bool m_isAvailable; }; KTemplateListItem::KTemplateListItem(TQListViewItem* tqparent, const TQString& text) : KListViewItem(tqparent, text), m_isAvailable(false) { } void KTemplateListItem::setAvailable(void) { m_isAvailable = true; } class KAccountTemplateSelector::Private { public: Private(KAccountTemplateSelector* p) { m_parent = p; } #ifndef KMM_DESIGNER TQValueList selectedTemplates(void) const; TQListViewItem* hierarchyItem(const TQString& tqparent, const TQString& name); void loadHierarchy(void); #endif public: KAccountTemplateSelector* m_parent; TQMap m_templateHierarchy; #ifndef KMM_DESIGNER TQMap m_templates; TQMap countries; TQMap::iterator it_m; TQStringList dirlist; int id; #endif }; #ifndef KMM_DESIGNER TQListViewItem* KAccountTemplateSelector::Private::hierarchyItem(const TQString& tqparent, const TQString& name) { if(!m_templateHierarchy.tqcontains(tqparent) || m_templateHierarchy[tqparent] == 0) { TQRegExp exp("(.*):(.*)"); if(exp.search(tqparent) != -1) m_templateHierarchy[tqparent] = hierarchyItem(exp.cap(1), exp.cap(2)); } return new KTemplateListItem(m_templateHierarchy[tqparent], name); } void KAccountTemplateSelector::Private::loadHierarchy(void) { m_templateHierarchy.clear(); TQListViewItemIterator it(m_parent->m_groupList, TQListViewItemIterator::Selected); TQListViewItem* 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 TQValueList aList; TQValueList::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(); TQMap::iterator it_m; TQRegExp 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()); } } TQValueList KAccountTemplateSelector::Private::selectedTemplates(void) const { TQValueList list; TQListViewItemIterator it(m_parent->m_groupList, TQListViewItemIterator::Selected); TQListViewItem* it_v; while((it_v = it.current()) != 0) { list << m_templates[it_v->text(2)]; ++it; } return list; } #endif KAccountTemplateSelector::KAccountTemplateSelector(TQWidget* tqparent, const char* name) : KAccountTemplateSelectorDecl(tqparent, name), d(new Private(this)) { m_accountList->header()->hide(); connect(m_groupList, TQT_SIGNAL(selectionChanged()), this, TQT_SLOT(slotLoadHierarchy())); // kick off loading of account template data TQTimer::singleShot(0, this, TQT_SLOT(slotLoadTemplateList())); } KAccountTemplateSelector::~KAccountTemplateSelector() { delete d; } void KAccountTemplateSelector::slotLoadTemplateList(void) { #ifndef KMM_DESIGNER TQStringList dirs; // get list of template subdirs and scan them for the list of subdirs d->dirlist = KGlobal::dirs()->findDirs("appdata", "templates"); TQStringList::iterator it; for(it = d->dirlist.begin(); it != d->dirlist.end(); ++it) { TQDir dir(*it); // qDebug("Reading dir '%s' with %d entries", (*it).data(), dir.count()); dirs = dir.entryList("*", TQDir::Dirs); TQStringList::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; TQRegExp exp("(..)_(..)"); if(exp.search(*it_d) != -1) { TQString country = KGlobal::locale()->twoAlphaToCountryName(exp.cap(2)); if(country.isEmpty()) country = exp.cap(2); TQString lang = KGlobal::locale()->twoAlphaToLanguageName(exp.cap(1)); if(d->countries.tqcontains(country)) { if(d->countries[country] != *it_d) { TQString oName = d->countries[country]; exp.search(oName); TQString oCountry = KGlobal::locale()->twoAlphaToCountryName(exp.cap(2)); TQString oLang = KGlobal::locale()->twoAlphaToLanguageName(exp.cap(1)); d->countries.remove(country); d->countries[TQString("%1 (%2)").tqarg(oCountry).tqarg(oLang)] = oName; d->countries[TQString("%1 (%2)").tqarg(country).tqarg(lang)] = *it_d; } } else { d->countries[country] = *it_d; } } else if((*it_d).length() == 2) { TQString 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; TQTimer::singleShot(0, this, TQT_SLOT(slotLoadCountry())); #endif } void KAccountTemplateSelector::slotLoadCountry(void) { #ifndef KMM_DESIGNER KListViewItem* tqparent = new KListViewItem(m_groupList, d->it_m.key()); tqparent->setSelectable(false); TQStringList::iterator it; for(it = d->dirlist.begin(); it != d->dirlist.end(); ++it) { TQStringList::iterator it_f; TQDir dir(TQString("%1%2").tqarg(*it).tqarg(*(d->it_m))); if(dir.exists()) { TQStringList files = dir.entryList("*", TQDir::Files); for(it_f = files.begin(); it_f != files.end(); ++it_f) { MyMoneyTemplate templ(TQString("%1/%2").tqarg(dir.canonicalPath()).tqarg(*it_f)); d->m_templates[TQString("%1").tqarg(d->id)] = templ; new KListViewItem(tqparent, templ.title(), templ.shortDescription(), TQString("%1").tqarg(d->id)); ++d->id; } } } ++d->it_m; if(d->it_m != d->countries.end()) TQTimer::singleShot(0, this, TQT_SLOT(slotLoadCountry())); else { d->loadHierarchy(); } #endif } void KAccountTemplateSelector::slotLoadHierarchy(void) { #ifndef KMM_DESIGNER d->loadHierarchy(); #endif } TQValueList KAccountTemplateSelector::selectedTemplates(void) const { #ifndef KMM_DESIGNER return d->selectedTemplates(); #else return TQValueList(); #endif } #include "kaccounttemplateselector.moc"