diff options
Diffstat (limited to 'kontact/plugins/newsticker')
-rw-r--r-- | kontact/plugins/newsticker/Makefile.am | 26 | ||||
-rw-r--r-- | kontact/plugins/newsticker/kcmkontactknt.cpp | 452 | ||||
-rw-r--r-- | kontact/plugins/newsticker/kcmkontactknt.desktop | 156 | ||||
-rw-r--r-- | kontact/plugins/newsticker/kcmkontactknt.h | 102 | ||||
-rw-r--r-- | kontact/plugins/newsticker/newsfeeds.h | 315 | ||||
-rw-r--r-- | kontact/plugins/newsticker/newsticker_plugin.cpp | 43 | ||||
-rw-r--r-- | kontact/plugins/newsticker/newsticker_plugin.h | 40 | ||||
-rw-r--r-- | kontact/plugins/newsticker/newstickerplugin.desktop | 99 | ||||
-rw-r--r-- | kontact/plugins/newsticker/summarywidget.cpp | 319 | ||||
-rw-r--r-- | kontact/plugins/newsticker/summarywidget.h | 115 |
10 files changed, 1667 insertions, 0 deletions
diff --git a/kontact/plugins/newsticker/Makefile.am b/kontact/plugins/newsticker/Makefile.am new file mode 100644 index 000000000..779936802 --- /dev/null +++ b/kontact/plugins/newsticker/Makefile.am @@ -0,0 +1,26 @@ +INCLUDES = -I$(top_srcdir)/kontact/interfaces \ + -I$(top_srcdir)/libkdepim \ + -I$(top_srcdir) $(all_includes) + +kde_module_LTLIBRARIES = libkontact_newstickerplugin.la kcm_kontactknt.la +libkontact_newstickerplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) +libkontact_newstickerplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KDEUI) \ + $(top_builddir)/libkdepim/libkdepim.la ../../interfaces/libkpinterfaces.la + +libkontact_newstickerplugin_la_SOURCES = newsticker_plugin.cpp \ + summarywidget.cpp summarywidget.skel + +kcm_kontactknt_la_SOURCES = kcmkontactknt.cpp +kcm_kontactknt_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) \ + -avoid-version -no-undefined +kcm_kontactknt_la_LIBADD = $(LIB_KDEUI) + +METASOURCES = AUTO + +servicedir = $(kde_servicesdir)/kontact +service_DATA = newstickerplugin.desktop + +kde_services_DATA = kcmkontactknt.desktop + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/kcmkontactnt.pot diff --git a/kontact/plugins/newsticker/kcmkontactknt.cpp b/kontact/plugins/newsticker/kcmkontactknt.cpp new file mode 100644 index 000000000..18f439c8e --- /dev/null +++ b/kontact/plugins/newsticker/kcmkontactknt.cpp @@ -0,0 +1,452 @@ +/* + This file is part of Kontact. + Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> + + 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. + + This program 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qgroupbox.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qvaluevector.h> +#include <qspinbox.h> + +#include <dcopref.h> +#include <dcopclient.h> + +#include <kaboutdata.h> +#include <kapplication.h> +#include <kaccelmanager.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kdialogbase.h> +#include <klistview.h> +#include <klocale.h> +#include <kpushbutton.h> + +#include "kcmkontactknt.h" + +#include "newsfeeds.h" + +#include <kdepimmacros.h> + +extern "C" +{ + KDE_EXPORT KCModule *create_kontactknt( QWidget *parent, const char * ) + { + return new KCMKontactKNT( parent, "kcmkontactknt" ); + } +} + +NewsEditDialog::NewsEditDialog( const QString& title, const QString& url, QWidget *parent ) + : KDialogBase( Plain, i18n( "New News Feed" ), Ok | Cancel, + Ok, parent, 0, true, true ) +{ + QWidget *page = plainPage(); + QGridLayout *layout = new QGridLayout( page, 2, 3, marginHint(), + spacingHint() ); + + QLabel *label = new QLabel( i18n( "Name:" ), page ); + layout->addWidget( label, 0, 0 ); + + mTitle = new QLineEdit( page ); + label->setBuddy( mTitle ); + layout->addMultiCellWidget( mTitle, 0, 0, 1, 2 ); + + label = new QLabel( i18n( "URL:" ), page ); + layout->addWidget( label, 1, 0 ); + + mURL = new QLineEdit( page ); + label->setBuddy( mURL ); + layout->addMultiCellWidget( mURL, 1, 1, 1, 2 ); + + mTitle->setText( title ); + mURL->setText( url ); + mTitle->setFocus(); + connect( mTitle, SIGNAL( textChanged( const QString& ) ), + this, SLOT( modified() ) ); + connect( mURL, SIGNAL( textChanged( const QString& ) ), + this, SLOT( modified() ) ); + + modified(); +} + +void NewsEditDialog::modified() +{ + enableButton( KDialogBase::Ok, !title().isEmpty() && !url().isEmpty() ); +} + +QString NewsEditDialog::title() const +{ + return mTitle->text(); +} + +QString NewsEditDialog::url() const +{ + return mURL->text(); +} + +class NewsItem : public QListViewItem +{ + public: + NewsItem( QListView *parent, const QString& title, const QString& url, bool custom ) + : QListViewItem( parent ), mTitle( title ), mUrl( url ), mCustom( custom ) + { + setText( 0, mTitle ); + } + + NewsItem( QListViewItem *parent, const QString& title, const QString& url, bool custom ) + : QListViewItem( parent ), mTitle( title ), mUrl( url ), mCustom( custom ) + { + setText( 0, mTitle ); + } + + QString title() const { return mTitle; } + QString url() const { return mUrl; } + bool custom() const { return mCustom; } + + private: + QString mTitle; + QString mUrl; + bool mCustom; +}; + +KCMKontactKNT::KCMKontactKNT( QWidget *parent, const char *name ) + : KCModule( parent, name ) +{ + initGUI(); + + connect( mAllNews, SIGNAL( currentChanged( QListViewItem* ) ), + this, SLOT( allCurrentChanged( QListViewItem* ) ) ); + connect( mSelectedNews, SIGNAL( selectionChanged( QListViewItem* ) ), + this, SLOT( selectedChanged( QListViewItem* ) ) ); + + connect( mUpdateInterval, SIGNAL( valueChanged( int ) ), SLOT( modified() ) ); + connect( mArticleCount, SIGNAL( valueChanged( int ) ), SLOT( modified() ) ); + + connect( mAddButton, SIGNAL( clicked() ), this, SLOT( addNews() ) ); + connect( mRemoveButton, SIGNAL( clicked() ), this, SLOT( removeNews() ) ); + connect( mNewButton, SIGNAL( clicked() ), this, SLOT( newFeed() ) ); + connect( mDeleteButton, SIGNAL( clicked() ), this, SLOT( deleteFeed() ) ); + + KAcceleratorManager::manage( this ); + + load(); +} + +void KCMKontactKNT::loadNews() +{ + QValueVector<QListViewItem*> parents; + QValueVector<QListViewItem*>::Iterator it; + + parents.append( new QListViewItem( mAllNews, i18n( "Arts" ) ) ); + parents.append( new QListViewItem( mAllNews, i18n( "Business" ) ) ); + parents.append( new QListViewItem( mAllNews, i18n( "Computers" ) ) ); + parents.append( new QListViewItem( mAllNews, i18n( "Misc" ) ) ); + parents.append( new QListViewItem( mAllNews, i18n( "Recreation" ) ) ); + parents.append( new QListViewItem( mAllNews, i18n( "Society" ) ) ); + + for ( it = parents.begin(); it != parents.end(); ++it ) + (*it)->setSelectable( false ); + + for ( int i = 0; i < DEFAULT_NEWSSOURCES; ++i ) { + NewsSourceData data = NewsSourceDefault[ i ]; + new NewsItem( parents[ data.category() ], data.name(), data.url(), false ); + mFeedMap.insert( data.url(), data.name() ); + } +} + +void KCMKontactKNT::loadCustomNews() +{ + KConfig config( "kcmkontactkntrc" ); + QMap<QString, QString> customFeeds = config.entryMap( "CustomFeeds" ); + config.setGroup( "CustomFeeds" ); + + mCustomItem = new QListViewItem( mAllNews, i18n( "Custom" ) ); + mCustomItem->setSelectable( false ); + + if ( customFeeds.count() == 0 ) + mCustomItem->setVisible( false ); + + QMap<QString, QString>::Iterator it; + for ( it = customFeeds.begin(); it != customFeeds.end(); ++it ) { + QStringList value = config.readListEntry( it.key() ); + mCustomFeeds.append( new NewsItem( mCustomItem, value[ 0 ], value[ 1 ], true ) ); + mFeedMap.insert( value[ 1 ], value[ 0 ] ); + mCustomItem->setVisible( true ); + } +} + +void KCMKontactKNT::storeCustomNews() +{ + KConfig config( "kcmkontactkntrc" ); + config.deleteGroup( "CustomFeeds" ); + config.setGroup( "CustomFeeds" ); + + int counter = 0; + QValueList<NewsItem*>::Iterator it; + for ( it = mCustomFeeds.begin(); it != mCustomFeeds.end(); ++it ) { + QStringList value; + value << (*it)->title() << (*it)->url(); + config.writeEntry( QString::number( counter ), value ); + + ++counter; + } + + config.sync(); +} + +void KCMKontactKNT::addNews() +{ + if ( !dcopActive() ) + return; + + NewsItem *item = dynamic_cast<NewsItem*>( mAllNews->selectedItem() ); + if ( item == 0 ) + return; + + DCOPRef service( "rssservice", "RSSService" ); + service.send( "add(QString)", item->url() ); + + scanNews(); + + emit changed( true ); +} + +void KCMKontactKNT::removeNews() +{ + if ( !dcopActive() ) + return; + + NewsItem *item = dynamic_cast<NewsItem*>( mSelectedNews->selectedItem() ); + if ( item == 0 ) + return; + + DCOPRef service( "rssservice", "RSSService" ); + service.send( "remove(QString)", item->url() ); + + scanNews(); + + emit changed( true ); +} + +void KCMKontactKNT::newFeed() +{ + NewsEditDialog dlg( "", "", this ); + + if ( dlg.exec() ) { + NewsItem *item = new NewsItem( mCustomItem, dlg.title(), dlg.url(), true ); + mCustomFeeds.append( item ); + mFeedMap.insert( dlg.url(), dlg.title() ); + + mCustomItem->setVisible( true ); + mCustomItem->setOpen( true ); + mAllNews->ensureItemVisible( item ); + mAllNews->setSelected( item, true ); + + emit changed( true ); + } +} + +void KCMKontactKNT::deleteFeed() +{ + NewsItem *item = dynamic_cast<NewsItem*>( mAllNews->selectedItem() ); + if ( !item ) + return; + + if ( mCustomFeeds.find( item ) == mCustomFeeds.end() ) + return; + + mCustomFeeds.remove( item ); + mFeedMap.remove( item->url() ); + delete item; + + if ( mCustomFeeds.count() == 0 ) + mCustomItem->setVisible( false ); + + emit changed( true ); +} + +void KCMKontactKNT::scanNews() +{ + if ( !dcopActive() ) + return; + + mSelectedNews->clear(); + + DCOPRef service( "rssservice", "RSSService" ); + QStringList urls = service.call( "list()" ); + + for ( uint i = 0; i < urls.count(); ++i ) + { + QString url = urls[ i ]; + QString feedName = mFeedMap[ url ]; + if ( feedName.isEmpty() ) + feedName = url; + new NewsItem( mSelectedNews, feedName, url, false ); + } +} + +void KCMKontactKNT::selectedChanged( QListViewItem *item ) +{ + mRemoveButton->setEnabled( item && item->isSelected() ); +} + +void KCMKontactKNT::allCurrentChanged( QListViewItem *item ) +{ + NewsItem *newsItem = dynamic_cast<NewsItem*>( item ); + + bool addState = false; + bool delState = false; + if ( newsItem && newsItem->isSelected() ) { + addState = true; + delState = (mCustomFeeds.find( newsItem ) != mCustomFeeds.end()); + } + + mAddButton->setEnabled( addState ); + mDeleteButton->setEnabled( delState ); +} + +void KCMKontactKNT::modified() +{ + emit changed( true ); +} + +void KCMKontactKNT::initGUI() +{ + QGridLayout *layout = new QGridLayout( this, 2, 3, KDialog::marginHint(), + KDialog::spacingHint() ); + + mAllNews = new KListView( this ); + mAllNews->addColumn( i18n( "All" ) ); + mAllNews->setRootIsDecorated( true ); + mAllNews->setFullWidth( true ); + layout->addWidget( mAllNews, 0, 0 ); + + QVBoxLayout *vbox = new QVBoxLayout( layout, KDialog::spacingHint() ); + + vbox->addStretch(); + mAddButton = new KPushButton( i18n( "Add" ), this ); + mAddButton->setEnabled( false ); + vbox->addWidget( mAddButton ); + mRemoveButton = new KPushButton( i18n( "Remove" ), this ); + mRemoveButton->setEnabled( false ); + vbox->addWidget( mRemoveButton ); + vbox->addStretch(); + + mSelectedNews = new KListView( this ); + mSelectedNews->addColumn( i18n( "Selected" ) ); + mSelectedNews->setFullWidth( true ); + layout->addWidget( mSelectedNews, 0, 2 ); + + QGroupBox *box = new QGroupBox( 0, Qt::Vertical, + i18n( "News Feed Settings" ), this ); + + QGridLayout *boxLayout = new QGridLayout( box->layout(), 2, 3, + KDialog::spacingHint() ); + + QLabel *label = new QLabel( i18n( "Refresh time:" ), box ); + boxLayout->addWidget( label, 0, 0 ); + + mUpdateInterval = new QSpinBox( 1, 3600, 1, box ); + mUpdateInterval->setSuffix( " sec." ); + label->setBuddy( mUpdateInterval ); + boxLayout->addWidget( mUpdateInterval, 0, 1 ); + + label = new QLabel( i18n( "Number of items shown:" ), box ); + boxLayout->addWidget( label, 1, 0 ); + + mArticleCount = new QSpinBox( box ); + label->setBuddy( mArticleCount ); + boxLayout->addWidget( mArticleCount, 1, 1 ); + + mNewButton = new KPushButton( i18n( "New Feed..." ), box ); + boxLayout->addWidget( mNewButton, 0, 2 ); + + mDeleteButton = new KPushButton( i18n( "Delete Feed" ), box ); + mDeleteButton->setEnabled( false ); + boxLayout->addWidget( mDeleteButton, 1, 2 ); + + layout->addMultiCellWidget( box, 1, 1, 0, 2 ); +} + +bool KCMKontactKNT::dcopActive() const +{ + QString error; + QCString appID; + bool isGood = true; + DCOPClient *client = kapp->dcopClient(); + if ( !client->isApplicationRegistered( "rssservice" ) ) { + if ( KApplication::startServiceByDesktopName( "rssservice", QStringList(), &error, &appID ) ) + isGood = false; + } + + return isGood; +} + +void KCMKontactKNT::load() +{ + mAllNews->clear(); + + loadNews(); + loadCustomNews(); + scanNews(); + + KConfig config( "kcmkontactkntrc" ); + config.setGroup( "General" ); + + mUpdateInterval->setValue( config.readNumEntry( "UpdateInterval", 600 ) ); + mArticleCount->setValue( config.readNumEntry( "ArticleCount", 4 ) ); + + emit changed( false ); +} + +void KCMKontactKNT::save() +{ + storeCustomNews(); + + KConfig config( "kcmkontactkntrc" ); + config.setGroup( "General" ); + + config.writeEntry( "UpdateInterval", mUpdateInterval->value() ); + config.writeEntry( "ArticleCount", mArticleCount->value() ); + + config.sync(); + + emit changed( false ); +} + +void KCMKontactKNT::defaults() +{ +} + +const KAboutData* KCMKontactKNT::aboutData() const +{ + KAboutData *about = new KAboutData( I18N_NOOP( "kcmkontactknt" ), + I18N_NOOP( "Newsticker Configuration Dialog" ), + 0, 0, KAboutData::License_GPL, + I18N_NOOP( "(c) 2003 - 2004 Tobias Koenig" ) ); + + about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" ); + + return about; +} + +#include "kcmkontactknt.moc" diff --git a/kontact/plugins/newsticker/kcmkontactknt.desktop b/kontact/plugins/newsticker/kcmkontactknt.desktop new file mode 100644 index 000000000..d866e252a --- /dev/null +++ b/kontact/plugins/newsticker/kcmkontactknt.desktop @@ -0,0 +1,156 @@ +[Desktop Entry] +Icon=knode +Type=Service +ServiceTypes=KCModule + +X-KDE-ModuleType=Library +X-KDE-Library=kontactknt +X-KDE-FactoryName=kontactknt +X-KDE-ParentApp=kontact_newstickerplugin +X-KDE-ParentComponents=kontact_newstickerplugin +X-KDE-CfgDlgHierarchy=KontactSummary + +Name=News Ticker +Name[af]=Nuus tikker +Name[az]=Xəbər Gözləyici +Name[br]=Kliker keleier +Name[ca]=Teletip de notícies +Name[cy]=Ticer Newyddion +Name[da]=Nyhedstelegraf +Name[de]=Newsticker +Name[el]=Προβολέας ειδήσεων +Name[eo]=Novaĵprezentilo +Name[es]=Teletipo de noticias +Name[et]=Uudistejälgija +Name[eu]=Berri markatzailea +Name[fa]=Ticker اخبار +Name[fi]=Uutisnäytin +Name[fr]=Téléscripteur de nouvelles +Name[fy]=Nijs Tikker +Name[gl]=Colector de Novas +Name[he]=חדשות רצות +Name[hi]=न्यूज टिकर +Name[hr]=Ticker sa novostima +Name[hu]=RSS hírmegjelenítő +Name[id]=Ticker Berita +Name[is]=Fréttastrimill +Name[it]=Ticker notizie +Name[ja]=ニュースティッカー +Name[ka]=სიახლეთა ტიკერი +Name[kk]=Жаңалық таспасы +Name[km]=កម្មវិធីទទួលព័ត៌មាន +Name[lt]=News pranešėjas +Name[lv]=Ziņu Tikkers +Name[ms]=Pengetik Berita +Name[nb]=Nyhetstelegraf +Name[nds]=Narichten-Ticker +Name[ne]=न्यूज टिकर +Name[nn]=Nyheitstelegraf +Name[pl]=Wiadomości +Name[pt]=Extractor de Notícias +Name[pt_BR]=Animação de Notícias +Name[ro]=Ştiri Internet +Name[ru]=Новости +Name[sk]=Sledovanie správ +Name[sl]=Prikazovalnik novic +Name[sr]=Откуцавач вести +Name[sr@Latn]=Otkucavač vesti +Name[sv]=Nyhetsövervakare +Name[ta]=செய்திகள் குறிப்பான் +Name[tg]=Ахборот +Name[th]=ตั๋วข่าว +Name[tr]=Haber İzleyici +Name[uk]=Стрічка новин +Name[ven]=Musengulusi wa Mafhungo +Name[vi]=Trình kiểm tra news +Name[xh]=Umchola-choli weendaba +Name[zh_CN]=新闻点点通 +Name[zh_TW]=新聞顯示器 +Name[zu]=Umlungiseleli Wezindaba +Comment=News Ticker Summary Setup +Comment[af]=Nuus tikker opsomming opstelling +Comment[bg]=Настройване обобщението на новините +Comment[ca]=Configuració del resum del teletip de notícies +Comment[cs]=Nastavení souhrnu newstickeru +Comment[da]=Nyhedstelegrafs opsætning af opsummering +Comment[de]=Einstellung der News-übersicht +Comment[el]=Περίληψη ρύθμισης προβολέα ρυθμίσεων +Comment[es]=Configuración del resumen del teletipo de noticias +Comment[et]=Uudistejälgija kokkuvõtte seadistus +Comment[eu]=Berri markatzailearen laburpenaren konfigurazioa +Comment[fa]=برپایی خلاصۀTicker اخبار +Comment[fi]=Uutisnäyttimen yhteenvedon asetukset +Comment[fr]=Configuration du résumé du téléscripteur de nouvelles +Comment[fy]=Oersichtsynstellings nijstikker +Comment[gl]=Configuración do Resumo de Fontes de Novas +Comment[he]=הגדרות תקציר חדשות רצות +Comment[hu]=A hírmegjelenítő áttekintőjének beállításai +Comment[is]=Uppsetning á yfirliti yfir fréttastrimla +Comment[it]=Impostazioni sommario ticker notizie +Comment[ja]=ニュースティッカーの設定 +Comment[ka]=სიახლეთა ტიკერის დაიჯესტის კონფიგურაცია +Comment[kk]=Жаңалық таспасының тұжырымынын баптау +Comment[km]=រៀបចំសេចក្ដីសង្ខេបកម្មវិធីទទួលព័ត៌មាន +Comment[lt]=News Ticker santraukos nustatymai +Comment[nb]=Oppsett av sammendraget til nyhetstelegrafen +Comment[nds]=Narichten-Översicht instellen +Comment[ne]=न्यूज टिकर सारांश सेटअप +Comment[nl]=Overzichtsinstellingen nieuwsticker +Comment[nn]=Oppsett av nyhendetelegrafsamandrag +Comment[pl]=Ustawienia podsumowania wiadomości +Comment[pt]=Configuração do Sumário do Extractor de Notícias +Comment[pt_BR]=Configuração de Resumo de Notícias +Comment[ru]=Настройка сводки новостей +Comment[sk]=Nastavenie súhrnu správ +Comment[sl]=Nastavitve povzetka novic +Comment[sr]=Подешавање сажетка приказивања вести +Comment[sr@Latn]=Podešavanje sažetka prikazivanja vesti +Comment[sv]=Inställning av nyhetsövervakningsöversikt +Comment[tr]=Haber Yakalayıcı Özet Ayarları +Comment[uk]=Налаштування зведення стрічки новин +Comment[zh_CN]=新闻点点通摘要设置 +Comment[zh_TW]=新聞顯示器摘要設定 +Keywords=news ticker, configure, settings +Keywords[bg]=новини, източник, настройки, news ticker, configure, settings +Keywords[bs]=news ticker, configure, settings, vijesti, newsticker, podešavanje +Keywords[ca]=teletip, configura, opcions +Keywords[cs]=novinky,nastavení +Keywords[da]=nyhedstelegraf, indstil, opsætning +Keywords[de]=Newsticker,Einrichten,Einstellungen +Keywords[el]=προβολέας ειδήσεων, ρύθμιση, ρυθμίσεις +Keywords[es]=teletipo de noticias, configurar, opciones +Keywords[et]=uudistejälgija, seadistamine, seadistused +Keywords[eu]=berri markatzaileak, konfiguratu, ezarpenak +Keywords[fa]=ticker اخبار، پیکربندی، تنظیمات +Keywords[fi]=uutiset, asetukset, muokkaa +Keywords[fr]=configurer,paramètre,news ticker, téléscripteur +Keywords[fy]=newsticker,instellingen,ynstellings,configuratie,nieuws,nijs +Keywords[gl]=capturador de novas, configurar, opcións +Keywords[he]=news ticker, configure, settings, חדשות, תצורה, הגדרות +Keywords[hu]=hírmegjelenítő,konfigurálás,beállítások +Keywords[is]=fréttastrimill, stillingar, stilla +Keywords[it]=ticker notizie, configura, impostazioni +Keywords[ja]=ニュースティッカー,設定,設定 +Keywords[ka]=სიახლეთა ტიკერი, კონფიგურაცია, პარამეტრები +Keywords[km]=កម្មវិធីទទួលព័ត៌មាន,កំណត់រចនាសម្ព័ន្ធ,ការកំណត់ +Keywords[lt]=news ticker, configure, settings, konfigūravimas, nustatymai, naujienų pranešėjas +Keywords[ms]=Pengetik berita, konfigur, seting +Keywords[nb]=nyhetstelegraf, oppsett, innstillinger +Keywords[nds]=Narichten-Ticker, instellen +Keywords[ne]=न्यूज टिकर, कन्फिगर, सेटिङ +Keywords[nl]=newsticker,instellingen,configuratie,nieuws +Keywords[nn]=nyhendetelegraf,oppsett,innstillingar +Keywords[pl]=news ticker,wiadomości,nagłówki,konfiguracja,ustawienia +Keywords[pt]=notícias, configurar, configuração +Keywords[pt_BR]=mostrador de notícias,configurar, preferências +Keywords[ru]=news ticker, configure, settings, настройка, новости +Keywords[sk]=zdroje správ,nastavenie +Keywords[sl]=prikazovalnik novic, nastavi, nastavitve +Keywords[sr]=news ticker, подеси, поставке +Keywords[sr@Latn]=news ticker, podesi, postavke +Keywords[sv]=nyhetsövervakare, anpassa, inställningar +Keywords[ta]=கேமுகவரிப்புத்தகம்,கட்டமைப்பு,அமைவுகள் +Keywords[tg]=news ticker, configure, settings, танзимот +Keywords[tr]=haber izleyici, yapılandırma, yapılandır +Keywords[uk]=новини, налаштування, параметри +Keywords[zh_CN]=news ticker, configure, settings, 新闻点点通, 配置, 设置 diff --git a/kontact/plugins/newsticker/kcmkontactknt.h b/kontact/plugins/newsticker/kcmkontactknt.h new file mode 100644 index 000000000..7463cf004 --- /dev/null +++ b/kontact/plugins/newsticker/kcmkontactknt.h @@ -0,0 +1,102 @@ +/* + This file is part of Kontact. + Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> + + 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. + + This program 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#ifndef KCMKONTACTKNT_H +#define KCMKONTACTKNT_H + +#include <kcmodule.h> + +class QListViewItem; +class QSpinxBox; + +class KAboutData; +class KListView; +class KPushButton; + +class NewsItem; + +class KCMKontactKNT : public KCModule +{ + Q_OBJECT + + public: + KCMKontactKNT( QWidget *parent = 0, const char *name = 0 ); + + virtual void load(); + virtual void save(); + virtual void defaults(); + virtual const KAboutData* aboutData() const; + + private slots: + void addNews(); + void removeNews(); + void newFeed(); + void deleteFeed(); + + void selectedChanged( QListViewItem *item ); + void allCurrentChanged( QListViewItem *item ); + + void modified(); + + private: + void initGUI(); + void loadNews(); + void loadCustomNews(); + void storeCustomNews(); + void scanNews(); + + bool dcopActive() const; + + KListView *mAllNews; + KListView *mSelectedNews; + QListViewItem *mCustomItem; + + KPushButton *mAddButton; + KPushButton *mRemoveButton; + KPushButton *mNewButton; + KPushButton *mDeleteButton; + QSpinBox *mUpdateInterval; + QSpinBox *mArticleCount; + + QMap<QString, QString> mFeedMap; + QValueList<NewsItem*> mCustomFeeds; +}; + +class NewsEditDialog : public KDialogBase +{ + Q_OBJECT + + public: + NewsEditDialog( const QString&, const QString&, QWidget *parent ); + QString title() const; + QString url() const; + + private slots: + void modified(); + + private: + QLineEdit *mTitle; + QLineEdit *mURL; +}; + +#endif diff --git a/kontact/plugins/newsticker/newsfeeds.h b/kontact/plugins/newsticker/newsfeeds.h new file mode 100644 index 000000000..fb5ef4098 --- /dev/null +++ b/kontact/plugins/newsticker/newsfeeds.h @@ -0,0 +1,315 @@ +/* + This file is part of Kontact. + Copyright (c) 2004 Tobias Koenig <tokoe@kde.org> + + 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. + + This program 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#ifndef NEWSFEEDS_H +#define NEWSFEEDS_H + +#include <qvaluelist.h> + +#define DEFAULT_NEWSSOURCES 60 + +class NewsSourceData +{ + public: + typedef QValueList<NewsSourceData> List; + + enum Category { Arts, Business, Computers, Misc, + Recreation, Society }; + + NewsSourceData( const QString &name = I18N_NOOP( "Unknown" ), + const QString &url = QString::null, + const QString &icon = QString::null, + const Category category= Computers ) + : mName( name ), mURL( url ), mIcon( icon ), mCategory( category ) + { + } + + QString name() const { return mName; } + QString url() const { return mURL; } + QString icon() const { return mIcon; } + Category category() const { return mCategory; } + + QString mName; + QString mURL; + QString mIcon; + Category mCategory; +}; + +static NewsSourceData NewsSourceDefault[DEFAULT_NEWSSOURCES] = { + // Arts --------------- + NewsSourceData( + QString::fromLatin1("Bureau 42"), + QString::fromLatin1("http://www.bureau42.com/rdf/"), + QString::fromLatin1("http://www.bureau42.com/favicon.ico"), + NewsSourceData::Arts ), + NewsSourceData( + QString::fromLatin1("eFilmCritic"), + QString::fromLatin1("http://efilmcritic.com/fo.rdf"), + QString::fromLatin1("http://efilmcritic.com/favicon.ico"), + NewsSourceData::Arts ), + // Business ----------- + NewsSourceData( + QString::fromLatin1("Internet.com Business"), + QString::fromLatin1("http://headlines.internet.com/internetnews/bus-news/news.rss"), + QString::null, + NewsSourceData::Business ), + NewsSourceData( + QString::fromLatin1("TradeSims"), + QString::fromLatin1("http://www.tradesims.com/AEX.rdf"), + QString::null, + NewsSourceData::Business ), + // Computers ---------- + NewsSourceData( + QString::fromLatin1("KDE Deutschland"), + QString::fromLatin1("http://www.kde.de/nachrichten/nachrichten.rdf"), + QString::fromLatin1("http://www.kde.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("KDE France"), + QString::fromLatin1("http://www.kde-france.org/backend-breves.php3"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("FreeBSD Project News"), + QString::fromLatin1("http://www.freebsd.org/news/news.rdf"), + QString::fromLatin1("http://www.freebsd.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("dot.kde.org"), + QString::fromLatin1("http://www.kde.org/dotkdeorg.rdf"), + QString::fromLatin1("http://www.kde.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( QString::fromLatin1("KDE-Look.org"), + QString::fromLatin1("http://www.kde.org/kde-look-content.rdf"), + QString::fromLatin1("http://kde-look.org/img/favicon-1-1.ico"), + NewsSourceData::Computers ), + NewsSourceData( QString::fromLatin1("KDE-Apps.org"), + QString::fromLatin1("http://www.kde.org/dot/kde-apps-content.rdf"), + QString::fromLatin1("http://kde-apps.org/img/favicon-1-1.ico"), + NewsSourceData::Computers ), + NewsSourceData( QString::fromLatin1("DesktopLinux"), + QString::fromLatin1("http://www.desktoplinux.com/backend/index.html"), + QString::fromLatin1("http://www.desktoplinux.com/images/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( QString::fromLatin1("DistroWatch"), + QString::fromLatin1("http://distrowatch.com/news/dw.xml"), + QString::fromLatin1("http://distrowatch.com/favicon.ico"), + NewsSourceData::Computers ), + /*URL changed*/ + NewsSourceData( + QString::fromLatin1("GNOME News"), + QString::fromLatin1("http://www.gnomedesktop.org/node/feed"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Slashdot"), + QString::fromLatin1("http://slashdot.org/slashdot.rdf"), + QString::fromLatin1("http://slashdot.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Ask Slashdot"), + QString::fromLatin1("http://slashdot.org/askslashdot.rdf"), + QString::fromLatin1("http://slashdot.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Slashdot: Features"), + QString::fromLatin1("http://slashdot.org/features.rdf"), + QString::fromLatin1("http://slashdot.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Slashdot: Apache"), + QString::fromLatin1("http://slashdot.org/apache.rdf"), + QString::fromLatin1("http://slashdot.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Slashdot: Books"), + QString::fromLatin1("http://slashdot.org/books.rdf"), + QString::fromLatin1("http://slashdot.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Jabber News"), + QString::fromLatin1("http://www.jabber.org/news/rss.xml"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Freshmeat"), + QString::fromLatin1("http://freshmeat.net/backend/fm.rdf"), + QString::fromLatin1("http://freshmeat.net/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Linux Weekly News"), + QString::fromLatin1("http://www.lwn.net/headlines/rss"), + QString::fromLatin1("http://www.lwn.net/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("heise online news"), + QString::fromLatin1("http://www.heise.de/newsticker/heise.rdf"), + QString::fromLatin1("http://www.heise.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("RUS-CERT Ticker"), + QString::fromLatin1("http://cert.uni-stuttgart.de/ticker/rus-cert.rdf"), + QString::fromLatin1("http://cert.uni-stuttgart.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("RUS-CERT Elsewhere"), + QString::fromLatin1("http://cert.uni-stuttgart.de/ticker/rus-cert-elsewhere.rdf"), + QString::fromLatin1("http://cert.uni-stuttgart.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Kuro5hin"), + QString::fromLatin1("http://kuro5hin.org/backend.rdf"), + QString::fromLatin1("http://kuro5hin.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Prolinux"), + QString::fromLatin1("http://www.pl-forum.de/backend/pro-linux.rdf"), + QString::fromLatin1("http://www.prolinux.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("LinuxSecurity.com"), + QString::fromLatin1("http://www.linuxsecurity.com/linuxsecurity_hybrid.rdf"), + QString::fromLatin1("http://www.linuxsecurity.com/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Linux Game Tome"), + QString::fromLatin1("http://happypenguin.org/html/news.rdf"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Mozilla"), + QString::fromLatin1("http://www.mozilla.org/news.rdf"), + QString::fromLatin1("http://www.mozillazine.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("MozillaZine"), + QString::fromLatin1("http://www.mozillazine.org/contents.rdf"), + QString::fromLatin1("http://www.mozillazine.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Daemon News"), + QString::fromLatin1("http://daily.daemonnews.org/ddn.rdf.php3"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("use Perl;"), + QString::fromLatin1("http://use.perl.org/useperl.rdf"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Root prompt"), + QString::fromLatin1("http://www.rootprompt.org/rss/"), + QString::fromLatin1("http://www.rootprompt.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("SecurityFocus"), + QString::fromLatin1("http://www.securityfocus.com/topnews-rdf.html"), + QString::fromLatin1("http://www.securityfocus.com/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("Arstechnica"), + QString::fromLatin1("http://arstechnica.com/etc/rdf/ars.rdf"), + QString::fromLatin1("http://arstechnica.com/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("amiga-news.de - deutschsprachige Amiga Nachrichten"), + QString::fromLatin1("http://www.amiga-news.de/de/backends/news/index.rss"), + QString::fromLatin1("http://www.amiga-news.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("amiga-news.de - english Amiga news"), + QString::fromLatin1("http://www.amiga-news.de/en/backends/news/index.rss"), + QString::fromLatin1("http://www.amiga-news.de/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("FreshPorts - the place for ports"), + QString::fromLatin1("http://www.freshports.org/news.php3"), + QString::fromLatin1("http://www.freshports.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("zez.org - about code "), + QString::fromLatin1("http://zez.org/article/rssheadlines"), + QString::null, + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("BSDatwork.com"), + QString::fromLatin1("http://BSDatwork.com/backend.php"), + QString::fromLatin1("http://BSDatwork.com/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("FreshSource - the place for source"), + QString::fromLatin1("http://www.freshsource.org/news.php"), + QString::fromLatin1("http://www.freshsource.org/favicon.ico"), + NewsSourceData::Computers ), + NewsSourceData( + QString::fromLatin1("The FreeBSD Diary"), + QString::fromLatin1("http://www.freebsddiary.org/news.php"), + QString::fromLatin1("http://www.freebsddiary.org/favicon.ico"), + NewsSourceData::Computers ), + // Miscellaneous ------ + NewsSourceData( + QString::fromLatin1("tagesschau.de"), + QString::fromLatin1("http://www.tagesschau.de/newsticker.rdf"), + QString::fromLatin1("http://www.tagesschau.de/favicon.ico"), + NewsSourceData::Misc ), + NewsSourceData( + QString::fromLatin1("CNN Top Stories"), + QString::fromLatin1("http://rss.cnn.com/rss/cnn_topstories.rss"), + QString::fromLatin1("http://www.cnn.com/favicon.ico"), + NewsSourceData::Misc ), + /*feed URL changed*/ + NewsSourceData( + QString::fromLatin1("HotWired"), + QString::fromLatin1("http://www.wired.com/news/feeds/rss2/0,2610,,00.xml"), + QString::fromLatin1("http://www.hotwired.com/favicon.ico"), + NewsSourceData::Misc ), + NewsSourceData( + QString::fromLatin1("The Register"), + QString::fromLatin1("http://www.theregister.co.uk/headlines.rss"), + QString::fromLatin1("http://www.theregister.co.uk/favicon.ico"), + NewsSourceData::Misc ), + NewsSourceData( + QString::fromLatin1( "Christian Science Monitor" ), + QString::fromLatin1( "http://www.csmonitor.com/rss/csm.rss"), + QString::fromLatin1( "http://www.csmonitor.com/favicon.ico"), + NewsSourceData::Misc ), + // Recreation + // Society + NewsSourceData( + QString::fromLatin1("nippon.it"), + QString::fromLatin1("http://www.nippon.it/backend.it.php"), + QString::fromLatin1("http://www.nippon.it/favicon.ico"), + NewsSourceData::Society ), + NewsSourceData( + QString::fromLatin1( "gflash" ), + QString::fromLatin1( "http://www.gflash.de/backend.php"), + QString::fromLatin1( "http://www.gflash.de/favicon.ico"), + NewsSourceData::Society ), + NewsSourceData( + QString::fromLatin1( "Quintessenz" ), + QString::fromLatin1( "http://quintessenz.at/cgi-bin/rdf"), + QString::fromLatin1( "http://quintessenz.at/favicon.ico"), + NewsSourceData::Society ) +}; + +#endif diff --git a/kontact/plugins/newsticker/newsticker_plugin.cpp b/kontact/plugins/newsticker/newsticker_plugin.cpp new file mode 100644 index 000000000..0bc42bd14 --- /dev/null +++ b/kontact/plugins/newsticker/newsticker_plugin.cpp @@ -0,0 +1,43 @@ +/* + This file is part of Kontact. + Copyright (C) 2003 Tobias Koenig <tokoe@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <kgenericfactory.h> +#include <klocale.h> +#include <kparts/componentfactory.h> +#include "core.h" + +#include "summarywidget.h" + +#include "newsticker_plugin.h" + +typedef KGenericFactory< NewsTickerPlugin, Kontact::Core > NewsTickerPluginFactory; +K_EXPORT_COMPONENT_FACTORY( libkontact_newstickerplugin, + NewsTickerPluginFactory( "kontact_newstickerplugin" ) ) + +NewsTickerPlugin::NewsTickerPlugin( Kontact::Core *core, const char *name, const QStringList& ) + : Kontact::Plugin( core, core, name ) +{ + setInstance( NewsTickerPluginFactory::instance() ); +} + +Kontact::Summary *NewsTickerPlugin::createSummaryWidget( QWidget* parentWidget ) +{ + return new SummaryWidget( parentWidget ); +} diff --git a/kontact/plugins/newsticker/newsticker_plugin.h b/kontact/plugins/newsticker/newsticker_plugin.h new file mode 100644 index 000000000..d912da797 --- /dev/null +++ b/kontact/plugins/newsticker/newsticker_plugin.h @@ -0,0 +1,40 @@ +/* + This file is part of Kontact. + Copyright (C) 2003 Tobias Koenig <tokoe@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef NEWSTICKER_PLUGIN_H +#define NEWSTICKER_PLUGIN_H + +#include "plugin.h" + +class SummaryWidget; + +class NewsTickerPlugin : public Kontact::Plugin +{ + public: + NewsTickerPlugin( Kontact::Core *core, const char *name, const QStringList& ); + NewsTickerPlugin(); + + virtual Kontact::Summary *createSummaryWidget( QWidget* parentWidget ); + + protected: + virtual KParts::ReadOnlyPart* createPart() { return 0L; } +}; + +#endif diff --git a/kontact/plugins/newsticker/newstickerplugin.desktop b/kontact/plugins/newsticker/newstickerplugin.desktop new file mode 100644 index 000000000..18a34cda9 --- /dev/null +++ b/kontact/plugins/newsticker/newstickerplugin.desktop @@ -0,0 +1,99 @@ +[Desktop Entry] +Type=Service +Icon=knewsticker +ServiceTypes=Kontact/Plugin,KPluginInfo +TryExec=rssservice + +X-KDE-Library=libkontact_newstickerplugin +X-KDE-KontactPluginVersion=6 +X-KDE-KontactPluginHasSummary=true +X-KDE-KontactPluginHasPart=false + +X-KDE-PluginInfo-Name=kontact_newstickerplugin +X-KDE-PluginInfo-Version=0.1 +X-KDE-PluginInfo-License=LGPL +X-KDE-PluginInfo-EnabledByDefault=true + +Comment=Newsticker Component +Comment[bg]=Компонент за новини +Comment[ca]=Component de teletip de notícies +Comment[da]=Nyhedstelegraf-komponent +Comment[de]=Newsticker-Komponente +Comment[el]=Συστατικό προβολέα ειδήσεων +Comment[es]=Componente de teletipo de noticias +Comment[et]=Uudistejälgija plugin +Comment[fr]=Composant Newsticker +Comment[is]=Fréttastrimilseining +Comment[it]=Componente ticker notizie +Comment[ja]=ニュースティッカーコンポーネント +Comment[km]=សមាសភាគ Newsticker +Comment[nds]=Narichtentelegraaf-Komponent +Comment[nl]=Nieuwstickercomponent +Comment[pl]=Składnik paska wiadomości +Comment[ru]=Компонент новостей +Comment[sr]=Компонента откуцавача вести +Comment[sr@Latn]=Komponenta otkucavača vesti +Comment[sv]=Nyhetsövervakningskomponent +Comment[tr]=Haber İzleyici Bileşeni +Comment[zh_CN]=新闻点点通组件 +Comment[zh_TW]=新聞顯示組件 +Name=News +Name[af]=Nuus +Name[ar]=الأخبار +Name[be]=Навіны +Name[bg]=Новини +Name[br]=Keleier +Name[bs]=Usenet +Name[ca]=Notícies +Name[cs]=Novinky +Name[cy]=Newyddion +Name[da]=Nyheder +Name[de]=Usenet +Name[el]=Νέα +Name[eo]=Novaĵoj +Name[es]=Noticias +Name[et]=Uudisegrupid +Name[eu]=Berriak +Name[fa]=اخبار +Name[fi]=Uutiset +Name[fr]=Nouvelles +Name[fy]=Nijs +Name[ga]=Nuacht +Name[gl]=Novas +Name[he]=חדשות +Name[hi]=समाचार +Name[hu]=Hírek +Name[is]=Fréttir +Name[ja]=ニュース +Name[ka]=სიახლეები +Name[kk]=Жаңалықтар +Name[km]=ព័ត៌មាន +Name[lt]=Naujienos +Name[mk]=Вести +Name[ms]=Berita +Name[nb]=Njus +Name[nds]=Narichten +Name[ne]=समाचार +Name[nl]=Nieuws +Name[nn]=Nyheiter +Name[pa]=ਖ਼ਬਰਾਂ +Name[pl]=Listy dyskusyjne +Name[pt]=Notícias +Name[pt_BR]=Notícias +Name[ro]=Ştiri +Name[ru]=Новости +Name[se]=Ođđasat +Name[sk]=Diskusné skupiny +Name[sl]=Novice +Name[sr]=Вести +Name[sr@Latn]=Vesti +Name[sv]=Nyheter +Name[ta]=செய்திகள் +Name[tg]=Ахборот +Name[th]=ข่าว +Name[tr]=Haberler +Name[uk]=Новини +Name[uz]=Yangiliklar +Name[uz@cyrillic]=Янгиликлар +Name[zh_CN]=新闻 +Name[zh_TW]=新聞 diff --git a/kontact/plugins/newsticker/summarywidget.cpp b/kontact/plugins/newsticker/summarywidget.cpp new file mode 100644 index 000000000..14b7bc27a --- /dev/null +++ b/kontact/plugins/newsticker/summarywidget.cpp @@ -0,0 +1,319 @@ +/* + This file is part of Kontact. + Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> + + 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. + + This program 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qclipboard.h> +#include <qeventloop.h> +#include <qhbox.h> +#include <qlayout.h> +#include <qpixmap.h> +#include <qpopupmenu.h> +#include <qcursor.h> + +#include <dcopclient.h> +#include <kapplication.h> +#include <kcharsets.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kurllabel.h> + +#include "summarywidget.h" + +SummaryWidget::SummaryWidget( QWidget *parent, const char *name ) + : Kontact::Summary( parent, name ), + DCOPObject( "NewsTickerPlugin" ), mLayout( 0 ), mFeedCounter( 0 ) +{ + QVBoxLayout *vlay = new QVBoxLayout( this, 3, 3 ); + + QPixmap icon = KGlobal::iconLoader()->loadIcon( "kontact_news", + KIcon::Desktop, KIcon::SizeMedium ); + + QWidget *header = createHeader( this, icon, i18n( "News Feeds" ) ); + vlay->addWidget( header ); + + QString error; + QCString appID; + + bool dcopAvailable = true; + if ( !kapp->dcopClient()->isApplicationRegistered( "rssservice" ) ) { + if ( KApplication::startServiceByDesktopName( "rssservice", QStringList(), &error, &appID ) ) { + QLabel *label = new QLabel( i18n( "No rss dcop service available.\nYou need rssservice to use this plugin." ), this ); + vlay->addWidget( label, Qt::AlignHCenter ); + dcopAvailable = false; + } + } + + mBaseWidget = new QWidget( this, "baseWidget" ); + vlay->addWidget( mBaseWidget ); + + connect( &mTimer, SIGNAL( timeout() ), this, SLOT( updateDocuments() ) ); + + readConfig(); + + connectDCOPSignal( 0, 0, "documentUpdateError(DCOPRef,int)", "documentUpdateError(DCOPRef, int)", false ); + + if ( dcopAvailable ) + initDocuments(); + + connectDCOPSignal( 0, 0, "added(QString)", "documentAdded(QString)", false ); + connectDCOPSignal( 0, 0, "removed(QString)", "documentRemoved(QString)", false ); +} + +int SummaryWidget::summaryHeight() const +{ + return ( mFeeds.count() == 0 ? 1 : mFeeds.count() ); +} + +void SummaryWidget::documentAdded( QString ) +{ + initDocuments(); +} + +void SummaryWidget::documentRemoved( QString ) +{ + initDocuments(); +} + +void SummaryWidget::configChanged() +{ + readConfig(); + + updateView(); +} + +void SummaryWidget::readConfig() +{ + KConfig config( "kcmkontactkntrc" ); + config.setGroup( "General" ); + + mUpdateInterval = config.readNumEntry( "UpdateInterval", 600 ); + mArticleCount = config.readNumEntry( "ArticleCount", 4 ); +} + +void SummaryWidget::initDocuments() +{ + mFeeds.clear(); + + DCOPRef dcopCall( "rssservice", "RSSService" ); + QStringList urls; + dcopCall.call( "list()" ).get( urls ); + + if ( urls.isEmpty() ) { // add default + urls.append( "http://www.kde.org/dotkdeorg.rdf" ); + dcopCall.send( "add(QString)", urls[ 0 ] ); + } + + QStringList::Iterator it; + for ( it = urls.begin(); it != urls.end(); ++it ) { + DCOPRef feedRef = dcopCall.call( "document(QString)", *it ); + + Feed feed; + feed.ref = feedRef; + feedRef.call( "title()" ).get( feed.title ); + feedRef.call( "link()" ).get( feed.url ); + feedRef.call( "pixmap()" ).get( feed.logo ); + mFeeds.append( feed ); + + disconnectDCOPSignal( "rssservice", feedRef.obj(), "documentUpdated(DCOPRef)", 0 ); + connectDCOPSignal( "rssservice", feedRef.obj(), "documentUpdated(DCOPRef)", + "documentUpdated(DCOPRef)", false ); + + if ( qApp ) + qApp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput | + QEventLoop::ExcludeSocketNotifiers ); + } + + updateDocuments(); +} + +void SummaryWidget::updateDocuments() +{ + mTimer.stop(); + + FeedList::Iterator it; + for ( it = mFeeds.begin(); it != mFeeds.end(); ++it ) + (*it).ref.send( "refresh()" ); + + mTimer.start( 1000 * mUpdateInterval ); +} + +void SummaryWidget::documentUpdated( DCOPRef feedRef ) +{ + ArticleMap map; + + int numArticles = feedRef.call( "count()" ); + for ( int i = 0; i < numArticles; ++i ) { + DCOPRef artRef = feedRef.call( "article(int)", i ); + QString title, url; + + if ( qApp ) + qApp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput | + QEventLoop::ExcludeSocketNotifiers ); + + artRef.call( "title()" ).get( title ); + artRef.call( "link()" ).get( url ); + + QPair<QString, KURL> article(title, KURL( url )); + map.append( article ); + } + + FeedList::Iterator it; + for ( it = mFeeds.begin(); it != mFeeds.end(); ++it ) + if ( (*it).ref.obj() == feedRef.obj() ) { + (*it).map = map; + if ( (*it).title.isEmpty() ) + feedRef.call( "title()" ).get( (*it).title ); + if ( (*it).url.isEmpty() ) + feedRef.call( "link()" ).get( (*it).url ); + if ( (*it).logo.isNull() ) + feedRef.call( "pixmap()" ).get( (*it).logo ); + } + + mFeedCounter++; + if ( mFeedCounter == mFeeds.count() ) { + mFeedCounter = 0; + updateView(); + } +} + +void SummaryWidget::updateView() +{ + mLabels.setAutoDelete( true ); + mLabels.clear(); + mLabels.setAutoDelete( false ); + + delete mLayout; + mLayout = new QVBoxLayout( mBaseWidget, 3 ); + + QFont boldFont; + boldFont.setBold( true ); + boldFont.setPointSize( boldFont.pointSize() + 2 ); + + FeedList::Iterator it; + for ( it = mFeeds.begin(); it != mFeeds.end(); ++it ) { + QHBox *hbox = new QHBox( mBaseWidget ); + mLayout->addWidget( hbox ); + + // icon + KURLLabel *urlLabel = new KURLLabel( hbox ); + urlLabel->setURL( (*it).url ); + urlLabel->setPixmap( (*it).logo ); + urlLabel->setMaximumSize( urlLabel->minimumSizeHint() ); + mLabels.append( urlLabel ); + + connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ), + kapp, SLOT( invokeBrowser( const QString& ) ) ); + connect( urlLabel, SIGNAL( rightClickedURL( const QString& ) ), + this, SLOT( rmbMenu( const QString& ) ) ); + + // header + QLabel *label = new QLabel( hbox ); + label->setText( KCharsets::resolveEntities( (*it).title ) ); + label->setAlignment( AlignLeft|AlignVCenter ); + label->setFont( boldFont ); + label->setIndent( 6 ); + label->setMaximumSize( label->minimumSizeHint() ); + mLabels.append( label ); + + hbox->setMaximumWidth( hbox->minimumSizeHint().width() ); + hbox->show(); + + // articles + ArticleMap articles = (*it).map; + ArticleMap::Iterator artIt; + int numArticles = 0; + for ( artIt = articles.begin(); artIt != articles.end() && numArticles < mArticleCount; ++artIt ) { + urlLabel = new KURLLabel( (*artIt).second.url(), (*artIt).first, mBaseWidget ); + urlLabel->installEventFilter( this ); + //TODO: RichText causes too much horizontal space between articles + //urlLabel->setTextFormat( RichText ); + mLabels.append( urlLabel ); + mLayout->addWidget( urlLabel ); + + connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ), + kapp, SLOT( invokeBrowser( const QString& ) ) ); + connect( urlLabel, SIGNAL( rightClickedURL( const QString& ) ), + this, SLOT( rmbMenu( const QString& ) ) ); + + + numArticles++; + } + } + + for ( QLabel *label = mLabels.first(); label; label = mLabels.next() ) + label->show(); +} + +void SummaryWidget::documentUpdateError( DCOPRef feedRef, int errorCode ) +{ + kdDebug() << " error while updating document, error code: " << errorCode << endl; + FeedList::Iterator it; + for ( it = mFeeds.begin(); it != mFeeds.end(); ++it ) { + if ( (*it).ref.obj() == feedRef.obj() ) { + mFeeds.remove( it ); + break; + } + } + + if ( mFeedCounter == mFeeds.count() ) { + mFeedCounter = 0; + updateView(); + } + +} + +QStringList SummaryWidget::configModules() const +{ + return "kcmkontactknt.desktop"; +} + +void SummaryWidget::updateSummary( bool ) +{ + updateDocuments(); +} + +void SummaryWidget::rmbMenu( const QString& url ) +{ + QPopupMenu menu; + menu.insertItem( i18n( "Copy URL to Clipboard" ) ); + int id = menu.exec( QCursor::pos() ); + if ( id != -1 ) + kapp->clipboard()->setText( url, QClipboard::Clipboard ); +} + +bool SummaryWidget::eventFilter( QObject *obj, QEvent* e ) +{ + if ( obj->inherits( "KURLLabel" ) ) { + KURLLabel* label = static_cast<KURLLabel*>( obj ); + if ( e->type() == QEvent::Enter ) + emit message( label->url() ); + if ( e->type() == QEvent::Leave ) + emit message( QString::null ); + } + + return Kontact::Summary::eventFilter( obj, e ); +} + +#include "summarywidget.moc" diff --git a/kontact/plugins/newsticker/summarywidget.h b/kontact/plugins/newsticker/summarywidget.h new file mode 100644 index 000000000..ad914334b --- /dev/null +++ b/kontact/plugins/newsticker/summarywidget.h @@ -0,0 +1,115 @@ +/* + This file is part of Kontact. + Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> + + 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. + + This program 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#ifndef SUMMARYWIDGET_H +#define SUMMARYWIDGET_H + +#include <dcopobject.h> +#include <dcopref.h> + +#include <qmap.h> +#include <qptrlist.h> +#include <qtimer.h> +#include <qwidget.h> + +#include "summary.h" +#include <kurl.h> + +class QVBoxLayout; +class QLabel; + +class DCOPRef; +class KURLLabel; + +typedef QValueList< QPair<QString, KURL> > ArticleMap; + +typedef struct { + DCOPRef ref; + QString title; + QString url; + QPixmap logo; + ArticleMap map; +} Feed; + +typedef QValueList<Feed> FeedList; + +class SummaryWidget : public Kontact::Summary, public DCOPObject +{ + Q_OBJECT + K_DCOP + + public: + SummaryWidget( QWidget *parent, const char *name = 0 ); + + int summaryHeight() const; + QStringList configModules() const; + + k_dcop: + /** + * Inform the newsticker summary widget that an RSSDocument has been updated. + */ + void documentUpdated( DCOPRef ); + /** + * Inform the newsticker summary widget that a feed has been added. + */ + void documentAdded( QString ); + /** + * Inform the newsticker summary widget that a feed has been removed. + */ + void documentRemoved( QString ); + /** + * Inform the newsticker summary widget that an error occurred while updating a feed. + * @param ref DCOPRef to the failing RSSDocument. + * @param errorCode indicates the cause of the failure: 1 = RSS Parse Error, 2 = Could not access file, 3 = Unknown error. + */ + void documentUpdateError( DCOPRef ref, int errorCode ); + + public slots: + void updateSummary( bool force = false ); + void configChanged(); + + protected slots: + void updateDocuments(); + void rmbMenu( const QString& ); + + protected: + virtual bool eventFilter( QObject *obj, QEvent *e ); + void initDocuments(); + void updateView(); + void readConfig(); + + private: + QVBoxLayout *mLayout; + QWidget* mBaseWidget; + + QPtrList<QLabel> mLabels; + + FeedList mFeeds; + + QTimer mTimer; + int mUpdateInterval; + int mArticleCount; + uint mFeedCounter; +}; + +#endif |