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/views/kscheduledlistitem.cpp

232 lines
6.9 KiB

/***************************************************************************
kscheduledlistitem.cpp - description
-------------------
begin : Sun Jan 27 2002
copyright : (C) 2000-2002 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>
***************************************************************************/
/***************************************************************************
* *
* 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 <tqpainter.h>
#include <tqstyle.h>
// ----------------------------------------------------------------------------
// KDE Includes
#include <tdeconfig.h>
#include <klocale.h>
#include <kglobal.h>
#include <kglobalsettings.h>
// ----------------------------------------------------------------------------
// Project Includes
#include "kscheduledlistitem.h"
#include "../mymoney/mymoneyfile.h"
#include "../kmymoneyglobalsettings.h"
#include "../kmymoneyutils.h"
KScheduledListItem::KScheduledListItem(TDEListView *parent, const TQString& name, const TQPixmap& pixmap, const TQString& sortKey) :
TDEListViewItem(parent, name),
m_sortKey(sortKey)
{
setPixmap(0, pixmap);
if(m_sortKey.isEmpty())
m_sortKey = name;
}
KScheduledListItem::KScheduledListItem(KScheduledListItem *parent, const MyMoneySchedule& schedule/*, bool even*/)
: TDEListViewItem(parent)
{
m_schedule = schedule;
m_sortKey = schedule.name();
setPixmap(0, KMyMoneyUtils::scheduleIcon(KIcon::Small));
try
{
MyMoneyTransaction transaction = schedule.transaction();
MyMoneySplit s1 = transaction.splits()[0];
MyMoneySplit s2 = transaction.splits()[1];
TQValueList<MyMoneySplit>::ConstIterator it_s;
MyMoneySplit split;
MyMoneyAccount acc;
switch(schedule.type()) {
case MyMoneySchedule::TYPE_DEPOSIT:
if (s1.value().isNegative())
split = s2;
else
split = s1;
break;
case MyMoneySchedule::TYPE_LOANPAYMENT:
for(it_s = transaction.splits().begin(); it_s != transaction.splits().end(); ++it_s) {
acc = MyMoneyFile::instance()->account((*it_s).accountId());
if(acc.accountGroup() == MyMoneyAccount::Asset
|| acc.accountGroup() == MyMoneyAccount::Liability) {
if(acc.accountType() != MyMoneyAccount::Loan
&& acc.accountType() != MyMoneyAccount::AssetLoan) {
split = *it_s;
break;
}
}
}
if(it_s == transaction.splits().end()) {
tqFatal("Split for payment account not found in %s:%d.", __FILE__, __LINE__);
}
break;
default:
if (!s1.value().isPositive())
split = s1;
else
split = s2;
break;
}
acc = MyMoneyFile::instance()->account(split.accountId());
/*
if (schedule.type() == MyMoneySchedule::TYPE_DEPOSIT)
{
if (s1.value() >= 0)
split = s1;
else
split = s2;
}
else if(schedule.type() == MyMoneySchedule::TYPE_LOANPAYMENT)
{
}
else
{
if (s1.value() < 0)
split = s1;
else
split = s2;
}
*/
setText(0, schedule.name());
MyMoneySecurity currency = MyMoneyFile::instance()->currency(acc.currencyId());
setText(1, acc.name());
if(!s1.payeeId().isEmpty())
setText(2, MyMoneyFile::instance()->payee(s1.payeeId()).name());
else
setText(2, "---");
m_amount = split.shares().abs();
setText(3, TQString("%1 ").arg(m_amount.formatMoney(acc, currency)));
// Do the real next payment like ms-money etc
if (schedule.isFinished())
{
setText(4, i18n("Finished"));
}
else
setText(4, TDEGlobal::locale()->formatDate(schedule.adjustedNextDueDate(), true));
setText(5, i18n(schedule.occurenceToString()));
setText(6, KMyMoneyUtils::paymentMethodToString(schedule.paymentType()));
}
catch (MyMoneyException *e)
{
setText(0, "Error:");
setText(1, e->what());
delete e;
}
}
KScheduledListItem::~KScheduledListItem()
{
}
void KScheduledListItem::paintCell(TQPainter* p, const TQColorGroup& cg, int column, int width, int align)
{
TQColorGroup cg2(cg);
TQColor textColour = TDEGlobalSettings::textColor();
TQFont cellFont = KMyMoneyGlobalSettings::listCellFont();
// avoid colorizing lines that do not contain a schedule
if(!m_schedule.id().isEmpty()) {
if (m_schedule.isFinished())
textColour = TQt::darkGreen;
else if (m_schedule.isOverdue())
textColour = TQt::red;
}
cg2.setColor(TQColorGroup::Text, textColour);
// display group items in bold
if (!parent())
cellFont.setBold(true);
p->setFont(cellFont);
if (isAlternate())
cg2.setColor(TQColorGroup::Base, KMyMoneyGlobalSettings::listColor());
else
cg2.setColor(TQColorGroup::Base, KMyMoneyGlobalSettings::listBGColor());
TQListViewItem::paintCell(p, cg2, column, width, align);
}
int KScheduledListItem::compare(TQListViewItem* i, int col, bool ascending) const
{
KScheduledListItem* item = dynamic_cast<KScheduledListItem*>(i);
int rc;
// do special sorting only if
// a) date
// b) amount
// c) name/group
// d) occurence
// in all other cases use the standard sorting
MyMoneyMoney diff;
switch(col) {
case 0: // type and name
rc = m_sortKey.compare(item->m_sortKey);
break;
case 3: // amount
diff = m_amount - item->m_amount;
if(diff.isZero())
rc = 0;
else if(diff.isPositive())
rc = 1;
else
rc = -1;
break;
case 4: // date
rc = item->m_schedule.adjustedNextDueDate().daysTo(m_schedule.adjustedNextDueDate());
break;
case 5: // occurence
rc = (m_schedule.occurence() - item->m_schedule.occurence());
break;
default:
rc = TDEListViewItem::compare(i, col, ascending);
break;
}
// adjust to [-1..1]
if(rc != 0) {
rc = (rc > 0) ? 1 : -1;
}
return rc;
}