/*************************************************************************** kinvestmentview.cpp - description ------------------- begin : Mon Mar 12 2007 copyright : (C) 2007 by Thomas Baumgart email : Thomas Baumgart ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include // ---------------------------------------------------------------------------- // QT Includes // ---------------------------------------------------------------------------- // KDE Includes #include "kdecompat.h" #include // ---------------------------------------------------------------------------- // Project Includes #include #include #include #include #include #include #include #include #include #include "../kmymoney2.h" #include "kinvestmentview.h" #include "kinvestmentlistitem.h" class KInvestmentView::Private { public: Private() : m_needReload(false), m_newAccountLoaded(false), m_recursion(false), m_precision(2) {} MyMoneyAccount m_account; bool m_needReload; bool m_newAccountLoaded; bool m_recursion; int m_precision; }; KInvestmentView::KInvestmentView(TQWidget *parent, const char *name) : KInvestmentViewDecl(parent,name), d(new Private) { m_table->setRootIsDecorated(false); // m_table->setColumnText(0, i18n("Symbol")); m_table->addColumn(i18n("Name")); m_table->addColumn(i18n("Symbol")); int col = m_table->addColumn(i18n("Value")); m_table->setColumnAlignment(col, TQt::AlignRight); col = m_table->addColumn(i18n("Quantity")); m_table->setColumnAlignment(col, TQt::AlignRight); col = m_table->addColumn(i18n("Price")); m_table->setColumnAlignment(col, TQt::AlignRight); m_table->setMultiSelection(false); m_table->setColumnWidthMode(0, TQListView::Maximum); m_table->header()->setResizeEnabled(true); m_table->setAllColumnsShowFocus(true); m_table->setShowSortIndicator(true); m_table->restoreLayout(TDEGlobal::config(), "Investment Settings"); connect(m_table, TQT_SIGNAL(contextMenu(TDEListView*, TQListViewItem* , const TQPoint&)), this, TQT_SLOT(slotListContextMenu(TDEListView*, TQListViewItem*, const TQPoint&))); connect(m_table, TQT_SIGNAL(selectionChanged(TQListViewItem *)), this, TQT_SLOT(slotSelectionChanged(TQListViewItem *))); connect(m_accountComboBox, TQT_SIGNAL(accountSelected(const TQString&)), this, TQT_SLOT(slotSelectAccount(const TQString&))); connect(m_table, TQT_SIGNAL(doubleClicked(TQListViewItem*,const TQPoint&, int)), kmymoney2->action("investment_edit"), TQT_SLOT(activate())); connect(MyMoneyFile::instance(), TQT_SIGNAL(dataChanged()), this, TQT_SLOT(slotLoadView())); } KInvestmentView::~KInvestmentView() { m_table->saveLayout(TDEGlobal::config(), "Investment Settings"); delete d; } void KInvestmentView::slotSelectionChanged(TQListViewItem *item) { kmymoney2->slotSelectInvestment(); KInvestmentListItem *pItem = dynamic_cast(item); if(pItem) { try { MyMoneyAccount account = MyMoneyFile::instance()->account(pItem->account().id()); kmymoney2->slotSelectInvestment(account); } catch (MyMoneyException *e) { delete e; } } } void KInvestmentView::slotListContextMenu(TDEListView* /* lv */, TQListViewItem* /*item*/, const TQPoint& /*point*/) { kmymoney2->slotSelectInvestment(); KInvestmentListItem *pItem = dynamic_cast(m_table->selectedItem()); if(pItem) { kmymoney2->slotSelectInvestment(MyMoneyFile::instance()->account(pItem->account().id())); } emit investmentRightMouseClick(); } void KInvestmentView::slotLoadView(void) { d->m_needReload = true; if(isVisible()) { loadView(); d->m_needReload = false; // force a new account if the current one is empty d->m_newAccountLoaded = d->m_account.id().isEmpty(); } } void KInvestmentView::loadAccounts(void) { MyMoneyFile* file = MyMoneyFile::instance(); // check if the current account still exists and make it the // current account if(!d->m_account.id().isEmpty()) { try { d->m_account = file->account(d->m_account.id()); } catch(MyMoneyException *e) { delete e; d->m_account = MyMoneyAccount(); } } m_accountComboBox->loadList(MyMoneyAccount::Investment); if(d->m_account.id().isEmpty()) { TQStringList list = m_accountComboBox->accountList(); if(list.count()) { TQStringList::Iterator it; for(it = list.begin(); it != list.end(); ++it) { MyMoneyAccount a = file->account(*it); if(a.accountType() == MyMoneyAccount::Investment) { if(a.value("PreferredAccount") == "Yes") { d->m_account = a; break; } else if(d->m_account.id().isEmpty()) { d->m_account = a; } } } } } if(!d->m_account.id().isEmpty()) { m_accountComboBox->setSelected(d->m_account); try { d->m_precision = MyMoneyMoney::denomToPrec(d->m_account.fraction()); } catch(MyMoneyException *e) { tqDebug("Security %s for account %s not found", d->m_account.currencyId().data(), d->m_account.name().data()); delete e; d->m_precision = 2; } } } bool KInvestmentView::slotSelectAccount(const MyMoneyObject& obj) { if(typeid(obj) != typeid(MyMoneyAccount)) return false; if(d->m_recursion) return false; d->m_recursion = true; const MyMoneyAccount& acc = dynamic_cast(obj); bool rc = slotSelectAccount(acc.id()); d->m_recursion = false; return rc; } bool KInvestmentView::slotSelectAccount(const TQString& id, const TQString& transactionId, const bool /* reconciliation*/) { bool rc = true; if(!id.isEmpty()) { // if the account id differs, then we have to do something if(d->m_account.id() != id) { try { d->m_account = MyMoneyFile::instance()->account(id); // if a stock account is selected, we show the // the corresponding parent (investment) account if(d->m_account.isInvest()) { d->m_account = MyMoneyFile::instance()->account(d->m_account.parentAccountId()); } // TODO if we don't have an investment account, then we should switch to the ledger view d->m_newAccountLoaded = true; if(d->m_account.accountType() == MyMoneyAccount::Investment) { slotLoadView(); } else { emit accountSelected(id, transactionId); d->m_account = MyMoneyAccount(); d->m_needReload = true; rc = false; } } catch(MyMoneyException* e) { tqDebug("Unable to retrieve account %s", id.data()); delete e; rc = false; } } else { emit accountSelected(d->m_account); } } return rc; } void KInvestmentView::clear(void) { // setup header font TQFont font = KMyMoneyGlobalSettings::listHeaderFont(); TQFontMetrics fm( font ); int height = fm.lineSpacing()+6; m_table->header()->setMinimumHeight(height); m_table->header()->setMaximumHeight(height); m_table->header()->setFont(font); // setup cell font font = KMyMoneyGlobalSettings::listCellFont(); m_table->setFont(font); // clear the table m_table->clear(); // and the selected account in the combo box m_accountComboBox->setSelected(TQString()); } void KInvestmentView::loadView(void) { // no account selected emit accountSelected(MyMoneyAccount()); // clear the current contents ... clear(); // ... load the combobox widget and select current account ... loadAccounts(); if(d->m_account.id().isEmpty()) { // if we don't have an account we bail out setEnabled(false); return; } setEnabled(true); MyMoneyFile* file = MyMoneyFile::instance(); bool showClosedAccounts = kmymoney2->toggleAction("view_show_all_accounts")->isChecked() || !KMyMoneyGlobalSettings::hideClosedAccounts(); try { d->m_account = file->account(d->m_account.id()); TQStringList securities = d->m_account.accountList(); for(TQStringList::ConstIterator it = securities.begin(); it != securities.end(); ++it) { MyMoneyAccount acc = file->account(*it); if(!acc.isClosed() || showClosedAccounts) new KInvestmentListItem(m_table, acc); } } catch(MyMoneyException* e) { tqDebug("KInvestmentView::loadView() - selected account does not exist anymore"); d->m_account = MyMoneyAccount(); delete e; } // and tell everyone what's selected emit accountSelected(d->m_account); } void KInvestmentView::show(void) { if(d->m_needReload) { loadView(); d->m_needReload = false; d->m_newAccountLoaded = false; } else { emit accountSelected(d->m_account); } // don't forget base class implementation KInvestmentViewDecl::show(); } #include "kinvestmentview.moc"