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.
280 lines
9.2 KiB
280 lines
9.2 KiB
// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
|
|
|
|
/***************************************************************************
|
|
sidebar_news.cpp - The real sidebar plugin
|
|
-------------------
|
|
begin : Sat June 23 13:35:30 CEST 2001
|
|
copyright : (C) 2001,2002 Marcus Camen, Joseph Wenninger
|
|
copyright : (C) 2003,2004 Marcus Camen
|
|
email : Marcus Camen <mcamen@mcamen.de>
|
|
idea and original code: jowenn@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 <dcopclient.h>
|
|
#include <tqtimer.h>
|
|
#include <tqbuffer.h>
|
|
#include <tqwidgetstack.h>
|
|
#include <kdebug.h>
|
|
#include <tdeapplication.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <kdesktopfile.h>
|
|
#include <kiconloader.h>
|
|
#include <kdemacros.h>
|
|
#include "sidebar_news.h"
|
|
#include "nsstacktabwidget.h"
|
|
#include "norsswidget.h"
|
|
#include "sidebarsettings.h"
|
|
|
|
|
|
namespace KSB_News {
|
|
|
|
KonqSidebar_News::KonqSidebar_News(TDEInstance *inst, TQObject *parent,
|
|
TQWidget *widgetParent,
|
|
TQString &desktopName, const char* name)
|
|
: KonqSidebarPlugin(inst, parent, widgetParent, desktopName, name),
|
|
DCOPObject("sidebar-newsticker")
|
|
{
|
|
// get the application icon
|
|
// FIXME: as konqueror knows the icon there might be a possibility to
|
|
// access the already present TQPixmap
|
|
KDesktopFile desktopFile(desktopName, true);
|
|
TQString iconName = desktopFile.readIcon();
|
|
TDEIconLoader iconLoader;
|
|
m_appIcon = iconLoader.loadIcon(iconName, TDEIcon::Small);
|
|
|
|
// create all sidebar widgets
|
|
widgets = new TQWidgetStack(widgetParent, "main_widgetstack");
|
|
newswidget = new NSStackTabWidget(widgets, "feedbrowser_stackchld",
|
|
m_appIcon);
|
|
noRSSwidget = new NoRSSWidget(widgets, "nofeed_stackchld");
|
|
widgets->addWidget(newswidget);
|
|
widgets->addWidget(noRSSwidget);
|
|
widgets->raiseWidget(noRSSwidget);
|
|
noRSSwidget->show();
|
|
|
|
// try to connect to the DCOP service
|
|
if (checkDcopService() > 0) {
|
|
KMessageBox::sorry(widgets,
|
|
i18n("<qt>Cannot connect to RSS service. Please make "
|
|
"sure the <strong>rssservice</strong> program "
|
|
"is available (usually distributed as part "
|
|
"of tdenetwork).</qt>"),
|
|
i18n("Sidebar Newsticker"));
|
|
noRSSwidget->setEnabled(false);
|
|
} else {
|
|
m_rssservice = DCOPRef("rssservice", "RSSService");
|
|
|
|
TQStringList reslist = SidebarSettings::sources();
|
|
TQStringList::iterator it;
|
|
for (it = reslist.begin(); it != reslist.end(); ++it) {
|
|
addedRSSSource(*it);
|
|
}
|
|
|
|
// fetch added and removed RSS sources
|
|
connectDCOPSignal("rssservice", m_rssservice.obj(), "added(TQString)",
|
|
"addedRSSSource(TQString)", false);
|
|
connectDCOPSignal("rssservice", m_rssservice.obj(), "removed(TQString)",
|
|
"removedRSSSource(TQString)", false);
|
|
|
|
// show special widget if there are no RSS sources available
|
|
if (newswidget->isEmpty()) {
|
|
widgets->raiseWidget(noRSSwidget);
|
|
noRSSwidget->show();
|
|
} else {
|
|
widgets->raiseWidget(newswidget);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
KonqSidebar_News::~KonqSidebar_News() {
|
|
}
|
|
|
|
|
|
|
|
void *KonqSidebar_News::provides(const TQString &) {return 0;}
|
|
|
|
void KonqSidebar_News::emitStatusBarText (const TQString &) {;}
|
|
|
|
TQWidget *KonqSidebar_News::getWidget(){return widgets;}
|
|
|
|
void KonqSidebar_News::handleURL(const KURL &/*url*/) {;}
|
|
|
|
|
|
///////// startup of the DCOP servce ///////////////////////////////////////
|
|
|
|
int KonqSidebar_News::checkDcopService() {
|
|
TQString rdfservice_error;
|
|
int err = 0;
|
|
|
|
if (! kapp->dcopClient()->isApplicationRegistered("rssservice"))
|
|
if (TDEApplication::startServiceByDesktopName("rssservice", TQString(),
|
|
&rdfservice_error) > 0)
|
|
err = 1;
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
|
|
///////// helper methods ///////////////////////////////////////////////////
|
|
|
|
NSPanel *KonqSidebar_News::getNSPanelByKey(TQString key) {
|
|
NSPanel *nsp = NULL, *current_nsp;
|
|
|
|
for (current_nsp = nspanelptrlist.first(); current_nsp;
|
|
current_nsp = nspanelptrlist.next()) {
|
|
if (current_nsp->key() == key)
|
|
nsp = current_nsp;
|
|
}
|
|
|
|
return nsp;
|
|
}
|
|
|
|
|
|
void KonqSidebar_News::addedRSSSource(TQString key) {
|
|
kdDebug(90140) << "KonqSidebar_News::addedRSSSource: " << key << endl;
|
|
|
|
// Only add RSS source if we have registered the URI before in
|
|
// NSStackTabWidget.
|
|
if (newswidget->isRegistered(key)) {
|
|
NSPanel *nspanel = new NSPanel(this,
|
|
TQString(TQString("sidebar-newsticker-")+key).latin1(),
|
|
key, &m_rssservice);
|
|
nspanel->setTitle(key);
|
|
nspanelptrlist.append(nspanel);
|
|
|
|
// add preliminary widgets for this newssource
|
|
if (! nspanel->listbox()) {
|
|
TTListBox *listbox = new TTListBox(newswidget, "article_lb");
|
|
newswidget->addStackTab(nspanel, listbox);
|
|
connect(listbox, TQT_SIGNAL(executed(TQListBoxItem *)),
|
|
this, TQT_SLOT(slotArticleItemExecuted(TQListBoxItem *)));
|
|
listbox->insertItem(i18n("Connecting..." ));
|
|
nspanel->setListbox(listbox);
|
|
}
|
|
|
|
// listen to updates
|
|
connect(nspanel, TQT_SIGNAL(documentUpdated(NSPanel *)),
|
|
this, TQT_SLOT(updateArticles(NSPanel *)));
|
|
connect(nspanel, TQT_SIGNAL(documentUpdated(NSPanel *)),
|
|
this, TQT_SLOT(updateTitle(NSPanel *)));
|
|
connect(nspanel, TQT_SIGNAL(pixmapUpdated(NSPanel *)),
|
|
this, TQT_SLOT(updatePixmap(NSPanel *)));
|
|
|
|
if (widgets->visibleWidget() != newswidget)
|
|
widgets->raiseWidget(newswidget);
|
|
}
|
|
}
|
|
|
|
|
|
void KonqSidebar_News::removedRSSSource(TQString key) {
|
|
kdDebug(90140) << "inside KonqSidebar_News::removedSource " << key << endl;
|
|
|
|
if (NSPanel *nsp = getNSPanelByKey(key)) {
|
|
newswidget->delStackTab(nsp);
|
|
delete nspanelptrlist.take(nspanelptrlist.findRef(nsp));
|
|
} else
|
|
kdWarning() << "removedSource called for non-existing id" << endl;
|
|
|
|
if (newswidget->isEmpty())
|
|
widgets->raiseWidget(noRSSwidget);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
void KonqSidebar_News::slotArticleItemExecuted(TQListBoxItem *item) {
|
|
if (!item) return;
|
|
|
|
NSPanel *current_nspanel, *nspanel = NULL;
|
|
for (current_nspanel = nspanelptrlist.first(); current_nspanel;
|
|
current_nspanel = nspanelptrlist.next()) {
|
|
if (current_nspanel->listbox() == item->listBox())
|
|
nspanel = current_nspanel;
|
|
}
|
|
|
|
int subid = nspanel->listbox()->index(item);
|
|
TQString link = nspanel->articleLinks()[subid];
|
|
|
|
emit openURLRequest(KURL(link));
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////// update article headlines ////////////
|
|
|
|
void KonqSidebar_News::updateArticles(NSPanel *nsp) {
|
|
nsp->listbox()->clear();
|
|
|
|
TQStringList articleList = nsp->articles();
|
|
TQStringList::iterator it;
|
|
for (it = articleList.begin(); it != articleList.end(); ++it)
|
|
nsp->listbox()->insertItem((*it));
|
|
}
|
|
|
|
|
|
/////////// Title stuff /////////////////////////////////////
|
|
|
|
void KonqSidebar_News::updateTitle(NSPanel *nsp) {
|
|
newswidget->updateTitle(nsp);
|
|
}
|
|
|
|
|
|
/////////// Pixmap stuff /////////////////////////////////////
|
|
|
|
void KonqSidebar_News::updatePixmap(NSPanel *nsp) {
|
|
newswidget->updatePixmap(nsp);
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////
|
|
|
|
|
|
extern "C" {
|
|
KDE_EXPORT void* create_konq_sidebarnews(TDEInstance *instance, TQObject *par,
|
|
TQWidget *widp,
|
|
TQString &desktopname,
|
|
const char *name) {
|
|
TDEGlobal::locale()->insertCatalogue("konqsidebar_news");
|
|
return new KonqSidebar_News(instance, par, widp, desktopname, name);
|
|
}
|
|
}
|
|
|
|
extern "C" {
|
|
KDE_EXPORT bool add_konq_sidebarnews(TQString* fn, TQString*,
|
|
TQMap<TQString,TQString> *map) {
|
|
map->insert("Type", "Link");
|
|
map->insert("Icon", "konqsidebar_news");
|
|
map->insert("Name", i18n("Newsticker"));
|
|
map->insert("Open", "false");
|
|
map->insert("X-TDE-KonqSidebarModule", "konq_sidebarnews");
|
|
fn->setLatin1("news%1.desktop");
|
|
return true;
|
|
}
|
|
}
|
|
|
|
} // namespace KSB_News
|
|
|
|
#include "sidebar_news.moc"
|