You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/dialogs/kfindtransactiondlg.cpp

843 lines
25 KiB

/***************************************************************************
kfindtransactiondlg.cpp
-------------------
copyright : (C) 2003, 2007 by Thomas Baumgart
email : 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. *
* *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
// ----------------------------------------------------------------------------
// TQt Includes
#include <tqlabel.h>
#include <tqradiobutton.h>
#include <tqcheckbox.h>
#include <tqtimer.h>
#include <tqtabwidget.h>
#include <tqlayout.h>
// ----------------------------------------------------------------------------
// TDE Includes
#include <tdeapplication.h>
#include <tdeglobal.h>
#include <tdelocale.h>
#include <kstandarddirs.h>
#include <kpushbutton.h>
#include <klineedit.h>
#include <tdelistview.h>
#include <kcombobox.h>
#include <kstdguiitem.h>
#include <kiconloader.h>
// ----------------------------------------------------------------------------
// Project Includes
#include "kfindtransactiondlg.h"
#include <kmymoney/kmymoneydateinput.h>
#include <kmymoney/kmymoneyedit.h>
#include <kmymoney/kmymoneylineedit.h>
#include <kmymoney/kmymoneyaccountselector.h>
#include <kmymoney/mymoneyfile.h>
#include <kmymoney/kmymoneychecklistitem.h>
#include <kmymoney/kmymoneyglobalsettings.h>
#include <kmymoney/register.h>
#include <kmymoney/transaction.h>
#include <kmymoney/kmymoneycombo.h>
#include "ksortoptiondlg.h"
KFindTransactionDlg::KFindTransactionDlg(TQWidget *parent, const char *name) :
KFindTransactionDlgDecl(parent, name, false),
m_needReload(false)
{
m_register->installEventFilter(this);
m_tabWidget->setTabEnabled(m_resultPage, false);
// 'cause we don't have a separate setupTextPage
connect(m_textEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
setupAccountsPage();
setupCategoriesPage();
setupDatePage();
setupAmountPage();
setupPayeesPage();
setupDetailsPage();
// We don't need to add the default into the list (see ::slotShowHelp() why)
// m_helpAnchor[m_textTab] = TQString("details.search");
m_helpAnchor[m_accountTab] = TQString("details.search.account");
m_helpAnchor[m_dateTab] = TQString("details.search.date");
m_helpAnchor[m_amountTab] = TQString("details.search.amount");
m_helpAnchor[m_categoryTab] = TQString("details.search.category");
m_helpAnchor[m_payeeTab] = TQString("details.search.payee");
m_helpAnchor[m_detailsTab] = TQString("details.search.details");
// setup the register
TQValueList<KMyMoneyRegister::Column> cols;
cols << KMyMoneyRegister::DateColumn;
cols << KMyMoneyRegister::AccountColumn;
cols << KMyMoneyRegister::DetailColumn;
cols << KMyMoneyRegister::ReconcileFlagColumn;
cols << KMyMoneyRegister::PaymentColumn;
cols << KMyMoneyRegister::DepositColumn;
m_register->setupRegister(MyMoneyAccount(), cols);
m_register->setSelectionMode(TQTable::Single);
connect(m_register, TQ_SIGNAL(editTransaction()), this, TQ_SLOT(slotSelectTransaction()));
connect(m_register, TQ_SIGNAL(headerClicked()), this, TQ_SLOT(slotSortOptions()));
slotUpdateSelections();
// setup the connections
connect(m_searchButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotSearch()));
connect(m_resetButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotReset()));
connect(m_resetButton, TQ_SIGNAL(clicked()), m_accountsView, TQ_SLOT(slotSelectAllAccounts()));
connect(m_resetButton, TQ_SIGNAL(clicked()), m_categoriesView, TQ_SLOT(slotSelectAllAccounts()));
connect(m_closeButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(deleteLater()));
connect(m_helpButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotShowHelp()));
// only allow searches when a selection has been made
connect(this, TQ_SIGNAL(selectionEmpty(bool)), m_searchButton, TQ_SLOT(setDisabled(bool)));
// get signal about engine changes
connect(MyMoneyFile::instance(), TQ_SIGNAL(dataChanged()), this, TQ_SLOT(slotRefreshView()));
slotUpdateSelections();
m_textEdit->setFocus();
}
void KFindTransactionDlg::slotReset(void)
{
m_textEdit->setText(TQString());
m_regExp->setChecked(false);
m_caseSensitive->setChecked(false);
m_textNegate->setCurrentItem(0);
m_amountEdit->setEnabled(true);
m_amountFromEdit->setEnabled(false);
m_amountToEdit->setEnabled(false);
m_amountEdit->loadText(TQString());
m_amountFromEdit->loadText(TQString());
m_amountToEdit->loadText(TQString());
m_amountButton->setChecked(true);
m_amountRangeButton->setChecked(false);
m_emptyPayeesButton->setChecked(false);
selectAllItems(m_payeesView, true);
m_typeBox->setCurrentItem(MyMoneyTransactionFilter::allTypes);
m_stateBox->setCurrentItem(MyMoneyTransactionFilter::allStates);
m_validityBox->setCurrentItem(MyMoneyTransactionFilter::anyValidity);
m_nrEdit->setEnabled(true);
m_nrFromEdit->setEnabled(false);
m_nrToEdit->setEnabled(false);
m_nrEdit->setText(TQString());
m_nrFromEdit->setText(TQString());
m_nrToEdit->setText(TQString());
m_nrButton->setChecked(true);
m_nrRangeButton->setChecked(false);
m_tabWidget->setTabEnabled(m_resultPage, false);
m_tabWidget->setCurrentPage(m_tabWidget->indexOf(m_criteriaTab));
// the following call implies a call to slotUpdateSelections,
// that's why we call it last
m_dateRange->setCurrentItem(MyMoneyTransactionFilter::allDates);
slotDateRangeChanged(MyMoneyTransactionFilter::allDates);
}
void KFindTransactionDlg::slotUpdateSelections(void)
{
TQString txt;
// Text tab
if(!m_textEdit->text().isEmpty()) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Text");
m_regExp->setEnabled(TQRegExp(m_textEdit->text()).isValid());
} else
m_regExp->setEnabled(false);
m_caseSensitive->setEnabled(!m_textEdit->text().isEmpty());
m_textNegate->setEnabled(!m_textEdit->text().isEmpty());
// Account tab
if(!m_accountsView->allItemsSelected()) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Account");
}
// Date tab
if(m_dateRange->currentItem() != 0) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Date");
}
// Amount tab
if((m_amountButton->isChecked() && m_amountEdit->isValid())
|| (m_amountRangeButton->isChecked()
&& (m_amountFromEdit->isValid() || m_amountToEdit->isValid()))) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Amount");
}
// Categories tab
if(!m_categoriesView->allItemsSelected()) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Category");
}
// Payees tab
if(!allItemsSelected(m_payeesView)
|| m_emptyPayeesButton->isChecked()) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Payees");
}
m_payeesView->setEnabled(!m_emptyPayeesButton->isChecked());
// Details tab
if(m_typeBox->currentItem() != 0
|| m_stateBox->currentItem() != 0
|| m_validityBox->currentItem() != 0
|| (m_nrButton->isChecked() && m_nrEdit->text().length() != 0)
|| (m_nrRangeButton->isChecked()
&& (m_nrFromEdit->text().length() != 0 || m_nrToEdit->text().length() != 0))) {
if(!txt.isEmpty())
txt += ", ";
txt += i18n("Details");
}
//Show a warning about transfers if Categories are filtered - bug #1523508
if(!m_categoriesView->allItemsSelected()) {
m_transferWarning->setText( i18n("Warning: Filtering by Category will exclude all transfers from the results.") );
} else {
m_transferWarning->setText("");
}
// disable the search button if no selection is made
emit selectionEmpty(txt.isEmpty());
if(txt.isEmpty()) {
txt = i18n("(None)");
}
m_selectedCriteria->setText(i18n("Current selections: ") + txt);
}
bool KFindTransactionDlg::allItemsSelected(const TQListViewItem *item) const
{
TQListViewItem* it_v;
for(it_v = item->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
if(it_v->rtti() == 1) {
TQCheckListItem* it_c = static_cast<TQCheckListItem*>(it_v);
if(!(it_c->isOn() && allItemsSelected(it_v)))
return false;
}
}
return true;
}
bool KFindTransactionDlg::allItemsSelected(const TQListView* view) const
{
TQListViewItem* it_v;
for(it_v = view->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
if(it_v->rtti() == 1) {
TQCheckListItem* it_c = static_cast<TQCheckListItem*>(it_v);
if(it_c->type() == TQCheckListItem::CheckBox) {
if(!(it_c->isOn() && allItemsSelected(it_v)))
return false;
} else {
if(!allItemsSelected(it_v))
return false;
}
}
}
return true;
}
void KFindTransactionDlg::setupAccountsPage(void)
{
m_accountsView->setSelectionMode(TQListView::Multi);
AccountSet accountSet;
accountSet.addAccountGroup(MyMoneyAccount::Asset);
accountSet.addAccountGroup(MyMoneyAccount::Liability);
//set the accountset to show closed account if the settings say so
accountSet.setHideClosedAccounts(KMyMoneyGlobalSettings::hideClosedAccounts());
accountSet.load(m_accountsView);
connect(m_accountsView, TQ_SIGNAL(stateChanged()), this, TQ_SLOT(slotUpdateSelections()));
}
void KFindTransactionDlg::selectAllItems(TQListView* view, const bool state)
{
TQListViewItem* it_v;
for(it_v = view->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
TQCheckListItem* it_c = static_cast<TQCheckListItem*>(it_v);
if(it_c->type() == TQCheckListItem::CheckBox) {
it_c->setOn(state);
}
selectAllSubItems(it_v, state);
}
slotUpdateSelections();
}
void KFindTransactionDlg::selectItems(TQListView* view, const TQStringList& list, const bool state)
{
TQListViewItem* it_v;
for(it_v = view->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
KMyMoneyCheckListItem* it_c = static_cast<KMyMoneyCheckListItem*>(it_v);
if(it_c->type() == TQCheckListItem::CheckBox && list.contains(it_c->id())) {
it_c->setOn(state);
}
selectSubItems(it_v, list, state);
}
slotUpdateSelections();
}
void KFindTransactionDlg::setupCategoriesPage(void)
{
m_categoriesView->setSelectionMode(TQListView::Multi);
AccountSet categorySet;
categorySet.addAccountGroup(MyMoneyAccount::Income);
categorySet.addAccountGroup(MyMoneyAccount::Expense);
categorySet.load(m_categoriesView);
connect(m_categoriesView, TQ_SIGNAL(stateChanged()), this, TQ_SLOT(slotUpdateSelections()));
}
void KFindTransactionDlg::selectAllSubItems(TQListViewItem* item, const bool state)
{
TQListViewItem* it_v;
for(it_v = item->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
static_cast<TQCheckListItem*>(it_v)->setOn(state);
selectAllSubItems(it_v, state);
}
}
void KFindTransactionDlg::selectSubItems(TQListViewItem* item, const TQStringList& list, const bool state)
{
TQListViewItem* it_v;
for(it_v = item->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
KMyMoneyCheckListItem* it_c = static_cast<KMyMoneyCheckListItem*>(it_v);
if(list.contains(it_c->id()))
it_c->setOn(state);
selectSubItems(it_v, list, state);
}
}
void KFindTransactionDlg::setupDatePage(void)
{
int i;
for(i = MyMoneyTransactionFilter::allDates; i < MyMoneyTransactionFilter::dateOptionCount; ++i) {
MyMoneyTransactionFilter::translateDateRange(static_cast<MyMoneyTransactionFilter::dateOptionE>(i), m_startDates[i], m_endDates[i]);
}
connect(m_dateRange, TQ_SIGNAL(itemSelected(int)), this, TQ_SLOT(slotDateRangeChanged(int)));
connect(m_fromDate, TQ_SIGNAL(dateChanged(const TQDate&)), this, TQ_SLOT(slotDateChanged()));
connect(m_toDate, TQ_SIGNAL(dateChanged(const TQDate&)), this, TQ_SLOT(slotDateChanged()));
slotDateRangeChanged(MyMoneyTransactionFilter::allDates);
}
void KFindTransactionDlg::slotDateRangeChanged(int idx)
{
switch(idx) {
case MyMoneyTransactionFilter::allDates:
case MyMoneyTransactionFilter::userDefined:
m_fromDate->loadDate(TQDate());
m_toDate->loadDate(TQDate());
break;
default:
m_fromDate->loadDate(m_startDates[idx]);
m_toDate->loadDate(m_endDates[idx]);
break;
}
slotUpdateSelections();
}
void KFindTransactionDlg::slotDateChanged(void)
{
int idx;
for(idx = MyMoneyTransactionFilter::asOfToday; idx < MyMoneyTransactionFilter::dateOptionCount; ++idx) {
if(m_fromDate->date() == m_startDates[idx]
&& m_toDate->date() == m_endDates[idx]) {
break;
}
}
//if no filter matched, set to user defined
if(idx == MyMoneyTransactionFilter::dateOptionCount)
idx = MyMoneyTransactionFilter::userDefined;
m_dateRange->blockSignals(true);
m_dateRange->setCurrentItem(static_cast<MyMoneyTransactionFilter::dateOptionE>(idx));
m_dateRange->blockSignals(false);
slotUpdateSelections();
}
void KFindTransactionDlg::setupAmountPage(void)
{
connect(m_amountButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotAmountSelected()));
connect(m_amountRangeButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotAmountRangeSelected()));
connect(m_amountEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_amountFromEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_amountToEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
m_amountButton->setChecked(true);
slotAmountSelected();
}
void KFindTransactionDlg::slotAmountSelected(void)
{
m_amountEdit->setEnabled(true);
m_amountFromEdit->setEnabled(false);
m_amountToEdit->setEnabled(false);
slotUpdateSelections();
}
void KFindTransactionDlg::slotAmountRangeSelected(void)
{
m_amountEdit->setEnabled(false);
m_amountFromEdit->setEnabled(true);
m_amountToEdit->setEnabled(true);
slotUpdateSelections();
}
void KFindTransactionDlg::setupPayeesPage(void)
{
m_payeesView->setSelectionMode(TQListView::Single);
m_payeesView->header()->hide();
loadPayees();
m_emptyPayeesButton->setChecked(false);
connect(m_allPayeesButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotSelectAllPayees()));
connect(m_clearPayeesButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotDeselectAllPayees()));
connect(m_emptyPayeesButton, TQ_SIGNAL(stateChanged(int)), this, TQ_SLOT(slotUpdateSelections()));
}
void KFindTransactionDlg::loadPayees(void)
{
MyMoneyFile* file = MyMoneyFile::instance();
TQValueList<MyMoneyPayee> list;
TQValueList<MyMoneyPayee>::Iterator it_l;
list = file->payeeList();
// load view
for(it_l = list.begin(); it_l != list.end(); ++it_l) {
KMyMoneyCheckListItem* item = new KMyMoneyCheckListItem(m_payeesView, (*it_l).name(), TQString(), (*it_l).id());
connect(item, TQ_SIGNAL(stateChanged(bool)), this, TQ_SLOT(slotUpdateSelections()));
item->setOn(true);
}
}
void KFindTransactionDlg::slotSelectAllPayees(void)
{
selectAllItems(m_payeesView, true);
}
void KFindTransactionDlg::slotDeselectAllPayees(void)
{
selectAllItems(m_payeesView, false);
}
void KFindTransactionDlg::setupDetailsPage(void)
{
connect(m_typeBox, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_stateBox, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_validityBox, TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_nrButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotNrSelected()));
connect(m_nrRangeButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotNrRangeSelected()));
connect(m_nrEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_nrFromEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
connect(m_nrToEdit, TQ_SIGNAL(textChanged(const TQString&)), this, TQ_SLOT(slotUpdateSelections()));
m_nrButton->setChecked(true);
slotNrSelected();
}
void KFindTransactionDlg::slotNrSelected(void)
{
m_nrEdit->setEnabled(true);
m_nrFromEdit->setEnabled(false);
m_nrToEdit->setEnabled(false);
slotUpdateSelections();
}
void KFindTransactionDlg::slotNrRangeSelected(void)
{
m_nrEdit->setEnabled(false);
m_nrFromEdit->setEnabled(true);
m_nrToEdit->setEnabled(true);
slotUpdateSelections();
}
void KFindTransactionDlg::addItemToFilter(const opTypeE op, const TQString& id)
{
switch(op) {
case addAccountToFilter:
m_filter.addAccount(id);
break;
case addCategoryToFilter:
m_filter.addCategory(id);
break;
case addPayeeToFilter:
m_filter.addPayee(id);
break;
}
}
void KFindTransactionDlg::scanCheckListItems(const TQListViewItem* item, const opTypeE op)
{
TQListViewItem* it_v;
for(it_v = item->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
if(it_v->rtti() == 1) {
KMyMoneyCheckListItem* it_c = static_cast<KMyMoneyCheckListItem*>(it_v);
if(it_c->type() == TQCheckListItem::CheckBox) {
if(it_c->isOn())
addItemToFilter(op, (*it_c).id());
}
scanCheckListItems(it_v, op);
}
}
}
void KFindTransactionDlg::scanCheckListItems(const TQListView* view, const opTypeE op)
{
TQListViewItem* it_v;
for(it_v = view->firstChild(); it_v != 0; it_v = it_v->nextSibling()) {
if(it_v->rtti() == 1) {
KMyMoneyCheckListItem* it_c = static_cast<KMyMoneyCheckListItem*>(it_v);
if(it_c->type() == TQCheckListItem::CheckBox) {
if(it_c->isOn())
addItemToFilter(op, (*it_c).id());
}
scanCheckListItems(it_v, op);
}
}
}
void KFindTransactionDlg::setupFilter(void)
{
m_filter.clear();
// Text tab
if(!m_textEdit->text().isEmpty()) {
TQRegExp exp(m_textEdit->text(), m_caseSensitive->isChecked(), !m_regExp->isChecked());
m_filter.setTextFilter(exp, m_textNegate->currentItem() != 0);
}
// Account tab
if(!m_accountsView->allItemsSelected()) {
// retrieve a list of selected accounts
TQStringList list;
m_accountsView->selectedItems(list);
// if we're not in expert mode, we need to make sure
// that all stock accounts for the selected investment
// account are also selected
if(!KMyMoneyGlobalSettings::expertMode()) {
TQStringList missing;
TQStringList::const_iterator it_a, it_b;
for(it_a = list.begin(); it_a != list.end(); ++it_a) {
MyMoneyAccount acc = MyMoneyFile::instance()->account(*it_a);
if(acc.accountType() == MyMoneyAccount::Investment) {
for(it_b = acc.accountList().begin(); it_b != acc.accountList().end(); ++it_b) {
if(!list.contains(*it_b)) {
missing.append(*it_b);
}
}
}
}
list += missing;
}
m_filter.addAccount(list);
}
// Date tab
if(m_dateRange->currentItem() != 0) {
m_filter.setDateFilter(m_fromDate->date(), m_toDate->date());
}
// Amount tab
if((m_amountButton->isChecked() && m_amountEdit->isValid())) {
m_filter.setAmountFilter(m_amountEdit->value(), m_amountEdit->value());
} else if((m_amountRangeButton->isChecked()
&& (m_amountFromEdit->isValid() || m_amountToEdit->isValid()))) {
MyMoneyMoney from(MyMoneyMoney::minValue), to(MyMoneyMoney::maxValue);
if(m_amountFromEdit->isValid())
from = m_amountFromEdit->value();
if(m_amountToEdit->isValid())
to = m_amountToEdit->value();
m_filter.setAmountFilter(from, to);
}
// Categories tab
if(!m_categoriesView->allItemsSelected()) {
m_filter.addCategory(m_categoriesView->selectedItems());
}
// Payees tab
if(m_emptyPayeesButton->isChecked()) {
m_filter.addPayee(TQString());
} else if(!allItemsSelected(m_payeesView)) {
scanCheckListItems(m_payeesView, addPayeeToFilter);
}
// Details tab
if(m_typeBox->currentItem() != 0)
m_filter.addType(m_typeBox->currentItem());
if(m_stateBox->currentItem() != 0)
m_filter.addState(m_stateBox->currentItem());
if(m_validityBox->currentItem() != 0)
m_filter.addValidity(m_validityBox->currentItem());
if(m_nrButton->isChecked() && !m_nrEdit->text().isEmpty())
m_filter.setNumberFilter(m_nrEdit->text(), m_nrEdit->text());
if(m_nrRangeButton->isChecked()
&& (!m_nrFromEdit->text().isEmpty() || !m_nrToEdit->text().isEmpty())) {
m_filter.setNumberFilter(m_nrFromEdit->text(), m_nrToEdit->text());
}
}
void KFindTransactionDlg::slotSearch(void)
{
// setup the filter from the dialog widgets
setupFilter();
// filter is setup, now fill the register
slotRefreshView();
m_register->setFocus();
}
void KFindTransactionDlg::slotRefreshView(void)
{
m_needReload = true;
if(isVisible()) {
loadView();
m_needReload = false;
}
}
void KFindTransactionDlg::show(void)
{
if(m_needReload) {
loadView();
m_needReload = false;
}
KFindTransactionDlgDecl::show();
}
void KFindTransactionDlg::loadView(void)
{
// setup sort order
m_register->setSortOrder(KMyMoneyGlobalSettings::sortSearchView());
// clear out old data
m_register->clear();
// retrieve the list from the engine
MyMoneyFile::instance()->transactionList(m_transactionList, m_filter);
// create the elements for the register
TQValueList<TQPair<MyMoneyTransaction, MyMoneySplit> >::const_iterator it;
TQMap<TQString, int>uniqueMap;
MyMoneyMoney deposit, payment;
int splitCount = 0;
for(it = m_transactionList.begin(); it != m_transactionList.end(); ++it) {
const MyMoneySplit& split = (*it).second;
MyMoneyAccount acc = MyMoneyFile::instance()->account(split.accountId());
++splitCount;
uniqueMap[(*it).first.id()]++;
KMyMoneyRegister::Register::transactionFactory(m_register, (*it).first, (*it).second, uniqueMap[(*it).first.id()]);
{ // debug stuff
if(split.shares().isNegative()) {
payment += split.shares().abs();
} else {
deposit += split.shares().abs();
}
}
}
// add the group markers
m_register->addGroupMarkers();
// sort the transactions according to the sort setting
m_register->sortItems();
// remove trailing and adjacent markers
m_register->removeUnwantedGroupMarkers();
// turn on the ledger lens for the register
m_register->setLedgerLensForced();
m_register->updateRegister(true);
m_register->setFocusToTop();
m_register->selectItem(m_register->focusItem());
#if KMM_DEBUG
m_foundText->setText(i18n("Found %1 matching transactions (D %2 / P %3 = %4)")
.arg(splitCount).arg(deposit.formatMoney("", 2)).arg(payment.formatMoney("", 2)).arg((deposit-payment).formatMoney("", 2)));
#else
m_foundText->setText(i18n("Found %1 matching transactions") .arg(splitCount));
#endif
m_tabWidget->setTabEnabled(m_resultPage, true);
m_tabWidget->setCurrentPage(m_tabWidget->indexOf(m_resultPage));
TQTimer::singleShot(10, this, TQ_SLOT(slotRightSize()));
}
void KFindTransactionDlg::slotRightSize(void)
{
m_register->updateContents();
}
void KFindTransactionDlg::resizeEvent(TQResizeEvent* ev)
{
// Columns
// 1 = Date
// 2 = Account
// 4 = Detail
// 5 = C
// 6 = Payment
// 7 = Deposit
// don't forget the resizer
KFindTransactionDlgDecl::resizeEvent(ev);
if(!m_register->isVisible())
return;
// resize the register
int w = m_register->visibleWidth();
int m_debitWidth = 80;
int m_creditWidth = 80;
m_register->adjustColumn(1);
m_register->adjustColumn(2);
m_register->adjustColumn(5);
m_register->setColumnWidth(6, m_debitWidth);
m_register->setColumnWidth(7, m_creditWidth);
for(int i = 0; i < m_register->numCols(); ++i) {
switch(i) {
case 4: // skip the one, we want to set
break;
default:
w -= m_register->columnWidth(i);
break;
}
}
m_register->setColumnWidth(4, w);
}
void KFindTransactionDlg::slotSelectTransaction(void)
{
TQValueList<KMyMoneyRegister::RegisterItem*> list = m_register->selectedItems();
if(!list.isEmpty()) {
KMyMoneyRegister::Transaction* t = dynamic_cast<KMyMoneyRegister::Transaction*>(list[0]);
if(t) {
emit transactionSelected(t->split().accountId(), t->transaction().id());
hide();
}
}
}
bool KFindTransactionDlg::eventFilter(TQObject* o, TQEvent* e)
{
bool rc = false;
if(o->isWidgetType()) {
if(e->type() == TQEvent::KeyPress) {
const TQWidget* w = dynamic_cast<const TQWidget*>(o);
TQKeyEvent *k = static_cast<TQKeyEvent*> (e);
if(w == m_register) {
switch(k->key()) {
default:
break;
case TQt::Key_Return:
case TQt::Key_Enter:
rc = true;
slotSelectTransaction();
break;
}
}
}
}
return rc;
}
void KFindTransactionDlg::slotShowHelp(void)
{
TQString anchor = m_helpAnchor[m_criteriaTab->currentPage()];
if(anchor.isEmpty())
anchor = TQString("details.search");
kapp->invokeHelp(anchor);
}
void KFindTransactionDlg::slotSortOptions(void)
{
KSortOptionDlg* dlg = new KSortOptionDlg(this);
dlg->setSortOption(KMyMoneyGlobalSettings::sortSearchView(), TQString());
dlg->hideDefaultButton();
if(dlg->exec() == TQDialog::Accepted) {
TQString sortOrder = dlg->sortOption();
if(sortOrder != KMyMoneyGlobalSettings::sortSearchView()) {
KMyMoneyGlobalSettings::setSortSearchView(sortOrder);
slotRefreshView();
}
}
delete dlg;
}
#include "kfindtransactiondlg.moc"