/***************************************************************************
                          kreportconfigurationdlg.cpp  -  description
                             -------------------
    begin                : Mon Jun 21 2004
    copyright            : (C) 2000-2004 by Michael Edwardes
    email                : mte@users.sourceforge.net
                           Javier Campos Morales <javi_c@users.sourceforge.net>
                           Felix Rodriguez <frodriguez@users.sourceforge.net>
                           John C <thetacoturtle@users.sourceforge.net>
                           Thomas Baumgart <ipwizard@users.sourceforge.net>
                           Kevin Tambascio <ktambascio@users.sourceforge.net>
                           Ace Jones <ace.j@hotpop.com>
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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

// ----------------------------------------------------------------------------
// QT Includes

#include <tqvariant.h>
#include <tqbuttongroup.h>
#include <tqcheckbox.h>
#include <tqframe.h>
#include <tqlabel.h>
#include <tqlineedit.h>
#include <tqpushbutton.h>
#include <tqradiobutton.h>
#include <tqlayout.h>
#include <tqspinbox.h>
#include <tqtooltip.h>
#include <tqwhatsthis.h>
#include <tqtabwidget.h>
#include <tqtextedit.h>
#include <tqlayout.h>
#include <tqapplication.h>

// ----------------------------------------------------------------------------
// KDE Includes

#include <tdeapplication.h>
#include <kpushbutton.h>
#include <klineedit.h>
#include <tdelistview.h>
#include <kcombobox.h>
#include <kguiitem.h>
#include <kiconloader.h>
#include <kdebug.h>
#include <kstdguiitem.h>
#include <tdelocale.h>

// ----------------------------------------------------------------------------
// Project Includes

#include "kreportconfigurationfilterdlg.h"
#include <kmymoney/kmymoneydateinput.h>
#include <kmymoney/kmymoneyedit.h>
#include <kmymoney/kmymoneylineedit.h>
#include <kmymoney/kmymoneyaccountselector.h>
#include <kmymoney/mymoneyfile.h>
#include <kmymoney/mymoneyreport.h>
#include <kmymoney/kmymoneycombo.h>
#include "../widgets/kmymoneyreportconfigtab1decl.h"
#include "../widgets/kmymoneyreportconfigtab2decl.h"
#include "../widgets/kmymoneyreportconfigtab3decl.h"
#include "../widgets/kmymoneyreportconfigtabchartdecl.h"

KReportConfigurationFilterDlg::KReportConfigurationFilterDlg(
  MyMoneyReport report, TQWidget *parent, const char *name)
 : KFindTransactionDlg(parent, name),
 m_tab2(0),
 m_tab3(0),
 m_tabChart(0),
 m_initialState(report),
 m_currentState(report)
{
    //
    // Rework labelling
    //

    setCaption( i18n( "Report Configuration" ) );
    delete TextLabel1;

    //
    // Rework the buttons
    //

    // the Ok button is always enabled
    disconnect(TQT_SIGNAL(selectionEmpty(bool)));
    m_searchButton->setGuiItem( KStdGuiItem::ok() );
    m_searchButton->setEnabled(true);

    // reconnect the close button
    m_closeButton->disconnect();
    connect(m_closeButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(reject()));

    //
    // Add new tabs
    //

    m_tab1 = new kMyMoneyReportConfigTab1Decl( m_criteriaTab, "kMyMoneyReportConfigTab1" );
    m_criteriaTab->insertTab( m_tab1, i18n("Report"), 0 );

    if ( m_initialState.reportType() == MyMoneyReport::ePivotTable )
    {
      m_tab2 = new kMyMoneyReportConfigTab2Decl( m_criteriaTab, "kMyMoneyReportConfigTab2" );
      m_criteriaTab->insertTab( m_tab2, i18n( "Rows/Columns"), 1 );
      connect(m_tab2->m_comboRows, TQT_SIGNAL(highlighted(int)), this, TQT_SLOT(slotRowTypeChanged(int)));
      connect(m_tab2->m_comboColumns, TQT_SIGNAL(activated(int)), this, TQT_SLOT(slotColumnTypeChanged(int)));
      //control the state of the includeTransfer check
      connect(m_categoriesView, TQT_SIGNAL(stateChanged()), this, TQT_SLOT(slotUpdateCheckTransfers()));

#ifdef HAVE_KDCHART
      m_tabChart = new kMyMoneyReportConfigTabChartDecl( m_criteriaTab, "kMyMoneyReportConfigTabChart" );
      m_criteriaTab->insertTab( m_tabChart, i18n( "Chart"), 2 );
#endif
    }
    else if ( m_initialState.reportType() == MyMoneyReport::eQueryTable )
    {
      // eInvestmentHoldings is a special-case report, and you cannot configure the
      // rows & columns of that report.
      if ( m_initialState.rowType() < MyMoneyReport::eAccountByTopAccount )
      {
        m_tab3 = new kMyMoneyReportConfigTab3Decl( m_criteriaTab, "kMyMoneyReportConfigTab3" );
        m_criteriaTab->insertTab( m_tab3, i18n("Rows/Columns"), 1 );
      }
    }

    m_criteriaTab->showPage( m_tab1 );
    m_criteriaTab->setMinimumSize( 500,200 );

    TQValueList<MyMoneyBudget> list = MyMoneyFile::instance()->budgetList();
    TQValueList<MyMoneyBudget>::const_iterator it_b;
    for(it_b = list.begin(); it_b != list.end(); ++it_b) {
      m_budgets.push_back(*it_b);
    }

    //
    // Now set up the widgets with proper values
    //
    slotReset();
}

KReportConfigurationFilterDlg::~KReportConfigurationFilterDlg()
{
}

void KReportConfigurationFilterDlg::slotSearch(void)
{
  // setup the filter from the dialog widgets
  setupFilter();

  // Copy the m_filter over to the filter part of m_currentConfig.
  m_currentState.assignFilter(m_filter);

  // Then extract the report properties
  m_currentState.setName( m_tab1->m_editName->text() );
  m_currentState.setComment( m_tab1->m_editComment->text() );
  m_currentState.setConvertCurrency( m_tab1->m_checkCurrency->isChecked() );
  m_currentState.setFavorite( m_tab1->m_checkFavorite->isChecked() );

  if ( m_tab2 )
  {
    MyMoneyReport::EDetailLevel dl[4] = { MyMoneyReport::eDetailAll, MyMoneyReport::eDetailTop, MyMoneyReport::eDetailGroup, MyMoneyReport::eDetailTotal };

    m_currentState.setDetailLevel( dl[m_tab2->m_comboDetail->currentItem()] );

    // modify the rowtype only if the widget is enabled
    if(m_tab2->m_comboRows->isEnabled()) {
      MyMoneyReport::ERowType rt[2] = { MyMoneyReport::eExpenseIncome, MyMoneyReport::eAssetLiability };
      m_currentState.setRowType( rt[m_tab2->m_comboRows->currentItem()] );
    }

    m_currentState.setShowingRowTotals(false);
    if(m_tab2->m_comboRows->currentItem() == 0)
      m_currentState.setShowingRowTotals(m_tab2->m_checkTotalColumn->isChecked());

    MyMoneyReport::EColumnType ct[6] = { MyMoneyReport::eDays, MyMoneyReport::eWeeks, MyMoneyReport::eMonths, MyMoneyReport::eBiMonths, MyMoneyReport::eQuarters, MyMoneyReport::eYears };
    bool dy[6] = { true, true, false, false, false, false };
    m_currentState.setColumnType( ct[m_tab2->m_comboColumns->currentItem()] );

    //TODO (Ace) This should be implicit in the call above.  MMReport needs fixin'
    m_currentState.setColumnsAreDays( dy[m_tab2->m_comboColumns->currentItem()] );

    m_currentState.setIncludingSchedules( m_tab2->m_checkScheduled->isChecked() );

    m_currentState.setIncludingTransfers( m_tab2->m_checkTransfers->isChecked() );

    m_currentState.setIncludingUnusedAccounts( m_tab2->m_checkUnused->isChecked() );

    if(m_tab2->m_comboBudget->isEnabled()) {
      m_currentState.setBudget(m_budgets[m_tab2->m_comboBudget->currentItem()].id(), m_initialState.rowType() == MyMoneyReport::eBudgetActual);
    } else {
      m_currentState.setBudget(TQString(), false);
    }

    //set moving average days
    if(m_tab2->m_movingAverageDays->isEnabled()) {
      m_currentState.setMovingAverageDays( m_tab2->m_movingAverageDays->value() );
    }
  }
  else if ( m_tab3 )
  {
    MyMoneyReport::ERowType rtq[7] = { MyMoneyReport::eCategory, MyMoneyReport::eTopCategory, MyMoneyReport::ePayee, MyMoneyReport::eAccount, MyMoneyReport::eTopAccount, MyMoneyReport::eMonth, MyMoneyReport::eWeek };
    m_currentState.setRowType( rtq[m_tab3->m_comboOrganizeBy->currentItem()] );

    unsigned qc = MyMoneyReport::eTQCnone;

    if (m_currentState.queryColumns() & MyMoneyReport::eTQCloan)
      // once a loan report, always a loan report
      qc = MyMoneyReport::eTQCloan;

    if ( m_tab3->m_checkNumber->isChecked() )
      qc |= MyMoneyReport::eTQCnumber;
    if ( m_tab3->m_checkPayee->isChecked() )
      qc |= MyMoneyReport::eTQCpayee;
    if ( m_tab3->m_checkCategory->isChecked() )
      qc |= MyMoneyReport::eTQCcategory;
    if ( m_tab3->m_checkMemo->isChecked() )
      qc |= MyMoneyReport::eTQCmemo;
    if ( m_tab3->m_checkAccount->isChecked() )
      qc |= MyMoneyReport::eTQCaccount;
    if ( m_tab3->m_checkReconciled->isChecked() )
      qc |= MyMoneyReport::eTQCreconciled;
    if ( m_tab3->m_checkAction->isChecked() )
      qc |= MyMoneyReport::eTQCaction;
    if ( m_tab3->m_checkShares->isChecked() )
      qc |= MyMoneyReport::eTQCshares;
    if ( m_tab3->m_checkPrice->isChecked() )
      qc |= MyMoneyReport::eTQCprice;
    if( m_tab3->m_checkBalance->isChecked() )
      qc |= MyMoneyReport::eTQCbalance;

    m_currentState.setQueryColumns(static_cast<MyMoneyReport::EQueryColumns>(qc));

    m_currentState.setTax( m_tab3->m_checkTax->isChecked() );
    m_currentState.setInvestmentsOnly( m_tab3->m_checkInvestments->isChecked() );
    m_currentState.setLoansOnly( m_tab3->m_checkLoans->isChecked() );

    m_currentState.setDetailLevel(m_tab3->m_checkHideSplitDetails->isChecked() ?
        MyMoneyReport::eDetailNone : MyMoneyReport::eDetailAll);
  }

  if ( m_tabChart )
  {
    MyMoneyReport::EChartType ct[5] = { MyMoneyReport::eChartLine, MyMoneyReport::eChartBar, MyMoneyReport::eChartStackedBar, MyMoneyReport::eChartPie, MyMoneyReport::eChartRing };
    m_currentState.setChartType( ct[m_tabChart->m_comboType->currentItem()] );

    m_currentState.setChartGridLines( m_tabChart->m_checkGridLines->isChecked() );
    m_currentState.setChartDataLabels( m_tabChart->m_checkValues->isChecked() );
    m_currentState.setChartByDefault( m_tabChart->m_checkShowChart->isChecked() );
    m_currentState.setChartLineWidth( m_tabChart->m_lineWidth->value() );
  }

  // setup the date lock
  MyMoneyTransactionFilter::dateOptionE range = m_dateRange->currentItem();
  m_currentState.setDateFilter(range);

  done(true);
}

void KReportConfigurationFilterDlg::slotRowTypeChanged(int row)
{
  m_tab2->m_checkTotalColumn->setEnabled(row == 0);
}

void KReportConfigurationFilterDlg::slotColumnTypeChanged(int row)
{
  if(m_tab2->m_comboBudget->isEnabled() && row < 2) {
    m_tab2->m_comboColumns->setCurrentItem(2);
  }
}

void KReportConfigurationFilterDlg::slotReset(void)
{
  //
  // Set up the widget from the initial filter
  //
  m_currentState = m_initialState;

  //
  // Report Properties
  //

  m_tab1->m_editName->setText( m_initialState.name() );
  m_tab1->m_editComment->setText( m_initialState.comment() );
  m_tab1->m_checkCurrency->setChecked( m_initialState.isConvertCurrency() );
  m_tab1->m_checkFavorite->setChecked( m_initialState.isFavorite() );

  if ( m_tab2 )
  {
    switch ( m_initialState.detailLevel() )
    {
    case MyMoneyReport::eDetailNone:
    case MyMoneyReport::eDetailEnd:
    case MyMoneyReport::eDetailAll:
      m_tab2->m_comboDetail->setCurrentItem(0);
      break;
    case MyMoneyReport::eDetailTop:
      m_tab2->m_comboDetail->setCurrentItem(1);
      break;
    case MyMoneyReport::eDetailGroup:
      m_tab2->m_comboDetail->setCurrentItem(2);
      break;
    case MyMoneyReport::eDetailTotal:
      m_tab2->m_comboDetail->setCurrentItem(3);
      break;
    }

    switch(m_initialState.rowType()) {
      case MyMoneyReport::eExpenseIncome:
      case MyMoneyReport::eBudget:
      case MyMoneyReport::eBudgetActual:
        m_tab2->m_comboRows->setCurrentItem(0); // income / expense
        break;
      default:
        m_tab2->m_comboRows->setCurrentItem(1); // asset / liability
        break;
    }
    m_tab2->m_checkTotalColumn->setChecked(m_initialState.isShowingRowTotals());

    slotRowTypeChanged(m_tab2->m_comboRows->currentItem());

    if ( m_initialState.isColumnsAreDays() )
    {
      switch ( m_initialState.columnType() )
      {
      case MyMoneyReport::eNoColumns:
      case MyMoneyReport::eDays:
        m_tab2->m_comboColumns->setCurrentItem(0);
        break;
      case MyMoneyReport::eWeeks:
        m_tab2->m_comboColumns->setCurrentItem(1);
        break;
      default:
        break;
      }
    }
    else
    {
      switch ( m_initialState.columnType() )
      {
      case MyMoneyReport::eNoColumns:
      case MyMoneyReport::eMonths:
        m_tab2->m_comboColumns->setCurrentItem(2);
        break;
      case MyMoneyReport::eBiMonths:
        m_tab2->m_comboColumns->setCurrentItem(3);
        break;
      case MyMoneyReport::eQuarters:
        m_tab2->m_comboColumns->setCurrentItem(4);
        break;
      case MyMoneyReport::eYears:
        m_tab2->m_comboColumns->setCurrentItem(5);
        break;
      default:
        break;
      }
    }

    //load budgets combo
    if(m_initialState.rowType() == MyMoneyReport::eBudget
    || m_initialState.rowType() == MyMoneyReport::eBudgetActual) {
      m_tab2->m_comboRows->setEnabled(false);
      m_tab2->m_budgetFrame->setEnabled(!m_budgets.empty());
      TQValueVector<MyMoneyBudget>::const_iterator it_b;
      int i = 0;
      for(it_b = m_budgets.begin(); it_b != m_budgets.end(); ++it_b) {
        m_tab2->m_comboBudget->insertItem((*it_b).name(), i);
        //set the current selected item
        if( (m_initialState.budget() == "Any" && (*it_b).budgetStart().year() == TQDate::currentDate().year())
             || m_initialState.budget() == (*it_b).id())
          m_tab2->m_comboBudget->setCurrentItem(i);
        i++;
      }
    }

    //set moving average days spinbox
    m_tab2->m_movingAverageDays->setEnabled( m_initialState.isIncludingMovingAverage() );
    if(m_initialState.isIncludingMovingAverage() ) {
      m_tab2->m_movingAverageDays->setValue( m_initialState.movingAverageDays() );
    }

    m_tab2->m_checkScheduled->setChecked( m_initialState.isIncludingSchedules() );
    m_tab2->m_checkTransfers->setChecked( m_initialState.isIncludingTransfers() );
    m_tab2->m_checkUnused->setChecked( m_initialState.isIncludingUnusedAccounts() );
  }
  else if ( m_tab3 )
  {
    switch ( m_initialState.rowType() )
    {
    case MyMoneyReport::eNoColumns:
    case MyMoneyReport::eCategory:
      m_tab3->m_comboOrganizeBy->setCurrentItem(0);
      break;
    case MyMoneyReport::eTopCategory:
      m_tab3->m_comboOrganizeBy->setCurrentItem(1);
      break;
    case MyMoneyReport::ePayee:
      m_tab3->m_comboOrganizeBy->setCurrentItem(2);
      break;
    case MyMoneyReport::eAccount:
      m_tab3->m_comboOrganizeBy->setCurrentItem(3);
      break;
    case MyMoneyReport::eTopAccount:
      m_tab3->m_comboOrganizeBy->setCurrentItem(4);
      break;
    case MyMoneyReport::eMonth:
      m_tab3->m_comboOrganizeBy->setCurrentItem(5);
      break;
    case MyMoneyReport::eWeek:
      m_tab3->m_comboOrganizeBy->setCurrentItem(6);
      break;
    default:
      throw new MYMONEYEXCEPTION("KReportConfigurationFilterDlg::slotReset(): QueryTable report has invalid rowtype");
    }

    unsigned qc = m_initialState.queryColumns();
    m_tab3->m_checkNumber->setChecked(qc & MyMoneyReport::eTQCnumber);
    m_tab3->m_checkPayee->setChecked(qc & MyMoneyReport::eTQCpayee);
    m_tab3->m_checkCategory->setChecked(qc & MyMoneyReport::eTQCcategory);
    m_tab3->m_checkMemo->setChecked(qc & MyMoneyReport::eTQCmemo);
    m_tab3->m_checkAccount->setChecked(qc & MyMoneyReport::eTQCaccount);
    m_tab3->m_checkReconciled->setChecked(qc & MyMoneyReport::eTQCreconciled);
    m_tab3->m_checkAction->setChecked(qc & MyMoneyReport::eTQCaction);
    m_tab3->m_checkShares->setChecked(qc & MyMoneyReport::eTQCshares);
    m_tab3->m_checkPrice->setChecked(qc & MyMoneyReport::eTQCprice);
    m_tab3->m_checkBalance->setChecked(qc & MyMoneyReport::eTQCbalance);

    m_tab3->m_checkTax->setChecked( m_initialState.isTax() );
    m_tab3->m_checkInvestments->setChecked( m_initialState.isInvestmentsOnly() );
    m_tab3->m_checkLoans->setChecked( m_initialState.isLoansOnly() );

    m_tab3->m_checkHideSplitDetails->setChecked
      (m_initialState.detailLevel() == MyMoneyReport::eDetailNone);
  }

  if ( m_tabChart )
  {
    switch( m_initialState.chartType() )
    {
      case MyMoneyReport::eChartNone:
      case MyMoneyReport::eChartLine:
        m_tabChart->m_comboType->setCurrentItem(0);
        break;
      case MyMoneyReport::eChartBar:
        m_tabChart->m_comboType->setCurrentItem(1);
        break;
      case MyMoneyReport::eChartStackedBar:
        m_tabChart->m_comboType->setCurrentItem(2);
        break;
      case MyMoneyReport::eChartPie:
        m_tabChart->m_comboType->setCurrentItem(3);
        break;
      case MyMoneyReport::eChartRing:
        m_tabChart->m_comboType->setCurrentItem(4);
        break;
      case MyMoneyReport::eChartEnd:
        throw new MYMONEYEXCEPTION("KReportConfigurationFilterDlg::slotReset(): Report has invalid charttype");
    }
    m_tabChart->m_checkGridLines->setChecked(m_initialState.isChartGridLines());
    m_tabChart->m_checkValues->setChecked(m_initialState.isChartDataLabels());
    m_tabChart->m_checkShowChart->setChecked(m_initialState.isChartByDefault());
    m_tabChart->m_lineWidth->setValue(m_initialState.chartLineWidth());
  }

  //
  // Text Filter
  //

  TQRegExp textfilter;
  if ( m_initialState.textFilter(textfilter))
  {
    m_textEdit->setText(textfilter.pattern());
    m_caseSensitive->setChecked(textfilter.caseSensitive());
    m_regExp->setChecked(!textfilter.wildcard());
    m_textNegate->setCurrentItem(m_initialState.isInvertingText());
  }

  //
  // Type & State Filters
  //

  int type;
  if ( m_initialState.firstType(type) )
    m_typeBox->setCurrentItem(type);

  int state;
  if ( m_initialState.firstState(state) )
    m_stateBox->setCurrentItem(state);

  //
  // Number Filter
  //

  TQString nrFrom, nrTo;
  if ( m_initialState.numberFilter(nrFrom, nrTo) )
  {
    if ( nrFrom == nrTo )
    {
      m_nrEdit->setEnabled(true);
      m_nrFromEdit->setEnabled(false);
      m_nrToEdit->setEnabled(false);
      m_nrEdit->setText(nrFrom);
      m_nrFromEdit->setText(TQString());
      m_nrToEdit->setText(TQString());
      m_nrButton->setChecked(true);
      m_nrRangeButton->setChecked(false);
    }
    else
    {
      m_nrEdit->setEnabled(false);
      m_nrFromEdit->setEnabled(true);
      m_nrToEdit->setEnabled(false);
      m_nrEdit->setText(TQString());
      m_nrFromEdit->setText(nrFrom);
      m_nrToEdit->setText(nrTo);
      m_nrButton->setChecked(false);
      m_nrRangeButton->setChecked(true);
    }
  }
  else
  {
    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);
  }

  //
  // Amount Filter
  //

  MyMoneyMoney from, to;
  if ( m_initialState.amountFilter(from,to) ) // bool getAmountFilter(MyMoneyMoney&,MyMoneyMoney&);
  {
    if ( from == to )
    {
      m_amountEdit->setEnabled(true);
      m_amountFromEdit->setEnabled(false);
      m_amountToEdit->setEnabled(false);
      m_amountEdit->loadText(TQString::number(from.toDouble()));
      m_amountFromEdit->loadText(TQString());
      m_amountToEdit->loadText(TQString());
      m_amountButton->setChecked(true);
      m_amountRangeButton->setChecked(false);
    }
    else
    {
      m_amountEdit->setEnabled(false);
      m_amountFromEdit->setEnabled(true);
      m_amountToEdit->setEnabled(true);
      m_amountEdit->loadText(TQString());
      m_amountFromEdit->loadText(TQString::number(from.toDouble()));
      m_amountToEdit->loadText(TQString::number(to.toDouble()));
      m_amountButton->setChecked(false);
      m_amountRangeButton->setChecked(true);
    }
  }
  else
  {
    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);
  }

  //
  // Payees Filter
  //

  TQStringList payees;
  if ( m_initialState.payees(payees) )
  {
    if ( payees.empty() )
    {
      m_emptyPayeesButton->setChecked(true);
    }
    else
    {
      selectAllItems(m_payeesView, false);
      selectItems(m_payeesView,payees,true);
    }
  }
  else
  {
    selectAllItems(m_payeesView, true);
  }

  //
  // Accounts Filter
  //

  TQStringList accounts;
  if ( m_initialState.accounts(accounts) )
  {
    m_accountsView->selectAllItems(false);
    m_accountsView->selectItems(accounts,true);
  }
  else
    m_accountsView->selectAllItems(true);

  //
  // Categories Filter
  //

  if ( m_initialState.categories(accounts) )
  {
    m_categoriesView->selectAllItems(false);
    m_categoriesView->selectItems(accounts,true);
  }
  else
    m_categoriesView->selectAllItems(true);

  //
  // Date Filter
  //

  // the following call implies a call to slotUpdateSelections,
  // that's why we call it last

  m_initialState.updateDateFilter();
  TQDate dateFrom, dateTo;
  if ( m_initialState.dateFilter( dateFrom, dateTo ) )
  {
    if(m_initialState.isUserDefined()) {
      m_dateRange->setCurrentItem(MyMoneyTransactionFilter::userDefined);
      m_fromDate->setDate(dateFrom);
      m_toDate->setDate(dateTo);
    } else {
      m_fromDate->setDate(dateFrom);
      m_toDate->setDate(dateTo);
      KFindTransactionDlg::slotDateChanged();
    }
  }
  else
  {
    m_dateRange->setCurrentItem(MyMoneyTransactionFilter::allDates);
    slotDateRangeChanged(MyMoneyTransactionFilter::allDates);
  }

  slotRightSize();
}

void KReportConfigurationFilterDlg::slotDateChanged(void)
{
  if(m_dateRange->currentItem() != MyMoneyTransactionFilter::userDefined) {
    KFindTransactionDlg::slotDateChanged();
  }
  slotUpdateSelections();
}

void KReportConfigurationFilterDlg::slotShowHelp(void)
{
  kapp->invokeHelp("details.reports.config");
}

//TODO Fix the reports and engine to include transfers even if categories are filtered - bug #1523508
void KReportConfigurationFilterDlg::slotUpdateCheckTransfers(void)
{
  if(!m_categoriesView->allItemsSelected()) {
    m_tab2->m_checkTransfers->setChecked(false);
    m_tab2->m_checkTransfers->setDisabled(true);
  } else {
    m_tab2->m_checkTransfers->setEnabled(true);
  }
}

#include "kreportconfigurationfilterdlg.moc"
