1 /*
2  * Copyright 2007-2018  Thomas Baumgart <tbaumgart@kde.org>
3  * Copyright 2017-2018  Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "kselecttransactionsdlg.h"
20 #include "kselecttransactionsdlg_p.h"
21 
22 // ----------------------------------------------------------------------------
23 // QT Includes
24 
25 #include <QEvent>
26 #include <QHeaderView>
27 #include <QKeyEvent>
28 #include <QList>
29 #include <QPushButton>
30 
31 // ----------------------------------------------------------------------------
32 // KDE Includes
33 
34 #include <KStandardGuiItem>
35 #include <KLocalizedString>
36 
37 // ----------------------------------------------------------------------------
38 // Project Includes
39 
40 #include "ui_kselecttransactionsdlg.h"
41 
42 #include "mymoneyaccount.h"
43 #include "selectedtransactions.h"
44 #include "mymoneysplit.h"
45 #include "mymoneytransaction.h"
46 #include "transaction.h"
47 #include "kmymoneysettings.h"
48 #include "widgetenums.h"
49 
KSelectTransactionsDlg(const MyMoneyAccount & _account,QWidget * parent)50 KSelectTransactionsDlg::KSelectTransactionsDlg(const MyMoneyAccount& _account, QWidget* parent) :
51   QDialog(parent),
52   d_ptr(new KSelectTransactionsDlgPrivate)
53 {
54   Q_D(KSelectTransactionsDlg);
55   d->m_account = _account;
56   d->ui->setupUi(this);
57   // setup descriptive texts
58   setWindowTitle(i18n("Select Transaction"));
59   d->ui->m_description->setText(i18n("Select a transaction and press the OK button or use Cancel to select none."));
60 
61   // clear current register contents
62   d->ui->m_register->clear();
63 
64   // no selection possible
65   d->ui->m_register->setSelectionMode(QTableWidget::SingleSelection);
66 
67   // setup header font
68   auto font = KMyMoneySettings::listHeaderFontEx();
69   QFontMetrics fm(font);
70   auto height = fm.lineSpacing() + 6;
71   d->ui->m_register->horizontalHeader()->setMinimumHeight(height);
72   d->ui->m_register->horizontalHeader()->setMaximumHeight(height);
73   d->ui->m_register->horizontalHeader()->setFont(font);
74 
75   // setup cell font
76   font = KMyMoneySettings::listCellFontEx();
77   d->ui->m_register->setFont(font);
78 
79   // ... setup the register columns ...
80   d->ui->m_register->setupRegister(d->m_account);
81 
82   // setup buttons
83 
84   // default is to need at least one transaction selected
85   d->ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
86 
87   // catch some events from the register
88   d->ui->m_register->installEventFilter(this);
89 
90   connect(d->ui->m_register, &KMyMoneyRegister::Register::transactionsSelected, this, &KSelectTransactionsDlg::slotEnableOk);
91   connect(d->ui->m_register, &KMyMoneyRegister::Register::editTransaction, this, &QDialog::accept);
92 
93   connect(d->ui->buttonBox, &QDialogButtonBox::helpRequested, this, &KSelectTransactionsDlg::slotHelp);
94 }
95 
~KSelectTransactionsDlg()96 KSelectTransactionsDlg::~KSelectTransactionsDlg()
97 {
98   Q_D(KSelectTransactionsDlg);
99   delete d;
100 }
101 
slotEnableOk(const KMyMoneyRegister::SelectedTransactions & list)102 void KSelectTransactionsDlg::slotEnableOk(const KMyMoneyRegister::SelectedTransactions& list)
103 {
104   Q_D(KSelectTransactionsDlg);
105   d->ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(list.count() != 0);
106 }
107 
addTransaction(const MyMoneyTransaction & t)108 void KSelectTransactionsDlg::addTransaction(const MyMoneyTransaction& t)
109 {
110   Q_D(KSelectTransactionsDlg);
111   foreach (const auto split, t.splits()) {
112     if (split.accountId() == d->m_account.id()) {
113       KMyMoneyRegister::Transaction* tr = KMyMoneyRegister::Register::transactionFactory(d->ui->m_register, t, split, 0);
114       // force full detail display
115       tr->setNumRowsRegister(tr->numRowsRegister(true));
116       break;
117     }
118   }
119 }
120 
exec()121 int KSelectTransactionsDlg::exec()
122 {
123   Q_D(KSelectTransactionsDlg);
124   d->ui->m_register->updateRegister(true);
125   d->ui->m_register->update();
126 
127   d->ui->m_register->setFocus();
128 
129   return QDialog::exec();
130 }
131 
slotHelp()132 void KSelectTransactionsDlg::slotHelp()
133 {
134   // KHelpClient::invokeHelp("details.ledgers.match");
135 }
136 
showEvent(QShowEvent * event)137 void KSelectTransactionsDlg::showEvent(QShowEvent* event)
138 {
139   Q_D(KSelectTransactionsDlg);
140   QDialog::showEvent(event);
141   d->ui->m_register->resize((int)eWidgets::eTransaction::Column::Detail, true);
142 }
143 
resizeEvent(QResizeEvent * ev)144 void KSelectTransactionsDlg::resizeEvent(QResizeEvent* ev)
145 {
146   Q_D(KSelectTransactionsDlg);
147   // don't forget the resizer
148   QDialog::resizeEvent(ev);
149 
150   // resize the register
151   d->ui->m_register->resize((int)eWidgets::eTransaction::Column::Detail, true);
152 }
153 
transaction() const154 MyMoneyTransaction KSelectTransactionsDlg::transaction() const
155 {
156   Q_D(const KSelectTransactionsDlg);
157   MyMoneyTransaction t;
158 
159   QList<KMyMoneyRegister::RegisterItem*> list;
160   list = d->ui->m_register->selectedItems();
161   if (list.count()) {
162     if (auto _t = dynamic_cast<KMyMoneyRegister::Transaction*>(list[0]))
163       t = _t->transaction();
164   }
165   return t;
166 }
167 
getRegister()168 KMyMoneyRegister::Register* KSelectTransactionsDlg::getRegister()
169 {
170   Q_D(KSelectTransactionsDlg);
171   return d->ui->m_register;
172 }
173 
eventFilter(QObject * o,QEvent * e)174 bool KSelectTransactionsDlg::eventFilter(QObject* o, QEvent* e)
175 {
176   Q_D(KSelectTransactionsDlg);
177   auto rc = false;
178 
179   if (o == d->ui->m_register) {
180     switch (e->type()) {
181       case QEvent::KeyPress:
182         if (auto k = dynamic_cast<QKeyEvent*>(e)) {
183           if ((k->modifiers() & Qt::KeyboardModifierMask) == 0
184               || (k->modifiers() & Qt::KeypadModifier) != 0) {
185             switch (k->key()) {
186               case Qt::Key_Return:
187               case Qt::Key_Enter:
188                 if (d->ui->buttonBox->button(QDialogButtonBox::Ok)->isEnabled()) {
189                   accept();
190                   rc = true;
191                 }
192                 // tricky fall through here
193               default:
194                 break;
195             }
196           }
197         }
198         // tricky fall through here
199       default:
200         break;
201     }
202   }
203   return rc;
204 }
205