File indexing completed on 2024-05-12 16:44:00

0001 /*
0002     SPDX-FileCopyrightText: 2004-2017 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kmymoneyaccountcompletion.h"
0008 #include "kmymoneycompletion_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QRegExp>
0014 #include <QLayout>
0015 
0016 // ----------------------------------------------------------------------------
0017 // KDE Includes
0018 
0019 // ----------------------------------------------------------------------------
0020 // Project Includes
0021 
0022 #include "mymoneyfile.h"
0023 #include "kmymoneyaccountselector.h"
0024 #include "mymoneyenums.h"
0025 
0026 KMyMoneyAccountCompletion::KMyMoneyAccountCompletion(QWidget *parent) :
0027     KMyMoneyCompletion(parent)
0028 {
0029     Q_D(KMyMoneyCompletion);
0030     delete d->m_selector;
0031     d->m_selector = new KMyMoneyAccountSelector(this, 0, false);
0032     d->m_selector->listView()->setFocusProxy(parent);
0033     layout()->addWidget(d->m_selector);
0034 
0035 #ifndef KMM_DESIGNER
0036     // Default is to show all accounts
0037     // FIXME We should leave this also to the caller
0038     AccountSet set;
0039     set.addAccountGroup(eMyMoney::Account::Type::Asset);
0040     set.addAccountGroup(eMyMoney::Account::Type::Liability);
0041     set.addAccountGroup(eMyMoney::Account::Type::Income);
0042     set.addAccountGroup(eMyMoney::Account::Type::Expense);
0043     set.load(selector());
0044 #endif
0045 
0046     connectSignals(d->m_selector, d->m_selector->listView());
0047 }
0048 
0049 KMyMoneyAccountCompletion::~KMyMoneyAccountCompletion()
0050 {
0051 }
0052 
0053 QStringList KMyMoneyAccountCompletion::accountList(const QList<eMyMoney::Account::Type>& list = QList<eMyMoney::Account::Type>()) const
0054 {
0055     return selector()->accountList(list);
0056 }
0057 
0058 QStringList KMyMoneyAccountCompletion::accountList() const
0059 {
0060     return accountList(QList<eMyMoney::Account::Type>());
0061 }
0062 
0063 KMyMoneyAccountSelector* KMyMoneyAccountCompletion::selector() const
0064 {
0065     Q_D(const KMyMoneyCompletion);
0066 //  return nullptr;
0067     return dynamic_cast<KMyMoneyAccountSelector*>(d->m_selector);
0068 }
0069 
0070 void KMyMoneyAccountCompletion::slotMakeCompletion(const QString& txt)
0071 {
0072     Q_D(KMyMoneyCompletion);
0073     // if(txt.isEmpty() || txt.length() == 0)
0074     //  return;
0075 
0076     auto cnt = 0;
0077     if (txt.contains(MyMoneyFile::AccountSeparator) == 0) {
0078         d->m_lastCompletion = QRegExp(QRegExp::escape(txt), Qt::CaseInsensitive);
0079         cnt = selector()->slotMakeCompletion(txt);
0080     } else {
0081         QStringList parts = txt.split(MyMoneyFile::AccountSeparator, QString::SkipEmptyParts);
0082         QString pattern("^");
0083         QStringList::iterator it;
0084         for (it = parts.begin(); it != parts.end(); ++it) {
0085             if (pattern.length() > 1)
0086                 pattern += MyMoneyFile::AccountSeparator;
0087             pattern += QRegExp::escape(QString(*it).trimmed()) + ".*";
0088         }
0089         pattern += '$';
0090         d->m_lastCompletion = QRegExp(pattern, Qt::CaseInsensitive);
0091         cnt = selector()->slotMakeCompletion(d->m_lastCompletion);
0092         // if we don't have a match, we try it again, but this time
0093         // we add a wildcard for the top level
0094         if (cnt == 0) {
0095             pattern = pattern.insert(1, QString(".*") + MyMoneyFile::AccountSeparator);
0096             d->m_lastCompletion = QRegExp(pattern, Qt::CaseInsensitive);
0097             cnt = selector()->slotMakeCompletion(d->m_lastCompletion);
0098         }
0099     }
0100 
0101     if (d->m_parent && d->m_parent->isVisible() && !isVisible() && cnt)
0102         show(false);
0103     else {
0104         if (cnt != 0) {
0105             adjustSize();
0106         } else {
0107             hide();
0108         }
0109     }
0110 }