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