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.
295 lines
9.2 KiB
295 lines
9.2 KiB
/***************************************************************************
|
|
kinvestmentlistitem.cpp - description
|
|
-------------------
|
|
begin : Wed Feb 6 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>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// KDE Includes
|
|
|
|
#include <klistview.h>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Project Includes
|
|
|
|
#include <kmymoney/kmymoneyglobalsettings.h>
|
|
|
|
#include "kinvestmentlistitem.h"
|
|
|
|
#include <kmymoney/mymoneysecurity.h>
|
|
#include <kmymoney/mymoneyfile.h>
|
|
|
|
KInvestmentListItem::KInvestmentListItem(KListView* parent, const MyMoneyAccount& account)
|
|
: KListViewItem(parent)
|
|
{
|
|
bColumn5Negative = false;
|
|
bColumn6Negative = false;
|
|
bColumn7Negative = false;
|
|
bColumn8Negative = false;
|
|
bColumn9Negative = false;
|
|
|
|
m_account = account;
|
|
m_listView = parent;
|
|
|
|
MyMoneySecurity security;
|
|
MyMoneyFile* file = MyMoneyFile::instance();
|
|
|
|
security = file->security(m_account.currencyId());
|
|
m_tradingCurrency = file->security(security.tradingCurrency());
|
|
|
|
int prec = MyMoneyMoney::denomToPrec(m_tradingCurrency.smallestAccountFraction());
|
|
|
|
TQValueList<MyMoneyTransaction> transactionList;
|
|
// FIXME PRICE
|
|
// equity_price_history history = equity.priceHistory();
|
|
|
|
//column 0 (COLUMN_NAME_INDEX) is the name of the stock
|
|
setText(COLUMN_NAME_INDEX, m_account.name());
|
|
|
|
//column 1 (COLUMN_SYMBOL_INDEX) is the ticker symbol
|
|
setText(COLUMN_SYMBOL_INDEX, security.tradingSymbol());
|
|
|
|
//column 2 is the net value (price * quantity owned)
|
|
MyMoneyPrice price = file->price(m_account.currencyId(), m_tradingCurrency.id());
|
|
if(price.isValid()) {
|
|
setText(COLUMN_VALUE_INDEX, (file->balance(m_account.id()) * price.rate(m_tradingCurrency.id())).formatMoney(m_tradingCurrency.tradingSymbol(), prec));
|
|
} else {
|
|
setText(COLUMN_VALUE_INDEX, "---");
|
|
}
|
|
|
|
//column 3 (COLUMN_QUANTITY_INDEX) is the quantity of shares owned
|
|
prec = MyMoneyMoney::denomToPrec(security.smallestAccountFraction());
|
|
setText(COLUMN_QUANTITY_INDEX, file->balance(m_account.id()).formatMoney("", prec));
|
|
|
|
//column 4 is the current price
|
|
// Get the price precision from the configuration
|
|
prec = KMyMoneyGlobalSettings::pricePrecision();
|
|
|
|
// prec = MyMoneyMoney::denomToPrec(m_tradingCurrency.smallestAccountFraction());
|
|
if(price.isValid()) {
|
|
setText(COLUMN_PRICE_INDEX, price.rate(m_tradingCurrency.id()).formatMoney(m_tradingCurrency.tradingSymbol(), prec));
|
|
} else {
|
|
setText(COLUMN_PRICE_INDEX, "---");
|
|
}
|
|
}
|
|
|
|
KInvestmentListItem::~KInvestmentListItem()
|
|
{
|
|
}
|
|
|
|
// FIXME PRICE
|
|
#if 0
|
|
const TQString KInvestmentListItem::calculate1WeekGain(const equity_price_history& history)
|
|
{
|
|
return calculateGain(history, -7, 0, false, bColumn6Negative);
|
|
}
|
|
|
|
const TQString KInvestmentListItem::calculate4WeekGain(const equity_price_history& history)
|
|
{
|
|
return calculateGain(history, -28, 0, false, bColumn7Negative);
|
|
}
|
|
|
|
const TQString KInvestmentListItem::calculate3MonthGain(const equity_price_history& history)
|
|
{
|
|
return calculateGain(history, 0, -3, false, bColumn8Negative);
|
|
}
|
|
|
|
const TQString KInvestmentListItem::calculateYTDGain(const equity_price_history& history)
|
|
{
|
|
return calculateGain(history, 0, 0, true, bColumn9Negative);
|
|
}
|
|
|
|
const TQString KInvestmentListItem::calculateGain(const equity_price_history& history, int dayDifference, int monthDifference, bool YTD, bool& bNegative)
|
|
{
|
|
bNegative = false;
|
|
if(history.isEmpty())
|
|
{
|
|
return TQString("0.0%");
|
|
}
|
|
else
|
|
{
|
|
bool bFoundCurrent = false, bFoundComparison = false;
|
|
TQDate tempDate, comparisonDate = TQDate::tqcurrentDate();
|
|
|
|
if(YTD)
|
|
{
|
|
//if it is YTD, set the date to 01/01/<current year>
|
|
comparisonDate.setYMD(comparisonDate.year(), 1, 1);
|
|
}
|
|
else
|
|
{
|
|
comparisonDate = comparisonDate.addDays(dayDifference);
|
|
comparisonDate = comparisonDate.addMonths(monthDifference);
|
|
}
|
|
|
|
MyMoneyMoney comparisonValue, currentValue;
|
|
|
|
//find the current value, or closest to the current value.
|
|
equity_price_history::ConstIterator itToday = history.end();
|
|
for(tempDate = TQDate::tqcurrentDate(); tempDate >= comparisonDate; )
|
|
{
|
|
itToday = history.find(tempDate);
|
|
if(itToday != history.end())
|
|
{
|
|
currentValue = itToday.data();
|
|
bFoundCurrent = true;
|
|
break;
|
|
}
|
|
|
|
tempDate = tempDate.addDays(-1);
|
|
}
|
|
|
|
if(!bFoundCurrent)
|
|
{
|
|
return TQString("0.0%");
|
|
}
|
|
|
|
//find a date that is closest to a week old, not older, and not today's date. Because its a TQMap, this map
|
|
//should already be sorted earliest to latest.
|
|
for(equity_price_history::ConstIterator it = history.begin(); it != history.end(); ++it)
|
|
{
|
|
if(it.key() >= comparisonDate && it.key() < TQDate::tqcurrentDate())
|
|
{
|
|
comparisonDate = it.key();
|
|
comparisonValue = it.data();
|
|
bFoundComparison = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!bFoundComparison)
|
|
{
|
|
return TQString("0.0%");
|
|
}
|
|
|
|
//qDebug("Current date/value to use is %s/%s, Previous is %s/%s", tempDate.toString().data(), currentValue.toString().data(), comparisonDate.toString().data(), comparisonValue.toString().data());
|
|
|
|
//compute the percentage difference
|
|
if(comparisonValue != currentValue)
|
|
{
|
|
double result = (currentValue.toDouble() / comparisonValue.toDouble()) * 100.0;
|
|
result -= 100.0;
|
|
if(result < 0.0)
|
|
{
|
|
bNegative = true;
|
|
}
|
|
|
|
TQString ds = TQString("%1%").tqarg(result, 0, 'f', 3);
|
|
return ds;
|
|
|
|
/*MyMoneyMoney result = (currentValue / comparisonValue);
|
|
result = result * 100;
|
|
result = result - 100;
|
|
qDebug("final result = %s", result.toString().data());
|
|
return TQString(result.formatMoney("", 3) + "%");*/
|
|
}
|
|
}
|
|
return TQString("");
|
|
}
|
|
#endif
|
|
|
|
int KInvestmentListItem::compare(TQListViewItem* i, int col, bool ascending) const
|
|
{
|
|
KInvestmentListItem* item = dynamic_cast<KInvestmentListItem*>(i);
|
|
// do special sorting only for numeric columns
|
|
// in all other cases use the standard sorting
|
|
if(item) {
|
|
switch(col) {
|
|
case COLUMN_VALUE_INDEX:
|
|
case COLUMN_QUANTITY_INDEX:
|
|
case COLUMN_PRICE_INDEX:
|
|
{
|
|
bool inv1 = text(col) == "---";
|
|
bool inv2 = item->text(col) == "---";
|
|
if(!inv1 && !inv2) {
|
|
MyMoneyMoney result = MyMoneyMoney(text(col)) - MyMoneyMoney(item->text(col));
|
|
if(result.isNegative())
|
|
return -1;
|
|
if(result.isZero())
|
|
return 0;
|
|
return 1;
|
|
} else if(inv1 && inv2) {
|
|
return 0;
|
|
} else if(inv1) {
|
|
return -1;
|
|
}
|
|
return 1;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// do standard sorting here
|
|
return KListViewItem::compare(i, col, ascending);
|
|
}
|
|
|
|
void KInvestmentListItem::paintCell(TQPainter * p, const TQColorGroup & cg, int column, int width, int align)
|
|
{
|
|
bool bPaintRed = false;
|
|
if((column == COLUMN_RAWGAIN_INDEX && bColumn5Negative) ||
|
|
(column == COLUMN_1WEEKGAIN_INDEX && bColumn6Negative) ||
|
|
(column == COLUMN_4WEEKGAIN_INDEX && bColumn7Negative) ||
|
|
(column == COLUMN_3MONGAIN_INDEX && bColumn8Negative) ||
|
|
(column == COLUMN_YTDGAIN_INDEX && bColumn9Negative))
|
|
{
|
|
bPaintRed = true;
|
|
}
|
|
|
|
p->save();
|
|
|
|
TQColorGroup cg2(cg);
|
|
|
|
if(isAlternate())
|
|
cg2.setColor(TQColorGroup::Base, KMyMoneyGlobalSettings::listColor());
|
|
else
|
|
cg2.setColor(TQColorGroup::Base, KMyMoneyGlobalSettings::listBGColor());
|
|
|
|
#ifndef KMM_DESIGNER
|
|
TQFont font = KMyMoneyGlobalSettings::listCellFont();
|
|
// strike out closed accounts
|
|
if(m_account.isClosed())
|
|
font.setStrikeOut(true);
|
|
|
|
p->setFont(font);
|
|
#endif
|
|
|
|
if(bPaintRed)
|
|
{
|
|
TQColorGroup _cg( cg2);
|
|
TQColor c = _cg.text();
|
|
_cg.setColor(TQColorGroup::Text, TQt::red);
|
|
TQListViewItem::paintCell(p, _cg, column, width, align);
|
|
_cg.setColor(TQColorGroup::Text, c);
|
|
}
|
|
else
|
|
{
|
|
TQListViewItem::paintCell(p, cg2, column, width, align);
|
|
}
|
|
|
|
p->restore();
|
|
}
|