/*************************************************************************** kbudgetvalues - description ------------------- begin : Wed Nov 28 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart <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. * * * ***************************************************************************/ // ---------------------------------------------------------------------------- // QT Includes #include <tqtabwidget.h> #include <tqlabel.h> #include <tqbuttongroup.h> #include <tqradiobutton.h> #include <tqwidgetstack.h> #include <tqtimer.h> #include <tqtooltip.h> #include <tqapplication.h> // ---------------------------------------------------------------------------- // KDE Includes #include <kglobal.h> #include <klocale.h> #include <kcalendarsystem.h> #include <kmessagebox.h> #include <kpushbutton.h> #include <kstdguiitem.h> // ---------------------------------------------------------------------------- // Project Includes #include "kbudgetvalues.h" #include <kmymoney/kmymoneyedit.h> KBudgetValues::KBudgetValues(TQWidget* parent, const char* name) : KBudgetValuesDecl(parent, name), m_currentTab(m_monthlyButton) { m_budgetDate = TQDate(2007,1,1); m_field[0] = m_amount1; m_field[1] = m_amount2; m_field[2] = m_amount3; m_field[3] = m_amount4; m_field[4] = m_amount5; m_field[5] = m_amount6; m_field[6] = m_amount7; m_field[7] = m_amount8; m_field[8] = m_amount9; m_field[9] = m_amount10; m_field[10] = m_amount11; m_field[11] = m_amount12; m_label[0] = m_label1; m_label[1] = m_label2; m_label[2] = m_label3; m_label[3] = m_label4; m_label[4] = m_label5; m_label[5] = m_label6; m_label[6] = m_label7; m_label[7] = m_label8; m_label[8] = m_label9; m_label[9] = m_label10; m_label[10] = m_label11; m_label[11] = m_label12; // fill with standard labels m_monthlyButton->setChecked(true); slotChangePeriod(m_periodGroup->id(m_monthlyButton)); // connect(m_budgetLevel, TQT_SIGNAL(currentChanged(TQWidget*)), this, TQT_SIGNAL(valuesChanged())); connect(m_amountMonthly, TQT_SIGNAL(valueChanged(const TQString&)), this, TQT_SLOT(slotNeedUpdate())); connect(m_amountYearly, TQT_SIGNAL(valueChanged(const TQString&)), this, TQT_SLOT(slotNeedUpdate())); m_amountMonthly->installEventFilter(this); m_amountYearly->installEventFilter(this); for(int i=0; i < 12; ++i) { connect(m_field[i], TQT_SIGNAL(valueChanged(const TQString&)), this, TQT_SLOT(slotNeedUpdate())); m_field[i]->installEventFilter(this); } connect(m_clearButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotClearAllValues())); connect(m_periodGroup, TQT_SIGNAL(clicked(int)), this, TQT_SLOT(slotChangePeriod(int))); connect(this, TQT_SIGNAL(valuesChanged()), this, TQT_SLOT(slotUpdateClearButton())); KGuiItem clearItem(KStdGuiItem::clear()); m_clearButton->setGuiItem(clearItem); m_clearButton->setText(""); TQToolTip::add(m_clearButton, clearItem.toolTip()); } KBudgetValues::~KBudgetValues() { } bool KBudgetValues::eventFilter(TQObject* o, TQEvent* e) { bool rc = false; if(o->isWidgetType() && (e->type() == TQEvent::KeyPress)) { TQKeyEvent* k = dynamic_cast<TQKeyEvent*>(e); if((k->state() & TQt::KeyButtonMask) == 0) { TQKeyEvent evt(e->type(), TQt::Key_Tab, 0, k->state(), TQString(), k->isAutoRepeat(), k->count()); switch(k->key()) { case TQt::Key_Return: case TQt::Key_Enter: // send out a TAB key event TQApplication::sendEvent( o, &evt ); // don't process this one any further rc = true; break; default: break; } } } return rc; } void KBudgetValues::clear(void) { blockSignals(true); for(int i=0; i < 12; ++i) m_field[i]->setValue(MyMoneyMoney()); m_amountMonthly->setValue(MyMoneyMoney()); m_amountYearly->setValue(MyMoneyMoney()); blockSignals(false); } void KBudgetValues::slotClearAllValues(void) { TQWidget* tab = m_periodGroup->selected(); if(tab == m_monthlyButton) { m_amountMonthly->setValue(MyMoneyMoney()); } else if(tab == m_yearlyButton) { m_amountYearly->setValue(MyMoneyMoney()); } else if(tab == m_individualButton) { for(int i=0; i < 12; ++i) m_field[i]->setValue(MyMoneyMoney()); } emit valuesChanged(); } void KBudgetValues::slotChangePeriod(int id) { // Prevent a recursive entry of this method due to widget changes // performed during execution of this method static bool inside = false; if(inside) return; inside = true; TQWidget *tab = m_periodGroup->find(id); fillMonthLabels(); MyMoneyMoney newValue; if(tab == m_monthlyButton) { m_firstItemStack->raiseWidget(m_monthlyPage); enableMonths(false); m_label[0]->setText(" "); if(m_amountMonthly->value().isZero()) { if(m_currentTab == m_yearlyButton) { newValue = (m_amountYearly->value() / MyMoneyMoney(12, 1)).convert(); } else if(m_currentTab == m_individualButton) { for(int i=0; i < 12; ++i) newValue += m_field[i]->value(); newValue = (newValue / MyMoneyMoney(12, 1)).convert(); } if(!newValue.isZero()) { if(KMessageBox::questionYesNo(this, TQString("<qt>")+i18n("You have entered budget values using a different base which would result in a monthly budget of <b>%1</b>. Should this value be used to fill the monthly budget?").tqarg(newValue.formatMoney("", 2))+TQString("</qt>"), i18n("Auto assignment (caption)", "Auto assignment"), KStdGuiItem::yes(), KStdGuiItem::no(), "use_previous_budget_values") == KMessageBox::Yes) { m_amountMonthly->setValue(newValue); } } } } else if(tab == m_yearlyButton) { m_firstItemStack->raiseWidget(m_yearlyPage); enableMonths(false); m_label[0]->setText(" "); if(m_amountYearly->value().isZero()) { if(m_currentTab == m_monthlyButton) { newValue = (m_amountMonthly->value() * MyMoneyMoney(12, 1)).convert(); } else if(m_currentTab == m_individualButton) { for(int i=0; i < 12; ++i) newValue += m_field[i]->value(); } if(!newValue.isZero()) { if(KMessageBox::questionYesNo(this, TQString("<qt>")+i18n("You have entered budget values using a different base which would result in a yearly budget of <b>%1</b>. Should this value be used to fill the monthly budget?").tqarg(newValue.formatMoney("", 2))+TQString("</qt>"), i18n("Auto assignment (caption)", "Auto assignment"), KStdGuiItem::yes(), KStdGuiItem::no(), "use_previous_budget_values") == KMessageBox::Yes) { m_amountYearly->setValue(newValue); } } } } else if(tab == m_individualButton) { m_firstItemStack->raiseWidget(m_individualPage); enableMonths(true); for(int i=0; i < 12; ++i) newValue += m_field[i]->value(); if(newValue.isZero()) { if(m_currentTab == m_monthlyButton) { newValue = m_amountMonthly->value(); } else if(m_currentTab == m_yearlyButton) { newValue = (m_amountYearly->value() / MyMoneyMoney(12, 1)).convert(); } if(!newValue.isZero()) { if(KMessageBox::questionYesNo(this, TQString("<qt>")+i18n("You have entered budget values using a different base which would result in an individual monthly budget of <b>%1</b>. Should this value be used to fill the monthly budgets?").tqarg(newValue.formatMoney("", 2))+TQString("</qt>"), i18n("Auto assignment (caption)", "Auto assignment"), KStdGuiItem::yes(), KStdGuiItem::no(), "use_previous_budget_values") == KMessageBox::Yes) { for(int i=0; i < 12; ++i) m_field[i]->setValue(newValue); } } } } slotNeedUpdate(); m_currentTab = tab; inside = false; } void KBudgetValues::slotNeedUpdate(void) { if(!signalsBlocked()) TQTimer::singleShot(0, this, TQT_SIGNAL(valuesChanged())); } void KBudgetValues::enableMonths(bool enabled) { for(int i = 1; i < 12; ++i) { m_label[i]->setEnabled(enabled); m_field[i]->setEnabled(enabled); } } void KBudgetValues::fillMonthLabels(void) { TQDate date(m_budgetDate); for(int i = 0; i < 12; ++i) { m_label[i]->setText(KGlobal::locale()->calendar()->monthName(date, true)); date = date.addMonths(1); } } void KBudgetValues::setBudgetValues(const MyMoneyBudget& budget, const MyMoneyBudget::AccountGroup& budgetAccount) { MyMoneyBudget::PeriodGroup period; m_budgetDate = budget.budgetStart(); TQDate date; // make sure all values are zero so that slotChangePeriod() // doesn't check for anything. clear(); blockSignals(true); switch(budgetAccount.budgetLevel()) { case MyMoneyBudget::AccountGroup::eMonthly: default: m_monthlyButton->setChecked(true); slotChangePeriod(m_periodGroup->id(m_monthlyButton)); m_amountMonthly->setValue(budgetAccount.period(m_budgetDate).amount()); break; case MyMoneyBudget::AccountGroup::eYearly: m_yearlyButton->setChecked(true); slotChangePeriod(m_periodGroup->id(m_yearlyButton)); m_amountYearly->setValue(budgetAccount.period(m_budgetDate).amount()); break; case MyMoneyBudget::AccountGroup::eMonthByMonth: m_individualButton->setChecked(true); slotChangePeriod(m_periodGroup->id(m_individualButton)); date.setYMD(m_budgetDate.year(), 1, 1); for(int i = 0; i < 12; ++i) { m_field[i]->setValue(budgetAccount.period(date).amount()); date = date.addMonths(1); } break; } slotUpdateClearButton(); blockSignals(false); } void KBudgetValues::budgetValues(const MyMoneyBudget& budget, MyMoneyBudget::AccountGroup& budgetAccount) { MyMoneyBudget::PeriodGroup period; m_budgetDate = budget.budgetStart(); period.setStartDate(m_budgetDate); TQDate date; budgetAccount.clearPeriods(); if(m_periodGroup->selected() == m_monthlyButton) { budgetAccount.setBudgetLevel(MyMoneyBudget::AccountGroup::eMonthly); period.setAmount(m_amountMonthly->value()); budgetAccount.addPeriod(m_budgetDate, period); } else if(m_periodGroup->selected() == m_yearlyButton) { budgetAccount.setBudgetLevel(MyMoneyBudget::AccountGroup::eYearly); period.setAmount(m_amountYearly->value()); budgetAccount.addPeriod(m_budgetDate, period); } else if(m_periodGroup->selected() == m_individualButton) { budgetAccount.setBudgetLevel(MyMoneyBudget::AccountGroup::eMonthByMonth); date.setYMD(m_budgetDate.year(), 1, 1); for(int i = 0; i < 12; ++i) { period.setStartDate(date); period.setAmount(m_field[i]->value()); budgetAccount.addPeriod(date, period); date = date.addMonths(1); } } } void KBudgetValues::slotUpdateClearButton(void) { bool rc = false; if(m_periodGroup->selected() == m_monthlyButton) { rc = !m_amountMonthly->value().isZero(); } else if(m_periodGroup->selected() == m_yearlyButton) { rc = !m_amountYearly->value().isZero(); } else if(m_periodGroup->selected() == m_individualButton) { for(int i = 0; (i < 12) && (rc == false); ++i) { rc |= !m_field[i]->value().isZero(); } } m_clearButton->setEnabled(rc); } #include "kbudgetvalues.moc"