diff --git a/src/alkonlinequoteswidget.cpp b/src/alkonlinequoteswidget.cpp index 9500a8f..672cf25 100644 --- a/src/alkonlinequoteswidget.cpp +++ b/src/alkonlinequoteswidget.cpp @@ -1,434 +1,433 @@ /*************************************************************************** * Copyright 2004 Thomas Baumgart tbaumgart@kde.org * * * * This file is part of libalkimia. * * * * libalkimia 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.1 of * * the License or (at your option) version 3 or any later version. * * * * libalkimia is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see * ***************************************************************************/ #include "alkonlinequoteswidget.h" #include "alkonlinequote.h" #include "alkonlinequotesprofilemanager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include class AlkOnlineQuotesWidget::Private { public: QWebView *m_webView; }; AlkOnlineQuotesWidget::AlkOnlineQuotesWidget(QWidget *parent) : AlkOnlineQuotesWidgetDecl(parent), d(new Private), m_quoteInEditing(false) { QStringList groups = AlkOnlineQuote::quoteSources(); loadProfiles(); - loadQuotesList(true /*updateResetList*/); - m_updateButton->setEnabled(false); // TODO move to ui file KGuiItem updateButtenItem(i18nc("Accepts the entered data and stores it", "&Accept"), KIcon("dialog-ok"), i18n("Accepts the entered data and stores it"), i18n("Use this to accept the modified data.")); m_updateButton->setGuiItem(updateButtenItem); KGuiItem deleteButtenItem(i18n("&Delete"), KIcon("edit-delete"), i18n("Delete the selected source entry"), i18n("Use this to delete the selected online source entry")); m_deleteButton->setGuiItem(deleteButtenItem); KGuiItem checkButtonItem(i18nc("Check the selected source entry", "&Check Source"), KIcon("document-edit-verify"), i18n("Check the selected source entry"), i18n("Use this to check the selected online source entry")); m_checkButton->setGuiItem(checkButtonItem); KGuiItem showButtonItem(i18nc("Show the selected source entry in a web browser", "&Show page"), KIcon("applications-internet"), i18n("Show the selected source entry in a web browser"), i18n("Use this to show the selected online source entry")); m_showButton->setGuiItem(showButtonItem); KGuiItem newButtenItem(i18nc("Create a new source entry for online quotes", "&New..."), KIcon("document-new"), i18n("Create a new source entry for online quotes"), i18n("Use this to create a new entry for online quotes")); m_newButton->setGuiItem(newButtenItem); connect(m_newProfile, SIGNAL(clicked()), this, SLOT(slotNewProfile())); connect(m_deleteProfile, SIGNAL(clicked()), this, SLOT(slotDeleteProfile())); connect(m_selectProfile, SIGNAL(clicked()), this, SLOT(slotSelectProfile())); - connect(m_profileList, SIGNAL(itemSelectionChanged()), this, SLOT(slotLoadProfile())); connect(m_updateButton, SIGNAL(clicked()), this, SLOT(slotUpdateEntry())); connect(m_newButton, SIGNAL(clicked()), this, SLOT(slotNewEntry())); connect(m_checkButton, SIGNAL(clicked()), this, SLOT(slotCheckEntry())); connect(m_deleteButton, SIGNAL(clicked()), this, SLOT(slotDeleteEntry())); connect(m_showButton, SIGNAL(clicked()), this, SLOT(slotShowEntry())); connect(m_installButton, SIGNAL(clicked()), this, SLOT(slotInstallEntries())); connect(m_quoteSourceList, SIGNAL(itemSelectionChanged()), this, SLOT(slotLoadWidgets())); connect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotEntryRenamed(QListWidgetItem*))); connect(m_quoteSourceList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotStartRename(QListWidgetItem*))); connect(m_editURL, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editSymbol, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editDate, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editDateFormat, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editPrice, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_skipStripping, SIGNAL(toggled(bool)), this, SLOT(slotEntryChanged())); m_checkSymbol->setText("ORCL"); m_checkSymbol2->setText("BTC GBP"); } AlkOnlineQuotesWidget::~AlkOnlineQuotesWidget() { delete d; } void AlkOnlineQuotesWidget::loadProfiles() { AlkOnlineQuotesProfileList list = AlkOnlineQuoteSource::profile()->manager()->profiles(); foreach(AlkOnlineQuotesProfile *profile, list) { QListWidgetItem *item = new QListWidgetItem(dynamic_cast(m_profileList)); item->setText(profile->name()); item->setFlags(item->flags() | Qt::ItemIsEditable); } + m_profileList->setCurrentRow(0); + loadQuotesList(); } void AlkOnlineQuotesWidget::loadQuotesList(const bool updateResetList) { //disconnect the slot while items are being loaded and reconnect at the end disconnect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotEntryRenamed(QListWidgetItem*))); m_quoteInEditing = false; QStringList groups = AlkOnlineQuote::quoteSources(); if (updateResetList) m_resetList.clear(); m_quoteSourceList->clear(); QStringList::Iterator it; for (it = groups.begin(); it != groups.end(); ++it) { AlkOnlineQuoteSource source(*it); if (!source.isValid()) continue; QListWidgetItem* item = new QListWidgetItem(*it); item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); m_quoteSourceList->addItem(item); if (updateResetList) m_resetList += source; } m_quoteSourceList->sortItems(); QListWidgetItem* first = m_quoteSourceList->item(0); if (first) m_quoteSourceList->setCurrentItem(first); slotLoadWidgets(); m_newButton->setEnabled((m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly)).count() == 0); connect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotEntryRenamed(QListWidgetItem*))); } void AlkOnlineQuotesWidget::resetConfig() { QStringList::ConstIterator it; QStringList groups = AlkOnlineQuote::quoteSources(); // delete all currently defined entries for (it = groups.constBegin(); it != groups.constEnd(); ++it) { AlkOnlineQuoteSource(*it).remove(); } // and write back the one's from the reset list QList::ConstIterator itr; for (itr = m_resetList.constBegin(); itr != m_resetList.constEnd(); ++itr) { (*itr).write(); } loadQuotesList(); } void AlkOnlineQuotesWidget::setView(QWebView *view) { d->m_webView = view; } void AlkOnlineQuotesWidget::slotNewProfile() { QListWidgetItem *item = new QListWidgetItem(dynamic_cast(m_profileList)); item->setText(QLatin1String("new profile")); item->setFlags(item->flags() | Qt::ItemIsEditable); } void AlkOnlineQuotesWidget::slotDeleteProfile() { delete m_profileList->currentItem(); } void AlkOnlineQuotesWidget::slotSelectProfile() { - qDebug() << "selecting" << m_profileList->currentItem()->text(); + slotLoadProfile(); } void AlkOnlineQuotesWidget::slotLoadProfile() { AlkOnlineQuotesProfileList list = AlkOnlineQuoteSource::profile()->manager()->profiles(); foreach(AlkOnlineQuotesProfile *profile, list) { if (m_profileList->currentItem()->text() == profile->name()) { AlkOnlineQuoteSource::setProfile(profile); loadQuotesList(); } } } void AlkOnlineQuotesWidget::slotLoadWidgets() { m_quoteInEditing = false; QListWidgetItem* item = m_quoteSourceList->currentItem(); m_editURL->setEnabled(true); m_editSymbol->setEnabled(true); m_editPrice->setEnabled(true); m_editDate->setEnabled(true); m_editDateFormat->setEnabled(true); m_skipStripping->setEnabled(true); m_editURL->setText(QString()); m_editSymbol->setText(QString()); m_editPrice->setText(QString()); m_editDate->setText(QString()); m_editDateFormat->setText(QString()); if (item) { m_currentItem = AlkOnlineQuoteSource(item->text()); m_editURL->setText(m_currentItem.url()); m_editSymbol->setText(m_currentItem.sym()); m_editPrice->setText(m_currentItem.price()); m_editDate->setText(m_currentItem.date()); m_editDateFormat->setText(m_currentItem.dateformat()); m_skipStripping->setChecked(m_currentItem.skipStripping()); } else { m_editURL->setEnabled(false); m_editSymbol->setEnabled(false); m_editPrice->setEnabled(false); m_editDate->setEnabled(false); m_editDateFormat->setEnabled(false); m_skipStripping->setEnabled(false); } m_updateButton->setEnabled(false); } void AlkOnlineQuotesWidget::slotEntryChanged() { clearIcons(); bool modified = m_editURL->text() != m_currentItem.url() || m_editSymbol->text() != m_currentItem.sym() || m_editDate->text() != m_currentItem.date() || m_editDateFormat->text() != m_currentItem.dateformat() || m_editPrice->text() != m_currentItem.price() || m_skipStripping->isChecked() != m_currentItem.skipStripping(); m_updateButton->setEnabled(modified); m_checkButton->setEnabled(!modified); m_checkSymbol->setEnabled(!m_currentItem.url().contains("%2")); m_checkSymbol2->setEnabled(m_currentItem.url().contains("%2")); } void AlkOnlineQuotesWidget::slotDeleteEntry() { QList items = m_quoteSourceList->findItems(m_currentItem.name(), Qt::MatchExactly); if (items.size() == 0) return; QListWidgetItem* item = items.at(0); if (!item) return; int ret = KMessageBox::warningContinueCancel(this, i18n("Are you sure to delete this online quote ?"), i18n("Delete online quote"), KStandardGuiItem::cont(), KStandardGuiItem::cancel(), QString("DeletingOnlineQuote")); if (ret == KMessageBox::Cancel) return; // keep this order to avoid deleting the wrong current item m_currentItem.remove(); delete item; slotEntryChanged(); } void AlkOnlineQuotesWidget::slotUpdateEntry() { m_currentItem.setUrl(m_editURL->text()); m_currentItem.setSym(m_editSymbol->text()); m_currentItem.setDate(m_editDate->text()); m_currentItem.setDateformat(m_editDateFormat->text()); m_currentItem.setPrice(m_editPrice->text()); m_currentItem.setSkipStripping(m_skipStripping->isChecked()); m_currentItem.write(); m_checkButton->setEnabled(true); slotEntryChanged(); } void AlkOnlineQuotesWidget::slotNewEntry() { AlkOnlineQuoteSource newSource(i18n("New Quote Source")); newSource.write(); loadQuotesList(); QListWidgetItem* item = m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).at(0); if (item) { m_quoteSourceList->setCurrentItem(item); slotLoadWidgets(); } } void AlkOnlineQuotesWidget::clearIcons() { QPixmap emptyIcon; m_urlCheckLabel->setPixmap(emptyIcon); m_dateCheckLabel->setPixmap(emptyIcon); m_priceCheckLabel->setPixmap(emptyIcon); m_symbolCheckLabel->setPixmap(emptyIcon); m_dateFormatCheckLabel->setPixmap(emptyIcon); } void AlkOnlineQuotesWidget::setupIcons(const AlkOnlineQuote::Errors &errors) { QPixmap okIcon(BarIcon("dialog-ok-apply")); QPixmap failIcon(BarIcon("dialog-cancel")); if (errors & AlkOnlineQuote::Errors::URL) m_urlCheckLabel->setPixmap(failIcon); else { m_urlCheckLabel->setPixmap(okIcon); m_symbolCheckLabel->setPixmap(errors & AlkOnlineQuote::Errors::Symbol ? failIcon : okIcon); m_priceCheckLabel->setPixmap(errors & AlkOnlineQuote::Errors::Price ? failIcon : okIcon); if (errors & AlkOnlineQuote::Errors::Date) m_dateCheckLabel->setPixmap(failIcon); else { m_dateCheckLabel->setPixmap(okIcon); m_dateFormatCheckLabel->setPixmap(errors & AlkOnlineQuote::Errors::DateFormat? failIcon : okIcon); } } } void AlkOnlineQuotesWidget::slotCheckEntry() { AlkOnlineQuote quote; m_logWindow->setVisible(true); m_logWindow->clear(); clearIcons(); quote.setWebView(d->m_webView); connect("e, SIGNAL(status(QString)), this, SLOT(slotLogStatus(QString))); connect("e, SIGNAL(error(QString)), this, SLOT(slotLogError(QString))); connect("e, SIGNAL(failed(QString, QString)), this, SLOT(slotLogFailed(QString, QString))); connect("e, SIGNAL(quote(QString, QString, QDate, double)), this, SLOT(slotLogQuote(QString, QString, QDate, double))); if (m_currentItem.url().contains("%2")) quote.launch(m_checkSymbol2->text(), m_checkSymbol2->text(), m_currentItem.name()); else quote.launch(m_checkSymbol->text(), m_checkSymbol->text(), m_currentItem.name()); setupIcons(quote.errors()); } void AlkOnlineQuotesWidget::slotLogStatus(const QString &s) { m_logWindow->append(s); } void AlkOnlineQuotesWidget::slotLogError(const QString &s) { slotLogStatus(QString("") + s + QString("")); } void AlkOnlineQuotesWidget::slotLogFailed(const QString &id, const QString &symbol) { slotLogStatus(QString("%1 %2").arg(id, symbol)); } void AlkOnlineQuotesWidget::slotLogQuote(const QString &id, const QString &symbol, const QDate &date, double price) { slotLogStatus(QString("%1 %2 %3 %4").arg(id, symbol, date.toString()).arg(price)); } void AlkOnlineQuotesWidget::slotStartRename(QListWidgetItem* item) { m_quoteInEditing = true; m_quoteSourceList->editItem(item); } void AlkOnlineQuotesWidget::slotEntryRenamed(QListWidgetItem* item) { //if there is no current item selected, exit if (m_quoteInEditing == false || !m_quoteSourceList->currentItem() || item != m_quoteSourceList->currentItem()) return; m_quoteInEditing = false; QString text = item->text(); int nameCount = 0; for (int i = 0; i < m_quoteSourceList->count(); ++i) { if (m_quoteSourceList->item(i)->text() == text) ++nameCount; } // Make sure we get a non-empty and unique name if (text.length() > 0 && nameCount == 1) { m_currentItem.rename(text); } else { item->setText(m_currentItem.name()); } m_quoteSourceList->sortItems(); m_newButton->setEnabled(m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).count() == 0); } void AlkOnlineQuotesWidget::slotInstallEntries() { QString configFile = AlkOnlineQuoteSource::profile()->hotNewStuffConfigFile(); QPointer dialog = new KNS3::DownloadDialog(configFile, this); dialog->exec(); delete dialog; loadQuotesList(); } QString AlkOnlineQuotesWidget::expandedUrl() const { if (m_currentItem.url().contains("%2")) return m_currentItem.url().arg(m_checkSymbol2->text()); else return m_currentItem.url().arg(m_checkSymbol->text()); }