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.
344 lines
11 KiB
344 lines
11 KiB
/***************************************************************************
|
|
kmymoneypriceview.cpp - description
|
|
-------------------
|
|
begin : Wed Mar 24 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>
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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 <tqheader.h>
|
|
#include <tqcursor.h>
|
|
#include <tqtimer.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqgroupbox.h>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// KDE Includes
|
|
|
|
#include <klocale.h>
|
|
#include <kglobal.h>
|
|
#include <klistview.h>
|
|
#include <kiconloader.h>
|
|
#include <kconfig.h>
|
|
#include <kmessagebox.h>
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Project Includes
|
|
|
|
#include "kmymoneypriceview.h"
|
|
#include <kmymoney/mymoneysecurity.h>
|
|
#include <kmymoney/mymoneyfile.h>
|
|
#include "../kmymoneyglobalsettings.h"
|
|
#if 0
|
|
#include "../widgets/kmymoneycurrencyselector.h"
|
|
#include "../dialogs/kupdatestockpricedlg.h"
|
|
#include "../dialogs/kcurrencycalculator.h"
|
|
#include "../dialogs/kequitypriceupdatedlg.h"
|
|
#include "../kmymoneyutils.h"
|
|
#include "../mymoney/mymoneyfile.h"
|
|
#endif
|
|
|
|
#define COMMODITY_COL 0
|
|
#define CURRENCY_COL 1
|
|
#define DATE_COL 2
|
|
#define PRICE_COL 3
|
|
#define SOURCE_COL 4
|
|
|
|
KMyMoneyPriceItem::KMyMoneyPriceItem(KListView *view, const MyMoneyPrice& pr) :
|
|
KMyMoneyListViewItem(view, TQString(), TQString(), TQString()),
|
|
m_pr(pr)
|
|
{
|
|
MyMoneySecurity from, to;
|
|
KConfig *kconfig = KGlobal::config();
|
|
kconfig->setGroup("General Options");
|
|
int prec = kconfig->readNumEntry("PricePrecision", 4);
|
|
|
|
if(!m_pr.isValid())
|
|
m_pr = MyMoneyFile::instance()->price(m_pr.from(), m_pr.to(), m_pr.date());
|
|
|
|
if(m_pr.isValid()) {
|
|
TQString priceBase = m_pr.to();
|
|
from = MyMoneyFile::instance()->security(m_pr.from());
|
|
to = MyMoneyFile::instance()->security(m_pr.to());
|
|
if(!to.isCurrency()) {
|
|
from = MyMoneyFile::instance()->security(m_pr.to());
|
|
to = MyMoneyFile::instance()->security(m_pr.from());
|
|
priceBase = m_pr.from();
|
|
}
|
|
|
|
setText(COMMODITY_COL, (from.isCurrency()) ? from.id() : from.tradingSymbol());
|
|
setText(CURRENCY_COL, to.id());
|
|
setText(DATE_COL, KGlobal::locale()->formatDate(m_pr.date(), true));
|
|
setText(PRICE_COL, m_pr.rate(priceBase).formatMoney("", prec));
|
|
setText(SOURCE_COL, m_pr.source());
|
|
}
|
|
}
|
|
|
|
int KMyMoneyPriceItem::compare(TQListViewItem* i, int col, bool ascending) const
|
|
{
|
|
KMyMoneyPriceItem* item = static_cast<KMyMoneyPriceItem*>(i);
|
|
int rc = 0;
|
|
|
|
switch(col) {
|
|
case DATE_COL: // date
|
|
if(m_pr.date() > item->m_pr.date())
|
|
rc = 1;
|
|
else if(m_pr.date() < item->m_pr.date())
|
|
rc = -1;
|
|
break;
|
|
|
|
case PRICE_COL: // value
|
|
if(m_pr.rate(TQString()) > item->m_pr.rate(TQString()))
|
|
rc = 1;
|
|
else if(m_pr.rate(TQString()) < item->m_pr.rate(TQString()))
|
|
rc = -1;
|
|
break;
|
|
|
|
default:
|
|
rc = TQListViewItem::compare(i, col, ascending);
|
|
break;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
KMyMoneyPriceView::KMyMoneyPriceView(TQWidget *parent, const char *name ) :
|
|
KListView(parent,name),
|
|
m_contextMenu(0),
|
|
m_showAll(false)
|
|
{
|
|
addColumn(i18n("Commodity"));
|
|
addColumn(i18n("Currency"));
|
|
addColumn(i18n("Date"));
|
|
addColumn(i18n("Price"));
|
|
addColumn(i18n("Source"));
|
|
setAllColumnsShowFocus(true);
|
|
setMultiSelection(false);
|
|
setColumnWidthMode(0, TQListView::Maximum);
|
|
setColumnWidthMode(1, TQListView::Maximum);
|
|
setShowSortIndicator(true);
|
|
setSorting(COMMODITY_COL);
|
|
|
|
header()->setFont(KMyMoneyGlobalSettings::listHeaderFont());
|
|
|
|
KIconLoader *kiconloader = KGlobal::iconLoader();
|
|
|
|
m_contextMenu = new KPopupMenu(this);
|
|
m_contextMenu->insertTitle(i18n("Price Options"));
|
|
m_contextMenu->insertItem(kiconloader->loadIcon("filenew", KIcon::Small),
|
|
i18n("New..."),
|
|
this, TQT_SIGNAL(newPrice()));
|
|
|
|
m_contextMenu->insertItem(kiconloader->loadIcon("edit", KIcon::Small),
|
|
i18n("Edit..."),
|
|
this, TQT_SIGNAL(editPrice()));
|
|
|
|
m_contextMenu->insertItem(kiconloader->loadIcon("connect_creating", KIcon::Small),
|
|
i18n("Online Price Update..."),
|
|
this, TQT_SIGNAL(onlinePriceUpdate()));
|
|
|
|
m_contextMenu->insertItem(kiconloader->loadIcon("delete", KIcon::Small),
|
|
i18n("Delete..."),
|
|
this, TQT_SIGNAL(deletePrice()));
|
|
|
|
connect(this, TQT_SIGNAL(rightButtonClicked(TQListViewItem* , const TQPoint&, int)),
|
|
this, TQT_SLOT(slotListClicked(TQListViewItem*, const TQPoint&, int)));
|
|
|
|
// connect(MyMoneyFile::instance(), TQT_SIGNAL(dataChanged()), this, TQT_SLOT(slotReloadWidget()));
|
|
|
|
// slotReloadWidget();
|
|
|
|
// If the widget is shown, the size must be fixed a little later
|
|
// to be appropriate. I saw this in some other places and the only
|
|
// way to solve this problem is to postpone the setup of the size
|
|
// to the time when the widget is on the screen.
|
|
resize(width()-1, height()-1);
|
|
TQTimer::singleShot(50, this, TQT_SLOT(slotTimerDone()));
|
|
}
|
|
|
|
KMyMoneyPriceView::~KMyMoneyPriceView()
|
|
{
|
|
}
|
|
|
|
void KMyMoneyPriceView::slotTimerDone(void)
|
|
{
|
|
// the resize operation does the trick to adjust
|
|
// all widgets in the view to the size they should
|
|
// have and show up correctly. Don't ask me, why
|
|
// this is, but it cured the problem (ipwizard).
|
|
resize(width()+1, height()+1);
|
|
}
|
|
|
|
#if 0
|
|
void KMyMoneyPriceView::slotReloadWidget(void)
|
|
{
|
|
m_priceHistory->clear();
|
|
|
|
MyMoneyPriceList list = MyMoneyFile::instance()->priceList();
|
|
MyMoneyPriceList::ConstIterator it_l;
|
|
for(it_l = list.begin(); it_l != list.end(); ++it_l) {
|
|
MyMoneyPriceEntries::ConstIterator it_e;
|
|
if(m_showAll) {
|
|
for(it_e = (*it_l).begin(); it_e != (*it_l).end(); ++it_e) {
|
|
new kMyMoneyPriceItem(m_priceHistory, *it_e);
|
|
}
|
|
} else {
|
|
if((*it_l).count() > 0) {
|
|
it_e = (*it_l).end();
|
|
--it_e;
|
|
new kMyMoneyPriceItem(m_priceHistory, *it_e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void KMyMoneyPriceView::resizeEvent(TQResizeEvent* e)
|
|
{
|
|
int w = visibleWidth()/5;
|
|
|
|
setColumnWidth(0, w);
|
|
setColumnWidth(1, w);
|
|
setColumnWidth(2, w);
|
|
setColumnWidth(3, w);
|
|
setColumnWidth(4, w);
|
|
resizeContents(visibleWidth(), contentsHeight());
|
|
|
|
KListView::resizeEvent(e);
|
|
}
|
|
|
|
void KMyMoneyPriceView::slotListClicked(TQListViewItem* item, const TQPoint&, int)
|
|
{
|
|
int editId = m_contextMenu->idAt(2);
|
|
int updateId = m_contextMenu->idAt(3);
|
|
int delId = m_contextMenu->idAt(4);
|
|
|
|
m_contextMenu->setItemEnabled(editId, item != 0);
|
|
m_contextMenu->setItemEnabled(delId, item != 0);
|
|
|
|
KMyMoneyPriceItem* priceitem = dynamic_cast<KMyMoneyPriceItem*>(item);
|
|
if(priceitem) {
|
|
MyMoneySecurity security;
|
|
security = MyMoneyFile::instance()->security(priceitem->price().from());
|
|
m_contextMenu->setItemEnabled(updateId, security.isCurrency() );
|
|
|
|
// Modification of automatically added entries is not allowed
|
|
if(priceitem->price().source() == "KMyMoney") {
|
|
m_contextMenu->setItemEnabled(editId, false);
|
|
m_contextMenu->setItemEnabled(updateId, false);
|
|
m_contextMenu->setItemEnabled(delId, false);
|
|
}
|
|
}
|
|
else
|
|
m_contextMenu->setItemEnabled(updateId, false );
|
|
|
|
m_contextMenu->exec(TQCursor::pos());
|
|
}
|
|
|
|
#if 0
|
|
void KMyMoneyPriceView::slotNewPrice(void)
|
|
{
|
|
KUpdateStockPriceDlg dlg(this);
|
|
kMyMoneyPriceItem* item = dynamic_cast<kMyMoneyPriceItem*>(m_priceHistory->selectedItem());
|
|
if(item) {
|
|
MyMoneySecurity security;
|
|
security = MyMoneyFile::instance()->security(item->price().from());
|
|
dlg.m_security->setSecurity(security);
|
|
security = MyMoneyFile::instance()->security(item->price().to());
|
|
dlg.m_currency->setSecurity(security);
|
|
}
|
|
if(dlg.exec()) {
|
|
MyMoneyPrice price(dlg.m_security->security().id(), dlg.m_currency->security().id(), dlg.date(), MyMoneyMoney(1,1));
|
|
kMyMoneyPriceItem* p = new kMyMoneyPriceItem(m_priceHistory, price);
|
|
m_priceHistory->setSelected(p, true);
|
|
// If the user cancels the following operation, we delete the new item
|
|
// and re-select any previously selected one
|
|
if(slotEditPrice() == TQDialog::Rejected) {
|
|
delete p;
|
|
if(item)
|
|
m_priceHistory->setSelected(item, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
int KMyMoneyPriceView::slotEditPrice(void)
|
|
{
|
|
int rc = TQDialog::Rejected;
|
|
kMyMoneyPriceItem* item = dynamic_cast<kMyMoneyPriceItem*>(m_priceHistory->selectedItem());
|
|
if(item) {
|
|
MyMoneySecurity from(MyMoneyFile::instance()->security(item->price().from()));
|
|
MyMoneySecurity to(MyMoneyFile::instance()->security(item->price().to()));
|
|
signed64 fract = MyMoneyMoney::precToDenom(KMyMoneyGlobalSettings::pricePrecision());
|
|
|
|
KCurrencyCalculator calc(from,
|
|
to,
|
|
MyMoneyMoney(1,1),
|
|
item->price().rate(),
|
|
item->price().date(),
|
|
fract,
|
|
this, "currencyCalculator");
|
|
// we always want to update the price, that's why we're here
|
|
calc.m_updateButton->setChecked(true);
|
|
calc.m_updateButton->hide();
|
|
|
|
rc = calc.exec();
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
void KMyMoneyPriceView::slotDeletePrice(void)
|
|
{
|
|
kMyMoneyPriceItem* item = dynamic_cast<kMyMoneyPriceItem*>(m_priceHistory->selectedItem());
|
|
if(item) {
|
|
if(KMessageBox::questionYesNo(this, i18n("Do you really want to delete the selected price entry?"), i18n("Delete price information"), KStdGuiItem::yes(), KStdGuiItem::no(), "DeletePrice") == KMessageBox::Yes) {
|
|
MyMoneyFileTransaction ft;
|
|
try {
|
|
MyMoneyFile::instance()->removePrice(item->price());
|
|
ft.commit();
|
|
} catch(MyMoneyException *e) {
|
|
qDebug("Cannot delete price");
|
|
delete e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void KMyMoneyPriceView::slotShowAllPrices(bool enabled)
|
|
{
|
|
if(m_showAll != enabled) {
|
|
m_showAll = enabled;
|
|
slotReloadWidget();
|
|
}
|
|
}
|
|
|
|
void KMyMoneyPriceView::slotOnlinePriceUpdate(void)
|
|
{
|
|
KMyMoneyPriceItem* item = dynamic_cast<KMyMoneyPriceItem*>(m_priceHistory->selectedItem());
|
|
if(item)
|
|
{
|
|
KEquityPriceUpdateDlg dlg(this, (item->text(COMMODITY_COL)+" "+item->text(CURRENCY_COL)).utf8());
|
|
if(dlg.exec() == TQDialog::Accepted)
|
|
dlg.storePrices();
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#include "kmymoneypriceview.moc"
|