summaryrefslogtreecommitdiffstats
path: root/kontact/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'kontact/plugins')
-rw-r--r--kontact/plugins/Makefile.am6
-rw-r--r--kontact/plugins/akregator/Makefile.am14
-rw-r--r--kontact/plugins/akregator/akregator_plugin.cpp156
-rw-r--r--kontact/plugins/akregator/akregator_plugin.h81
-rw-r--r--kontact/plugins/akregator/akregatorplugin.desktop87
-rw-r--r--kontact/plugins/akregator/akregatorplugin3.2.desktop112
-rw-r--r--kontact/plugins/kaddressbook/Makefile.am18
-rw-r--r--kontact/plugins/kaddressbook/kaddressbook_plugin.cpp218
-rw-r--r--kontact/plugins/kaddressbook/kaddressbook_plugin.h86
-rw-r--r--kontact/plugins/kaddressbook/kaddressbookplugin.desktop100
-rw-r--r--kontact/plugins/karm/Makefile.am16
-rw-r--r--kontact/plugins/karm/karm_plugin.cpp71
-rw-r--r--kontact/plugins/karm/karm_plugin.h57
-rw-r--r--kontact/plugins/karm/karmplugin.desktop59
-rw-r--r--kontact/plugins/kitchensync/Makefile.am14
-rw-r--r--kontact/plugins/kitchensync/kitchensync.desktop52
-rw-r--r--kontact/plugins/kitchensync/kitchensync_plugin.cpp67
-rw-r--r--kontact/plugins/kitchensync/kitchensync_plugin.h51
-rw-r--r--kontact/plugins/kmail/Makefile.am29
-rw-r--r--kontact/plugins/kmail/kcmkmailsummary.cpp192
-rw-r--r--kontact/plugins/kmail/kcmkmailsummary.desktop107
-rw-r--r--kontact/plugins/kmail/kcmkmailsummary.h61
-rw-r--r--kontact/plugins/kmail/kmail_plugin.cpp221
-rw-r--r--kontact/plugins/kmail/kmail_plugin.h86
-rw-r--r--kontact/plugins/kmail/kmailplugin.desktop67
-rw-r--r--kontact/plugins/kmail/summarywidget.cpp182
-rw-r--r--kontact/plugins/kmail/summarywidget.h73
-rw-r--r--kontact/plugins/knode/Makefile.am14
-rw-r--r--kontact/plugins/knode/knode_plugin.cpp123
-rw-r--r--kontact/plugins/knode/knode_plugin.h68
-rw-r--r--kontact/plugins/knode/knodeplugin.desktop98
-rw-r--r--kontact/plugins/knotes/Makefile.am23
-rw-r--r--kontact/plugins/knotes/knotes_part.cpp413
-rw-r--r--kontact/plugins/knotes/knotes_part.h101
-rw-r--r--kontact/plugins/knotes/knotes_part.rc23
-rw-r--r--kontact/plugins/knotes/knotes_part_p.h188
-rw-r--r--kontact/plugins/knotes/knotes_plugin.cpp97
-rw-r--r--kontact/plugins/knotes/knotes_plugin.h58
-rw-r--r--kontact/plugins/knotes/knotesplugin.desktop95
-rw-r--r--kontact/plugins/knotes/knotetip.cpp227
-rw-r--r--kontact/plugins/knotes/knotetip.h68
-rw-r--r--kontact/plugins/knotes/summarywidget.cpp164
-rw-r--r--kontact/plugins/knotes/summarywidget.h71
-rw-r--r--kontact/plugins/korganizer/Makefile.am58
-rw-r--r--kontact/plugins/korganizer/journalplugin.cpp139
-rw-r--r--kontact/plugins/korganizer/journalplugin.desktop89
-rw-r--r--kontact/plugins/korganizer/journalplugin.h63
-rw-r--r--kontact/plugins/korganizer/kcmkorgsummary.cpp200
-rw-r--r--kontact/plugins/korganizer/kcmkorgsummary.desktop125
-rw-r--r--kontact/plugins/korganizer/kcmkorgsummary.h56
-rw-r--r--kontact/plugins/korganizer/korg_uniqueapp.cpp38
-rw-r--r--kontact/plugins/korganizer/korg_uniqueapp.h37
-rw-r--r--kontact/plugins/korganizer/korganizerplugin.cpp227
-rw-r--r--kontact/plugins/korganizer/korganizerplugin.desktop101
-rw-r--r--kontact/plugins/korganizer/korganizerplugin.h75
-rw-r--r--kontact/plugins/korganizer/summarywidget.cpp313
-rw-r--r--kontact/plugins/korganizer/summarywidget.h70
-rw-r--r--kontact/plugins/korganizer/todoplugin.cpp230
-rw-r--r--kontact/plugins/korganizer/todoplugin.desktop65
-rw-r--r--kontact/plugins/korganizer/todoplugin.h68
-rw-r--r--kontact/plugins/korganizer/todosummarywidget.cpp270
-rw-r--r--kontact/plugins/korganizer/todosummarywidget.h72
-rw-r--r--kontact/plugins/kpilot/Makefile.am24
-rw-r--r--kontact/plugins/kpilot/kpilot_plugin.cpp69
-rw-r--r--kontact/plugins/kpilot/kpilot_plugin.h49
-rw-r--r--kontact/plugins/kpilot/kpilotplugin.desktop44
-rw-r--r--kontact/plugins/kpilot/summarywidget.cpp242
-rw-r--r--kontact/plugins/kpilot/summarywidget.h99
-rw-r--r--kontact/plugins/newsticker/Makefile.am26
-rw-r--r--kontact/plugins/newsticker/kcmkontactknt.cpp452
-rw-r--r--kontact/plugins/newsticker/kcmkontactknt.desktop156
-rw-r--r--kontact/plugins/newsticker/kcmkontactknt.h102
-rw-r--r--kontact/plugins/newsticker/newsfeeds.h315
-rw-r--r--kontact/plugins/newsticker/newsticker_plugin.cpp43
-rw-r--r--kontact/plugins/newsticker/newsticker_plugin.h40
-rw-r--r--kontact/plugins/newsticker/newstickerplugin.desktop99
-rw-r--r--kontact/plugins/newsticker/summarywidget.cpp319
-rw-r--r--kontact/plugins/newsticker/summarywidget.h115
-rw-r--r--kontact/plugins/specialdates/Makefile.am31
-rw-r--r--kontact/plugins/specialdates/kcmsdsummary.cpp248
-rw-r--r--kontact/plugins/specialdates/kcmsdsummary.desktop126
-rw-r--r--kontact/plugins/specialdates/kcmsdsummary.h69
-rw-r--r--kontact/plugins/specialdates/sdsummarywidget.cpp637
-rw-r--r--kontact/plugins/specialdates/sdsummarywidget.h84
-rw-r--r--kontact/plugins/specialdates/specialdates_plugin.cpp70
-rw-r--r--kontact/plugins/specialdates/specialdates_plugin.h52
-rw-r--r--kontact/plugins/specialdates/specialdatesplugin.desktop92
-rw-r--r--kontact/plugins/summary/Makefile.am26
-rw-r--r--kontact/plugins/summary/dropwidget.cpp44
-rw-r--r--kontact/plugins/summary/dropwidget.h42
-rw-r--r--kontact/plugins/summary/kcmkontactsummary.cpp189
-rw-r--r--kontact/plugins/summary/kcmkontactsummary.desktop79
-rw-r--r--kontact/plugins/summary/kcmkontactsummary.h62
-rw-r--r--kontact/plugins/summary/kontactsummary_part.rc9
-rw-r--r--kontact/plugins/summary/summaryplugin.desktop97
-rw-r--r--kontact/plugins/summary/summaryview_part.cpp434
-rw-r--r--kontact/plugins/summary/summaryview_part.h103
-rw-r--r--kontact/plugins/summary/summaryview_plugin.cpp123
-rw-r--r--kontact/plugins/summary/summaryview_plugin.h62
-rw-r--r--kontact/plugins/test/Makefile.am20
-rw-r--r--kontact/plugins/test/kptestplugin.desktop113
-rw-r--r--kontact/plugins/test/kptestplugin.rc10
-rw-r--r--kontact/plugins/test/test_part.cpp117
-rw-r--r--kontact/plugins/test/test_part.h61
-rw-r--r--kontact/plugins/test/test_plugin.cpp61
-rw-r--r--kontact/plugins/test/test_plugin.h51
-rw-r--r--kontact/plugins/test/testpartui.rc10
-rw-r--r--kontact/plugins/weather/Makefile.am13
-rw-r--r--kontact/plugins/weather/summarywidget.cpp230
-rw-r--r--kontact/plugins/weather/summarywidget.h123
-rw-r--r--kontact/plugins/weather/weather_plugin.cpp61
-rw-r--r--kontact/plugins/weather/weather_plugin.h44
-rw-r--r--kontact/plugins/weather/weatherplugin.desktop92
113 files changed, 12289 insertions, 0 deletions
diff --git a/kontact/plugins/Makefile.am b/kontact/plugins/Makefile.am
new file mode 100644
index 000000000..986713b93
--- /dev/null
+++ b/kontact/plugins/Makefile.am
@@ -0,0 +1,6 @@
+if compile_kpilot
+KPILOT_KONTACTPLUGIN = kpilot
+endif
+
+SUBDIRS = $(KPILOT_KONTACTPLUGIN) kaddressbook kmail knotes korganizer \
+ summary weather knode newsticker specialdates akregator karm
diff --git a/kontact/plugins/akregator/Makefile.am b/kontact/plugins/akregator/Makefile.am
new file mode 100644
index 000000000..d97f14341
--- /dev/null
+++ b/kontact/plugins/akregator/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir)/akregator/src -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_akregator.la
+libkontact_akregator_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_akregator_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS)
+libkontact_akregator_la_SOURCES = akregator_plugin.cpp akregator_partiface.stub
+
+METASOURCES = AUTO
+
+akregator_partiface_DIR = $(top_srcdir)/akregator/src
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = akregatorplugin.desktop akregatorplugin3.2.desktop
+
diff --git a/kontact/plugins/akregator/akregator_plugin.cpp b/kontact/plugins/akregator/akregator_plugin.cpp
new file mode 100644
index 000000000..d57cea7f6
--- /dev/null
+++ b/kontact/plugins/akregator/akregator_plugin.cpp
@@ -0,0 +1,156 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Sashmit Bhaduri <smt@vfemail.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.
+
+ 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 <qwidget.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <kaboutdata.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kparts/componentfactory.h>
+
+#include <core.h>
+#include <plugin.h>
+
+#include <akregator_options.h>
+#include <akregator_part.h>
+#include "akregator_plugin.h"
+namespace Akregator {
+
+typedef KGenericFactory<Akregator::Plugin, Kontact::Core > PluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_akregator,
+ PluginFactory( "kontact_akregator" ) )
+
+Plugin::Plugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "akregator" ), m_stub(0)
+{
+
+ setInstance( PluginFactory::instance() );
+
+ insertNewAction( new KAction( i18n( "New Feed..." ), "bookmark_add", CTRL+SHIFT+Key_F, this, SLOT( addFeed() ), actionCollection(), "feed_new" ) );
+
+ m_uniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<Akregator::UniqueAppHandler>(), this );
+}
+
+Plugin::~Plugin()
+{
+}
+
+bool Plugin::isRunningStandalone()
+{
+ return m_uniqueAppWatcher->isRunningStandalone();
+}
+
+QStringList Plugin::invisibleToolbarActions() const
+{
+ return QStringList( "file_new_contact" );
+}
+
+
+Akregator::AkregatorPartIface_stub *Plugin::interface()
+{
+ if ( !m_stub ) {
+ part();
+ }
+
+ Q_ASSERT( m_stub );
+ return m_stub;
+}
+
+
+MyBasePart* Plugin::createPart()
+{
+ MyBasePart* p = loadPart();
+
+ connect(p, SIGNAL(showPart()), this, SLOT(showPart()));
+ m_stub = new Akregator::AkregatorPartIface_stub( dcopClient(), "akregator",
+ "AkregatorIface" );
+ m_stub->openStandardFeedList();
+ return p;
+}
+
+
+void Plugin::showPart()
+{
+ core()->selectPlugin(this);
+}
+
+void Plugin::addFeed()
+{
+ interface()->addFeed();
+}
+
+QStringList Plugin::configModules() const
+{
+ QStringList modules;
+ modules << "PIM/akregator.desktop";
+ return modules;
+}
+
+void Plugin::readProperties( KConfig *config )
+{
+ if ( part() ) {
+ Akregator::Part *myPart = static_cast<Akregator::Part*>( part() );
+ myPart->readProperties( config );
+ }
+}
+
+void Plugin::saveProperties( KConfig *config )
+{
+ if ( part() ) {
+ Akregator::Part *myPart = static_cast<Akregator::Part*>( part() );
+ myPart->saveProperties( config );
+ }
+}
+
+void UniqueAppHandler::loadCommandLineOptions()
+{
+ KCmdLineArgs::addCmdLineOptions( akregator_options );
+}
+
+int UniqueAppHandler::newInstance()
+{
+ kdDebug(5602) << k_funcinfo << endl;
+ // Ensure part is loaded
+ (void)plugin()->part();
+ DCOPRef akr( "akregator", "AkregatorIface" );
+// DCOPReply reply = kAB.call( "handleCommandLine" );
+ // if ( reply.isValid() ) {
+ // bool handled = reply;
+ // kdDebug(5602) << k_funcinfo << "handled=" << handled << endl;
+ // if ( !handled ) // no args -> simply bring kaddressbook plugin to front
+ return Kontact::UniqueAppHandler::newInstance();
+ // }
+ // return 0;
+}
+
+} // namespace Akregator
+#include "akregator_plugin.moc"
diff --git a/kontact/plugins/akregator/akregator_plugin.h b/kontact/plugins/akregator/akregator_plugin.h
new file mode 100644
index 000000000..af1a905f9
--- /dev/null
+++ b/kontact/plugins/akregator/akregator_plugin.h
@@ -0,0 +1,81 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Sashmit Bhaduri <smt@vfemail.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.
+
+ 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 AKREGATOR_PLUGIN_H
+#define AKREGATOR_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include <kparts/part.h>
+#include <plugin.h>
+#include "akregator_partiface_stub.h"
+#include <uniqueapphandler.h>
+
+class KAboutData;
+
+namespace Akregator {
+
+typedef KParts::ReadOnlyPart MyBasePart;
+
+class UniqueAppHandler : public Kontact::UniqueAppHandler
+{
+ public:
+ UniqueAppHandler( Kontact::Plugin* plugin ) : Kontact::UniqueAppHandler( plugin ) {}
+ virtual void loadCommandLineOptions();
+ virtual int newInstance();
+};
+
+
+class Plugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ Plugin( Kontact::Core *core, const char *name,
+ const QStringList & );
+ ~Plugin();
+
+ int weight() const { return 700; }
+
+ AkregatorPartIface_stub *interface();
+
+ virtual QStringList configModules() const;
+ virtual QStringList invisibleToolbarActions() const;
+ virtual bool isRunningStandalone();
+ virtual void readProperties( KConfig *config );
+ virtual void saveProperties( KConfig *config );
+
+ private slots:
+ void showPart();
+ void addFeed();
+
+ protected:
+ MyBasePart *createPart();
+ AkregatorPartIface_stub *m_stub;
+ Kontact::UniqueAppWatcher *m_uniqueAppWatcher;
+};
+
+} // namespace Akregator
+#endif
diff --git a/kontact/plugins/akregator/akregatorplugin.desktop b/kontact/plugins/akregator/akregatorplugin.desktop
new file mode 100644
index 000000000..015ae80a1
--- /dev/null
+++ b/kontact/plugins/akregator/akregatorplugin.desktop
@@ -0,0 +1,87 @@
+[Desktop Entry]
+Type=Service
+Icon=akregator
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_akregator
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libakregatorpart
+X-KDE-KontactPartLoadOnStart=false
+
+X-KDE-PluginInfo-Name=kontact_akregator
+X-KDE-PluginInfo-Version=1.0b2
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Feed Reader Component (Akregator Plugin)
+Comment[bg]=Приставка за Akregator
+Comment[ca]=Component lector d'enllaços (endollable de l'Akregator)
+Comment[da]=Feed-læserkomponent (Akregator-plugin)
+Comment[de]=News-Leser (Akregator-Modul)
+Comment[el]=Συστατικό ανάγνωσης ροών (Πρόσθετο του Akregator)
+Comment[es]=Componente de lectura de fuentes (complemento de Akregator)
+Comment[et]=Uudistevoogude plugin (Akregator)
+Comment[fr]=Composant du lecteur de flux (Module pour Akregator)
+Comment[is]=Fréttastraumalestur (Akregator íforrit)
+Comment[it]=Componente lettore fonti (plugin Akregator)
+Comment[ja]=フィードリーダーコンポーネント (Akregator プラグイン)
+Comment[km]=មមាសភាគ​កម្មវិធី​អាន​មតិព័ត៌មាន (កម្មវិធី​ជំនួយ Akregator​)
+Comment[nds]=Stroomleser-Komponent (Akregator-Moduul)
+Comment[nl]=Component om feeds te lezen (Akregator-plugin)
+Comment[pl]=Składnik do czytania kanałów RSS (wtyczka Akregator)
+Comment[ru]=Просмотр лент новостей (модуль Akregator)
+Comment[sk]=Komponent na čítanie kanálov (Modul pre Akregator)
+Comment[sr]=Компонента читања довода (прикључак Akregator-а)
+Comment[sr@Latn]=Komponenta čitanja dovoda (priključak Akregator-a)
+Comment[sv]=Komponent för läsning av kanaler (Akregator-insticksprogram)
+Comment[tr]=Kaynak Okuyucu Bileşeni (Akregator Eklentisi)
+Comment[zh_CN]=新闻源阅读器组件(Akregator 插件)
+Comment[zh_TW]=Feed 閱讀器組件(Akregator 外掛程式)
+Name=Feeds
+Name[af]=Strome
+Name[bg]=Новини
+Name[ca]=Enllaços
+Name[cs]=Kanály
+Name[da]=Kilder
+Name[de]=Nachrichten
+Name[el]=Ροές
+Name[eo]=Fluoj
+Name[es]=Orígenes
+Name[et]=Uudisevood
+Name[eu]=Iturriak
+Name[fa]=خوراندنها
+Name[fi]=Syötteet
+Name[fr]=Flux
+Name[fy]=Nijsoanfier
+Name[ga]=Fothaí
+Name[gl]=Fontes
+Name[he]=ערוצים
+Name[hu]=Hírforrások
+Name[is]=Fréttastraumar
+Name[it]=Fonti
+Name[ja]=フィード
+Name[ka]=კვება
+Name[kk]=Ақпарлар
+Name[km]=មតិព័ត៌មាន
+Name[lt]=Kanalai
+Name[ms]=Suapan
+Name[nb]=Kanaler
+Name[nds]=Narichtenströöm
+Name[ne]=फिड
+Name[nn]=Kanalar
+Name[pl]=Kanały
+Name[pt]=Fontes
+Name[pt_BR]=Fontes de Notícias
+Name[ru]=Ленты новостей
+Name[sk]=Kanály
+Name[sl]=Viri
+Name[sr]=Доводи
+Name[sr@Latn]=Dovodi
+Name[sv]=Kanaler
+Name[ta]=உள்ளீடுகள்
+Name[tr]=Haberler
+Name[uk]=Подачі
+Name[uz]=Yangiliklar tasmalari
+Name[uz@cyrillic]=Янгиликлар тасмалари
+Name[zh_CN]=种子
+
diff --git a/kontact/plugins/akregator/akregatorplugin3.2.desktop b/kontact/plugins/akregator/akregatorplugin3.2.desktop
new file mode 100644
index 000000000..7bd29ffbc
--- /dev/null
+++ b/kontact/plugins/akregator/akregatorplugin3.2.desktop
@@ -0,0 +1,112 @@
+[Desktop Entry]
+Type=Service
+Icon=akregator
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_akregator
+X-KDE-KontactPluginVersion=3
+X-KDE-KontactPartLibraryName=libakregatorpart
+
+X-KDE-PluginInfo-Name=kontact_akregator
+X-KDE-PluginInfo-Version=1.0b2
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Akregator Plugin
+Comment[af]=Akregator inprop module
+Comment[bg]=Приставка за Akregator
+Comment[br]=Lugant Akregator
+Comment[ca]=Endollable Akregator
+Comment[cs]=Modul Akregatoru
+Comment[de]=Akregator-Modul
+Comment[el]=Πρόσθετο του Akregator
+Comment[eo]=Akregator-kromaĵo
+Comment[es]=Extensión de Akregator
+Comment[et]=Akregatori plugin
+Comment[eu]=Akregator plugin-a
+Comment[fa]=وصلۀ Akregator
+Comment[fi]=Akregator-liitännäinen
+Comment[fr]=Module pour Akregator
+Comment[fy]=Akregatorplugin
+Comment[ga]=Breiseán Akregator
+Comment[gl]=Extensión para Akregator
+Comment[he]=תוסף עבור Akregator
+Comment[hu]=Akregator bővítőmodul
+Comment[is]=Akregator íforrit
+Comment[it]=Plugin aKregator
+Comment[ja]=Akregator プラグイン
+Comment[ka]=Akregator-ის მოდული
+Comment[kk]=Akregator модулі
+Comment[km]=កម្មវិធី​ជំនួយ Akregator
+Comment[lt]=Akregator priedas
+Comment[mk]=Приклучок за Akregator
+Comment[ms]=Plugin Akregator
+Comment[nb]=Akgregator-programtillegg
+Comment[nds]=Akregator-Moduul
+Comment[ne]=एक्रिगेटर प्लगइन
+Comment[nl]=Akregatorplugin
+Comment[nn]=Akregator-programtillegg
+Comment[pl]=Wtyczka Akregatora
+Comment[pt]='Plugin' Akregator
+Comment[pt_BR]=Plug-in do Akregator
+Comment[ru]=Модуль Akregator
+Comment[sk]=Modul Akregator
+Comment[sl]=Vstavek Akregator
+Comment[sr]=Прикључак Akregator-а
+Comment[sr@Latn]=Priključak Akregator-a
+Comment[sv]=Akregator-insticksprogram
+Comment[ta]=Akregator சொருகுப்பொருள்
+Comment[tr]=Akregator Eklentisi
+Comment[uk]=Втулок Akregator
+Comment[uz]=Akregator plagini
+Comment[uz@cyrillic]=Akregator плагини
+Comment[zh_CN]=Akregator 插件
+Comment[zh_TW]=Akregator 外掛程式
+Name=Feeds
+Name[af]=Strome
+Name[bg]=Новини
+Name[ca]=Enllaços
+Name[cs]=Kanály
+Name[da]=Kilder
+Name[de]=Nachrichten
+Name[el]=Ροές
+Name[eo]=Fluoj
+Name[es]=Orígenes
+Name[et]=Uudisevood
+Name[eu]=Iturriak
+Name[fa]=خوراندنها
+Name[fi]=Syötteet
+Name[fr]=Flux
+Name[fy]=Nijsoanfier
+Name[ga]=Fothaí
+Name[gl]=Fontes
+Name[he]=ערוצים
+Name[hu]=Hírforrások
+Name[is]=Fréttastraumar
+Name[it]=Fonti
+Name[ja]=フィード
+Name[ka]=კვება
+Name[kk]=Ақпарлар
+Name[km]=មតិព័ត៌មាន
+Name[lt]=Kanalai
+Name[ms]=Suapan
+Name[nb]=Kanaler
+Name[nds]=Narichtenströöm
+Name[ne]=फिड
+Name[nn]=Kanalar
+Name[pl]=Kanały
+Name[pt]=Fontes
+Name[pt_BR]=Fontes de Notícias
+Name[ru]=Ленты новостей
+Name[sk]=Kanály
+Name[sl]=Viri
+Name[sr]=Доводи
+Name[sr@Latn]=Dovodi
+Name[sv]=Kanaler
+Name[ta]=உள்ளீடுகள்
+Name[tr]=Haberler
+Name[uk]=Подачі
+Name[uz]=Yangiliklar tasmalari
+Name[uz@cyrillic]=Янгиликлар тасмалари
+Name[zh_CN]=种子
+
diff --git a/kontact/plugins/kaddressbook/Makefile.am b/kontact/plugins/kaddressbook/Makefile.am
new file mode 100644
index 000000000..a769f29d8
--- /dev/null
+++ b/kontact/plugins/kaddressbook/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_kaddressbookplugin.la
+libkontact_kaddressbookplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -lkabc
+libkontact_kaddressbookplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(top_builddir)/libkdepim/libkdepim.la
+
+libkontact_kaddressbookplugin_la_SOURCES = kaddressbook_plugin.cpp \
+ kaddressbookiface.stub \
+ kmailIface.stub
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = kaddressbookplugin.desktop
+
+kaddressbookiface_DIR = $(top_srcdir)/kaddressbook
+kmailIface_DIR = $(top_srcdir)/kmail
+kmailIface_DCOPIDLNG = true
diff --git a/kontact/plugins/kaddressbook/kaddressbook_plugin.cpp b/kontact/plugins/kaddressbook/kaddressbook_plugin.cpp
new file mode 100644
index 000000000..e2f5a706f
--- /dev/null
+++ b/kontact/plugins/kaddressbook/kaddressbook_plugin.cpp
@@ -0,0 +1,218 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 <qwidget.h>
+#include <qdragobject.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kparts/componentfactory.h>
+
+#include <kaddrbook.h>
+#include <kabc/addressbook.h>
+#include <kabc/stdaddressbook.h>
+
+#include <dcopclient.h>
+#include "kmailIface_stub.h"
+
+#include <libkdepim/maillistdrag.h>
+
+#include "core.h"
+#include "plugin.h"
+
+#include "kaddressbook_plugin.h"
+
+typedef KGenericFactory< KAddressbookPlugin, Kontact::Core > KAddressbookPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_kaddressbookplugin,
+ KAddressbookPluginFactory( "kontact_kaddressbookplugin" ) )
+
+KAddressbookPlugin::KAddressbookPlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "kaddressbook" ),
+ mStub( 0 )
+{
+ setInstance( KAddressbookPluginFactory::instance() );
+
+ insertNewAction( new KAction( i18n( "New Contact..." ), "identity",
+ CTRL+SHIFT+Key_C, this, SLOT( slotNewContact() ), actionCollection(),
+ "new_contact" ) );
+
+ insertNewAction( new KAction( i18n( "&New Distribution List..." ), "kontact_contacts", 0, this,
+ SLOT( slotNewDistributionList() ), actionCollection(), "new_distributionlist" ) );
+
+ insertSyncAction( new KAction( i18n( "Synchronize Contacts" ), "reload",
+ 0, this, SLOT( slotSyncContacts() ), actionCollection(),
+ "kaddressbook_sync" ) );
+ mUniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<KABUniqueAppHandler>(), this );
+}
+
+KAddressbookPlugin::~KAddressbookPlugin()
+{
+}
+
+KParts::ReadOnlyPart* KAddressbookPlugin::createPart()
+{
+ KParts::ReadOnlyPart * part = loadPart();
+ if ( !part ) return 0;
+
+ // Create the stub that allows us to talk to the part
+ mStub = new KAddressBookIface_stub( dcopClient(), "kaddressbook",
+ "KAddressBookIface" );
+ return part;
+}
+
+QStringList KAddressbookPlugin::configModules() const
+{
+ QStringList modules;
+ modules << "PIM/kabconfig.desktop" << "PIM/kabldapconfig.desktop";
+ return modules;
+}
+
+QStringList KAddressbookPlugin::invisibleToolbarActions() const
+{
+ return QStringList( "file_new_contact" );
+}
+
+KAddressBookIface_stub *KAddressbookPlugin::interface()
+{
+ if ( !mStub ) {
+ part();
+ }
+ Q_ASSERT( mStub );
+ return mStub;
+}
+
+void KAddressbookPlugin::slotNewContact()
+{
+ interface()->newContact();
+}
+
+
+void KAddressbookPlugin::slotNewDistributionList()
+{
+ interface()->newDistributionList();
+}
+
+void KAddressbookPlugin::slotSyncContacts()
+{
+ DCOPRef ref( "kmail", "KMailICalIface" );
+ ref.send( "triggerSync", QString("Contact") );
+}
+
+bool KAddressbookPlugin::createDCOPInterface( const QString& serviceType )
+{
+ if ( serviceType == "DCOP/AddressBook" ) {
+ Q_ASSERT( mStub );
+ return true;
+ }
+
+ return false;
+}
+
+void KAddressbookPlugin::configUpdated()
+{
+}
+
+bool KAddressbookPlugin::isRunningStandalone()
+{
+ return mUniqueAppWatcher->isRunningStandalone();
+}
+
+bool KAddressbookPlugin::canDecodeDrag( QMimeSource *mimeSource )
+{
+ return QTextDrag::canDecode( mimeSource ) ||
+ KPIM::MailListDrag::canDecode( mimeSource );
+}
+
+#include <dcopref.h>
+
+void KAddressbookPlugin::processDropEvent( QDropEvent *event )
+{
+ KPIM::MailList mails;
+ if ( KPIM::MailListDrag::decode( event, mails ) ) {
+ if ( mails.count() != 1 ) {
+ KMessageBox::sorry( core(),
+ i18n( "Drops of multiple mails are not supported." ) );
+ } else {
+ KPIM::MailSummary mail = mails.first();
+
+ KMailIface_stub kmailIface( "kmail", "KMailIface" );
+ QString sFrom = kmailIface.getFrom( mail.serialNumber() );
+
+ if ( !sFrom.isEmpty() ) {
+ KAddrBookExternal::addEmail( sFrom, core() );
+ }
+ }
+ return;
+ }
+
+ KMessageBox::sorry( core(), i18n( "Cannot handle drop events of type '%1'." )
+ .arg( event->format() ) );
+}
+
+
+void KAddressbookPlugin::loadProfile( const QString& directory )
+{
+ DCOPRef ref( "kaddressbook", "KAddressBookIface" );
+ ref.send( "loadProfile", directory );
+}
+
+void KAddressbookPlugin::saveToProfile( const QString& directory ) const
+{
+ DCOPRef ref( "kaddressbook", "KAddressBookIface" );
+ ref.send( "saveToProfile", directory );
+}
+
+////
+
+#include "../../../kaddressbook/kaddressbook_options.h"
+
+void KABUniqueAppHandler::loadCommandLineOptions()
+{
+ KCmdLineArgs::addCmdLineOptions( kaddressbook_options );
+}
+
+int KABUniqueAppHandler::newInstance()
+{
+ kdDebug(5602) << k_funcinfo << endl;
+ // Ensure part is loaded
+ (void)plugin()->part();
+ DCOPRef kAB( "kaddressbook", "KAddressBookIface" );
+ DCOPReply reply = kAB.call( "handleCommandLine" );
+ if ( reply.isValid() ) {
+ bool handled = reply;
+ kdDebug(5602) << k_funcinfo << "handled=" << handled << endl;
+ if ( !handled ) // no args -> simply bring kaddressbook plugin to front
+ return Kontact::UniqueAppHandler::newInstance();
+ }
+ return 0;
+}
+
+#include "kaddressbook_plugin.moc"
+
+// vim: sw=2 sts=2 tw=80 et
diff --git a/kontact/plugins/kaddressbook/kaddressbook_plugin.h b/kontact/plugins/kaddressbook/kaddressbook_plugin.h
new file mode 100644
index 000000000..f66d44aaf
--- /dev/null
+++ b/kontact/plugins/kaddressbook/kaddressbook_plugin.h
@@ -0,0 +1,86 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 KADDRESSBOOK_PLUGIN_H
+#define KADDRESSBOOK_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "kaddressbookiface_stub.h"
+#include "plugin.h"
+#include <uniqueapphandler.h>
+
+class KAboutData;
+
+class KABUniqueAppHandler : public Kontact::UniqueAppHandler
+{
+public:
+ KABUniqueAppHandler( Kontact::Plugin* plugin ) : Kontact::UniqueAppHandler( plugin ) {}
+ virtual void loadCommandLineOptions();
+ virtual int newInstance();
+};
+
+class KAddressbookPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KAddressbookPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~KAddressbookPlugin();
+
+ virtual bool createDCOPInterface( const QString &serviceType );
+ virtual bool isRunningStandalone();
+ int weight() const { return 300; }
+
+ bool canDecodeDrag( QMimeSource * );
+ void processDropEvent( QDropEvent * );
+
+ virtual QStringList configModules() const;
+
+ virtual QStringList invisibleToolbarActions() const;
+
+ virtual void configUpdated();
+
+ KAddressBookIface_stub *interface();
+
+ //override
+ void loadProfile( const QString& directory );
+
+ //override
+ void saveToProfile( const QString& directory ) const;
+
+ protected:
+ KParts::ReadOnlyPart *createPart();
+ private slots:
+ void slotNewContact();
+ void slotNewDistributionList();
+ void slotSyncContacts();
+
+ private:
+ KAddressBookIface_stub *mStub;
+ Kontact::UniqueAppWatcher *mUniqueAppWatcher;
+};
+
+#endif
diff --git a/kontact/plugins/kaddressbook/kaddressbookplugin.desktop b/kontact/plugins/kaddressbook/kaddressbookplugin.desktop
new file mode 100644
index 000000000..f5208ea52
--- /dev/null
+++ b/kontact/plugins/kaddressbook/kaddressbookplugin.desktop
@@ -0,0 +1,100 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_contacts
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_kaddressbookplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkaddressbookpart
+X-KDE-KontactPartExecutableName=kaddressbook
+X-KDE-KontactPluginHasSummary=false
+
+X-KDE-PluginInfo-Website=http://www.kaddressbook.org/
+X-KDE-PluginInfo-Name=kontact_kaddressbookplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Contacts Component (KAdressbook Plugin)
+Comment[bg]=Приставка за адресника
+Comment[ca]=Component de contactes (endollable del KAdressbook)
+Comment[da]=Kontaktkomponent (KAddressbook-plugin)
+Comment[de]=Kontakte-Komponente (Adressbuch-Modul)
+Comment[el]=Συστατικό επαφών (Πρόσθετο του KAdressbook)
+Comment[es]=Componente de contactos (complemento de KAddressbook)
+Comment[et]=Kontaktide plugin (KDE aadressiraamat)
+Comment[fr]=Composant des contacts (module externe KAdressBook)
+Comment[is]=Vistfangaskráreining (KAddressBook íforrit)
+Comment[it]=Componente contatti (plugin KAddressbook)
+Comment[ja]=アドレス帳コンポーネント (KAddressbook プラグイン)
+Comment[km]=សមាសភាគ​ទំនាក់ទំន​ង (កម្មវិធី​ជំនួយ KAdressbook​)
+Comment[nds]=Kontakten-Komponent (KAddressbook-Moduul)
+Comment[nl]=Adresboekcomponent (KAddressbook-plugin)
+Comment[pl]=Składnik wizytówek (wtyczka KAddressBook)
+Comment[ru]=Контакты (модуль KAddressBook)
+Comment[sr]=Компонента контаката (прикључак KAddressBook-а)
+Comment[sr@Latn]=Komponenta kontakata (priključak KAddressBook-a)
+Comment[sv]=Kontaktkomponent (adressboksinsticksprogram)
+Comment[tr]=Kişiler Bileşeni (KAdresDefteri Eklentisi)
+Comment[zh_CN]=联系人组件(KAddressbook 插件)
+Comment[zh_TW]=聯絡人組件(KAddressBook 外掛程式)
+Name=Contacts
+Name[af]=Kontakte
+Name[ar]=المراسلون
+Name[be]=Кантакты
+Name[bg]=Контакти
+Name[br]=Darempredoù
+Name[bs]=Kontakti
+Name[ca]=Contactes
+Name[cs]=Kontakty
+Name[cy]=Cysylltau
+Name[da]=Kontakter
+Name[de]=Kontakte
+Name[el]=Επαφές
+Name[eo]=Kontaktoj
+Name[es]=Contactos
+Name[et]=Kontaktid
+Name[eu]=Kontaktuak
+Name[fa]=تماسها
+Name[fi]=Yhteystiedot
+Name[fy]=Adressen
+Name[ga]=Teagmhálacha
+Name[gl]=Contactos
+Name[he]=אנשי קשר
+Name[hi]=सम्पर्कों
+Name[hu]=Névjegyek
+Name[is]=Tengiliðir
+Name[it]=Contatti
+Name[ja]=コンタクト
+Name[ka]=კონტაქტები
+Name[kk]=Контакттар
+Name[km]=ទំនាក់ទំនង
+Name[lt]=Kontaktai
+Name[mk]=Контакти
+Name[ms]=Orang hubungan
+Name[nds]=Kontakten
+Name[ne]=सम्पर्क
+Name[nl]=Adressen
+Name[nn]=Kontaktar
+Name[pa]=ਸੰਪਰਕ
+Name[pl]=Wizytówki
+Name[pt]=Contactos
+Name[pt_BR]=Contatos
+Name[ro]=Contacte
+Name[ru]=Контакты
+Name[rw]=Amaderesi
+Name[se]=Oktavuođat
+Name[sk]=Kontakty
+Name[sl]=Stiki
+Name[sr]=Контакти
+Name[sr@Latn]=Kontakti
+Name[sv]=Kontakter
+Name[ta]=தொடர்புகள்
+Name[tg]=Алоқот
+Name[th]=ที่อยู่ติดต่อ
+Name[tr]=Kişiler
+Name[uk]=Контакти
+Name[uz]=Aloqalar
+Name[uz@cyrillic]=Алоқалар
+Name[zh_CN]=联系人
+Name[zh_TW]=聯絡人
diff --git a/kontact/plugins/karm/Makefile.am b/kontact/plugins/karm/Makefile.am
new file mode 100644
index 000000000..e3fb02276
--- /dev/null
+++ b/kontact/plugins/karm/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir)/karm -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_karm.la
+libkontact_karm_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_karm_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la
+
+libkontact_karm_la_SOURCES = karm_plugin.cpp karmdcopiface.stub
+
+METASOURCES = AUTO
+
+karmdcopiface_DIR = $(top_srcdir)/karm
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = karmplugin.desktop
+
+DISTCLEANFILES = karmdcopiface.h karmdcopiface.stub
diff --git a/kontact/plugins/karm/karm_plugin.cpp b/kontact/plugins/karm/karm_plugin.cpp
new file mode 100644
index 000000000..a3a9d277d
--- /dev/null
+++ b/kontact/plugins/karm/karm_plugin.cpp
@@ -0,0 +1,71 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+ adapted for karm 2005 by Thorsten Staerk <kde@staerk.de>
+
+ 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 <kgenericfactory.h>
+#include <kparts/componentfactory.h>
+
+#include "core.h"
+#include "plugin.h"
+
+#include "karm_plugin.h"
+#include "karmdcopiface_stub.h"
+
+typedef KGenericFactory<KarmPlugin, Kontact::Core> KarmPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_karm,
+ KarmPluginFactory( "kontact_karm" ) )
+
+KarmPlugin::KarmPlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "KArm" )
+{
+ setInstance( KarmPluginFactory::instance() );
+ (void)dcopClient();
+ insertNewAction( new KAction( i18n( "New Task" ), "karm",
+ CTRL+SHIFT+Key_W, this, SLOT( newTask() ), actionCollection(),
+ "new_task" ) );
+}
+
+KarmPlugin::~KarmPlugin()
+{
+}
+
+KParts::ReadOnlyPart* KarmPlugin::createPart()
+{
+ KParts::ReadOnlyPart * part = loadPart();
+ if ( !part ) return 0;
+
+ // this calls a DCOP interface from karm via the lib KarmDCOPIface_stub that is generated automatically
+ mStub = new KarmDCOPIface_stub( dcopClient(), "KArm",
+ "KarmDCOPIface" );
+
+ return part;
+}
+
+void KarmPlugin::newTask()
+{
+ kdDebug() << "Entering newTask" << endl;
+ mStub->addTask("New Task");
+}
+
+#include "karm_plugin.moc"
diff --git a/kontact/plugins/karm/karm_plugin.h b/kontact/plugins/karm/karm_plugin.h
new file mode 100644
index 000000000..c5ef3e289
--- /dev/null
+++ b/kontact/plugins/karm/karm_plugin.h
@@ -0,0 +1,57 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+ adapted for karm 2005 by Thorsten Staerk <kde@staerk.de>
+
+ 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 KARM_PLUGIN_H
+#define KARM_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+#include "karmdcopiface_stub.h"
+
+#include "plugin.h"
+
+class KAboutData;
+
+class KarmPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KarmPlugin( Kontact::Core *core, const char *name,
+ const QStringList & );
+ ~KarmPlugin();
+
+ int weight() const { return 700; }
+
+ protected:
+ KParts::ReadOnlyPart *createPart();
+ KarmDCOPIface_stub *mStub;
+
+ public slots:
+ void newTask();
+
+};
+
+#endif
diff --git a/kontact/plugins/karm/karmplugin.desktop b/kontact/plugins/karm/karmplugin.desktop
new file mode 100644
index 000000000..469989fe6
--- /dev/null
+++ b/kontact/plugins/karm/karmplugin.desktop
@@ -0,0 +1,59 @@
+[Desktop Entry]
+Type=Service
+Icon=karm
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_karm
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkarmpart
+
+X-KDE-PluginInfo-Name=kontact_karm
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+
+Comment=Time Tracker Component (KArm Plugin)
+Comment[bg]=Приставка за KArm
+Comment[ca]=Component de seguiment dels temps (endollable del KArm)
+Comment[da]=Time Tracker-komponent (KArm-plugin)
+Comment[de]=Zeitplaner-Komponente (KArm-Modul)
+Comment[el]=Συστατικό γραμμής χρόνου (Πρόσθετο του KArm)
+Comment[es]=Componente de seguimiento de tiempos (complemento de KArm)
+Comment[et]=Ajaarvestaja plugin (KArm)
+Comment[fr]=Composant de suivi temporel (Module pour KArm)
+Comment[is]=Tímastjórnunareining (KArm íforrit)
+Comment[it]=Componente segna-tempo (plugin Karm)
+Comment[ja]=タイムトラッカーコンポーネント (KArm プラグイン)
+Comment[km]=សមាសភាគ​កម្មវិធី​តាមដាន​ពេលវេលា (កម្មវិធី​ជំនួយ KArm​)
+Comment[nds]=Tietlogbook-Komponent (KArm-Moduul)
+Comment[nl]=Tijdsregistratiecomponent (KArm-plugin)
+Comment[pl]=Składnik śledzenia czasu (wtyczka KArm)
+Comment[ru]=Отслеживание времени (модуль KArm)
+Comment[sr]=Компонента праћења времена (прикључак KArm-а)
+Comment[sr@Latn]=Komponenta praćenja vremena (priključak KArm-a)
+Comment[sv]=Komponent för tidmätning (Karm-insticksprogram)
+Comment[tr]=Zaman İzleyici Bileşeni (KArm Eklentisi)
+Comment[zh_CN]=时间追踪组件(KArm 插件)
+Comment[zh_TW]=時間追蹤器組件(KArm 外掛程式)
+
+Name=Timer
+Name[bg]=Таймер
+Name[ca]=Cronòmetre
+Name[de]=Stoppuhr
+Name[el]=Χρονόμετρο
+Name[es]=Temporizador
+Name[et]=Ajaarvestaja
+Name[fr]=Minuteur
+Name[is]=Tímamælir
+Name[ja]=タイマー
+Name[km]=កម្មវិធី​កំណត់​ពេលវេលា
+Name[nds]=Tietgever
+Name[nl]=Tijdklok
+Name[pl]=Stoper
+Name[ru]=Таймер
+Name[sk]=Časovač
+Name[sr]=Тајмер
+Name[sr@Latn]=Tajmer
+Name[sv]=Tidmätning
+Name[zh_CN]=计时器
+Name[zh_TW]=計時器
diff --git a/kontact/plugins/kitchensync/Makefile.am b/kontact/plugins/kitchensync/Makefile.am
new file mode 100644
index 000000000..c6df9113f
--- /dev/null
+++ b/kontact/plugins/kitchensync/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_kitchensync.la
+libkontact_kitchensync_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_kitchensync_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la
+
+libkontact_kitchensync_la_SOURCES = kitchensync_plugin.cpp
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = kitchensync.desktop
+
+kitchensynciface_DIR = $(top_srcdir)/kitchensync
diff --git a/kontact/plugins/kitchensync/kitchensync.desktop b/kontact/plugins/kitchensync/kitchensync.desktop
new file mode 100644
index 000000000..0b1ac5078
--- /dev/null
+++ b/kontact/plugins/kitchensync/kitchensync.desktop
@@ -0,0 +1,52 @@
+[Desktop Entry]
+Type=Service
+Icon=kitchensync
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_kitchensync
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkitchensyncpart
+
+X-KDE-PluginInfo-Name=kontact_kitchensync
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+
+Comment=Synchronization Component (Kitchensynk Plugin)
+Comment[bg]=Приставка за синхронизация
+Comment[ca]=Component de sincronització (endollable del KitchenSync)
+Comment[da]=Synkronisergingskomponent (Kitchensync-plugin)
+Comment[de]=Abgleich-Komponente (KitchenSync-Modul)
+Comment[el]=Συστατικό συγχρονισμού (Πρόσθετο του Kitchensynk)
+Comment[en_GB]=Synchronisation Component (Kitchensynk Plugin)
+Comment[es]=Componente de sincronización (complemento de KitchenSync)
+Comment[et]=Sünkroniseerimise plugin (KitchenSync)
+Comment[fr]=Composant de synchronisation (Module KitchenSync)
+Comment[is]=Samstillingareining (KitchenSync íforrit)
+Comment[it]=Componente di sincronizzazione (plugin KitchenSync)
+Comment[ja]=同期コンポーネント (KitchenSync プラグイン)
+Comment[km]=ការ​ធ្វើ​សមកាលកម្ម​សមាសភាគ (កម្មវិធី​ជំនួយ Kitchensynk​)
+Comment[nds]=Synkroniseer-Komponent (Kitchensynk-Moduul)
+Comment[nl]=Synchronisatiecomponent (Kitchensynk-plugin)
+Comment[pl]=Składnik synchronizacji (wtyczka KitchenSync)
+Comment[ru]=Синхронизация (модуль KitchenSync)
+Comment[sk]=Synchronizačný komponent (Modul pre Kitchensynk)
+Comment[sr]=Компонента синхронизације (прикључак KitchenSync-а)
+Comment[sr@Latn]=Komponenta sinhronizacije (priključak KitchenSync-a)
+Comment[sv]=Synkroniseringskomponent (Kitchensynk-insticksprogram)
+Comment[tr]=Eşzamanlama Eklentisi (Kitchensynk Eklentisi)
+Comment[zh_CN]=同步组件(KitchenSync 插件)
+Comment[zh_TW]=同步組件(KitchenSynk 外掛程式)
+Name=Sync
+Name[bg]=Синхронизация
+Name[de]=Abgleich
+Name[el]=Συγχρονισμός
+Name[et]=Sünkroniseerimine
+Name[fr]=Synchroniser
+Name[is]=Samstilling
+Name[ja]=同期
+Name[nds]=Synkroniseren
+Name[pl]=Synchronizacja
+Name[ru]=Синхронизация
+Name[sv]=Synkronisering
+Name[zh_TW]=同步
diff --git a/kontact/plugins/kitchensync/kitchensync_plugin.cpp b/kontact/plugins/kitchensync/kitchensync_plugin.cpp
new file mode 100644
index 000000000..4de6cf8da
--- /dev/null
+++ b/kontact/plugins/kitchensync/kitchensync_plugin.cpp
@@ -0,0 +1,67 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@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 <qwidget.h>
+
+#include <kaboutdata.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kparts/componentfactory.h>
+
+#include "core.h"
+#include "plugin.h"
+
+#include "kitchensync_plugin.h"
+
+typedef KGenericFactory< KitchenSyncPlugin, Kontact::Core > KitchenSyncPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_kitchensync,
+ KitchenSyncPluginFactory( "kontact_kitchensync" ) )
+
+KitchenSyncPlugin::KitchenSyncPlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "KitchenSync" )
+{
+ setInstance( KitchenSyncPluginFactory::instance() );
+}
+
+KitchenSyncPlugin::~KitchenSyncPlugin()
+{
+}
+
+KParts::ReadOnlyPart* KitchenSyncPlugin::createPart()
+{
+ return loadPart();
+}
+
+QStringList KitchenSyncPlugin::configModules() const
+{
+ QStringList modules;
+ modules << "PIM/kitchensync.desktop";
+ return modules;
+}
+
+#include "kitchensync_plugin.moc"
diff --git a/kontact/plugins/kitchensync/kitchensync_plugin.h b/kontact/plugins/kitchensync/kitchensync_plugin.h
new file mode 100644
index 000000000..fafa12d71
--- /dev/null
+++ b/kontact/plugins/kitchensync/kitchensync_plugin.h
@@ -0,0 +1,51 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@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 KITCHENSYNC_PLUGIN_H
+#define KITCHENSYNC_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "plugin.h"
+
+class KAboutData;
+
+class KitchenSyncPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KitchenSyncPlugin( Kontact::Core *core, const char *name,
+ const QStringList & );
+ ~KitchenSyncPlugin();
+
+ int weight() const { return 800; }
+
+ virtual QStringList configModules() const;
+ protected:
+ KParts::ReadOnlyPart *createPart();
+};
+
+#endif
diff --git a/kontact/plugins/kmail/Makefile.am b/kontact/plugins/kmail/Makefile.am
new file mode 100644
index 000000000..d176693a3
--- /dev/null
+++ b/kontact/plugins/kmail/Makefile.am
@@ -0,0 +1,29 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir)/kmail -I$(top_builddir)/kmail \
+ -I$(top_srcdir)/libkdepim \
+ -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_kmailplugin.la kcm_kmailsummary.la
+
+libkontact_kmailplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_kmailplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(top_builddir)/libkcal/libkcal.la $(LIB_KPARTS)
+
+libkontact_kmailplugin_la_SOURCES = kmail_plugin.cpp kmailIface.stub \
+ summarywidget.cpp summarywidget.skel
+
+kcm_kmailsummary_la_SOURCES = kcmkmailsummary.cpp
+kcm_kmailsummary_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) \
+ -avoid-version -no-undefined
+kcm_kmailsummary_la_LIBADD = $(LIB_KDEUI)
+
+kmailIface_DCOPIDLNG = true
+
+summarywidget_DCOPIDLNG = true
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = kmailplugin.desktop
+
+kde_services_DATA = kcmkmailsummary.desktop
+
+kmailIface_DIR = $(top_srcdir)/kmail
diff --git a/kontact/plugins/kmail/kcmkmailsummary.cpp b/kontact/plugins/kmail/kcmkmailsummary.cpp
new file mode 100644
index 000000000..02627c0fe
--- /dev/null
+++ b/kontact/plugins/kmail/kcmkmailsummary.cpp
@@ -0,0 +1,192 @@
+/*
+ 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.
+*/
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+
+#include <dcopref.h>
+
+#include <kaboutdata.h>
+#include <kaccelmanager.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <klistview.h>
+#include <klocale.h>
+
+#include "kcmkmailsummary.h"
+
+#include <kdepimmacros.h>
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_kmailsummary( QWidget *parent, const char * )
+ {
+ return new KCMKMailSummary( parent, "kcmkmailsummary" );
+ }
+}
+
+KCMKMailSummary::KCMKMailSummary( QWidget *parent, const char *name )
+ : KCModule( parent, name )
+{
+ initGUI();
+
+ connect( mFolderView, SIGNAL( clicked( QListViewItem* ) ), SLOT( modified() ) );
+ connect( mFullPath, SIGNAL( toggled( bool ) ), SLOT( modified() ) );
+
+ KAcceleratorManager::manage( this );
+
+ load();
+
+ KAboutData *about = new KAboutData( I18N_NOOP( "kcmkmailsummary" ),
+ I18N_NOOP( "Mail Summary Configuration Dialog" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c) 2004 Tobias Koenig" ) );
+
+ about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" );
+ setAboutData( about );
+}
+
+void KCMKMailSummary::modified()
+{
+ emit changed( true );
+}
+
+void KCMKMailSummary::initGUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ mFolderView = new KListView( this );
+ mFolderView->setRootIsDecorated( true );
+ mFolderView->setFullWidth( true );
+
+ mFolderView->addColumn( i18n( "Summary" ) );
+
+ mFullPath = new QCheckBox( i18n( "Show full path for folders" ), this );
+
+ layout->addWidget( mFolderView );
+ layout->addWidget( mFullPath );
+}
+
+void KCMKMailSummary::initFolders()
+{
+ DCOPRef kmail( "kmail", "KMailIface" );
+
+ QStringList folderList;
+ kmail.call( "folderList" ).get( folderList );
+
+ mFolderView->clear();
+ mFolderMap.clear();
+
+ QStringList::Iterator it;
+ for ( it = folderList.begin(); it != folderList.end(); ++it ) {
+ QString displayName;
+ if ( (*it) == "/Local" )
+ displayName = i18n( "prefix for local folders", "Local" );
+ else {
+ DCOPRef folderRef = kmail.call( "getFolder(QString)", *it );
+ folderRef.call( "displayName()" ).get( displayName );
+ }
+ if ( (*it).contains( '/' ) == 1 ) {
+ if ( mFolderMap.find( *it ) == mFolderMap.end() )
+ mFolderMap.insert( *it, new QListViewItem( mFolderView,
+ displayName ) );
+ } else {
+ const int pos = (*it).findRev( '/' );
+ const QString parentFolder = (*it).left( pos );
+ mFolderMap.insert( *it,
+ new QCheckListItem( mFolderMap[ parentFolder ],
+ displayName,
+ QCheckListItem::CheckBox ) );
+ }
+ }
+}
+
+void KCMKMailSummary::loadFolders()
+{
+ KConfig config( "kcmkmailsummaryrc" );
+ config.setGroup( "General" );
+
+ QStringList folders;
+ if ( !config.hasKey( "ActiveFolders" ) )
+ folders << "/Local/inbox";
+ else
+ folders = config.readListEntry( "ActiveFolders" );
+
+ QMap<QString, QListViewItem*>::Iterator it;
+ for ( it = mFolderMap.begin(); it != mFolderMap.end(); ++it ) {
+ if ( QCheckListItem *qli = dynamic_cast<QCheckListItem*>( it.data() ) ) {
+ if ( folders.contains( it.key() ) ) {
+ qli->setOn( true );
+ mFolderView->ensureItemVisible( it.data() );
+ } else {
+ qli->setOn( false );
+ }
+ }
+ }
+ mFullPath->setChecked( config.readBoolEntry( "ShowFullPath", true ) );
+}
+
+void KCMKMailSummary::storeFolders()
+{
+ KConfig config( "kcmkmailsummaryrc" );
+ config.setGroup( "General" );
+
+ QStringList folders;
+
+ QMap<QString, QListViewItem*>::Iterator it;
+ for ( it = mFolderMap.begin(); it != mFolderMap.end(); ++it )
+ if ( QCheckListItem *qli = dynamic_cast<QCheckListItem*>( it.data() ) )
+ if ( qli->isOn() )
+ folders.append( it.key() );
+
+ config.writeEntry( "ActiveFolders", folders );
+ config.writeEntry( "ShowFullPath", mFullPath->isChecked() );
+
+ config.sync();
+}
+
+void KCMKMailSummary::load()
+{
+ initFolders();
+ loadFolders();
+
+ emit changed( false );
+}
+
+void KCMKMailSummary::save()
+{
+ storeFolders();
+
+ emit changed( false );
+}
+
+void KCMKMailSummary::defaults()
+{
+ mFullPath->setChecked( true );
+
+ emit changed( true );
+}
+
+#include "kcmkmailsummary.moc"
diff --git a/kontact/plugins/kmail/kcmkmailsummary.desktop b/kontact/plugins/kmail/kcmkmailsummary.desktop
new file mode 100644
index 000000000..2b8c7d99e
--- /dev/null
+++ b/kontact/plugins/kmail/kcmkmailsummary.desktop
@@ -0,0 +1,107 @@
+[Desktop Entry]
+Icon=kontact_mail
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=kmailsummary
+X-KDE-FactoryName=kmailsummary
+X-KDE-ParentApp=kontact_kmailplugin
+X-KDE-ParentComponents=kontact_kmailplugin
+X-KDE-CfgDlgHierarchy=KontactSummary
+
+Name=E-Mail Overview
+Name[bg]=Преглед на пощата
+Name[ca]=Resum de correu
+Name[da]=Oversigt over e-mail
+Name[de]=E-Mail-Übersicht
+Name[el]=Επισκόπηση αλληλογραφίας
+Name[es]=Resumen de correo electrónico
+Name[et]=E-posti ülevaade
+Name[fr]=Aperçu du courriel
+Name[is]=Yfirsýn á tölvupóst
+Name[it]=Panoramica posta elettronica
+Name[ja]=メールの要約
+Name[km]=ទិដ្ឋភាព​ទូទៅ​របស់​អ៊ីមែល
+Name[nds]=Nettpost-Översicht
+Name[nl]=E-mailoverzicht
+Name[pl]=Poczta
+Name[ru]=Сведения о почте
+Name[sk]=Prehľad pošty
+Name[sr]=Преглед е-поште
+Name[sr@Latn]=Pregled e-pošte
+Name[sv]=E-postöversikt
+Name[tr]=E-Postalara Genel Bakış
+Name[zh_CN]=邮件概览
+Name[zh_TW]=郵件概要
+Comment=E-Mail Summary Setup
+Comment[bg]=Настройки на обобщението на писмата
+Comment[ca]=Configuració del resum de correu
+Comment[da]=Opsætning af post-opsummering
+Comment[de]=Einstellungen für E-Mail-Übersicht
+Comment[el]=Ρύθμιση σύνοψης αλληλογραφίας
+Comment[es]=Configuración del resumen de correo electrónico
+Comment[et]=E-posti kokkuvõtte seadistus
+Comment[fr]=Configuration du résumé des courriels
+Comment[is]=Uppsetning póstyfirlits
+Comment[it]=Impostazioni sommario posta elettronica
+Comment[ja]=メール要約の設定
+Comment[km]=រៀបចំ​សេចក្ដី​សង្ខេប​អ៊ីមែល
+Comment[nds]=Instellen för Nettpost-Översicht
+Comment[nl]=Instellingen voor e-mailoverzicht
+Comment[pl]=Ustawienia podsumowania e-maili
+Comment[ru]=Настройка сводки почты
+Comment[sk]=Nastavenie súhrnu pošty
+Comment[sr]=Подешавање сажетка е-поште
+Comment[sr@Latn]=Podešavanje sažetka e-pošte
+Comment[sv]=Inställning av e-postöversikt
+Comment[tr]=E-Posta Özet Yapılandırması
+Comment[zh_CN]=邮件摘要设置
+Comment[zh_TW]=郵件摘要設定
+Keywords=email, summary, configure, settings
+Keywords[af]=email,summary,configure,settings
+Keywords[bg]=резюме, общо, обобщение, пощенски, клиент, е-поща, email, summary, configure, settings
+Keywords[bs]=email, summary, configure, settings, sažetak, postavke
+Keywords[ca]=correu-e, resum, configuració, arranjament
+Keywords[cs]=email,souhrn,nastavení,nastavit
+Keywords[da]=e-mail, opsummering, indstil, opsætning
+Keywords[de]=E-Mail,email,Übersicht,einstellen,Einstellungen,Einrichten
+Keywords[el]=αλληλογραφία, σύνοψη, ρύθμιση, ρυθμίσεις
+Keywords[es]=correo, resumen, configurar, opciones
+Keywords[et]=e-post, meil, seadistamine, seadistused
+Keywords[eu]=eposta, laburpena, konfiguratu, ezarpenak
+Keywords[fa]=email، خلاصه، پیکربندی، تنظیمات
+Keywords[fi]=sähköposti, yhteenveto, asetukset
+Keywords[fr]=message,messagerie,courriel,résumé,vue,configurer,paramètres,paramètre
+Keywords[fy]=email,e-mail,e-post,oersicht,gearfetting,ynstellings, konfiguraasje
+Keywords[ga]=ríomhphost, achoimre, cumraigh, socruithe
+Keywords[gl]=email, resumo, configurar, opcións
+Keywords[he]=email, summary, configure, settings, דוא"ל, תקציר, תצורה, הגדרת, דואל, דואר, דואר אלקטרוני
+Keywords[hu]=e-mail,áttekintés,konfigurálás,beállítások
+Keywords[is]=tölvupóstur, yfirlit, stillingar, stilla
+Keywords[it]=posta elettronica, email, sommario, configura, impostazioni
+Keywords[ja]=メール,要約,設定,設定
+Keywords[ka]=ელფოსტა,დაიჯესტი,კონფიგურაცია,პარამეტრები
+Keywords[km]=អ៊ីមែល,សង្ខេប,កំណត់​រចនាសម្ព័ន្ធ,ការ​កំណត់
+Keywords[lt]=email, summary, configure, settings, e. paštas, santrauka, konfigūruoti, nustatymai
+Keywords[mk]=email, summary, configure, settings, е-пошта, преглед, конфигурација, поставувања
+Keywords[ms]=e-mel, ringkasan, konfigur, seting
+Keywords[nb]=e-post, sammendrag, oppsett, innstillinger
+Keywords[nds]=Nettpost,Nettbreef,Översicht,instellen
+Keywords[ne]=इमेल, सारांश, कन्फिगर, सेटिङ
+Keywords[nl]=email,e-mail,overzicht,samenvatting,instellingen,configuratie
+Keywords[nn]=e-post,samandrag,oppsett,innstillingar
+Keywords[pl]=e-mail,list,podsumowanie,konfiguracja,ustawienia
+Keywords[pt]=e-mail, sumário, configurar, configuração
+Keywords[pt_BR]=e-mail, resumo, configurar, configurações
+Keywords[ru]=email,summary,configure,settings,настройки,сводка,почта
+Keywords[sk]=email,súhrn,nastavenie
+Keywords[sl]=e-pošta,pošta,povzetek,nastavi,nastavitve
+Keywords[sr]=емаил, сажетак, подеси, поставке
+Keywords[sr@Latn]=email, sažetak, podesi, postavke
+Keywords[sv]=e-post, översikt, anpassa, inställningar
+Keywords[ta]=மின்னஞ்சல்,சுருக்கம்,கட்டமைப்பு,அமைவுகள்
+Keywords[tg]=email, summary, configure, settings,танзимот, дайджест,почта
+Keywords[tr]=e-posta, özet, yapılandır, yapılandırma
+Keywords[uk]=пошта, підсумок, налаштування, параметри
+Keywords[zh_CN]=email, summary, configure, settings, 电子邮件, 摘要, 配置, 设置
diff --git a/kontact/plugins/kmail/kcmkmailsummary.h b/kontact/plugins/kmail/kcmkmailsummary.h
new file mode 100644
index 000000000..e2959dead
--- /dev/null
+++ b/kontact/plugins/kmail/kcmkmailsummary.h
@@ -0,0 +1,61 @@
+/*
+ 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 KCMKMAILSUMMARY_H
+#define KCMKMAILSUMMARY_H
+
+#include <qvaluelist.h>
+
+#include <kcmodule.h>
+
+class KListView;
+
+class QCheckBox;
+class QCheckListItem;
+
+class KCMKMailSummary : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMKMailSummary( QWidget *parent = 0, const char *name = 0 );
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+ private slots:
+ void modified();
+
+ private:
+ void initGUI();
+ void initFolders();
+ void loadFolders();
+ void storeFolders();
+
+ KListView *mFolderView;
+ QCheckBox *mFullPath;
+ QMap<QString, QListViewItem*> mFolderMap;
+};
+
+#endif
diff --git a/kontact/plugins/kmail/kmail_plugin.cpp b/kontact/plugins/kmail/kmail_plugin.cpp
new file mode 100644
index 000000000..3d9f45bec
--- /dev/null
+++ b/kontact/plugins/kmail/kmail_plugin.cpp
@@ -0,0 +1,221 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Kontact Developer
+
+ 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 <qwidget.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kparts/componentfactory.h>
+#include <kstandarddirs.h>
+#include <dcopclient.h>
+#include <ktempfile.h>
+
+#include <kabc/addressee.h>
+
+#include <libkcal/vcaldrag.h>
+#include <libkcal/icaldrag.h>
+#include <libkcal/calendarlocal.h>
+
+#include <libkdepim/kvcarddrag.h>
+
+#include <kmail/kmail_part.h>
+#include <kmail/kmkernel.h>
+
+#include "core.h"
+#include "summarywidget.h"
+
+#include "kmail_plugin.h"
+
+using namespace KCal;
+
+typedef KGenericFactory<KMailPlugin, Kontact::Core> KMailPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_kmailplugin,
+ KMailPluginFactory( "kontact_kmailplugin" ) )
+
+KMailPlugin::KMailPlugin(Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "kmail" ),
+ mStub( 0 )
+{
+ setInstance( KMailPluginFactory::instance() );
+
+ insertNewAction( new KAction( i18n( "New Message..." ), "mail_new",
+ CTRL+SHIFT+Key_M, this, SLOT( slotNewMail() ), actionCollection(),
+ "new_mail" ) );
+
+ insertSyncAction( new KAction( i18n( "Synchronize Mail" ), "reload",
+ 0, this, SLOT( slotSyncFolders() ), actionCollection(),
+ "sync_mail" ) );
+
+ mUniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<KMailUniqueAppHandler>(), this );
+}
+
+bool KMailPlugin::canDecodeDrag( QMimeSource *qms )
+{
+ return ( ICalDrag::canDecode( qms ) ||
+ VCalDrag::canDecode( qms ) ||
+ KVCardDrag::canDecode( qms ) );
+}
+
+void KMailPlugin::processDropEvent( QDropEvent * de )
+{
+ kdDebug() << k_funcinfo << endl;
+ CalendarLocal cal( QString::fromLatin1("UTC") );
+ KABC::Addressee::List list;
+
+ if ( VCalDrag::decode( de, &cal ) || ICalDrag::decode( de, &cal ) ) {
+ KTempFile tmp( locateLocal( "tmp", "incidences-" ), ".ics" );
+ cal.save( tmp.name() );
+ openComposer( KURL::fromPathOrURL( tmp.name() ) );
+ }
+ else if ( KVCardDrag::decode( de, list ) ) {
+ KABC::Addressee::List::Iterator it;
+ QStringList to;
+ for ( it = list.begin(); it != list.end(); ++it ) {
+ to.append( ( *it ).fullEmail() );
+ }
+ openComposer( to.join(", ") );
+ }
+
+}
+
+void KMailPlugin::openComposer( const KURL& attach )
+{
+ (void) part(); // ensure part is loaded
+ Q_ASSERT( mStub );
+ if ( mStub ) {
+ if ( attach.isValid() )
+ mStub->newMessage( "", "", "", false, true, KURL(), attach );
+ else
+ mStub->newMessage( "", "", "", false, true, KURL(), KURL() );
+ }
+}
+
+void KMailPlugin::openComposer( const QString& to )
+{
+ (void) part(); // ensure part is loaded
+ Q_ASSERT( mStub );
+ if ( mStub ) {
+ mStub->newMessage( to, "", "", false, true, KURL(), KURL() );
+ }
+}
+
+void KMailPlugin::slotNewMail()
+{
+ openComposer( QString::null );
+}
+
+void KMailPlugin::slotSyncFolders()
+{
+ DCOPRef ref( "kmail", "KMailIface" );
+ ref.send( "checkMail" );
+}
+
+KMailPlugin::~KMailPlugin()
+{
+}
+
+bool KMailPlugin::createDCOPInterface( const QString& serviceType )
+{
+ if ( serviceType == "DCOP/ResourceBackend/IMAP" ) {
+ if ( part() )
+ return true;
+ }
+
+ return false;
+}
+
+QString KMailPlugin::tipFile() const
+{
+ QString file = ::locate("data", "kmail/tips");
+ return file;
+}
+
+KParts::ReadOnlyPart* KMailPlugin::createPart()
+{
+ KParts::ReadOnlyPart *part = loadPart();
+ if ( !part ) return 0;
+
+ mStub = new KMailIface_stub( dcopClient(), "kmail", "KMailIface" );
+
+ return part;
+}
+
+QStringList KMailPlugin::invisibleToolbarActions() const
+{
+ return QStringList( "new_message" );
+}
+
+bool KMailPlugin::isRunningStandalone()
+{
+ return mUniqueAppWatcher->isRunningStandalone();
+}
+
+Kontact::Summary *KMailPlugin::createSummaryWidget( QWidget *parent )
+{
+ return new SummaryWidget( this, parent );
+}
+
+////
+
+#include "../../../kmail/kmail_options.h"
+void KMailUniqueAppHandler::loadCommandLineOptions()
+{
+ KCmdLineArgs::addCmdLineOptions( kmail_options );
+}
+
+int KMailUniqueAppHandler::newInstance()
+{
+ // Ensure part is loaded
+ (void)plugin()->part();
+ DCOPRef kmail( "kmail", "KMailIface" );
+ DCOPReply reply = kmail.call( "handleCommandLine", false );
+ if ( reply.isValid() ) {
+ bool handled = reply;
+ //kdDebug(5602) << k_funcinfo << "handled=" << handled << endl;
+ if ( !handled ) // no args -> simply bring kmail plugin to front
+ return Kontact::UniqueAppHandler::newInstance();
+ }
+ return 0;
+}
+
+bool KMailPlugin::queryClose() const {
+ KMailIface_stub stub( kapp->dcopClient(), "kmail", "KMailIface" );
+ bool canClose=stub.canQueryClose();
+ return canClose;
+}
+
+void KMailPlugin::loadProfile( const QString& profileDirectory ) {
+ DCOPRef ref( "kmail", "KMailIface" );
+ ref.send( "loadProfile", profileDirectory );
+}
+
+void KMailPlugin::saveToProfile( const QString& profileDirectory ) {
+ DCOPRef ref( "kmail", "KMailIface" );
+ ref.send( "saveToProfile", profileDirectory );
+}
+
+#include "kmail_plugin.moc"
diff --git a/kontact/plugins/kmail/kmail_plugin.h b/kontact/plugins/kmail/kmail_plugin.h
new file mode 100644
index 000000000..0d6013867
--- /dev/null
+++ b/kontact/plugins/kmail/kmail_plugin.h
@@ -0,0 +1,86 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Kontact Developer
+
+ 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 KMAIL_PLUGIN_H
+#define KMAIL_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "kmailIface_stub.h"
+#include <plugin.h>
+#include <summary.h>
+#include <uniqueapphandler.h>
+
+class QMimeSource;
+class QDropEvent;
+
+class KMailUniqueAppHandler : public Kontact::UniqueAppHandler
+{
+public:
+ KMailUniqueAppHandler( Kontact::Plugin* plugin ) : Kontact::UniqueAppHandler( plugin ) {}
+ virtual void loadCommandLineOptions();
+ virtual int newInstance();
+};
+
+class KMailPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KMailPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~KMailPlugin();
+
+ virtual bool isRunningStandalone();
+ virtual bool createDCOPInterface( const QString& serviceType );
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parent );
+ virtual QString tipFile() const;
+ int weight() const { return 200; }
+
+ virtual QStringList invisibleToolbarActions() const;
+ virtual bool queryClose() const;
+
+ //override
+ void loadProfile( const QString& profileDirectory );
+
+ //override
+ void saveToProfile( const QString& profileDirectory );
+
+ protected:
+ virtual KParts::ReadOnlyPart* createPart();
+ void openComposer( const KURL& = KURL() );
+ void openComposer( const QString& to );
+ bool canDecodeDrag( QMimeSource * );
+ void processDropEvent( QDropEvent * );
+
+
+ protected slots:
+ void slotNewMail();
+ void slotSyncFolders();
+
+ private:
+ KMailIface_stub *mStub;
+ Kontact::UniqueAppWatcher *mUniqueAppWatcher;
+};
+
+#endif
diff --git a/kontact/plugins/kmail/kmailplugin.desktop b/kontact/plugins/kmail/kmailplugin.desktop
new file mode 100644
index 000000000..55ba5e97b
--- /dev/null
+++ b/kontact/plugins/kmail/kmailplugin.desktop
@@ -0,0 +1,67 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_mail
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_kmailplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkmailpart
+X-KDE-KontactPartExecutableName=kmail
+X-KDE-KontactPartLoadOnStart=true
+X-KDE-KontactPluginHasSummary=true
+
+X-KDE-PluginInfo-Website=http://kmail.kde.org/
+X-KDE-PluginInfo-Name=kontact_kmailplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=E-Mail Component (KMail Plugin)
+Comment[bg]=Модул за е-поща
+Comment[ca]=Component de correu (endollable del KMail)
+Comment[da]=Post-komponent (KMail-plugin)
+Comment[de]=E-Mail-Komponente (KMail-Modul)
+Comment[el]=Συστατικό αλληλογραφίας (Πρόσθετο του KMail)
+Comment[es]=Componente de correo electrónico (complemento de KMail)
+Comment[et]=E-posti plugin (KMail)
+Comment[fr]=Composant de courriel (Module pour KMail)
+Comment[is]=Pósteining (KMail íforrit)
+Comment[it]=Componente posta elettronica (plugin KMail)
+Comment[ja]=メールコンポーネント (KMail プラグイン)
+Comment[km]=សមាសភាគ​អ៊ីមែល (កម្មវិធី​ជំនួយ KMail)
+Comment[nds]=Nettpost-Komponent (KMail-Moduul)
+Comment[nl]=E-mailcomponent (KMail-plugin)
+Comment[pl]=Składnik poczty (wtyczka KMail)
+Comment[pt_BR]=Componente de e-mail (plug-in do KMail)
+Comment[ru]=Электронная почта (модуль KMail)
+Comment[sk]=Poštový komponent (Model pre KMail)
+Comment[sr]=Компонента е-поште (прикључак KMail-а)
+Comment[sr@Latn]=Komponenta e-pošte (priključak KMail-a)
+Comment[sv]=E-postkomponent (Kmail-insticksprogram)
+Comment[tr]=E-Posta Bileşeni (KMail Eklentisi)
+Comment[zh_CN]=邮件组件(KMail 插件)
+Comment[zh_TW]=電子郵件組件(KMail 外掛程式)
+Name=E-Mail
+Name[bg]=Е-поща
+Name[ca]=Correu
+Name[da]=E-mail
+Name[el]=Αλληλογραφία
+Name[es]=Correo electrónico
+Name[et]=E-post
+Name[fr]=Courriel
+Name[is]=Tölvupóstur
+Name[it]=Posta elettronica
+Name[ja]=メール
+Name[km]=អ៊ីមែល
+Name[nds]=Nettpost
+Name[nl]=E-mail
+Name[pl]=E-mail
+Name[pt_BR]=E-mail
+Name[ru]=Электронная почта
+Name[sk]=Pošta
+Name[sr]=Е-пошта
+Name[sr@Latn]=E-pošta
+Name[sv]=E-post
+Name[tr]=E-Posta
+Name[zh_CN]=邮件
+Name[zh_TW]=電子郵件
diff --git a/kontact/plugins/kmail/summarywidget.cpp b/kontact/plugins/kmail/summarywidget.cpp
new file mode 100644
index 000000000..79f2f4657
--- /dev/null
+++ b/kontact/plugins/kmail/summarywidget.cpp
@@ -0,0 +1,182 @@
+/* -*- mode: C++; c-file-style: "gnu" -*-
+
+ 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 <qlabel.h>
+#include <qlayout.h>
+
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "core.h"
+#include "summary.h"
+#include "summarywidget.h"
+
+#include <time.h>
+
+SummaryWidget::SummaryWidget( Kontact::Plugin *plugin, QWidget *parent, const char *name )
+ : Kontact::Summary( parent, name ),
+ DCOPObject( QCString("MailSummary") ),
+ mPlugin( plugin )
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout( this, 3, 3 );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kontact_mail", KIcon::Desktop,
+ KIcon::SizeMedium );
+ QWidget *header = createHeader(this, icon, i18n("E-Mail"));
+ mLayout = new QGridLayout( 1, 3, 3 );
+
+ mainLayout->addWidget(header);
+ mainLayout->addLayout(mLayout);
+
+ slotUnreadCountChanged();
+ connectDCOPSignal( 0, 0, "unreadCountChanged()", "slotUnreadCountChanged()",
+ false );
+}
+
+void SummaryWidget::selectFolder( const QString& folder )
+{
+ if ( mPlugin->isRunningStandalone() )
+ mPlugin->bringToForeground();
+ else
+ mPlugin->core()->selectPlugin( mPlugin );
+ QByteArray data;
+ QDataStream arg( data, IO_WriteOnly );
+ arg << folder;
+ emitDCOPSignal( "kmailSelectFolder(QString)", data );
+}
+
+void SummaryWidget::updateSummary( bool )
+{
+ // check whether we need to update the message counts
+ DCOPRef kmail( "kmail", "KMailIface" );
+ const int timeOfLastMessageCountChange =
+ kmail.call( "timeOfLastMessageCountChange()" );
+ if ( timeOfLastMessageCountChange > mTimeOfLastMessageCountUpdate )
+ slotUnreadCountChanged();
+}
+
+void SummaryWidget::slotUnreadCountChanged()
+{
+ DCOPRef kmail( "kmail", "KMailIface" );
+ DCOPReply reply = kmail.call( "folderList" );
+ if ( reply.isValid() ) {
+ QStringList folderList = reply;
+ updateFolderList( folderList );
+ }
+ else {
+ kdDebug(5602) << "Calling kmail->KMailIface->folderList() via DCOP failed."
+ << endl;
+ }
+ mTimeOfLastMessageCountUpdate = ::time( 0 );
+}
+
+void SummaryWidget::updateFolderList( const QStringList& folders )
+{
+ mLabels.setAutoDelete( true );
+ mLabels.clear();
+ mLabels.setAutoDelete( false );
+
+ KConfig config( "kcmkmailsummaryrc" );
+ config.setGroup( "General" );
+
+ QStringList activeFolders;
+ if ( !config.hasKey( "ActiveFolders" ) )
+ activeFolders << "/Local/inbox";
+ else
+ activeFolders = config.readListEntry( "ActiveFolders" );
+
+ int counter = 0;
+ QStringList::ConstIterator it;
+ DCOPRef kmail( "kmail", "KMailIface" );
+ for ( it = folders.begin(); it != folders.end(); ++it ) {
+ if ( activeFolders.contains( *it ) ) {
+ DCOPRef folderRef = kmail.call( "getFolder(QString)", *it );
+ const int numMsg = folderRef.call( "messages()" );
+ const int numUnreadMsg = folderRef.call( "unreadMessages()" );
+
+ if ( numUnreadMsg == 0 ) continue;
+
+ QString folderPath;
+ if ( config.readBoolEntry( "ShowFullPath", true ) )
+ folderRef.call( "displayPath()" ).get( folderPath );
+ else
+ folderRef.call( "displayName()" ).get( folderPath );
+
+ KURLLabel *urlLabel = new KURLLabel( *it, folderPath, this );
+ urlLabel->installEventFilter( this );
+ urlLabel->setAlignment( AlignLeft );
+ urlLabel->show();
+ connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ SLOT( selectFolder( const QString& ) ) );
+ mLayout->addWidget( urlLabel, counter, 0 );
+ mLabels.append( urlLabel );
+
+ QLabel *label =
+ new QLabel( QString( i18n("%1: number of unread messages "
+ "%2: total number of messages", "%1 / %2") )
+ .arg( numUnreadMsg ).arg( numMsg ), this );
+ label->setAlignment( AlignLeft );
+ label->show();
+ mLayout->addWidget( label, counter, 2 );
+ mLabels.append( label );
+
+ counter++;
+ }
+ }
+
+ if ( counter == 0 ) {
+ QLabel *label = new QLabel( i18n( "No unread messages in your monitored folders" ), this );
+ label->setAlignment( AlignHCenter | AlignVCenter );
+ mLayout->addMultiCellWidget( label, 0, 0, 0, 2 );
+ label->show();
+ mLabels.append( label );
+ }
+}
+
+bool SummaryWidget::eventFilter( QObject *obj, QEvent* e )
+{
+ if ( obj->inherits( "KURLLabel" ) ) {
+ KURLLabel* label = static_cast<KURLLabel*>( obj );
+ if ( e->type() == QEvent::Enter )
+ emit message( i18n( "Open Folder: \"%1\"" ).arg( label->text() ) );
+ if ( e->type() == QEvent::Leave )
+ emit message( QString::null );
+ }
+
+ return Kontact::Summary::eventFilter( obj, e );
+}
+
+QStringList SummaryWidget::configModules() const
+{
+ return QStringList( "kcmkmailsummary.desktop" );
+}
+
+#include "summarywidget.moc"
diff --git a/kontact/plugins/kmail/summarywidget.h b/kontact/plugins/kmail/summarywidget.h
new file mode 100644
index 000000000..563a021e1
--- /dev/null
+++ b/kontact/plugins/kmail/summarywidget.h
@@ -0,0 +1,73 @@
+/*
+ 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 <qmap.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+#include <dcopobject.h>
+#include <kurllabel.h>
+#include <kparts/part.h>
+
+#include "plugin.h"
+#include "summary.h"
+
+class QGridLayout;
+class QString;
+
+class SummaryWidget : public Kontact::Summary, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+
+ public:
+ SummaryWidget( Kontact::Plugin *plugin, QWidget *parent, const char *name = 0 );
+
+ int summaryHeight() const { return 1; }
+ QStringList configModules() const;
+
+ k_dcop_hidden:
+ void slotUnreadCountChanged();
+
+ protected:
+ virtual bool eventFilter( QObject *obj, QEvent* e );
+
+ public slots:
+ virtual void updateSummary( bool force );
+
+ private slots:
+ void selectFolder( const QString& );
+
+ private:
+ void updateFolderList( const QStringList& folders );
+
+ QPtrList<QLabel> mLabels;
+ QGridLayout *mLayout;
+ Kontact::Plugin *mPlugin;
+ int mTimeOfLastMessageCountUpdate;
+};
+
+#endif
diff --git a/kontact/plugins/knode/Makefile.am b/kontact/plugins/knode/Makefile.am
new file mode 100644
index 000000000..bf4ba753a
--- /dev/null
+++ b/kontact/plugins/knode/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir)/knode -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_knodeplugin.la
+libkontact_knodeplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_knodeplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS)
+
+libkontact_knodeplugin_la_SOURCES = knode_plugin.cpp knodeiface.stub
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = knodeplugin.desktop
+
+knodeiface_DIR = $(top_srcdir)/knode
diff --git a/kontact/plugins/knode/knode_plugin.cpp b/kontact/plugins/knode/knode_plugin.cpp
new file mode 100644
index 000000000..6ad7fedb1
--- /dev/null
+++ b/kontact/plugins/knode/knode_plugin.cpp
@@ -0,0 +1,123 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2003 Zack Rusin <zack@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 "knode_plugin.h"
+
+#include "core.h"
+
+#include <kapplication.h>
+#include <kparts/componentfactory.h>
+#include <kgenericfactory.h>
+#include <kapplication.h>
+#include <kaction.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+
+#include <dcopclient.h>
+
+#include <qwidget.h>
+
+
+typedef KGenericFactory<KNodePlugin, Kontact::Core> KNodePluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_knodeplugin,
+ KNodePluginFactory( "kontact_knodeplugin" ) )
+
+
+KNodePlugin::KNodePlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "knode" ), mStub(0)
+{
+ setInstance( KNodePluginFactory::instance() );
+
+ insertNewAction( new KAction( i18n( "New Article..." ), "mail_new", CTRL+SHIFT+Key_A,
+ this, SLOT( slotPostArticle() ), actionCollection(), "post_article" ) );
+
+ mUniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<KNodeUniqueAppHandler>(), this );
+}
+
+KNodePlugin::~KNodePlugin()
+{
+}
+
+bool KNodePlugin::createDCOPInterface( const QString& /*serviceType*/ )
+{
+ return false;
+}
+
+bool KNodePlugin::isRunningStandalone()
+{
+ return mUniqueAppWatcher->isRunningStandalone();
+}
+
+QStringList KNodePlugin::invisibleToolbarActions() const
+{
+ return QStringList( "article_postNew" );
+}
+
+void KNodePlugin::slotPostArticle()
+{
+ (void) part(); // ensure part is loaded
+ Q_ASSERT( mStub );
+ if ( mStub )
+ mStub->postArticle();
+}
+
+KParts::ReadOnlyPart* KNodePlugin::createPart()
+{
+ KParts::ReadOnlyPart *part = loadPart();
+ if ( !part ) return 0;
+
+ mStub = new KNodeIface_stub( dcopClient(), "knode", "KNodeIface" );
+ return part;
+}
+
+////
+
+#include "../../../knode/knode_options.h"
+void KNodeUniqueAppHandler::loadCommandLineOptions()
+{
+ KCmdLineArgs::addCmdLineOptions( knode_options );
+}
+
+int KNodeUniqueAppHandler::newInstance()
+{
+ // Ensure part is loaded
+ (void)plugin()->part();
+ DCOPRef knode( "knode", "KNodeIface" );
+ DCOPReply reply = knode.call( "handleCommandLine" );
+#if 0
+ if ( reply.isValid() ) {
+ bool handled = reply;
+ kdDebug(5602) << k_funcinfo << "handled=" << handled << endl;
+ if ( !handled )
+#endif
+ // in all cases, bring knode plugin to front
+ return Kontact::UniqueAppHandler::newInstance();
+#if 0
+ }
+ return 0;
+#endif
+}
+
+#include "knode_plugin.moc"
diff --git a/kontact/plugins/knode/knode_plugin.h b/kontact/plugins/knode/knode_plugin.h
new file mode 100644
index 000000000..78d4275ed
--- /dev/null
+++ b/kontact/plugins/knode/knode_plugin.h
@@ -0,0 +1,68 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2003 Zack Rusin <zack@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 KNODE_PLUGIN_H
+#define KNODE_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "knodeiface_stub.h"
+#include "plugin.h"
+#include <uniqueapphandler.h>
+
+class KNodeUniqueAppHandler : public Kontact::UniqueAppHandler
+{
+public:
+ KNodeUniqueAppHandler( Kontact::Plugin* plugin ) : Kontact::UniqueAppHandler( plugin ) {}
+ virtual void loadCommandLineOptions();
+ virtual int newInstance();
+};
+
+class KNodePlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KNodePlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~KNodePlugin();
+
+ virtual bool createDCOPInterface( const QString& serviceType );
+ virtual bool isRunningStandalone();
+ int weight() const { return 500; }
+
+ virtual QStringList invisibleToolbarActions() const;
+
+ protected:
+ virtual KParts::ReadOnlyPart* createPart();
+
+ protected slots:
+ void slotPostArticle();
+
+ private:
+ KNodeIface_stub *mStub;
+ Kontact::UniqueAppWatcher *mUniqueAppWatcher;
+};
+
+#endif
diff --git a/kontact/plugins/knode/knodeplugin.desktop b/kontact/plugins/knode/knodeplugin.desktop
new file mode 100644
index 000000000..d84c16f7e
--- /dev/null
+++ b/kontact/plugins/knode/knodeplugin.desktop
@@ -0,0 +1,98 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_news
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_knodeplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libknodepart
+X-KDE-KontactPartExecutableName=knode
+
+X-KDE-PluginInfo-Name=kontact_knodeplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+
+Comment=Newsreader Component (KNode Plugin)
+Comment[bg]=Приставка за KNode
+Comment[ca]=Component de notícies (endollable del KNode)
+Comment[da]=Nyhedskomponent (KNode-plugin)
+Comment[de]=News-Komponente (KNode-Modul)
+Comment[el]=Συστατικό ανάγνωσης νέων (Πρόσθετο του KNode)
+Comment[es]=Componente de noticias (complemento de KNode)
+Comment[et]=Uudistelugeja plugin (KNode)
+Comment[fr]=Composant de lecteur de nouvelles (Module pour KNode)
+Comment[is]=Fréttaeining (KNode íforrit)
+Comment[it]=Componente lettore di news (plugin KNode)
+Comment[ja]=ニュースリーダーコンポーネント (KNode プラグイン)
+Comment[km]=សមាសភាគ Newsreader (កម្មវិធី​ជំនួយ KNode)
+Comment[nds]=Narichtenkieker-Komponent (KNode-Moduul)
+Comment[nl]=Nieuwscomponent (KNode-plugin)
+Comment[pl]=Składnik wiadomości (wtyczka KNode)
+Comment[ru]=Новости (модуль KNode)
+Comment[sr]=Компонента вести (прикључак KNode-а)
+Comment[sr@Latn]=Komponenta vesti (priključak KNode-a)
+Comment[sv]=Komponent för läsning av diskussionsgrupper (Knode-insticksprogram)
+Comment[tr]=Haber Okuyucu Bileşeni (KNode Eklentisi)
+Comment[zh_CN]=新闻组阅读器组件(KNode 插件)
+Comment[zh_TW]=新聞閱讀器組件(KNode 外掛程式)
+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/knotes/Makefile.am b/kontact/plugins/knotes/Makefile.am
new file mode 100644
index 000000000..4a3b1710f
--- /dev/null
+++ b/kontact/plugins/knotes/Makefile.am
@@ -0,0 +1,23 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_knotesplugin.la
+libkontact_knotesplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_knotesplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la \
+ $(LIB_KPARTS) $(top_builddir)/libkdepim/libkdepim.la \
+ $(top_builddir)/libkcal/libkcal.la -lkresources -lkdeprint \
+ $(top_builddir)/knotes/libknotesresources.la \
+ $(top_builddir)/knotes/libknoteseditor.la \
+ $(top_builddir)/knotes/libknotesprinting.la
+
+libkontact_knotesplugin_la_SOURCES = knotes_plugin.cpp knotes_part.cpp summarywidget.cpp \
+ knotetip.cpp KNotesIface.skel
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = knotesplugin.desktop
+
+partdir = $(kde_datadir)/knotes
+part_DATA = knotes_part.rc
+
+KNotesIface_DIR = $(top_srcdir)/knotes
diff --git a/kontact/plugins/knotes/knotes_part.cpp b/kontact/plugins/knotes/knotes_part.cpp
new file mode 100644
index 000000000..5bd160d1d
--- /dev/null
+++ b/kontact/plugins/knotes/knotes_part.cpp
@@ -0,0 +1,413 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2002-2003 Daniel Molkentin <molkentin@kde.org>
+ Copyright (C) 2004-2006 Michael Brade <brade@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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qpopupmenu.h>
+#include <qclipboard.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kmessagebox.h>
+
+#include <libkdepim/infoextension.h>
+#include <libkdepim/sidebarextension.h>
+
+#include "knotes/knoteprinter.h"
+#include "knotes/resourcemanager.h"
+
+#include "knotes_part.h"
+#include "knotes_part_p.h"
+#include "knotetip.h"
+
+
+KNotesPart::KNotesPart( QObject *parent, const char *name )
+ : DCOPObject( "KNotesIface" ), KParts::ReadOnlyPart( parent, name ),
+ mNotesView( new KNotesIconView() ),
+ mNoteTip( new KNoteTip( mNotesView ) ),
+ mNoteEditDlg( 0 ),
+ mManager( new KNotesResourceManager() )
+{
+ mNoteList.setAutoDelete( true );
+
+ setInstance( new KInstance( "knotes" ) );
+
+ // create the actions
+ new KAction( i18n( "&New" ), "knotes", CTRL+Key_N, this, SLOT( newNote() ),
+ actionCollection(), "file_new" );
+ new KAction( i18n( "Rename..." ), "text", this, SLOT( renameNote() ),
+ actionCollection(), "edit_rename" );
+ new KAction( i18n( "Delete" ), "editdelete", Key_Delete, this, SLOT( killSelectedNotes() ),
+ actionCollection(), "edit_delete" );
+ new KAction( i18n( "Print Selected Notes..." ), "print", CTRL+Key_P, this, SLOT( printSelectedNotes() ),
+ actionCollection(), "print_note" );
+
+ // TODO icons: s/editdelete/knotes_delete/ or the other way round in knotes
+
+ // set the view up
+ mNotesView->setSelectionMode( QIconView::Extended );
+ mNotesView->setItemsMovable( false );
+ mNotesView->setResizeMode( QIconView::Adjust );
+ mNotesView->setAutoArrange( true );
+ mNotesView->setSorting( true );
+
+ connect( mNotesView, SIGNAL( executed( QIconViewItem* ) ),
+ this, SLOT( editNote( QIconViewItem* ) ) );
+ connect( mNotesView, SIGNAL( returnPressed( QIconViewItem* ) ),
+ this, SLOT( editNote( QIconViewItem* ) ) );
+ connect( mNotesView, SIGNAL( itemRenamed( QIconViewItem* ) ),
+ this, SLOT( renamedNote( QIconViewItem* ) ) );
+ connect( mNotesView, SIGNAL( contextMenuRequested( QIconViewItem*, const QPoint& ) ),
+ this, SLOT( popupRMB( QIconViewItem*, const QPoint& ) ) );
+ connect( mNotesView, SIGNAL( onItem( QIconViewItem* ) ),
+ this, SLOT( slotOnItem( QIconViewItem* ) ) );
+ connect( mNotesView, SIGNAL( onViewport() ),
+ this, SLOT( slotOnViewport() ) );
+ connect( mNotesView, SIGNAL( currentChanged( QIconViewItem* ) ),
+ this, SLOT( slotOnCurrentChanged( QIconViewItem* ) ) );
+
+ slotOnCurrentChanged( 0 );
+
+ new KParts::SideBarExtension( mNotesView, this, "NotesSideBarExtension" );
+
+ setWidget( mNotesView );
+ setXMLFile( "knotes_part.rc" );
+
+ // connect the resource manager
+ connect( mManager, SIGNAL( sigRegisteredNote( KCal::Journal* ) ),
+ this, SLOT( createNote( KCal::Journal* ) ) );
+ connect( mManager, SIGNAL( sigDeregisteredNote( KCal::Journal* ) ),
+ this, SLOT( killNote( KCal::Journal* ) ) );
+
+ // read the notes
+ mManager->load();
+}
+
+KNotesPart::~KNotesPart()
+{
+ delete mNoteTip;
+ mNoteTip = 0;
+
+ delete mManager;
+ mManager = 0;
+}
+
+void KNotesPart::printSelectedNotes()
+{
+ QValueList<KCal::Journal*> journals;
+
+ for ( QIconViewItem *it = mNotesView->firstItem(); it; it = it->nextItem() ) {
+ if ( it->isSelected() ) {
+ journals.append( static_cast<KNotesIconViewItem *>( it )->journal() );
+ }
+ }
+
+ if ( journals.isEmpty() ) {
+ KMessageBox::information( mNotesView, i18n("To print notes, first select the notes to print from the list."), i18n("Print Notes") );
+ return;
+ }
+
+ KNotePrinter printer;
+ printer.printNotes(journals );
+
+#if 0
+ QString content;
+ if ( m_editor->textFormat() == PlainText )
+ content = QStyleSheet::convertFromPlainText( m_editor->text() );
+ else
+ content = m_editor->text();
+
+ KNotePrinter printer;
+ printer.setMimeSourceFactory( m_editor->mimeSourceFactory() );
+ //printer.setFont( m_config->font() );
+ //printer.setContext( m_editor->context() );
+ //printer.setStyleSheet( m_editor->styleSheet() );
+ printer.setColorGroup( colorGroup() );
+ printer.printNote( , content );
+#endif
+}
+
+bool KNotesPart::openFile()
+{
+ return false;
+}
+
+
+// public KNotes DCOP interface implementation
+
+QString KNotesPart::newNote( const QString& name, const QString& text )
+{
+ // create the new note
+ KCal::Journal *journal = new KCal::Journal();
+
+ // new notes have the current date/time as title if none was given
+ if ( !name.isEmpty() )
+ journal->setSummary( name );
+ else
+ journal->setSummary( KGlobal::locale()->formatDateTime( QDateTime::currentDateTime() ) );
+
+ // the body of the note
+ journal->setDescription( text );
+
+
+
+ // Edit the new note if text is empty
+ if ( text.isNull() )
+ {
+ if ( !mNoteEditDlg )
+ mNoteEditDlg = new KNoteEditDlg( widget() );
+
+ mNoteEditDlg->setTitle( journal->summary() );
+ mNoteEditDlg->setText( journal->description() );
+
+ if ( mNoteEditDlg->exec() == QDialog::Accepted )
+ {
+ journal->setSummary( mNoteEditDlg->title() );
+ journal->setDescription( mNoteEditDlg->text() );
+ }
+ else
+ {
+ delete journal;
+ return "";
+ }
+ }
+
+ mManager->addNewNote( journal );
+ mManager->save();
+
+ KNotesIconViewItem *note = mNoteList[ journal->uid() ];
+ mNotesView->ensureItemVisible( note );
+ mNotesView->setCurrentItem( note );
+
+ return journal->uid();
+}
+
+QString KNotesPart::newNoteFromClipboard( const QString& name )
+{
+ const QString& text = KApplication::clipboard()->text();
+ return newNote( name, text );
+}
+
+void KNotesPart::killNote( const QString& id )
+{
+ killNote( id, false );
+}
+
+void KNotesPart::killNote( const QString& id, bool force )
+{
+ KNotesIconViewItem *note = mNoteList[ id ];
+
+ if ( note &&
+ ( (!force && KMessageBox::warningContinueCancelList( mNotesView,
+ i18n( "Do you really want to delete this note?" ),
+ mNoteList[ id ]->text(), i18n( "Confirm Delete" ),
+ KStdGuiItem::del() ) == KMessageBox::Continue)
+ || force )
+ )
+ {
+ mManager->deleteNote( mNoteList[id]->journal() );
+ mManager->save();
+ }
+}
+
+QString KNotesPart::name( const QString& id ) const
+{
+ KNotesIconViewItem *note = mNoteList[ id ];
+ if ( note )
+ return note->text();
+ else
+ return QString::null;
+}
+
+QString KNotesPart::text( const QString& id ) const
+{
+ KNotesIconViewItem *note = mNoteList[id];
+ if ( note )
+ return note->journal()->description();
+ else
+ return QString::null;
+}
+
+void KNotesPart::setName( const QString& id, const QString& newName )
+{
+ KNotesIconViewItem *note = mNoteList[ id ];
+ if ( note ) {
+ note->setText( newName );
+ mManager->save();
+ }
+}
+
+void KNotesPart::setText( const QString& id, const QString& newText )
+{
+ KNotesIconViewItem *note = mNoteList[ id ];
+ if ( note ) {
+ note->journal()->setDescription( newText );
+ mManager->save();
+ }
+}
+
+QMap<QString, QString> KNotesPart::notes() const
+{
+ QMap<QString, QString> notes;
+ QDictIterator<KNotesIconViewItem> it( mNoteList );
+
+ for ( ; it.current(); ++it )
+ notes.insert( (*it)->journal()->uid(), (*it)->journal()->summary() );
+
+ return notes;
+}
+
+
+// private stuff
+
+void KNotesPart::killSelectedNotes()
+{
+ QPtrList<KNotesIconViewItem> items;
+ QStringList notes;
+
+ KNotesIconViewItem *knivi;
+ for ( QIconViewItem *it = mNotesView->firstItem(); it; it = it->nextItem() ) {
+ if ( it->isSelected() ) {
+ knivi = static_cast<KNotesIconViewItem *>( it );
+ items.append( knivi );
+ notes.append( knivi->text() );
+ }
+ }
+
+ if ( items.isEmpty() )
+ return;
+
+ int ret = KMessageBox::warningContinueCancelList( mNotesView,
+ i18n( "Do you really want to delete this note?",
+ "Do you really want to delete these %n notes?", items.count() ),
+ notes, i18n( "Confirm Delete" ),
+ KStdGuiItem::del() );
+
+ if ( ret == KMessageBox::Continue ) {
+ QPtrListIterator<KNotesIconViewItem> kniviIt( items );
+ while ( (knivi = *kniviIt) ) {
+ ++kniviIt;
+ mManager->deleteNote( knivi->journal() );
+ }
+
+ mManager->save();
+ }
+}
+
+void KNotesPart::popupRMB( QIconViewItem *item, const QPoint& pos )
+{
+ QPopupMenu *contextMenu = NULL;
+
+ if ( item )
+ contextMenu = static_cast<QPopupMenu *>( factory()->container( "note_context", this ) );
+ else
+ contextMenu = static_cast<QPopupMenu *>( factory()->container( "notepart_context", this ) );
+
+ if ( !contextMenu )
+ return;
+
+ contextMenu->popup( pos );
+}
+
+void KNotesPart::slotOnItem( QIconViewItem *i )
+{
+ // TODO: disable (i.e. setNote( QString::null )) when mouse button pressed
+
+ KNotesIconViewItem *item = static_cast<KNotesIconViewItem *>( i );
+ mNoteTip->setNote( item );
+}
+
+void KNotesPart::slotOnViewport()
+{
+ mNoteTip->setNote( 0 );
+}
+
+// TODO: also with takeItem, clear(),
+
+// create and kill the icon view item corresponding to the note, edit the note
+
+void KNotesPart::createNote( KCal::Journal *journal )
+{
+ // make sure all fields are existent, initialize them with default values
+ QString property = journal->customProperty( "KNotes", "BgColor" );
+ if ( property.isNull() )
+ journal->setCustomProperty( "KNotes", "BgColor", "#ffff00" );
+
+ property = journal->customProperty( "KNotes", "FgColor" );
+ if ( property.isNull() )
+ journal->setCustomProperty( "KNotes", "FgColor", "#000000" );
+
+ property = journal->customProperty( "KNotes", "RichText" );
+ if ( property.isNull() )
+ journal->setCustomProperty( "KNotes", "RichText", "true" );
+
+ mNoteList.insert( journal->uid(), new KNotesIconViewItem( mNotesView, journal ) );
+}
+
+void KNotesPart::killNote( KCal::Journal *journal )
+{
+ mNoteList.remove( journal->uid() );
+}
+
+void KNotesPart::editNote( QIconViewItem *item )
+{
+ if ( !mNoteEditDlg )
+ mNoteEditDlg = new KNoteEditDlg( widget() );
+
+ KCal::Journal *journal = static_cast<KNotesIconViewItem *>( item )->journal();
+
+ mNoteEditDlg->setRichText( journal->customProperty( "KNotes", "RichText" ) == "true" );
+ mNoteEditDlg->setTitle( journal->summary() );
+ mNoteEditDlg->setText( journal->description() );
+
+ if ( mNoteEditDlg->exec() == QDialog::Accepted ) {
+ item->setText( mNoteEditDlg->title() );
+ journal->setDescription( mNoteEditDlg->text() );
+ mManager->save();
+ }
+}
+
+void KNotesPart::renameNote()
+{
+ mNotesView->currentItem()->rename();
+}
+
+void KNotesPart::renamedNote( QIconViewItem* )
+{
+ mManager->save();
+}
+
+void KNotesPart::slotOnCurrentChanged( QIconViewItem* )
+{
+ KAction *renameAction = actionCollection()->action( "edit_rename" );
+ KAction *deleteAction = actionCollection()->action( "edit_delete" );
+
+ if ( !mNotesView->currentItem() ) {
+ renameAction->setEnabled( false );
+ deleteAction->setEnabled( false );
+ } else {
+ renameAction->setEnabled( true );
+ deleteAction->setEnabled( true );
+ }
+}
+
+#include "knotes_part.moc"
+#include "knotes_part_p.moc"
+
diff --git a/kontact/plugins/knotes/knotes_part.h b/kontact/plugins/knotes/knotes_part.h
new file mode 100644
index 000000000..c034d04fb
--- /dev/null
+++ b/kontact/plugins/knotes/knotes_part.h
@@ -0,0 +1,101 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+ Copyright (C) 2004-2006 Michael Brade <brade@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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KNOTES_PART_H
+#define KNOTES_PART_H
+
+#include <qdict.h>
+
+#include <kiconview.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+#include <libkcal/journal.h>
+#include <kparts/part.h>
+
+#include "knotes/KNotesIface.h"
+
+class KIconView;
+class QIconViewItem;
+class KNotesIconViewItem;
+class KNoteTip;
+class KNoteEditDlg;
+class KNotesResourceManager;
+
+namespace KCal {
+class Journal;
+}
+
+class KNotesPart : public KParts::ReadOnlyPart, virtual public KNotesIface
+{
+ Q_OBJECT
+
+ public:
+ KNotesPart( QObject *parent = 0, const char *name = 0 );
+ ~KNotesPart();
+
+ bool openFile();
+
+ public slots:
+ QString newNote( const QString& name = QString::null,
+ const QString& text = QString::null );
+ QString newNoteFromClipboard( const QString& name = QString::null );
+
+ public:
+ void killNote( const QString& id );
+ void killNote( const QString& id, bool force );
+
+ QString name( const QString& id ) const;
+ QString text( const QString& id ) const;
+
+ void setName( const QString& id, const QString& newName );
+ void setText( const QString& id, const QString& newText );
+
+ QMap<QString, QString> notes() const;
+
+ private slots:
+ void createNote( KCal::Journal *journal );
+ void killNote( KCal::Journal *journal );
+
+ void editNote( QIconViewItem *item );
+
+ void renameNote();
+ void renamedNote( QIconViewItem *item );
+
+ void slotOnItem( QIconViewItem *item );
+ void slotOnViewport();
+ void slotOnCurrentChanged( QIconViewItem *item );
+
+ void popupRMB( QIconViewItem *item, const QPoint& pos );
+ void killSelectedNotes();
+
+ void printSelectedNotes();
+
+ private:
+ KIconView *mNotesView;
+ KNoteTip *mNoteTip;
+ KNoteEditDlg *mNoteEditDlg;
+
+ KNotesResourceManager *mManager;
+ QDict<KNotesIconViewItem> mNoteList;
+};
+
+#endif
diff --git a/kontact/plugins/knotes/knotes_part.rc b/kontact/plugins/knotes/knotes_part.rc
new file mode 100644
index 000000000..ef4461868
--- /dev/null
+++ b/kontact/plugins/knotes/knotes_part.rc
@@ -0,0 +1,23 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="knotes" version="5">
+ <MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Merge/>
+ <Action name="print_note"/>
+ </Menu>
+ <Menu name="edit"><text>&amp;Edit</text>
+ <Action name="edit_rename"/>
+ <Action name="edit_delete"/>
+ </Menu>
+ </MenuBar>
+ <Menu name="note_context">
+ <Action name="file_new"/>
+ <Action name="edit_rename"/>
+ <Action name="edit_delete"/>
+ <Action name="print_note"/>
+ </Menu>
+ <Menu name="notepart_context">
+ <Action name="file_new"/>
+ </Menu>
+
+</kpartgui>
diff --git a/kontact/plugins/knotes/knotes_part_p.h b/kontact/plugins/knotes/knotes_part_p.h
new file mode 100644
index 000000000..55a0374b6
--- /dev/null
+++ b/kontact/plugins/knotes/knotes_part_p.h
@@ -0,0 +1,188 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2004-2006 Michael Brade <brade@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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef KNOTES_PART_P_H
+#define KNOTES_PART_P_H
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <kactioncollection.h>
+#include <klocale.h>
+#include <kiconview.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kiconeffect.h>
+#include <klineedit.h>
+#include <ktoolbar.h>
+#include <kpopupmenu.h>
+#include <kdialogbase.h>
+#include <kxmlguiclient.h>
+#include <kxmlguifactory.h>
+#include <kxmlguibuilder.h>
+
+#include <libkcal/calendarlocal.h>
+#include <libkcal/journal.h>
+#include <libkcal/icaldrag.h>
+#include <libkdepim/kpimprefs.h>
+
+#include "knotes/knoteedit.h"
+
+
+class KNotesIconViewItem : public KIconViewItem
+{
+ public:
+ KNotesIconViewItem( KIconView *parent, KCal::Journal *journal )
+ : KIconViewItem( parent ),
+ mJournal( journal )
+ {
+ setRenameEnabled( true );
+
+ KIconEffect effect;
+ QColor color( journal->customProperty( "KNotes", "BgColor" ) );
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "knotes", KIcon::Desktop );
+ icon = effect.apply( icon, KIconEffect::Colorize, 1, color, false );
+ setPixmap( icon );
+ setText( journal->summary() );
+ }
+
+ KCal::Journal *journal()
+ {
+ return mJournal;
+ }
+
+ virtual void setText( const QString& text )
+ {
+ KIconViewItem::setText( text );
+ mJournal->setSummary( text );
+ }
+
+ private:
+ KCal::Journal *mJournal;
+};
+
+
+class KNotesIconView : public KIconView
+{
+ protected:
+ QDragObject* dragObject()
+ {
+ QValueList<KNotesIconViewItem*> selectedItems;
+ for ( QIconViewItem *it = firstItem(); it; it = it->nextItem() ) {
+ if ( it->isSelected() )
+ selectedItems.append( static_cast<KNotesIconViewItem *>( it ) );
+ }
+ if ( selectedItems.count() != 1 )
+ return KIconView::dragObject();
+
+ KCal::CalendarLocal cal( KPimPrefs::timezone() );
+ KCal::Incidence *i = selectedItems.first()->journal()->clone();
+ cal.addIncidence( i );
+ KCal::ICalDrag *icd = new KCal::ICalDrag( &cal, this );
+ return icd;
+ }
+};
+
+
+class KNoteEditDlg : public KDialogBase, virtual public KXMLGUIClient
+{
+ Q_OBJECT
+
+ public:
+ KNoteEditDlg( QWidget *parent = 0, const char *name = 0 )
+ : KDialogBase( Plain, i18n( "Edit Note" ), Ok | Cancel, Ok,
+ parent, name, true, true )
+ {
+ // this dialog is modal to prevent one from editing the same note twice in two
+ // different windows
+
+ setInstance( new KInstance( "knotes" ) ); // TODO: hm, memleak??
+ setXMLFile( "knotesui.rc" );
+ actionCollection()->setWidget( this );
+
+ QWidget *page = plainPage();
+ QVBoxLayout *layout = new QVBoxLayout( page );
+
+ QHBoxLayout *hbl = new QHBoxLayout( layout, marginHint() );
+ QLabel *label = new QLabel( page);
+ label->setText( i18n( "Name:" ) );
+ hbl->addWidget( label,0 );
+ mTitleEdit= new KLineEdit( page, "name" );
+ hbl->addWidget( mTitleEdit, 1,Qt::AlignVCenter );
+
+ mNoteEdit = new KNoteEdit( actionCollection(), page );
+ mNoteEdit->setTextFormat( RichText );
+ mNoteEdit->setFocus();
+
+ KXMLGUIBuilder builder( page );
+ KXMLGUIFactory factory( &builder, this );
+ factory.addClient( this );
+
+ mTool = static_cast<KToolBar *>(factory.container( "note_tool", this ));
+
+ layout->addWidget( mTool );
+ layout->addWidget( mNoteEdit );
+ }
+
+ QString text() const
+ {
+ return mNoteEdit->text();
+ }
+
+ void setText( const QString& text )
+ {
+ mNoteEdit->setText( text );
+ }
+
+ QString title() const
+ {
+ return mTitleEdit->text();
+ }
+
+ void setTitle( const QString& text )
+ {
+ mTitleEdit->setText( text );
+ }
+
+ void setRichText( bool rt )
+ {
+ mNoteEdit->setTextFormat( rt ? RichText : PlainText );
+ }
+
+ private:
+ KLineEdit *mTitleEdit;
+ KNoteEdit *mNoteEdit;
+ KToolBar *mTool;
+ KPopupMenu *mEditMenu;
+};
+
+
+#endif
diff --git a/kontact/plugins/knotes/knotes_plugin.cpp b/kontact/plugins/knotes/knotes_plugin.cpp
new file mode 100644
index 000000000..beaaa6331
--- /dev/null
+++ b/kontact/plugins/knotes/knotes_plugin.cpp
@@ -0,0 +1,97 @@
+/*
+ This file is part of Kontact
+ Copyright (c) 2002 Daniel Molkentin <molkentin@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 <dcopref.h>
+#include <kaboutdata.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kstatusbar.h>
+
+#include "core.h"
+#include "knotes_part.h"
+#include "summarywidget.h"
+
+#include "knotes_plugin.h"
+
+
+typedef KGenericFactory< KNotesPlugin, Kontact::Core > KNotesPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_knotesplugin,
+ KNotesPluginFactory( "kontact_knotesplugin" ) )
+
+
+KNotesPlugin::KNotesPlugin( Kontact::Core *core, const char *, const QStringList & )
+ : Kontact::Plugin( core, core, "knotes" ),
+ mAboutData( 0 )
+{
+ setInstance( KNotesPluginFactory::instance() );
+
+ insertNewAction( new KAction( i18n( "New Note..." ), "knotes", CTRL+SHIFT+Key_N,
+ this, SLOT( slotNewNote() ), actionCollection(), "new_note" ) );
+ insertSyncAction( new KAction( i18n( "Synchronize Notes" ), "reload", 0,
+ this, SLOT( slotSyncNotes() ), actionCollection(), "knotes_sync" ) );
+}
+
+KNotesPlugin::~KNotesPlugin()
+{
+}
+
+KParts::ReadOnlyPart* KNotesPlugin::createPart()
+{
+ return new KNotesPart( this, "notes" );
+}
+
+Kontact::Summary *KNotesPlugin::createSummaryWidget( QWidget *parentWidget )
+{
+ return new KNotesSummaryWidget( this, parentWidget );
+}
+
+const KAboutData *KNotesPlugin::aboutData()
+{
+ if ( !mAboutData ) {
+ mAboutData = new KAboutData( "knotes", I18N_NOOP( "Notes Management" ),
+ "0.5", I18N_NOOP( "Notes Management" ),
+ KAboutData::License_GPL_V2,
+ "(c) 2003-2004 The Kontact developers" );
+ mAboutData->addAuthor( "Michael Brade", "Current Maintainer", "brade@kde.org" );
+ mAboutData->addAuthor( "Tobias Koenig", "", "tokoe@kde.org" );
+ }
+
+ return mAboutData;
+}
+
+
+// private slots
+
+void KNotesPlugin::slotNewNote()
+{
+ if ( part() )
+ static_cast<KNotesPart *>( part() )->newNote();
+}
+
+void KNotesPlugin::slotSyncNotes()
+{
+ DCOPRef ref( "kmail", "KMailICalIface" );
+ ref.send( "triggerSync", QString("Note") );
+}
+
+#include "knotes_plugin.moc"
+
diff --git a/kontact/plugins/knotes/knotes_plugin.h b/kontact/plugins/knotes/knotes_plugin.h
new file mode 100644
index 000000000..d4d58cb03
--- /dev/null
+++ b/kontact/plugins/knotes/knotes_plugin.h
@@ -0,0 +1,58 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Daniel Molkentin <molkentin@kde.org>
+ 2004 Michael Brade <brade@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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KNOTES_PLUGIN_H
+#define KNOTES_PLUGIN_H
+
+#include <klocale.h>
+
+#include "plugin.h"
+
+class KNotesPart;
+class SummaryWidget;
+
+
+class KNotesPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KNotesPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~KNotesPlugin();
+
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parentWidget );
+
+ int weight() const { return 600; }
+
+ const KAboutData *aboutData();
+
+ protected:
+ KParts::ReadOnlyPart* createPart();
+
+ private slots:
+ void slotNewNote();
+ void slotSyncNotes();
+
+ private:
+ KAboutData *mAboutData;
+};
+
+#endif
+
diff --git a/kontact/plugins/knotes/knotesplugin.desktop b/kontact/plugins/knotes/knotesplugin.desktop
new file mode 100644
index 000000000..e7fe8fc0c
--- /dev/null
+++ b/kontact/plugins/knotes/knotesplugin.desktop
@@ -0,0 +1,95 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_notes
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_knotesplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPluginHasSummary=true
+
+X-KDE-PluginInfo-Website=http://pim.kde.org/components/knotes.php
+X-KDE-PluginInfo-Name=kontact_knotesplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=LGPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Notes Component (KNotes Plugin)
+Comment[bg]=Приставка за бележки
+Comment[ca]=Component de notes (endollable del KNotes)
+Comment[da]=Notatkomponent (KNotes-plugin)
+Comment[de]=Notizen-Komponente (KNotes-Modul)
+Comment[el]=Συσταικό σημειώσεων (Πρόσθετο του KNotes)
+Comment[es]=Componente de notas (complemento de KNotes)
+Comment[et]=Märkmete plugin (KNotes)
+Comment[fr]=Composant de notes (Module KNotes)
+Comment[is]=Minnismiðaeining (KNotes íforrit)
+Comment[it]=Componente note (plugin KNotes)
+Comment[ja]=メモコンポーネント (KNotes プラグイン)
+Comment[km]=សមាសភាគ​ចំណាំ (កម្មវិធី​ជំនួយ KNotes​)
+Comment[nds]=Notizen-Komponent (KNotes-Moduul)
+Comment[nl]=Notitiecomponent (KNotes-plugin)
+Comment[pl]=Składnik notatek (wtyczka KNotes)
+Comment[ru]=Заметки (модуль KNotes)
+Comment[sr]=Компонента белешки (прикључак KNotes-а)
+Comment[sr@Latn]=Komponenta beleški (priključak KNotes-a)
+Comment[sv]=Anteckningskomponent (Knotes-insticksprogram)
+Comment[tr]=Notlar Bileşeni (KNotes Eklentisi)
+Comment[zh_CN]=便笺组件(KNotes 插件)
+Comment[zh_TW]=便條組件(KNotes 外掛程式)
+Name=Notes
+Name[af]=Notas
+Name[ar]=الملاحظات
+Name[be]=Нататкі
+Name[bg]=Бележки
+Name[br]=Notennoù
+Name[bs]=Bilješke
+Name[cs]=Poznámky
+Name[cy]=Nodiadau
+Name[da]=Noter
+Name[de]=Notizen
+Name[el]=Σημειώσεις
+Name[eo]=Notoj
+Name[es]=Notas
+Name[et]=Märkmed
+Name[eu]=Oharrak
+Name[fa]=یادداشتها
+Name[fi]=Muistio
+Name[fy]=Notysjes
+Name[ga]=Nótaí
+Name[gl]=Notas
+Name[he]=פתקים
+Name[hi]=टीप
+Name[hu]=Feljegyzések
+Name[is]=Minnismiðar
+Name[it]=Note
+Name[ja]=メモ
+Name[ka]=ჩანიშვნები
+Name[kk]=Жазбалар
+Name[km]=ចំណាំ
+Name[lt]=Užrašai
+Name[mk]=Белешки
+Name[ms]=Nota
+Name[nds]=Notizen
+Name[ne]=टिपोट
+Name[nl]=Notities
+Name[nn]=Notat
+Name[pl]=Notatki
+Name[pt]=Notas
+Name[pt_BR]=Notas
+Name[ro]=Notiţe
+Name[ru]=Заметки
+Name[se]=Nohtat
+Name[sk]=Poznámky
+Name[sl]=Notice
+Name[sr]=Белешке
+Name[sr@Latn]=Beleške
+Name[sv]=Anteckningar
+Name[ta]=குறிப்புகள்
+Name[tg]=Ахборот
+Name[th]=บันทึกช่วยจำ
+Name[tr]=Notlar
+Name[uk]=Примітки
+Name[uz]=Yozma xotira
+Name[uz@cyrillic]=Ёзма хотира
+Name[zh_CN]=便笺
+Name[zh_TW]=備忘錄
diff --git a/kontact/plugins/knotes/knotetip.cpp b/kontact/plugins/knotes/knotetip.cpp
new file mode 100644
index 000000000..6e2c998d7
--- /dev/null
+++ b/kontact/plugins/knotes/knotetip.cpp
@@ -0,0 +1,227 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2004 Michael Brade <brade@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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include <qtooltip.h>
+#include <qlayout.h>
+#include <qtextedit.h>
+
+#include <kapplication.h>
+#include <kglobalsettings.h>
+
+#include "knotetip.h"
+#include "knotes_part_p.h"
+
+
+KNoteTip::KNoteTip( KIconView *parent )
+ : QFrame( 0, 0, WX11BypassWM | // this will make Seli happy >:-P
+ WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WStyle_StaysOnTop ),
+ mFilter( false ),
+ mView( parent ),
+ mNoteIVI( 0 ),
+ mPreview( new QTextEdit( this ) )
+{
+ mPreview->setReadOnly( true );
+ mPreview->setHScrollBarMode( QScrollView::AlwaysOff );
+ mPreview->setVScrollBarMode( QScrollView::AlwaysOff );
+
+ QBoxLayout *layout = new QVBoxLayout( this );
+ layout->addWidget( mPreview );
+
+ setPalette( QToolTip::palette() );
+ setMargin( 1 );
+ setFrameStyle( QFrame::Plain | QFrame::Box );
+ hide();
+}
+
+KNoteTip::~KNoteTip()
+{
+ delete mPreview;
+ mPreview = 0;
+}
+
+void KNoteTip::setNote( KNotesIconViewItem *item )
+{
+ if ( mNoteIVI == item )
+ return;
+
+ mNoteIVI = item;
+
+ if ( !mNoteIVI ) {
+ killTimers();
+ if ( isVisible() ) {
+ setFilter( false );
+ hide();
+ }
+ } else {
+ KCal::Journal *journal = item->journal();
+ if ( journal->customProperty( "KNotes", "RichText" ) == "true" )
+ mPreview->setTextFormat( Qt::RichText );
+ else
+ mPreview->setTextFormat( Qt::PlainText );
+
+ QColor fg( journal->customProperty( "KNotes", "FgColor" ) );
+ QColor bg( journal->customProperty( "KNotes", "BgColor" ) );
+ setColor( fg, bg );
+
+ mPreview->setText( journal->description() );
+ mPreview->zoomTo( 8 );
+ mPreview->sync();
+
+ int w = 400;
+ int h = mPreview->heightForWidth( w );
+ while ( w > 60 && h == mPreview->heightForWidth( w - 20 ) )
+ w -= 20;
+
+ QRect desk = KGlobalSettings::desktopGeometry( mNoteIVI->rect().center() );
+ resize( w, QMIN( h, desk.height() / 2 - 20 ) );
+
+ hide();
+ killTimers();
+ setFilter( true );
+ startTimer( 600 ); // delay showing the tooltip for 0.7 sec
+ }
+}
+
+
+// protected, virtual methods
+
+void KNoteTip::resizeEvent( QResizeEvent *ev )
+{
+ QFrame::resizeEvent( ev );
+ reposition();
+}
+
+void KNoteTip::timerEvent( QTimerEvent * )
+{
+ killTimers();
+
+ if ( !isVisible() ) {
+ startTimer( 15000 ); // show the tooltip for 15 sec
+ reposition();
+ show();
+ } else {
+ setFilter( false );
+ hide();
+ }
+}
+
+bool KNoteTip::eventFilter( QObject *, QEvent *e )
+{
+ switch ( e->type() ) {
+ case QEvent::Leave:
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::KeyPress:
+ case QEvent::KeyRelease:
+ case QEvent::FocusIn:
+ case QEvent::FocusOut:
+ case QEvent::Wheel:
+ killTimers();
+ setFilter( false );
+ hide();
+ default:
+ break;
+ }
+
+ return false;
+}
+
+
+// private stuff
+
+void KNoteTip::setColor( const QColor &fg, const QColor &bg )
+{
+ QPalette newpalette = palette();
+ newpalette.setColor( QColorGroup::Background, bg );
+ newpalette.setColor( QColorGroup::Foreground, fg );
+ newpalette.setColor( QColorGroup::Base, bg ); // text background
+ newpalette.setColor( QColorGroup::Text, fg ); // text color
+ newpalette.setColor( QColorGroup::Button, bg );
+
+ // the shadow
+ newpalette.setColor( QColorGroup::Midlight, bg.light(110) );
+ newpalette.setColor( QColorGroup::Shadow, bg.dark(116) );
+ newpalette.setColor( QColorGroup::Light, bg.light(180) );
+ newpalette.setColor( QColorGroup::Dark, bg.dark(108) );
+ setPalette( newpalette );
+
+ // set the text color
+ mPreview->setColor( fg );
+}
+
+
+void KNoteTip::setFilter( bool enable )
+{
+ if ( enable == mFilter )
+ return;
+
+ if ( enable ) {
+ kapp->installEventFilter( this );
+ QApplication::setGlobalMouseTracking( true );
+ } else {
+ QApplication::setGlobalMouseTracking( false );
+ kapp->removeEventFilter( this );
+ }
+
+ mFilter = enable;
+}
+
+void KNoteTip::reposition()
+{
+ if ( !mNoteIVI )
+ return;
+
+ QRect rect = mNoteIVI->rect();
+ QPoint off = mView->mapToGlobal( mView->contentsToViewport( QPoint( 0, 0 ) ) );
+ rect.moveBy( off.x(), off.y() );
+
+ QPoint pos = rect.center();
+
+ // should the tooltip be shown to the left or to the right of the ivi?
+ QRect desk = KGlobalSettings::desktopGeometry( pos );
+ if ( rect.center().x() + width() > desk.right() ) {
+ // to the left
+ if ( pos.x() - width() < 0 )
+ pos.setX( 0 );
+ else
+ pos.setX( pos.x() - width() );
+ }
+
+ // should the tooltip be shown above or below the ivi ?
+ if ( rect.bottom() + height() > desk.bottom() ) {
+ // above
+ pos.setY( rect.top() - height() );
+ } else
+ pos.setY( rect.bottom() );
+
+ move( pos );
+ update();
+}
diff --git a/kontact/plugins/knotes/knotetip.h b/kontact/plugins/knotes/knotetip.h
new file mode 100644
index 000000000..f07b75f0c
--- /dev/null
+++ b/kontact/plugins/knotes/knotetip.h
@@ -0,0 +1,68 @@
+/*
+ This file is part of the KDE project
+ Copyright (C) 2004 Michael Brade <brade@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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#ifndef KNOTETIP_H
+#define KNOTETIP_H
+
+#include <qframe.h>
+
+class QTextEdit;
+class KIconView;
+class KNotesIconViewItem;
+
+class KNoteTip : public QFrame
+{
+ public:
+ KNoteTip( KIconView *parent );
+ ~KNoteTip();
+
+ void setNote( KNotesIconViewItem *item );
+
+ protected:
+ virtual bool eventFilter( QObject *, QEvent *e );
+ virtual void timerEvent( QTimerEvent * );
+ virtual void resizeEvent( QResizeEvent * );
+
+ private:
+ void setColor( const QColor &fg, const QColor &bg );
+ void setFilter( bool enable );
+ void reposition();
+
+ private:
+ bool mFilter;
+
+ KIconView *mView;
+ KNotesIconViewItem *mNoteIVI;
+
+ QTextEdit *mPreview;
+};
+
+#endif
diff --git a/kontact/plugins/knotes/summarywidget.cpp b/kontact/plugins/knotes/summarywidget.cpp
new file mode 100644
index 000000000..3045ede53
--- /dev/null
+++ b/kontact/plugins/knotes/summarywidget.cpp
@@ -0,0 +1,164 @@
+/*
+ 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 <qobject.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kurllabel.h>
+#include <kstandarddirs.h>
+
+#include <knotes/resourcenotes.h>
+#include <knotes/resourcemanager.h>
+
+#include "core.h"
+#include "plugin.h"
+
+#include "summarywidget.h"
+
+KNotesSummaryWidget::KNotesSummaryWidget( Kontact::Plugin *plugin,
+ QWidget *parent, const char *name )
+ : Kontact::Summary( parent, name ), mLayout( 0 ), mPlugin( plugin )
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout( this, 3, 3 );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kontact_notes",
+ KIcon::Desktop, KIcon::SizeMedium );
+ QWidget* header = createHeader( this, icon, i18n( "Notes" ) );
+ mainLayout->addWidget( header );
+
+ mLayout = new QGridLayout( mainLayout, 7, 3, 3 );
+ mLayout->setRowStretch( 6, 1 );
+
+ mCalendar = new KCal::CalendarLocal( QString::fromLatin1("UTC") );
+ KNotesResourceManager *manager = new KNotesResourceManager();
+
+ QObject::connect( manager, SIGNAL( sigRegisteredNote( KCal::Journal* ) ),
+ this, SLOT( addNote( KCal::Journal* ) ) );
+ QObject::connect( manager, SIGNAL( sigDeregisteredNote( KCal::Journal* ) ),
+ this, SLOT( removeNote( KCal::Journal* ) ) );
+ manager->load();
+
+
+ updateView();
+}
+
+void KNotesSummaryWidget::updateView()
+{
+ mNotes = mCalendar->journals();
+ QLabel *label;
+
+ for ( label = mLabels.first(); label; label = mLabels.next() )
+ label->deleteLater();
+ mLabels.clear();
+
+ KIconLoader loader( "knotes" );
+
+ int counter = 0;
+ QPixmap pm = loader.loadIcon( "knotes", KIcon::Small );
+
+ KCal::Journal::List::Iterator it;
+ if ( mNotes.count() ) {
+ for (it = mNotes.begin(); it != mNotes.end(); ++it) {
+
+ // Fill Note Pixmap Field
+ label = new QLabel( this );
+ label->setPixmap( pm );
+ label->setMaximumWidth( label->minimumSizeHint().width() );
+ label->setAlignment( AlignVCenter );
+ mLayout->addWidget( label, counter, 0 );
+ mLabels.append( label );
+
+ // File Note Summary Field
+ QString newtext = (*it)->summary();
+
+ KURLLabel *urlLabel = new KURLLabel( (*it)->uid(), newtext, this );
+ urlLabel->installEventFilter( this );
+ urlLabel->setTextFormat(RichText);
+ urlLabel->setAlignment( urlLabel->alignment() | Qt::WordBreak );
+ mLayout->addWidget( urlLabel, counter, 1 );
+ mLabels.append( urlLabel );
+
+ if ( !(*it)->description().isEmpty() ) {
+ QToolTip::add( urlLabel, (*it)->description().left( 80 ) );
+ }
+
+ connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( urlClicked( const QString& ) ) );
+ counter++;
+ }
+
+ } else {
+ QLabel *noNotes = new QLabel( i18n( "No Notes Available" ), this );
+ noNotes->setAlignment( AlignHCenter | AlignVCenter );
+ mLayout->addWidget( noNotes, 0, 1 );
+ mLabels.append( noNotes );
+ }
+
+ for ( label = mLabels.first(); label; label = mLabels.next() )
+ label->show();
+}
+
+void KNotesSummaryWidget::urlClicked( const QString &/*uid*/ )
+{
+ if ( !mPlugin->isRunningStandalone() )
+ mPlugin->core()->selectPlugin( mPlugin );
+ else
+ mPlugin->bringToForeground();
+}
+
+bool KNotesSummaryWidget::eventFilter( QObject *obj, QEvent* e )
+{
+ if ( obj->inherits( "KURLLabel" ) ) {
+ KURLLabel* label = static_cast<KURLLabel*>( obj );
+ if ( e->type() == QEvent::Enter )
+ emit message( i18n( "Read Note: \"%1\"" ).arg( label->text() ) );
+ if ( e->type() == QEvent::Leave )
+ emit message( QString::null );
+ }
+
+ return Kontact::Summary::eventFilter( obj, e );
+}
+
+void KNotesSummaryWidget::addNote( KCal::Journal *j )
+{
+ mCalendar->addJournal( j );
+ updateView();
+}
+
+void KNotesSummaryWidget::removeNote( KCal::Journal *j )
+{
+ mCalendar->deleteJournal( j );
+ updateView();
+}
+
+
+#include "summarywidget.moc"
diff --git a/kontact/plugins/knotes/summarywidget.h b/kontact/plugins/knotes/summarywidget.h
new file mode 100644
index 000000000..f21d829fa
--- /dev/null
+++ b/kontact/plugins/knotes/summarywidget.h
@@ -0,0 +1,71 @@
+/*
+ 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 "summary.h"
+
+#include <qmap.h>
+#include <qptrlist.h>
+#include <qwidget.h>
+
+#include <libkcal/resourcelocal.h>
+#include <libkcal/calendarresources.h>
+
+class QGridLayout;
+class QLabel;
+
+namespace Kontact {
+ class Plugin;
+}
+
+class KNotesSummaryWidget : public Kontact::Summary
+{
+ Q_OBJECT
+
+ public:
+ KNotesSummaryWidget( Kontact::Plugin *plugin, QWidget *parent, const char *name = 0 );
+
+ void updateSummary( bool force = false ) { Q_UNUSED( force ); updateView(); }
+
+ protected:
+ virtual bool eventFilter( QObject *obj, QEvent* e );
+
+ protected slots:
+ void urlClicked( const QString& );
+ void updateView();
+ void addNote( KCal::Journal* );
+ void removeNote( KCal::Journal* );
+
+ private:
+ KCal::CalendarLocal *mCalendar;
+ KCal::Journal::List mNotes;
+
+ QGridLayout *mLayout;
+
+ QPtrList<QLabel> mLabels;
+ Kontact::Plugin *mPlugin;
+};
+
+#endif
diff --git a/kontact/plugins/korganizer/Makefile.am b/kontact/plugins/korganizer/Makefile.am
new file mode 100644
index 000000000..a987e4941
--- /dev/null
+++ b/kontact/plugins/korganizer/Makefile.am
@@ -0,0 +1,58 @@
+# top_srcdir/korganizer is a hack, to get korganizeriface.h
+INCLUDES = -I$(top_srcdir)/kontact/interfaces \
+ -I$(top_srcdir)/libkdepim \
+ -I$(top_srcdir)/korganizer \
+ -I$(top_srcdir)/korganizer/interfaces \
+ -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_korganizerplugin.la \
+ libkontact_todoplugin.la \
+ libkontact_journalplugin.la \
+ kcm_korgsummary.la
+
+noinst_LTLIBRARIES = libcommon.la
+libcommon_la_SOURCES = korg_uniqueapp.cpp
+
+libkontact_korganizerplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_korganizerplugin_la_LIBADD = libcommon.la \
+ $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS) \
+ $(top_builddir)/korganizer/libkorganizer_calendar.la
+libkontact_korganizerplugin_la_SOURCES = korganizerplugin.cpp \
+ kcalendariface.stub \
+ summarywidget.cpp \
+ korganizeriface.stub
+
+korganizeriface_DIR = $(top_srcdir)/korganizer
+korganizeriface_DCOPIDLNG = true
+
+libkontact_todoplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_todoplugin_la_LIBADD = libcommon.la \
+ $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS) \
+ $(top_builddir)/korganizer/libkorganizer_calendar.la \
+ $(top_builddir)/korganizer/libkorganizer.la
+libkontact_todoplugin_la_SOURCES = todoplugin.cpp \
+ kcalendariface.stub \
+ todosummarywidget.cpp \
+ korganizeriface.stub
+
+libkontact_journalplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_journalplugin_la_LIBADD = libcommon.la \
+ $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS) \
+ $(top_builddir)/korganizer/libkorganizer_calendar.la
+libkontact_journalplugin_la_SOURCES = journalplugin.cpp kcalendariface.stub
+
+kcm_korgsummary_la_SOURCES = kcmkorgsummary.cpp
+kcm_korgsummary_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) \
+ $(all_libraries) \
+ -avoid-version -no-undefined
+kcm_korgsummary_la_LIBADD = $(LIB_KDEUI)
+
+METASOURCES = AUTO
+
+kcalendariface_DIR = $(top_srcdir)/korganizer
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = korganizerplugin.desktop todoplugin.desktop journalplugin.desktop
+
+kde_services_DATA = kcmkorgsummary.desktop
+
diff --git a/kontact/plugins/korganizer/journalplugin.cpp b/kontact/plugins/korganizer/journalplugin.cpp
new file mode 100644
index 000000000..178901b4c
--- /dev/null
+++ b/kontact/plugins/korganizer/journalplugin.cpp
@@ -0,0 +1,139 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2004 Allen Winter <winter@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 <qwidget.h>
+
+#include <kapplication.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <dcopclient.h>
+#include <dcopref.h>
+
+#include "core.h"
+#include "journalplugin.h"
+#include "korg_uniqueapp.h"
+
+
+typedef KGenericFactory< JournalPlugin, Kontact::Core > JournalPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_journalplugin,
+ JournalPluginFactory( "kontact_journalplugin" ) )
+
+JournalPlugin::JournalPlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "korganizer" ),
+ mIface( 0 )
+{
+ setInstance( JournalPluginFactory::instance() );
+ instance()->iconLoader()->addAppDir("kdepim");
+
+ insertNewAction( new KAction( i18n( "New Journal..." ), "newjournal",
+ CTRL+SHIFT+Key_J, this, SLOT( slotNewJournal() ), actionCollection(),
+ "new_journal" ) );
+ insertSyncAction( new KAction( i18n( "Synchronize Journal" ), "reload",
+ 0, this, SLOT( slotSyncJournal() ), actionCollection(),
+ "journal_sync" ) );
+
+
+ mUniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<KOrganizerUniqueAppHandler>(), this );
+}
+
+JournalPlugin::~JournalPlugin()
+{
+}
+
+KParts::ReadOnlyPart *JournalPlugin::createPart()
+{
+ KParts::ReadOnlyPart *part = loadPart();
+
+ if ( !part )
+ return 0;
+
+ dcopClient(); // ensure that we register to DCOP as "korganizer"
+ mIface = new KCalendarIface_stub( dcopClient(), "kontact", "CalendarIface" );
+
+ return part;
+}
+
+void JournalPlugin::select()
+{
+ interface()->showJournalView();
+}
+
+QStringList JournalPlugin::invisibleToolbarActions() const
+{
+ QStringList invisible;
+ invisible += "new_event";
+ invisible += "new_todo";
+ invisible += "new_journal";
+
+ invisible += "view_day";
+ invisible += "view_list";
+ invisible += "view_workweek";
+ invisible += "view_week";
+ invisible += "view_nextx";
+ invisible += "view_month";
+ invisible += "view_todo";
+ return invisible;
+}
+
+KCalendarIface_stub *JournalPlugin::interface()
+{
+ if ( !mIface ) {
+ part();
+ }
+ Q_ASSERT( mIface );
+ return mIface;
+}
+
+void JournalPlugin::slotNewJournal()
+{
+ interface()->openJournalEditor( "" );
+}
+
+void JournalPlugin::slotSyncJournal()
+{
+ DCOPRef ref( "kmail", "KMailICalIface" );
+ ref.send( "triggerSync", QString("Journal") );
+}
+
+bool JournalPlugin::createDCOPInterface( const QString& serviceType )
+{
+ kdDebug(5602) << k_funcinfo << serviceType << endl;
+ if ( serviceType == "DCOP/Organizer" || serviceType == "DCOP/Calendar" ) {
+ if ( part() )
+ return true;
+ }
+
+ return false;
+}
+
+bool JournalPlugin::isRunningStandalone()
+{
+ return mUniqueAppWatcher->isRunningStandalone();
+}
+
+#include "journalplugin.moc"
diff --git a/kontact/plugins/korganizer/journalplugin.desktop b/kontact/plugins/korganizer/journalplugin.desktop
new file mode 100644
index 000000000..8f33753ed
--- /dev/null
+++ b/kontact/plugins/korganizer/journalplugin.desktop
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_journal
+ServiceTypes=Kontact/Plugin
+
+X-KDE-Library=libkontact_journalplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkorganizerpart
+X-KDE-KontactPartExecutableName=korganizer
+X-KDE-KontactPluginHasSummary=false
+
+X-KDE-PluginInfo-Website=http://korganizer.kde.org
+X-KDE-PluginInfo-Name=kontact_journalplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Journal Component (KOrganizer Plugin)
+Comment[bg]=Приставка за KOrganizer
+Comment[ca]=Component de diari (endollable del KOrganizer)
+Comment[da]=Journalkomponent (KOrganizer-plugin)
+Comment[de]=Journal-Komponente (KOrganizer-Modul)
+Comment[el]=Συστατικό χρονικών (Πρόσθετο του KOrganizer)
+Comment[es]=Componente de diario (Complemento de KOrganizer)
+Comment[et]=Päevikuplugin (KOrganizer)
+Comment[fr]= Composant de journal (Module KOrganizer)
+Comment[is]=Dagbókareining (Journal KOrganizer íforrit)
+Comment[it]=Componente diario (plugin KOrganizer)
+Comment[ja]=ジャーナルコンポーネント (KOrganizer プラグイン)
+Comment[km]=សមាភាគទិនានុប្បវត្តិ (កម្មវិធី​ជំនួយ KOrganizer​)
+Comment[nds]=Daagböker-Komponent (KOrganizer-Moduul)
+Comment[nl]=Journaalcomponent (KOrganizer-plugin)
+Comment[pl]=Składnik dziennika (wtyczka Korganizer)
+Comment[ru]=Журнал (модуль KOrganizer)
+Comment[sr]=Компонента дневника (прикључак KOrganizer-а)
+Comment[sr@Latn]=Komponenta dnevnika (priključak KOrganizer-a)
+Comment[sv]=Journalkomponent (Korganizer-insticksprogram)
+Comment[tr]=Günlük Bileşeni (KOrganizer Eklentisi)
+Comment[zh_CN]=日记组件(KOrganizer 插件)
+Comment[zh_TW]=日誌組件(KOrganizer 外掛程式)
+Name=Journal
+Name[af]=Joernaal
+Name[ar]=اليومية
+Name[bg]=Дневник
+Name[br]=Deizlevr
+Name[ca]=Diari
+Name[cs]=Deník
+Name[cy]=Dyddlyfr
+Name[el]=Χρονικό
+Name[eo]=Ĵurnalo
+Name[es]=Diario
+Name[et]=Päevik
+Name[eu]=Egunkaria
+Name[fa]=نشریه
+Name[fi]=Päiväkirja
+Name[fy]=Journaal
+Name[ga]=Iris
+Name[gl]=Xornal
+Name[he]=יומן
+Name[hu]=Napló
+Name[is]=Dagbók
+Name[it]=Diario
+Name[ja]=ジャーナル
+Name[ka]=ჟურნალი
+Name[kk]=Күнделік
+Name[km]=ទិនានុប្បវត្តិ
+Name[lt]=Dienynas
+Name[ms]=Jurnal
+Name[nb]=Dagbok
+Name[nds]=Daagbook
+Name[ne]=जर्नल
+Name[nl]=Journaal
+Name[nn]=Dagbok
+Name[pl]=Dziennik
+Name[pt]=Diário
+Name[pt_BR]=Diário
+Name[ru]=Журнал
+Name[sk]=Žurnál
+Name[sl]=Dnevnik
+Name[sr]=Дневник
+Name[sr@Latn]=Dnevnik
+Name[ta]=பத்திரிகை
+Name[th]=วารสาร
+Name[tr]=Günlük
+Name[uk]=Журнал
+Name[uz]=Kundalik
+Name[uz@cyrillic]=Кундалик
+Name[zh_CN]=日记
+Name[zh_TW]=日誌
diff --git a/kontact/plugins/korganizer/journalplugin.h b/kontact/plugins/korganizer/journalplugin.h
new file mode 100644
index 000000000..668c2b289
--- /dev/null
+++ b/kontact/plugins/korganizer/journalplugin.h
@@ -0,0 +1,63 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2004 Allen Winter <winter@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 KONTACT_JOURNALPLUGIN_H
+#define KONTACT_JOURNALPLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "kcalendariface_stub.h"
+#include "plugin.h"
+#include "uniqueapphandler.h"
+
+class JournalPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+ public:
+ JournalPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~JournalPlugin();
+
+ virtual bool createDCOPInterface( const QString& serviceType );
+ virtual bool isRunningStandalone();
+ int weight() const { return 500; }
+
+ virtual QStringList invisibleToolbarActions() const;
+
+ void select();
+
+ KCalendarIface_stub *interface();
+
+ protected:
+ KParts::ReadOnlyPart *createPart();
+
+ private slots:
+ void slotNewJournal();
+ void slotSyncJournal();
+
+ private:
+ KCalendarIface_stub *mIface;
+ Kontact::UniqueAppWatcher *mUniqueAppWatcher;
+};
+
+#endif
diff --git a/kontact/plugins/korganizer/kcmkorgsummary.cpp b/kontact/plugins/korganizer/kcmkorgsummary.cpp
new file mode 100644
index 000000000..9ab0b6838
--- /dev/null
+++ b/kontact/plugins/korganizer/kcmkorgsummary.cpp
@@ -0,0 +1,200 @@
+/*
+ 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.
+*/
+
+#include <qbuttongroup.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kaccelmanager.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+
+#include "kcmkorgsummary.h"
+
+#include <kdepimmacros.h>
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_korgsummary( QWidget *parent, const char * )
+ {
+ return new KCMKOrgSummary( parent, "kcmkorgsummary" );
+ }
+}
+
+KCMKOrgSummary::KCMKOrgSummary( QWidget *parent, const char *name )
+ : KCModule( parent, name )
+{
+ initGUI();
+
+ customDaysChanged( 1 );
+
+ connect( mCalendarGroup, SIGNAL( clicked( int ) ), SLOT( modified() ) );
+ connect( mCalendarGroup, SIGNAL( clicked( int ) ), SLOT( buttonClicked( int ) ) );
+ connect( mTodoGroup, SIGNAL( clicked( int ) ), SLOT( modified() ) );
+ connect( mCustomDays, SIGNAL( valueChanged( int ) ), SLOT( modified() ) );
+ connect( mCustomDays, SIGNAL( valueChanged( int ) ), SLOT( customDaysChanged( int ) ) );
+
+ KAcceleratorManager::manage( this );
+
+ load();
+
+ KAboutData *about = new KAboutData( I18N_NOOP( "kcmkorgsummary" ),
+ I18N_NOOP( "Schedule Configuration Dialog" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c) 2003 - 2004 Tobias Koenig" ) );
+
+ about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" );
+ setAboutData( about );
+}
+
+void KCMKOrgSummary::modified()
+{
+ emit changed( true );
+}
+
+void KCMKOrgSummary::buttonClicked( int id )
+{
+ mCustomDays->setEnabled( id == 4 );
+}
+
+void KCMKOrgSummary::customDaysChanged( int value )
+{
+ mCustomDays->setSuffix( i18n( " day", " days", value ) );
+}
+
+void KCMKOrgSummary::initGUI()
+{
+ QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ mCalendarGroup = new QButtonGroup( 0, Vertical, i18n( "Appointments" ), this );
+ QVBoxLayout *boxLayout = new QVBoxLayout( mCalendarGroup->layout(),
+ KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "How many days should the calendar show at once?" ), mCalendarGroup );
+ boxLayout->addWidget( label );
+
+ QRadioButton *button = new QRadioButton( i18n( "One day" ), mCalendarGroup );
+ boxLayout->addWidget( button );
+
+ button = new QRadioButton( i18n( "Five days" ), mCalendarGroup );
+ boxLayout->addWidget( button );
+
+ button = new QRadioButton( i18n( "One week" ), mCalendarGroup );
+ boxLayout->addWidget( button );
+
+ button = new QRadioButton( i18n( "One month" ), mCalendarGroup );
+ boxLayout->addWidget( button );
+
+ QHBoxLayout *hbox = new QHBoxLayout( boxLayout, KDialog::spacingHint() );
+
+ button = new QRadioButton( "", mCalendarGroup );
+ hbox->addWidget( button );
+
+ mCustomDays = new QSpinBox( 1, 365, 1, mCalendarGroup );
+ mCustomDays->setEnabled( false );
+ hbox->addWidget( mCustomDays );
+
+ hbox->addStretch( 1 );
+
+ layout->addWidget( mCalendarGroup );
+
+ mTodoGroup = new QButtonGroup( 2, Horizontal, i18n( "To-dos" ), this );
+ new QRadioButton( i18n( "Show all to-dos" ), mTodoGroup );
+ new QRadioButton( i18n( "Show today's to-dos only" ), mTodoGroup );
+
+ layout->addWidget( mTodoGroup );
+
+ layout->addStretch();
+}
+
+void KCMKOrgSummary::load()
+{
+ KConfig config( "kcmkorgsummaryrc" );
+
+ config.setGroup( "Calendar" );
+ int days = config.readNumEntry( "DaysToShow", 1 );
+ if ( days == 1 )
+ mCalendarGroup->setButton( 0 );
+ else if ( days == 5 )
+ mCalendarGroup->setButton( 1 );
+ else if ( days == 7 )
+ mCalendarGroup->setButton( 2 );
+ else if ( days == 31 )
+ mCalendarGroup->setButton( 3 );
+ else {
+ mCalendarGroup->setButton( 4 );
+ mCustomDays->setValue( days );
+ mCustomDays->setEnabled( true );
+ }
+
+ config.setGroup( "Todo" );
+ bool allTodos = config.readBoolEntry( "ShowAllTodos", false );
+
+ if ( allTodos )
+ mTodoGroup->setButton( 0 );
+ else
+ mTodoGroup->setButton( 1 );
+
+ emit changed( false );
+}
+
+void KCMKOrgSummary::save()
+{
+ KConfig config( "kcmkorgsummaryrc" );
+
+ config.setGroup( "Calendar" );
+
+ int days;
+ switch ( mCalendarGroup->selectedId() ) {
+ case 0: days = 1; break;
+ case 1: days = 5; break;
+ case 2: days = 7; break;
+ case 3: days = 31; break;
+ case 4:
+ default: days = mCustomDays->value(); break;
+ }
+ config.writeEntry( "DaysToShow", days );
+
+ config.setGroup( "Todo" );
+ config.writeEntry( "ShowAllTodos", mTodoGroup->selectedId() == 0 );
+
+ config.sync();
+
+ emit changed( false );
+}
+
+void KCMKOrgSummary::defaults()
+{
+ mCalendarGroup->setButton( 0 );
+ mTodoGroup->setButton( 1 );
+
+ emit changed( true );
+}
+
+#include "kcmkorgsummary.moc"
diff --git a/kontact/plugins/korganizer/kcmkorgsummary.desktop b/kontact/plugins/korganizer/kcmkorgsummary.desktop
new file mode 100644
index 000000000..2f657852e
--- /dev/null
+++ b/kontact/plugins/korganizer/kcmkorgsummary.desktop
@@ -0,0 +1,125 @@
+[Desktop Entry]
+Icon=kontact_date
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=korgsummary
+X-KDE-FactoryName=korgsummary
+X-KDE-ParentApp=kontact_korganizerplugin,kontact_todoplugin
+X-KDE-ParentComponents=kontact_korganizerplugin,kontact_todoplugin
+X-KDE-CfgDlgHierarchy=KontactSummary
+
+Name=Appointment and To-do Overview
+Name[bg]=Преглед на срещи и задачи
+Name[ca]=Resum de cites i tasques pendents
+Name[da]=Oversigt over møder og gøremål
+Name[de]=Übersicht über Termine und Aufgaben
+Name[el]=Επισκόπηση ραντεβού και προς υλοποίηση εργασιών
+Name[es]=Resumen de citas y tareas pendientes
+Name[et]=Kohtumised ja ülesannete ülevaade
+Name[fr]=Aperçu des rendez-vous et des tâches
+Name[is]=Yfirlit um fundi og verkþætti
+Name[it]=Panoramica appuntamenti e cose da fare
+Name[ja]=約束と To-Do の要約
+Name[km]=ទិដ្ឋភាព​ការ​ណាត់ និង​ការងារ​ត្រូវ​ធ្វើ
+Name[nds]=Termin- un Opgaven-Översicht
+Name[nl]=Overzicht van evenementen en taken
+Name[pl]=Spotkania i zadania
+Name[ru]=Сводка встреч и задач
+Name[sr]=Преглед састанака и обавеза
+Name[sr@Latn]=Pregled sastanaka i obaveza
+Name[sv]=Översikt av möten och uppgifter
+Name[tr]=Randevulara ve Yapılacaklara Genel Bakış
+Name[zh_CN]=约会和待办概览
+Name[zh_TW]=約會與待辦事項概觀
+Comment=Appointments and To-dos Summary Setup
+Comment[af]=Afsprake en te-doen opsomming opstelling
+Comment[bg]=Приставка за обобщен преглед на срещите и задачите
+Comment[ca]=Configuració del resum de cites i tasques pendents
+Comment[cs]=Nastavení souhrnu schůzek a úkolů
+Comment[da]=Indstilling af oversigt over møder og gøremål
+Comment[de]=Einstellung der Übersicht über Termine und Aufgaben
+Comment[el]=Ρύθμιση ραντεβού και προς υλοποίηση εργασιών
+Comment[es]=Configuración del resumen de citas y de tareas pendientes
+Comment[et]=Kohtumiste ja ülesannete kokkuvõtte seadistus
+Comment[eu]=Hitzordu eta egitekoen laburpenen konfigurazioa
+Comment[fa]=برپایی خلاصۀ قرار ملاقاتها و کارهایی که باید انجام شوند
+Comment[fi]=Tapaamiset ja tehtävät -yhteenvedon asetukset
+Comment[fr]=Configuration du résumé des évènements et des tâches
+Comment[fy]=Oersichtsynstellings foar eveneminten en taken
+Comment[gl]=Configuración de sumarios de tarefas e notas
+Comment[hu]=A találkozók és feladatok áttekintőjének beállítása
+Comment[is]=Uppsetning á yfirliti yfir fundi og verkefni
+Comment[it]=Impostazioni sommario appuntamenti e cose da fare
+Comment[ja]=約束と To-Do の要約設定
+Comment[ka]=შეხვედრათა და გასაკეთებელთა რეზიუმეს დაყენება
+Comment[kk]=Кездесулер мен Жоспарлар тұжырымының баптау
+Comment[km]=រៀបចំ​សេចក្ដី​សង្ខេប​ការ​ណាត់ និង​ការងារ​ត្រូវ​ធ្វើ
+Comment[lt]=Susitikimų ir užduočių santraukos nustatymai
+Comment[mk]=Поставување на преглед за состаноци и задачи
+Comment[nb]=Oppsett av sammendraget av gjøremål og avtaler
+Comment[nds]=Termin- un Opgaven-Översicht instellen
+Comment[ne]=भेटघाट र गर्नुपर्ने कार्यहरूको सारांश सेटअप
+Comment[nl]=Overzichtsinstellingen voor evenementen en taken
+Comment[nn]=Oppsett av samandrag av avtalar og oppgåver
+Comment[pl]=Ustawienia podsumowania spotkań i zadań
+Comment[pt]=Configuração do Sumário de Compromissos e A-fazeres
+Comment[pt_BR]=Configuração do Resumo de Compromissos e Tarefas
+Comment[ru]=Настройка сводки встреч и задач
+Comment[sk]=Nastavenie súhrnu pripomienok a úloh
+Comment[sl]=Nastavitve povzetka sestankov in opravil
+Comment[sr]=Подешавање сажетка састанака и обавеза
+Comment[sr@Latn]=Podešavanje sažetka sastanaka i obaveza
+Comment[sv]=Inställning av översikt av möten och uppgifter
+Comment[tr]=Özel Günler ve Yapılacaklar Listesi Yapılandırması
+Comment[uk]=Налаштування зведення зустрічей і завдань
+Comment[zh_CN]=约会和待办摘要设置
+Comment[zh_TW]=約會與待辦事項摘要設定
+Keywords=calendar, todos, configure, settings
+Keywords[af]=calendar,todos,configure,settings
+Keywords[be]=каляндар, заданні, настроіць, настаўленні, calendar, todos, configure, settings
+Keywords[bg]=календар, задачи, организатор, calendar, todos, configure, settings
+Keywords[bs]=calendar, todos, configure, settings, kalendar, zadaci, postavke
+Keywords[ca]=calendari, pendents, configuració, arranjament
+Keywords[cs]=kalendář,úkoly,nastavit,nastavení
+Keywords[da]=kalender, gøremål, indstil, opsætning
+Keywords[de]=Kalender,Aufgaben,einstellen,Einstellungen,Einrichten
+Keywords[el]=ημερολόγιο, προς υλοποίηση, ρύθμιση, ρυθμίσεις
+Keywords[es]=calendario, tareas pendientes, configurar, opciones
+Keywords[et]=kalender, ülesanded, seadistamine, seadistused
+Keywords[eu]=egutegia, egitekoak, konfiguratu, ezarpenak
+Keywords[fa]=تقویم، کارهای انجامی، پیکربندی، تنظیمات
+Keywords[fi]=kalenteri, tehtävät, muokkaa, asetukset
+Keywords[fr]=calendrier,agenda,tâches,configurer,paramètres,paramètre
+Keywords[fy]=kalinder,aginda,taken,todo,ynstellings,konfiguraasje
+Keywords[ga]=féilire, tascanna, cumraigh, socruithe
+Keywords[gl]=calendario, pendentes, configurar, opcións
+Keywords[he]=calendar, todos, configure, settings, יומן, יומנים, משימות, מטלות, הגדרות, תצורה
+Keywords[hu]=naptár,feladatok,konfigurálás,beállítások
+Keywords[is]=dagatal, verkefni, stillingar, stilla
+Keywords[it]=calendario, cose da fare, configura, impostazioni
+Keywords[ja]=カレンダー, To-Do, 設定
+Keywords[ka]=კალენდარი,გასაკეთებლები,კონფიგურაცია,პარამეტრები
+Keywords[km]=ប្រតិទិន,ការងារ​ត្រូវ​ធ្វើ,កំណត់​រចនាសម្ព័ន្ធ,ការ​កំណត់
+Keywords[lt]=calendar, todos, configure, settings, kalendorius, darbai, konfigūruoti, nustatymai
+Keywords[ms]=kalendar, tugasan, konfigur, seting
+Keywords[nb]=kalender, gjørelister, oppsett, innstillinger
+Keywords[nds]=Kalenner,Opgaven,Opgaav,instellen,Mööt,Möten
+Keywords[ne]=क्यालेन्डर, गर्नुपर्ने कार्यहरू, कन्फिगर, सेटिङ
+Keywords[nl]=kalender,agenda,taken,todo,instellingen,configuratie
+Keywords[nn]=kalender,hugselister,oppsett,innstillingar
+Keywords[pl]=kalendarz,do zrobienia,konfiguracja,ustawienia
+Keywords[pt]=calendário, a fazer, configurar, configuração
+Keywords[pt_BR]=calendário, pendências, configurar, configurações
+Keywords[ru]=calendar,todos,configure,settings,настройка,календарь,задачи
+Keywords[sk]=kalendár,úlohy,nastavenie
+Keywords[sl]=koledar,za narediti,nastavitve,nastavi
+Keywords[sr]=calendar, todos, configure, settings, календар, послови, подеси, поставке
+Keywords[sr@Latn]=calendar, todos, configure, settings, kalendar, poslovi, podesi, postavke
+Keywords[sv]=kalender, uppgifter, anpassa, inställningar
+Keywords[ta]=நாள்காட்டி,செய்யவேண்டியவைகள்,கட்டமைப்பு,அமைவுகள்
+Keywords[tg]=calendar, todos, configure, settings,танзимот, тақвим,вазифа
+Keywords[tr]=takvim, yapılacaklar, yapılandır, yapılandırma
+Keywords[uk]=календар, завдання, налаштування, параметри
+Keywords[zh_CN]=calendar, todos, configure, settings, 日历, 待办事项, 配置, 设置
diff --git a/kontact/plugins/korganizer/kcmkorgsummary.h b/kontact/plugins/korganizer/kcmkorgsummary.h
new file mode 100644
index 000000000..cf484e56d
--- /dev/null
+++ b/kontact/plugins/korganizer/kcmkorgsummary.h
@@ -0,0 +1,56 @@
+/*
+ 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 KCMKORGSUMMARY_H
+#define KCMKORGSUMMARY_H
+
+#include <kcmodule.h>
+
+class QSpinxBox;
+class QButtonGroup;
+
+class KCMKOrgSummary : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMKOrgSummary( QWidget *parent = 0, const char *name = 0 );
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+ private slots:
+ void modified();
+ void buttonClicked( int );
+ void customDaysChanged( int );
+
+ private:
+ void initGUI();
+
+ QButtonGroup *mCalendarGroup;
+ QButtonGroup *mTodoGroup;
+ QSpinBox *mCustomDays;
+};
+
+#endif
diff --git a/kontact/plugins/korganizer/korg_uniqueapp.cpp b/kontact/plugins/korganizer/korg_uniqueapp.cpp
new file mode 100644
index 000000000..b70042353
--- /dev/null
+++ b/kontact/plugins/korganizer/korg_uniqueapp.cpp
@@ -0,0 +1,38 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2003 David Faure <faure@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 "korg_uniqueapp.h"
+#include <kdebug.h>
+#include "../../korganizer/korganizer_options.h"
+
+void KOrganizerUniqueAppHandler::loadCommandLineOptions()
+{
+ KCmdLineArgs::addCmdLineOptions( korganizer_options );
+}
+
+int KOrganizerUniqueAppHandler::newInstance()
+{
+ //kdDebug(5602) << k_funcinfo << endl;
+ // Ensure part is loaded
+ (void)plugin()->part();
+ // TODO handle command line options
+ return Kontact::UniqueAppHandler::newInstance();
+}
diff --git a/kontact/plugins/korganizer/korg_uniqueapp.h b/kontact/plugins/korganizer/korg_uniqueapp.h
new file mode 100644
index 000000000..d21f8c526
--- /dev/null
+++ b/kontact/plugins/korganizer/korg_uniqueapp.h
@@ -0,0 +1,37 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2003 David Faure <faure@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 KORG_UNIQUEAPP_H
+#define KORG_UNIQUEAPP_H
+
+#include <uniqueapphandler.h>
+
+class KOrganizerUniqueAppHandler : public Kontact::UniqueAppHandler
+{
+public:
+ KOrganizerUniqueAppHandler( Kontact::Plugin* plugin ) : Kontact::UniqueAppHandler( plugin ) {}
+ virtual void loadCommandLineOptions();
+ virtual int newInstance();
+};
+
+
+#endif /* KORG_UNIQUEAPP_H */
+
diff --git a/kontact/plugins/korganizer/korganizerplugin.cpp b/kontact/plugins/korganizer/korganizerplugin.cpp
new file mode 100644
index 000000000..7aef2e6e0
--- /dev/null
+++ b/kontact/plugins/korganizer/korganizerplugin.cpp
@@ -0,0 +1,227 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 <qcursor.h>
+#include <qfile.h>
+#include <qwidget.h>
+#include <qdragobject.h>
+
+#include <kapplication.h>
+#include <kabc/vcardconverter.h>
+#include <kaction.h>
+#include <dcopref.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <ktempfile.h>
+
+#include <dcopclient.h>
+
+#include <libkdepim/kvcarddrag.h>
+#include <libkdepim/maillistdrag.h>
+
+#include "core.h"
+#include "summarywidget.h"
+#include "korganizerplugin.h"
+#include "korg_uniqueapp.h"
+
+typedef KGenericFactory< KOrganizerPlugin, Kontact::Core > KOrganizerPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_korganizerplugin,
+ KOrganizerPluginFactory( "kontact_korganizerplugin" ) )
+
+KOrganizerPlugin::KOrganizerPlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "korganizer" ),
+ mIface( 0 )
+{
+
+ setInstance( KOrganizerPluginFactory::instance() );
+ instance()->iconLoader()->addAppDir("kdepim");
+
+ insertNewAction( new KAction( i18n( "New Event..." ), "newappointment",
+ CTRL+SHIFT+Key_E, this, SLOT( slotNewEvent() ), actionCollection(),
+ "new_event" ) );
+
+ insertSyncAction( new KAction( i18n( "Synchronize Calendar" ), "reload",
+ 0, this, SLOT( slotSyncEvents() ), actionCollection(),
+ "korganizer_sync" ) );
+
+ mUniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<KOrganizerUniqueAppHandler>(), this );
+}
+
+KOrganizerPlugin::~KOrganizerPlugin()
+{
+}
+
+Kontact::Summary *KOrganizerPlugin::createSummaryWidget( QWidget *parent )
+{
+ return new SummaryWidget( this, parent );
+}
+
+KParts::ReadOnlyPart *KOrganizerPlugin::createPart()
+{
+ KParts::ReadOnlyPart *part = loadPart();
+
+ if ( !part )
+ return 0;
+
+ mIface = new KCalendarIface_stub( dcopClient(), "kontact", "CalendarIface" );
+
+ return part;
+}
+
+QString KOrganizerPlugin::tipFile() const
+{
+ QString file = ::locate("data", "korganizer/tips");
+ return file;
+}
+
+QStringList KOrganizerPlugin::invisibleToolbarActions() const
+{
+ QStringList invisible;
+ invisible += "new_event";
+ invisible += "new_todo";
+ invisible += "new_journal";
+
+ invisible += "view_todo";
+ invisible += "view_journal";
+ return invisible;
+}
+
+void KOrganizerPlugin::select()
+{
+ interface()->showEventView();
+}
+
+KCalendarIface_stub *KOrganizerPlugin::interface()
+{
+ if ( !mIface ) {
+ part();
+ }
+ Q_ASSERT( mIface );
+ return mIface;
+}
+
+void KOrganizerPlugin::slotNewEvent()
+{
+ interface()->openEventEditor( "" );
+}
+
+void KOrganizerPlugin::slotSyncEvents()
+{
+ DCOPRef ref( "kmail", "KMailICalIface" );
+ ref.send( "triggerSync", QString("Calendar") );
+}
+
+bool KOrganizerPlugin::createDCOPInterface( const QString& serviceType )
+{
+ kdDebug(5602) << k_funcinfo << serviceType << endl;
+ if ( serviceType == "DCOP/Organizer" || serviceType == "DCOP/Calendar" ) {
+ if ( part() )
+ return true;
+ }
+
+ return false;
+}
+
+bool KOrganizerPlugin::isRunningStandalone()
+{
+ return mUniqueAppWatcher->isRunningStandalone();
+}
+
+bool KOrganizerPlugin::canDecodeDrag( QMimeSource *mimeSource )
+{
+ return QTextDrag::canDecode( mimeSource ) ||
+ KPIM::MailListDrag::canDecode( mimeSource );
+}
+
+void KOrganizerPlugin::processDropEvent( QDropEvent *event )
+{
+ QString text;
+
+ KABC::VCardConverter converter;
+ if ( KVCardDrag::canDecode( event ) && KVCardDrag::decode( event, text ) ) {
+ KABC::Addressee::List contacts = converter.parseVCards( text );
+ KABC::Addressee::List::Iterator it;
+
+ QStringList attendees;
+ for ( it = contacts.begin(); it != contacts.end(); ++it ) {
+ QString email = (*it).fullEmail();
+ if ( email.isEmpty() )
+ attendees.append( (*it).realName() + "<>" );
+ else
+ attendees.append( email );
+ }
+
+ interface()->openEventEditor( i18n( "Meeting" ), QString::null, QString::null,
+ attendees );
+ return;
+ }
+
+ if ( QTextDrag::decode( event, text ) ) {
+ kdDebug(5602) << "DROP:" << text << endl;
+ interface()->openEventEditor( text );
+ return;
+ }
+
+ KPIM::MailList mails;
+ if ( KPIM::MailListDrag::decode( event, mails ) ) {
+ if ( mails.count() != 1 ) {
+ KMessageBox::sorry( core(),
+ i18n("Drops of multiple mails are not supported." ) );
+ } else {
+ KPIM::MailSummary mail = mails.first();
+ QString txt = i18n("From: %1\nTo: %2\nSubject: %3").arg( mail.from() )
+ .arg( mail.to() ).arg( mail.subject() );
+
+ KTempFile tf;
+ tf.setAutoDelete( true );
+ QString uri = QString::fromLatin1("kmail:") + QString::number( mail.serialNumber() );
+ tf.file()->writeBlock( event->encodedData( "message/rfc822" ) );
+ tf.close();
+ interface()->openEventEditor( i18n("Mail: %1").arg( mail.subject() ), txt,
+ uri, tf.name(), QStringList(), "message/rfc822" );
+ }
+ return;
+ }
+
+ KMessageBox::sorry( core(), i18n("Cannot handle drop events of type '%1'.")
+ .arg( event->format() ) );
+}
+
+void KOrganizerPlugin::loadProfile( const QString& directory )
+{
+ DCOPRef ref( "korganizer", "KOrganizerIface" );
+ ref.send( "loadProfile", directory );
+}
+
+void KOrganizerPlugin::saveToProfile( const QString& directory ) const
+{
+ DCOPRef ref( "korganizer", "KOrganizerIface" );
+ ref.send( "saveToProfile", directory );
+}
+
+#include "korganizerplugin.moc"
diff --git a/kontact/plugins/korganizer/korganizerplugin.desktop b/kontact/plugins/korganizer/korganizerplugin.desktop
new file mode 100644
index 000000000..7a29913c1
--- /dev/null
+++ b/kontact/plugins/korganizer/korganizerplugin.desktop
@@ -0,0 +1,101 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_date
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_korganizerplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkorganizerpart
+X-KDE-KontactPartExecutableName=korganizer
+X-KDE-KontactPluginHasSummary=true
+
+X-KDE-PluginInfo-Website=http://korganizer.kde.org
+X-KDE-PluginInfo-Name=kontact_korganizerplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Calendar Component (KOrganizer Plugin)
+Comment[bg]=Приставка за KOrganizer
+Comment[ca]=Component de calendari (endollable del KOrganizer)
+Comment[da]=Kalenderkomponent (KOrganizer-plugin)
+Comment[de]=Kalender-Komponente (KOrganizer-Modul)
+Comment[el]=Συστατικό ημερολογίου (Πρόσθετο του KOrganizer)
+Comment[es]=Componente de calendario (complemento de KOrganizer)
+Comment[et]=Kalendriplugin (KOrganizer)
+Comment[fr]= Composant de calendrier (Module KOrganizer)
+Comment[is]=Dagatalseining (KOrganizer íforrit)
+Comment[it]=Componente calendario (plugin KOrganizer)
+Comment[ja]=カレンダーコンポーネント (KOrganizer プラグイン)
+Comment[km]=សមាសភាគ​ប្រតិទិន (កម្មវិធីជំនួយ​ KOrganizer​)
+Comment[nds]=Kalenner-Komponent (KOrganizer-Moduul)
+Comment[nl]=Agendacomponent (KOrganizer-plugin)
+Comment[pl]=Składnik kalendarza (wtyczka KOrganizer)
+Comment[ru]=Календарь (модуль KOrganizer)
+Comment[sk]=Kalendárový komponent (Modeul pre KOrganizer)
+Comment[sr]=Компонента календара (прикључак KOrganizer-а)
+Comment[sr@Latn]=Komponenta kalendara (priključak KOrganizer-a)
+Comment[sv]=Kalenderkomponent (Korganizer-insticksprogram)
+Comment[tr]=Takvim Bileşeni (KOrganizer Eklentisi)
+Comment[zh_CN]=日历组件(KOrganizer 插件)
+Comment[zh_TW]=行事曆組件(KOrganizer 外掛程式)
+Name=Calendar
+Name[af]=Kalender
+Name[ar]=التقويم
+Name[be]=Каляндар
+Name[bg]=Календар
+Name[br]=Deiziadur
+Name[bs]=Kalendar
+Name[ca]=Calendari
+Name[cs]=Kalendář
+Name[cy]=Calendr
+Name[da]=Kalender
+Name[de]=Kalender
+Name[el]=Ημερολόγιο
+Name[eo]=Kalendaro
+Name[es]=Calendario
+Name[et]=Kalender
+Name[eu]=Egutegia
+Name[fa]=تقویم
+Name[fi]=Kalenteri
+Name[fr]=Calendrier
+Name[fy]=Aginda
+Name[ga]=Féilire
+Name[gl]=Calendario
+Name[he]=לוח שנה
+Name[hi]=कैलेन्डर
+Name[hu]=Naptár
+Name[is]=Dagatal
+Name[it]=Calendario
+Name[ja]=カレンダー
+Name[ka]=კალენდარი
+Name[kk]=Күнтізбе
+Name[km]=ប្រតិទិន
+Name[lt]=Kalendorius
+Name[mk]=Календар
+Name[ms]=Kalendar
+Name[nb]=Kalender
+Name[nds]=Kalenner
+Name[ne]=क्यालेन्डर
+Name[nl]=Agenda
+Name[nn]=Kalender
+Name[pa]=ਕੈਲੰਡਰ
+Name[pl]=Kalendarz
+Name[pt]=Calendário
+Name[pt_BR]=Calendário
+Name[ru]=Календарь
+Name[se]=Kaleandar
+Name[sk]=Kalendár
+Name[sl]=Koledar
+Name[sr]=Календар
+Name[sr@Latn]=Kalendar
+Name[sv]=Kalender
+Name[ta]=நாள்காட்டி
+Name[tg]=Тақвим
+Name[th]=บันทึกประจำวัน
+Name[tr]=Takvim
+Name[uk]=Календар
+Name[uz]=Kalendar
+Name[uz@cyrillic]=Календар
+Name[zh_CN]=日历
+Name[zh_TW]=行事曆
diff --git a/kontact/plugins/korganizer/korganizerplugin.h b/kontact/plugins/korganizer/korganizerplugin.h
new file mode 100644
index 000000000..df8259961
--- /dev/null
+++ b/kontact/plugins/korganizer/korganizerplugin.h
@@ -0,0 +1,75 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 KORGANIZER_PLUGIN_H
+#define KORGANIZER_PLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "kcalendariface_stub.h"
+#include "plugin.h"
+#include "uniqueapphandler.h"
+
+class KOrganizerPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ KOrganizerPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~KOrganizerPlugin();
+
+ virtual bool createDCOPInterface( const QString& serviceType );
+ virtual bool isRunningStandalone();
+ int weight() const { return 400; }
+
+ bool canDecodeDrag( QMimeSource * );
+ void processDropEvent( QDropEvent * );
+
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parent );
+
+ virtual QString tipFile() const;
+ virtual QStringList invisibleToolbarActions() const;
+
+ void select();
+
+ KCalendarIface_stub *interface();
+
+
+ void loadProfile( const QString& path );
+ void saveToProfile( const QString& path ) const;
+
+ protected:
+ KParts::ReadOnlyPart *createPart();
+
+ private slots:
+ void slotNewEvent();
+ void slotSyncEvents();
+
+ private:
+ KCalendarIface_stub *mIface;
+ Kontact::UniqueAppWatcher *mUniqueAppWatcher;
+};
+
+#endif
diff --git a/kontact/plugins/korganizer/summarywidget.cpp b/kontact/plugins/korganizer/summarywidget.cpp
new file mode 100644
index 000000000..68742248f
--- /dev/null
+++ b/kontact/plugins/korganizer/summarywidget.cpp
@@ -0,0 +1,313 @@
+/*
+ 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 <qcursor.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kparts/part.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kurllabel.h>
+#include <libkcal/event.h>
+#include <libkcal/resourcecalendar.h>
+#include <libkcal/resourcelocal.h>
+#include <libkcal/incidenceformatter.h>
+#include <libkdepim/kpimprefs.h>
+
+#include "korganizeriface_stub.h"
+
+#include "core.h"
+#include "plugin.h"
+#include "korganizerplugin.h"
+
+#include "korganizer/stdcalendar.h"
+
+#include "summarywidget.h"
+
+SummaryWidget::SummaryWidget( KOrganizerPlugin *plugin, QWidget *parent,
+ const char *name )
+ : Kontact::Summary( parent, name ), mPlugin( plugin ), mCalendar( 0 )
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout( this, 3, 3 );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kontact_date",
+ KIcon::Desktop, KIcon::SizeMedium );
+ QWidget *header = createHeader( this, icon, i18n( "Calendar" ) );
+ mainLayout->addWidget( header );
+
+ mLayout = new QGridLayout( mainLayout, 7, 5, 3 );
+ mLayout->setRowStretch( 6, 1 );
+
+ mCalendar = KOrg::StdCalendar::self();
+ mCalendar->load();
+
+ connect( mCalendar, SIGNAL( calendarChanged() ), SLOT( updateView() ) );
+ connect( mPlugin->core(), SIGNAL( dayChanged( const QDate& ) ),
+ SLOT( updateView() ) );
+
+ updateView();
+}
+
+SummaryWidget::~SummaryWidget()
+{
+}
+
+void SummaryWidget::updateView()
+{
+ mLabels.setAutoDelete( true );
+ mLabels.clear();
+ mLabels.setAutoDelete( false );
+
+ KIconLoader loader( "kdepim" );
+
+ KConfig config( "kcmkorgsummaryrc" );
+
+ config.setGroup( "Calendar" );
+ int days = config.readNumEntry( "DaysToShow", 1 );
+
+ QLabel *label = 0;
+ int counter = 0;
+ QPixmap pm = loader.loadIcon( "appointment", KIcon::Small );
+
+ QDate dt;
+ QDate currentDate = QDate::currentDate();
+ for ( dt=currentDate;
+ dt<=currentDate.addDays( days - 1 );
+ dt=dt.addDays(1) ) {
+
+ KCal::Event *ev;
+
+ KCal::Event::List events_orig = mCalendar->events( dt );
+ KCal::Event::List::ConstIterator it = events_orig.begin();
+
+ KCal::Event::List events;
+ events.setAutoDelete( true );
+ QDateTime qdt;
+
+ // prevent implicitely sharing while finding recurring events
+ // replacing the QDate with the currentDate
+ for ( ; it != events_orig.end(); ++it ) {
+ ev = (*it)->clone();
+ if ( ev->recursOn( dt ) ) {
+ qdt = ev->dtStart();
+ qdt.setDate( dt );
+ ev->setDtStart( qdt );
+ }
+ events.append( ev );
+ }
+
+ // sort the events for this date by summary
+ events = KCal::Calendar::sortEvents( &events,
+ KCal::EventSortSummary,
+ KCal::SortDirectionAscending );
+ // sort the events for this date by start date
+ events = KCal::Calendar::sortEvents( &events,
+ KCal::EventSortStartDate,
+ KCal::SortDirectionAscending );
+
+ for ( it=events.begin(); it!=events.end(); ++it ) {
+ ev = *it;
+
+ // Count number of days remaining in multiday event
+ int span=1; int dayof=1;
+ if ( ev->isMultiDay() ) {
+ QDate d = ev->dtStart().date();
+ if ( d < currentDate ) {
+ d = currentDate;
+ }
+ while ( d < ev->dtEnd().date() ) {
+ if ( d < dt ) {
+ dayof++;
+ }
+ span++;
+ d=d.addDays( 1 );
+ }
+ }
+
+ // If this date is part of a floating, multiday event, then we
+ // only make a print for the first day of the event.
+ if ( ev->isMultiDay() && ev->doesFloat() && dayof != 1 ) continue;
+
+ // Fill Appointment Pixmap Field
+ label = new QLabel( this );
+ label->setPixmap( pm );
+ label->setMaximumWidth( label->minimumSizeHint().width() );
+ label->setAlignment( AlignVCenter );
+ mLayout->addWidget( label, counter, 0 );
+ mLabels.append( label );
+
+ // Fill Event Date Field
+ bool makeBold = false;
+ QString datestr;
+
+ // Modify event date for printing
+ QDate sD = QDate::QDate( dt.year(), dt.month(), dt.day() );
+ if ( ( sD.month() == currentDate.month() ) &&
+ ( sD.day() == currentDate.day() ) ) {
+ datestr = i18n( "Today" );
+ makeBold = true;
+ } else if ( ( sD.month() == currentDate.addDays( 1 ).month() ) &&
+ ( sD.day() == currentDate.addDays( 1 ).day() ) ) {
+ datestr = i18n( "Tomorrow" );
+ } else {
+ datestr = KGlobal::locale()->formatDate( sD );
+ }
+
+ // Print the date span for multiday, floating events, for the
+ // first day of the event only.
+ if ( ev->isMultiDay() && ev->doesFloat() && dayof == 1 && span > 1 ) {
+ datestr = KGlobal::locale()->formatDate( ev->dtStart().date() );
+ datestr += " -\n " +
+ KGlobal::locale()->formatDate( sD.addDays( span-1 ) );
+ }
+
+ label = new QLabel( datestr, this );
+ label->setAlignment( AlignLeft | AlignVCenter );
+ if ( makeBold ) {
+ QFont font = label->font();
+ font.setBold( true );
+ label->setFont( font );
+ }
+ mLayout->addWidget( label, counter, 1 );
+ mLabels.append( label );
+
+ // Fill Event Summary Field
+ QString newtext = ev->summary();
+ if ( ev->isMultiDay() && !ev->doesFloat() ) {
+ newtext.append( QString(" (%1/%2)").arg( dayof ).arg( span ) );
+ }
+
+ KURLLabel *urlLabel = new KURLLabel( this );
+ urlLabel->setText( newtext );
+ urlLabel->setURL( ev->uid() );
+ urlLabel->installEventFilter( this );
+ urlLabel->setAlignment( urlLabel->alignment() | Qt::WordBreak );
+ mLayout->addWidget( urlLabel, counter, 2 );
+ mLabels.append( urlLabel );
+
+ connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( viewEvent( const QString& ) ) );
+ connect( urlLabel, SIGNAL( rightClickedURL( const QString& ) ),
+ this, SLOT( popupMenu( const QString& ) ) );
+
+ QString tipText( KCal::IncidenceFormatter::toolTipString( ev, true ) );
+ if ( !tipText.isEmpty() ) {
+ QToolTip::add( urlLabel, tipText );
+ }
+
+ // Fill Event Time Range Field (only for non-floating Events)
+ if ( !ev->doesFloat() ) {
+ QTime sST = ev->dtStart().time();
+ QTime sET = ev->dtEnd().time();
+ if ( ev->isMultiDay() ) {
+ if ( ev->dtStart().date() < dt ) {
+ sST = QTime::QTime( 0, 0 );
+ }
+ if ( ev->dtEnd().date() > dt ) {
+ sET = QTime::QTime( 23, 59 );
+ }
+ }
+ datestr = i18n( "Time from - to", "%1 - %2" )
+ .arg( KGlobal::locale()->formatTime( sST ) )
+ .arg( KGlobal::locale()->formatTime( sET ) );
+ label = new QLabel( datestr, this );
+ label->setAlignment( AlignLeft | AlignVCenter );
+ mLayout->addWidget( label, counter, 3 );
+ mLabels.append( label );
+ }
+
+ counter++;
+ }
+ }
+
+ if ( !counter ) {
+ QLabel *noEvents = new QLabel(
+ i18n( "No appointments pending within the next day",
+ "No appointments pending within the next %n days",
+ days ), this, "nothing to see" );
+ noEvents->setAlignment( AlignHCenter | AlignVCenter );
+ mLayout->addWidget( noEvents, 0, 2 );
+ mLabels.append( noEvents );
+ }
+
+ for ( label = mLabels.first(); label; label = mLabels.next() )
+ label->show();
+}
+
+void SummaryWidget::viewEvent( const QString &uid )
+{
+ mPlugin->core()->selectPlugin( "kontact_korganizerplugin" ); //ensure loaded
+ KOrganizerIface_stub iface( "korganizer", "KOrganizerIface" );
+ iface.editIncidence( uid );
+}
+
+void SummaryWidget::removeEvent( const QString &uid )
+{
+ mPlugin->core()->selectPlugin( "kontact_korganizerplugin" ); //ensure loaded
+ KOrganizerIface_stub iface( "korganizer", "KOrganizerIface" );
+ iface.deleteIncidence( uid, false );
+}
+
+void SummaryWidget::popupMenu( const QString &uid )
+{
+ KPopupMenu popup( this );
+ QToolTip::remove( this );
+ popup.insertItem( i18n( "&Edit Appointment..." ), 0 );
+ popup.insertItem( KGlobal::iconLoader()->loadIcon( "editdelete", KIcon::Small),
+ i18n( "&Delete Appointment" ), 1 );
+
+ switch ( popup.exec( QCursor::pos() ) ) {
+ case 0:
+ viewEvent( uid );
+ break;
+ case 1:
+ removeEvent( uid );
+ break;
+ }
+}
+
+bool SummaryWidget::eventFilter( QObject *obj, QEvent* e )
+{
+ if ( obj->inherits( "KURLLabel" ) ) {
+ KURLLabel* label = static_cast<KURLLabel*>( obj );
+ if ( e->type() == QEvent::Enter )
+ emit message( i18n( "Edit Appointment: \"%1\"" ).arg( label->text() ) );
+ if ( e->type() == QEvent::Leave )
+ emit message( QString::null );
+ }
+
+ return Kontact::Summary::eventFilter( obj, e );
+}
+
+QStringList SummaryWidget::configModules() const
+{
+ return QStringList( "kcmkorgsummary.desktop" );
+}
+
+#include "summarywidget.moc"
diff --git a/kontact/plugins/korganizer/summarywidget.h b/kontact/plugins/korganizer/summarywidget.h
new file mode 100644
index 000000000..c9c572eca
--- /dev/null
+++ b/kontact/plugins/korganizer/summarywidget.h
@@ -0,0 +1,70 @@
+/*
+ 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 <qptrlist.h>
+#include <qwidget.h>
+
+#include <libkcal/calendarresources.h>
+
+#include "summary.h"
+
+class QGridLayout;
+class QLabel;
+
+class KOrganizerPlugin;
+
+class SummaryWidget : public Kontact::Summary
+{
+ Q_OBJECT
+
+ public:
+ SummaryWidget( KOrganizerPlugin *plugin, QWidget *parent,
+ const char *name = 0 );
+ ~SummaryWidget();
+
+ int summaryHeight() const { return 3; }
+ QStringList configModules() const;
+ public slots:
+ void updateSummary( bool force = false ) { Q_UNUSED( force ); updateView(); }
+
+ protected:
+ virtual bool eventFilter( QObject *obj, QEvent* e );
+
+ private slots:
+ void updateView();
+ void popupMenu( const QString &uid );
+ void viewEvent( const QString &uid );
+ void removeEvent( const QString &uid );
+
+ private:
+ KOrganizerPlugin *mPlugin;
+ QGridLayout *mLayout;
+
+ QPtrList<QLabel> mLabels;
+ KCal::CalendarResources *mCalendar;
+};
+
+#endif
diff --git a/kontact/plugins/korganizer/todoplugin.cpp b/kontact/plugins/korganizer/todoplugin.cpp
new file mode 100644
index 000000000..4cb281b84
--- /dev/null
+++ b/kontact/plugins/korganizer/todoplugin.cpp
@@ -0,0 +1,230 @@
+/*
+ This file is part of Kontact.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@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 <qwidget.h>
+#include <qdragobject.h>
+#include <qfile.h>
+
+#include <kapplication.h>
+#include <kabc/vcardconverter.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <ktempfile.h>
+
+#include <libkcal/calendarlocal.h>
+#include <libkcal/icaldrag.h>
+
+#include <libkdepim/maillistdrag.h>
+#include <libkdepim/kvcarddrag.h>
+#include <libkdepim/kpimprefs.h>
+
+#include "core.h"
+
+#include "todoplugin.h"
+#include "todosummarywidget.h"
+#include "korg_uniqueapp.h"
+
+typedef KGenericFactory< TodoPlugin, Kontact::Core > TodoPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_todoplugin,
+ TodoPluginFactory( "kontact_todoplugin" ) )
+
+TodoPlugin::TodoPlugin( Kontact::Core *core, const char *, const QStringList& )
+ : Kontact::Plugin( core, core, "korganizer" ),
+ mIface( 0 )
+{
+ setInstance( TodoPluginFactory::instance() );
+ instance()->iconLoader()->addAppDir("kdepim");
+
+ insertNewAction( new KAction( i18n( "New To-do..." ), "newtodo",
+ CTRL+SHIFT+Key_T, this, SLOT( slotNewTodo() ), actionCollection(),
+ "new_todo" ) );
+
+ insertSyncAction( new KAction( i18n( "Synchronize To-do List" ), "reload",
+ 0, this, SLOT( slotSyncTodos() ), actionCollection(),
+ "todo_sync" ) );
+
+ mUniqueAppWatcher = new Kontact::UniqueAppWatcher(
+ new Kontact::UniqueAppHandlerFactory<KOrganizerUniqueAppHandler>(), this );
+}
+
+TodoPlugin::~TodoPlugin()
+{
+}
+
+Kontact::Summary *TodoPlugin::createSummaryWidget( QWidget *parent )
+{
+ return new TodoSummaryWidget( this, parent );
+}
+
+KParts::ReadOnlyPart *TodoPlugin::createPart()
+{
+ KParts::ReadOnlyPart *part = loadPart();
+
+ if ( !part )
+ return 0;
+
+ dcopClient(); // ensure that we register to DCOP as "korganizer"
+ mIface = new KCalendarIface_stub( dcopClient(), "kontact", "CalendarIface" );
+
+ return part;
+}
+
+void TodoPlugin::select()
+{
+ interface()->showTodoView();
+}
+
+QStringList TodoPlugin::invisibleToolbarActions() const
+{
+ QStringList invisible;
+ invisible += "new_event";
+ invisible += "new_todo";
+ invisible += "new_journal";
+
+ invisible += "view_day";
+ invisible += "view_list";
+ invisible += "view_workweek";
+ invisible += "view_week";
+ invisible += "view_nextx";
+ invisible += "view_month";
+ invisible += "view_journal";
+ return invisible;
+}
+
+KCalendarIface_stub *TodoPlugin::interface()
+{
+ if ( !mIface ) {
+ part();
+ }
+ Q_ASSERT( mIface );
+ return mIface;
+}
+
+void TodoPlugin::slotNewTodo()
+{
+ interface()->openTodoEditor( "" );
+}
+
+void TodoPlugin::slotSyncTodos()
+{
+ DCOPRef ref( "kmail", "KMailICalIface" );
+ ref.send( "triggerSync", QString("Todo") );
+}
+
+bool TodoPlugin::createDCOPInterface( const QString& serviceType )
+{
+ kdDebug(5602) << k_funcinfo << serviceType << endl;
+ if ( serviceType == "DCOP/Organizer" || serviceType == "DCOP/Calendar" ) {
+ if ( part() )
+ return true;
+ }
+
+ return false;
+}
+
+bool TodoPlugin::canDecodeDrag( QMimeSource *mimeSource )
+{
+ return QTextDrag::canDecode( mimeSource ) ||
+ KPIM::MailListDrag::canDecode( mimeSource );
+}
+
+bool TodoPlugin::isRunningStandalone()
+{
+ return mUniqueAppWatcher->isRunningStandalone();
+}
+
+void TodoPlugin::processDropEvent( QDropEvent *event )
+{
+ QString text;
+
+ KABC::VCardConverter converter;
+ if ( KVCardDrag::canDecode( event ) && KVCardDrag::decode( event, text ) ) {
+ KABC::Addressee::List contacts = converter.parseVCards( text );
+ KABC::Addressee::List::Iterator it;
+
+ QStringList attendees;
+ for ( it = contacts.begin(); it != contacts.end(); ++it ) {
+ QString email = (*it).fullEmail();
+ if ( email.isEmpty() )
+ attendees.append( (*it).realName() + "<>" );
+ else
+ attendees.append( email );
+ }
+
+ interface()->openTodoEditor( i18n( "Meeting" ), QString::null, QString::null,
+ attendees );
+ return;
+ }
+
+ if ( KCal::ICalDrag::canDecode( event) ) {
+ KCal::CalendarLocal cal( KPimPrefs::timezone() );
+ if ( KCal::ICalDrag::decode( event, &cal ) ) {
+ KCal::Journal::List journals = cal.journals();
+ if ( !journals.isEmpty() ) {
+ event->accept();
+ KCal::Journal *j = journals.first();
+ interface()->openTodoEditor( i18n("Note: %1").arg( j->summary() ), j->description(), QString() );
+ return;
+ }
+ // else fall through to text decoding
+ }
+ }
+
+ if ( QTextDrag::decode( event, text ) ) {
+ interface()->openTodoEditor( text );
+ return;
+ }
+
+ KPIM::MailList mails;
+ if ( KPIM::MailListDrag::decode( event, mails ) ) {
+ if ( mails.count() != 1 ) {
+ KMessageBox::sorry( core(),
+ i18n("Drops of multiple mails are not supported." ) );
+ } else {
+ KPIM::MailSummary mail = mails.first();
+ QString txt = i18n("From: %1\nTo: %2\nSubject: %3").arg( mail.from() )
+ .arg( mail.to() ).arg( mail.subject() );
+
+ KTempFile tf;
+ tf.setAutoDelete( true );
+ QString uri = "kmail:" + QString::number( mail.serialNumber() ) + "/" +
+ mail.messageId();
+ tf.file()->writeBlock( event->encodedData( "message/rfc822" ) );
+ tf.close();
+ interface()->openTodoEditor( i18n("Mail: %1").arg( mail.subject() ), txt,
+ uri, tf.name(), QStringList(), "message/rfc822" );
+ }
+ return;
+ }
+
+ KMessageBox::sorry( core(), i18n("Cannot handle drop events of type '%1'.")
+ .arg( event->format() ) );
+}
+
+#include "todoplugin.moc"
diff --git a/kontact/plugins/korganizer/todoplugin.desktop b/kontact/plugins/korganizer/todoplugin.desktop
new file mode 100644
index 000000000..a571539d8
--- /dev/null
+++ b/kontact/plugins/korganizer/todoplugin.desktop
@@ -0,0 +1,65 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_todo
+ServiceTypes=Kontact/Plugin
+
+X-KDE-Library=libkontact_todoplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPartLibraryName=libkorganizerpart
+X-KDE-KontactPartExecutableName=korganizer
+X-KDE-KontactPluginHasSummary=true
+
+X-KDE-PluginInfo-Website=http://korganizer.kde.org
+X-KDE-PluginInfo-Name=kontact_todoplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=To-do List Component (KOrganizer plugin)
+Comment[bg]=Приставка за KOrganizer
+Comment[ca]=Component de llista de pendents (endollable del KOrganizer)
+Comment[da]=Komponent til gøremålsliste (KOrganizer-plugin)
+Comment[de]=Aufgabenlisten-Komponente (KOrganizer-Modul)
+Comment[el]=Συστατικό λίστα προς υλοποίηση εργασιών (Πρόσθετο του KOrganizer)
+Comment[es]=Componente de tareas pendientes (complemento de KOrganizer)
+Comment[et]=Ülesannete nimekirja plugin (KOrganizer)
+Comment[fr]=Composant de la liste des tâches (Module KOrganizer)
+Comment[is]=Verkefnaeining (KOrganizer íforrit)
+Comment[it]=Componente elenco delle cose da fare (plugin KOrganizer)
+Comment[ja]=To-Do リストコンポーネント (KOrganizer プラグイン)
+Comment[km]=សមាសភាគ​បញ្ជី​ការងារ​ត្រូវ​ធ្វើ (កម្មវិធី​ជំនួយ KOrganizer​)
+Comment[nds]=Opgavenlist-Komponent (KOrganizer-Moduul)
+Comment[nl]=Takenlijstcomponent (KOrganizer-plugin)
+Comment[pl]=Składnik zadań (wtyczka KOrganizer)
+Comment[ru]=Задачи (модуль KOrganizer)
+Comment[sk]=Komponent zoznamu úloh (Modul pre KOrganizer)
+Comment[sr]=Прикључак листе обавеза (прикључак KOrganizer-а)
+Comment[sr@Latn]=Priključak liste obaveza (priključak KOrganizer-a)
+Comment[sv]=Uppgiftslistkomponent (Korganizer-insticksprogram)
+Comment[tr]=Yapılacak İşler Bileşeni (KOrganizer eklentisi)
+Comment[zh_CN]=待办清单组件(KOrganizer 插件)
+Comment[zh_TW]=待辦事項清單組件(KOrganizer 外掛程式)
+Name=To-do
+Name[bg]=Задачи
+Name[ca]=Pendents
+Name[da]=Gøremål
+Name[de]=Aufgaben
+Name[el]=Προς υλοποίηση εργασίες
+Name[es]=Tareas pendientes
+Name[et]=Ülesanded
+Name[fr]=Tâches
+Name[is]=Verkefni
+Name[it]=Cose da fare
+Name[ja]=To-Do
+Name[km]=​ការងារ​ត្រូវ​ធ្វើ
+Name[nds]=Opgaav
+Name[nl]=Takenlijst
+Name[pl]=Lista zadań
+Name[ru]=Задачи
+Name[sk]=Zoznam úloh
+Name[sr]=Обавезе
+Name[sr@Latn]=Obaveze
+Name[sv]=Uppgift
+Name[tr]=Yapılacak Ögeleri
+Name[zh_CN]=待办清单
+Name[zh_TW]=待辦事項
diff --git a/kontact/plugins/korganizer/todoplugin.h b/kontact/plugins/korganizer/todoplugin.h
new file mode 100644
index 000000000..ce0cb5823
--- /dev/null
+++ b/kontact/plugins/korganizer/todoplugin.h
@@ -0,0 +1,68 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2003 Cornelius Schumacher <schumacher@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 KONTACT_TODOPLUGIN_H
+#define KONTACT_TODOPLUGIN_H
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include "kcalendariface_stub.h"
+#include "plugin.h"
+#include "uniqueapphandler.h"
+
+class TodoPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+ public:
+ TodoPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~TodoPlugin();
+
+ virtual bool createDCOPInterface( const QString& serviceType );
+ virtual bool isRunningStandalone();
+ int weight() const { return 450; }
+
+ bool canDecodeDrag( QMimeSource * );
+ void processDropEvent( QDropEvent * );
+
+ virtual QStringList invisibleToolbarActions() const;
+
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parent );
+
+ void select();
+
+ KCalendarIface_stub *interface();
+
+ protected:
+ KParts::ReadOnlyPart *createPart();
+
+ private slots:
+ void slotNewTodo();
+ void slotSyncTodos();
+
+ private:
+ KCalendarIface_stub *mIface;
+ Kontact::UniqueAppWatcher *mUniqueAppWatcher;
+};
+
+#endif
diff --git a/kontact/plugins/korganizer/todosummarywidget.cpp b/kontact/plugins/korganizer/todosummarywidget.cpp
new file mode 100644
index 000000000..d52941ee4
--- /dev/null
+++ b/kontact/plugins/korganizer/todosummarywidget.cpp
@@ -0,0 +1,270 @@
+/*
+ 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 <qcursor.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kparts/part.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kurllabel.h>
+#include <libkcal/resourcecalendar.h>
+#include <libkcal/resourcelocal.h>
+#include <libkcal/todo.h>
+#include <libkcal/incidenceformatter.h>
+#include <libkdepim/kpimprefs.h>
+
+#include "korganizeriface_stub.h"
+
+#include "core.h"
+#include "plugin.h"
+#include "todoplugin.h"
+
+#include "korganizer/stdcalendar.h"
+#include "korganizer/koglobals.h"
+#include "korganizer/incidencechanger.h"
+
+#include "todosummarywidget.h"
+
+TodoSummaryWidget::TodoSummaryWidget( TodoPlugin *plugin,
+ QWidget *parent, const char *name )
+ : Kontact::Summary( parent, name ), mPlugin( plugin )
+{
+ QVBoxLayout *mainLayout = new QVBoxLayout( this, 3, 3 );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kontact_todo",
+ KIcon::Desktop, KIcon::SizeMedium );
+ QWidget *header = createHeader( this, icon, i18n( "To-do" ) );
+ mainLayout->addWidget( header );
+
+ mLayout = new QGridLayout( mainLayout, 7, 4, 3 );
+ mLayout->setRowStretch( 6, 1 );
+
+ mCalendar = KOrg::StdCalendar::self();
+ mCalendar->load();
+
+ connect( mCalendar, SIGNAL( calendarChanged() ), SLOT( updateView() ) );
+ connect( mPlugin->core(), SIGNAL( dayChanged( const QDate& ) ),
+ SLOT( updateView() ) );
+
+ updateView();
+}
+
+TodoSummaryWidget::~TodoSummaryWidget()
+{
+}
+
+void TodoSummaryWidget::updateView()
+{
+ mLabels.setAutoDelete( true );
+ mLabels.clear();
+ mLabels.setAutoDelete( false );
+
+ KConfig config( "kcmkorgsummaryrc" );
+ config.setGroup( "Todo" );
+ bool showAllTodos = config.readBoolEntry( "ShowAllTodos", false );
+
+ KIconLoader loader( "kdepim" );
+
+ QLabel *label = 0;
+ int counter = 0;
+
+ QDate currentDate = QDate::currentDate();
+ KCal::Todo::List todos = mCalendar->todos();
+ if ( todos.count() > 0 ) {
+ QPixmap pm = loader.loadIcon( "todo", KIcon::Small );
+ KCal::Todo::List::ConstIterator it;
+ for ( it = todos.begin(); it != todos.end(); ++it ) {
+ KCal::Todo *todo = *it;
+
+ bool accepted = false;
+ QString stateText;
+
+ // show all incomplete todos
+ if ( showAllTodos && !todo->isCompleted())
+ accepted = true;
+
+ // show uncomplete todos from the last days
+ if ( todo->hasDueDate() && !todo->isCompleted() &&
+ todo->dtDue().date() < currentDate ) {
+ accepted = true;
+ stateText = i18n( "overdue" );
+ }
+
+ // show todos which started somewhere in the past and has to be finished in future
+ if ( todo->hasStartDate() && todo->hasDueDate() &&
+ todo->dtStart().date() < currentDate &&
+ currentDate < todo->dtDue().date() ) {
+ accepted = true;
+ stateText = i18n( "in progress" );
+ }
+
+ // all todos which start today
+ if ( todo->hasStartDate() && todo->dtStart().date() == currentDate ) {
+ accepted = true;
+ stateText = i18n( "starts today" );
+ }
+
+ // all todos which end today
+ if ( todo->hasDueDate() && todo->dtDue().date() == currentDate ) {
+ accepted = true;
+ stateText = i18n( "ends today" );
+ }
+
+ if ( !accepted )
+ continue;
+
+ label = new QLabel( this );
+ label->setPixmap( pm );
+ label->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
+ mLayout->addWidget( label, counter, 0 );
+ mLabels.append( label );
+
+ label = new QLabel( QString::number( todo->percentComplete() ) + "%", this );
+ label->setAlignment( AlignHCenter | AlignVCenter );
+ label->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
+ mLayout->addWidget( label, counter, 1 );
+ mLabels.append( label );
+
+ QString sSummary = todo->summary();
+ if ( todo->relatedTo() ) { // show parent only, not entire ancestry
+ sSummary = todo->relatedTo()->summary() + ":" + todo->summary();
+ }
+ KURLLabel *urlLabel = new KURLLabel( this );
+ urlLabel->setText( sSummary );
+ urlLabel->setURL( todo->uid() );
+ urlLabel->installEventFilter( this );
+ urlLabel->setTextFormat( Qt::RichText );
+ mLayout->addWidget( urlLabel, counter, 2 );
+ mLabels.append( urlLabel );
+
+ connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( viewTodo( const QString& ) ) );
+ connect( urlLabel, SIGNAL( rightClickedURL( const QString& ) ),
+ this, SLOT( popupMenu( const QString& ) ) );
+
+ QString tipText( KCal::IncidenceFormatter::toolTipString( todo, true ) );
+ if ( !tipText.isEmpty() ) {
+ QToolTip::add( urlLabel, tipText );
+ }
+
+ label = new QLabel( stateText, this );
+ label->setAlignment( AlignLeft | AlignVCenter );
+ label->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum );
+ mLayout->addWidget( label, counter, 3 );
+ mLabels.append( label );
+
+ counter++;
+ }
+ }
+
+ if ( counter == 0 ) {
+ QLabel *noTodos = new QLabel( i18n( "No to-dos pending" ), this );
+ noTodos->setAlignment( AlignHCenter | AlignVCenter );
+ mLayout->addWidget( noTodos, 0, 1 );
+ mLabels.append( noTodos );
+ }
+
+ for ( label = mLabels.first(); label; label = mLabels.next() )
+ label->show();
+}
+
+void TodoSummaryWidget::viewTodo( const QString &uid )
+{
+ mPlugin->core()->selectPlugin( "kontact_todoplugin" );//ensure loaded
+ KOrganizerIface_stub iface( "korganizer", "KOrganizerIface" );
+ iface.editIncidence( uid );
+}
+
+void TodoSummaryWidget::removeTodo( const QString &uid )
+{
+ mPlugin->core()->selectPlugin( "kontact_todoplugin" );//ensure loaded
+ KOrganizerIface_stub iface( "korganizer", "KOrganizerIface" );
+ iface.deleteIncidence( uid, false );
+}
+
+void TodoSummaryWidget::completeTodo( const QString &uid )
+{
+ KCal::Todo *todo = mCalendar->todo( uid );
+ IncidenceChanger *changer = new IncidenceChanger( mCalendar, this );
+ if ( !todo->isReadOnly() && changer->beginChange( todo ) ) {
+ KCal::Todo *oldTodo = todo->clone();
+ todo->setCompleted( QDateTime::currentDateTime() );
+ changer->changeIncidence( oldTodo, todo, KOGlobals::COMPLETION_MODIFIED );
+ changer->endChange( todo );
+ delete oldTodo;
+ updateView();
+ }
+}
+
+void TodoSummaryWidget::popupMenu( const QString &uid )
+{
+ KPopupMenu popup( this );
+ QToolTip::remove( this );
+ popup.insertItem( i18n( "&Edit To-do..." ), 0 );
+ popup.insertItem( KGlobal::iconLoader()->loadIcon( "editdelete", KIcon::Small),
+ i18n( "&Delete To-do" ), 1 );
+ KCal::Todo *todo = mCalendar->todo( uid );
+ if ( !todo->isCompleted() ) {
+ popup.insertItem( KGlobal::iconLoader()->loadIcon( "checkedbox", KIcon::Small),
+ i18n( "&Mark To-do Completed" ), 2 );
+ }
+
+ switch ( popup.exec( QCursor::pos() ) ) {
+ case 0:
+ viewTodo( uid );
+ break;
+ case 1:
+ removeTodo( uid );
+ break;
+ case 2:
+ completeTodo( uid );
+ break;
+ }
+}
+
+bool TodoSummaryWidget::eventFilter( QObject *obj, QEvent* e )
+{
+ if ( obj->inherits( "KURLLabel" ) ) {
+ KURLLabel* label = static_cast<KURLLabel*>( obj );
+ if ( e->type() == QEvent::Enter )
+ emit message( i18n( "Edit To-do: \"%1\"" ).arg( label->text() ) );
+ if ( e->type() == QEvent::Leave )
+ emit message( QString::null );
+ }
+
+ return Kontact::Summary::eventFilter( obj, e );
+}
+
+QStringList TodoSummaryWidget::configModules() const
+{
+ return QStringList( "kcmtodosummary.desktop" );
+}
+
+#include "todosummarywidget.moc"
diff --git a/kontact/plugins/korganizer/todosummarywidget.h b/kontact/plugins/korganizer/todosummarywidget.h
new file mode 100644
index 000000000..d5aca429e
--- /dev/null
+++ b/kontact/plugins/korganizer/todosummarywidget.h
@@ -0,0 +1,72 @@
+/*
+ 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 TODO_SUMMARYWIDGET_H
+#define TODO_SUMMARYWIDGET_H
+
+#include <qptrlist.h>
+#include <qwidget.h>
+
+#include <libkcal/calendarresources.h>
+
+#include "summary.h"
+
+class QGridLayout;
+class QLabel;
+
+class TodoPlugin;
+
+class TodoSummaryWidget : public Kontact::Summary
+{
+ Q_OBJECT
+
+ public:
+ TodoSummaryWidget( TodoPlugin *plugin, QWidget *parent,
+ const char *name = 0 );
+ ~TodoSummaryWidget();
+
+ int summaryHeight() const { return 3; }
+ QStringList configModules() const;
+
+ public slots:
+ void updateSummary( bool force = false ) { Q_UNUSED( force ); updateView(); }
+
+ protected:
+ virtual bool eventFilter( QObject *obj, QEvent* e );
+
+ private slots:
+ void updateView();
+ void popupMenu( const QString &uid );
+ void viewTodo( const QString &uid );
+ void removeTodo( const QString &uid );
+ void completeTodo( const QString &uid );
+
+ private:
+ TodoPlugin *mPlugin;
+ QGridLayout *mLayout;
+
+ QPtrList<QLabel> mLabels;
+ KCal::CalendarResources *mCalendar;
+};
+
+#endif
diff --git a/kontact/plugins/kpilot/Makefile.am b/kontact/plugins/kpilot/Makefile.am
new file mode 100644
index 000000000..2383a4fbd
--- /dev/null
+++ b/kontact/plugins/kpilot/Makefile.am
@@ -0,0 +1,24 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces \
+ -I$(top_srcdir)/libkdepim \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/kpilot/lib \
+ -I$(top_srcdir)/kpilot/kpilot \
+ $(PISOCK_INCLUDE) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_kpilotplugin.la
+libkontact_kpilotplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_kpilotplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la \
+ $(LIB_KPARTS) \
+ $(top_builddir)/libkdepim/libkdepim.la \
+ $(top_builddir)/kpilot/lib/libkpilot.la
+
+libkontact_kpilotplugin_la_SOURCES = kpilot_plugin.cpp summarywidget.cpp \
+ summarywidget.skel pilotDaemonDCOP.stub
+
+pilotDaemonDCOP_DIR = $(top_srcdir)/kpilot/kpilot
+pilotDaemonDCOP_DCOPIDLNG = true
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = kpilotplugin.desktop
diff --git a/kontact/plugins/kpilot/kpilot_plugin.cpp b/kontact/plugins/kpilot/kpilot_plugin.cpp
new file mode 100644
index 000000000..ed6104bd4
--- /dev/null
+++ b/kontact/plugins/kpilot/kpilot_plugin.cpp
@@ -0,0 +1,69 @@
+/*
+ This file is part of Kontact.
+ Copyright (C) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ 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 "options.h"
+
+#include <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <kparts/componentfactory.h>
+
+#include "core.h"
+#include "summarywidget.h"
+
+#include "kpilot_plugin.h"
+
+typedef KGenericFactory< KPilotPlugin, Kontact::Core > KPilotPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_kpilotplugin,
+ KPilotPluginFactory( "kontact_kpilotplugin" ) )
+
+KPilotPlugin::KPilotPlugin( Kontact::Core *core, const char *name, const QStringList& )
+ : Kontact::Plugin( core, core, "kpilot" ), mAboutData( 0 )
+{
+ setInstance( KPilotPluginFactory::instance() );
+ // TODO: Make sure kpilotDaemon is running!
+
+
+}
+
+Kontact::Summary *KPilotPlugin::createSummaryWidget( QWidget *parentWidget )
+{
+ return new SummaryWidget( parentWidget );
+}
+
+const KAboutData *KPilotPlugin::aboutData()
+{
+ if ( !mAboutData ) {
+ mAboutData = new KAboutData("kpilotplugin", I18N_NOOP("KPilot Information"),
+ KPILOT_VERSION,
+ I18N_NOOP("KPilot - HotSync software for KDE\n\n"),
+ KAboutData::License_GPL, "(c) 2004 Reinhold Kainhofer");
+ mAboutData->addAuthor("Reinhold Kainhofer",
+ I18N_NOOP("Plugin Developer"), "reinhold@kainhofer.com", "http://reinhold.kainhofer.com/Linux/");
+ mAboutData->addAuthor("Dan Pilone",
+ I18N_NOOP("Project Leader"),
+ 0, "http://www.kpilot.org/");
+ mAboutData->addAuthor("Adriaan de Groot",
+ I18N_NOOP("Maintainer"),
+ "groot@kde.org", "http://people.fruitsalad.org/adridg/");
+ }
+
+ return mAboutData;
+}
diff --git a/kontact/plugins/kpilot/kpilot_plugin.h b/kontact/plugins/kpilot/kpilot_plugin.h
new file mode 100644
index 000000000..9b76bd644
--- /dev/null
+++ b/kontact/plugins/kpilot/kpilot_plugin.h
@@ -0,0 +1,49 @@
+/*
+ This file is part of Kontact.
+ Copyright (C) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ 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 KPilot_PLUGIN_H
+#define KPilot_PLUGIN_H
+
+#include "plugin.h"
+#include "pilotDaemonDCOP_stub.h"
+
+class SummaryWidget;
+
+class KPilotPlugin : public Kontact::Plugin
+{
+ public:
+ KPilotPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ KPilotPlugin();
+
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parentWidget );
+
+ virtual bool showInSideBar() const { return false; }
+// virtual QStringList configModules() const;
+
+ const KAboutData *aboutData();
+
+ protected:
+ virtual KParts::ReadOnlyPart *createPart() { return 0; }
+ private:
+ KAboutData *mAboutData;
+};
+
+#endif
diff --git a/kontact/plugins/kpilot/kpilotplugin.desktop b/kontact/plugins/kpilot/kpilotplugin.desktop
new file mode 100644
index 000000000..7ad217fd9
--- /dev/null
+++ b/kontact/plugins/kpilot/kpilotplugin.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Type=Service
+Icon=kpilot
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_kpilotplugin
+X-KDE-KontactIdentifier=kpilot
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPluginHasSummary=true
+X-KDE-KontactPluginHasPart=false
+
+X-KDE-PluginInfo-Website=http://www.slac.com/~pilone/kpilot_home/
+X-KDE-PluginInfo-Name=kontact_kpilotplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Palm Tools Component (KPilot Plugin)
+Comment[bg]=Приставка за KPilot
+Comment[ca]=Component d'eines de la Palm (endollable del KPilot)
+Comment[da]=Komponent til palm-værktøjer (KPilot-plugin)
+Comment[de]=Palm-Komponente (KPilot-Modul)
+Comment[el]=Συστατικό εργαλείων Palm (Πρόσθετο του KPilot)
+Comment[es]=Componente de herramientas de Palm (complemento KPilot)
+Comment[et]=Palmi tööriistade plugin (KPilot)
+Comment[fr]=Composant d'outils pour Palms (Module KPilot)
+Comment[is]=Palm verkfæraeining (KPilot íforrit)
+Comment[it]=Componente strumenti Palm (plugin KPilot)
+Comment[ja]=Palm ツールコンポーネント (KPilot プラグイン)
+Comment[km]=សមាសភាគ​ឧបករណ៍ Palm (កម្មវិធី​ជំនួយ KPilot​)
+Comment[nds]=Palmreekner-Warktüüchkomponent (KPilot-Moduul)
+Comment[nl]=Component met hulpmiddelen voor PalmOS(tm)-apparaten (KPilot-plugin)
+Comment[pl]=Składnik narzędzi Palma (wtyczka KPilot)
+Comment[ru]=Синхронизация с Palm (модуль KPilot)
+Comment[sr]=Компонента алата за Palm (прикључак KPilot-а)
+Comment[sr@Latn]=Komponenta alata za Palm (priključak KPilot-a)
+Comment[sv]=Palm Pilot-verktygskomponent (Kpilot-insticksprogram)
+Comment[tr]=Palm Araçları Bileşeni (KPilot Eklentisi)
+Comment[zh_CN]=Palm 工具组件(KPilot 插件)
+Comment[zh_TW]=Palm 工具組件(KPilot 外掛程式)
+Name=Palm
+Name[nds]=Palmreekner
+Name[nl]=PalmOS(tm)-apparaat
+Name[sv]=Palm Pilot
diff --git a/kontact/plugins/kpilot/summarywidget.cpp b/kontact/plugins/kpilot/summarywidget.cpp
new file mode 100644
index 000000000..4230e6479
--- /dev/null
+++ b/kontact/plugins/kpilot/summarywidget.cpp
@@ -0,0 +1,242 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ 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 <qimage.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qfile.h>
+#include <qlabel.h>
+#include <qtextedit.h>
+#include <qvbox.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kurllabel.h>
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+
+#include "pilotDaemonDCOP_stub.h"
+
+#include <ktextedit.h>
+
+#include "summarywidget.h"
+
+SummaryWidget::SummaryWidget( QWidget *parent, const char *name )
+ : Kontact::Summary( parent, name ),
+ DCOPObject( "KPilotSummaryWidget" ),
+ mDCOPSuccess( false ),
+ mStartedDaemon( false ),
+ mShouldStopDaemon( true )
+{
+ mLayout = new QGridLayout( this, 2, 3, 3, 3 );
+
+ int row=0;
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kpilot", KIcon::Desktop, KIcon::SizeMedium );
+ QWidget *header = createHeader( this, icon, i18n( "KPilot Configuration" ) );
+ mLayout->addMultiCellWidget( header, row,row, 0,3 );
+
+ // Last sync information
+ row++;
+ mSyncTimeTextLabel = new QLabel( i18n( "<i>Last sync:</i>" ), this);
+ mLayout->addWidget( mSyncTimeTextLabel, row, 0 );
+ mSyncTimeLabel = new QLabel( i18n( "No information available" ), this );
+ mLayout->addWidget( mSyncTimeLabel, row, 1 );
+ mShowSyncLogLabel = new KURLLabel( "", i18n( "[View Sync Log]" ), this );
+ mLayout->addWidget( mShowSyncLogLabel, row, 3 );
+ connect( mShowSyncLogLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( showSyncLog( const QString& ) ) );
+
+ // User
+ row++;
+ mPilotUserTextLabel = new QLabel( i18n( "<i>User:</i>" ), this);
+ mLayout->addWidget( mPilotUserTextLabel, row, 0);
+ mPilotUserLabel = new QLabel( i18n( "Unknown" ), this );
+ mLayout->addMultiCellWidget( mPilotUserLabel, row, row, 1, 3 );
+
+ // Device information
+ row++;
+ mPilotDeviceTextLabel = new QLabel( i18n( "<i>Device:</i>" ), this);
+ mLayout->addWidget( mPilotDeviceTextLabel, row, 0 );
+ mPilotDeviceLabel = new QLabel( i18n( "Unknown" ), this );
+ mLayout->addMultiCellWidget( mPilotDeviceLabel, row, row, 1, 3 );
+
+ // Status
+ row++;
+ mDaemonStatusTextLabel = new QLabel( i18n( "<i>Status:</i>" ), this);
+ mLayout->addWidget( mDaemonStatusTextLabel, row, 0 );
+ mDaemonStatusLabel = new QLabel( i18n( "No communication with the daemon possible" ), this );
+ mLayout->addMultiCellWidget( mDaemonStatusLabel, row, row, 1, 3 );
+
+ // Conduits:
+ row++;
+ mConduitsTextLabel = new QLabel( i18n( "<i>Conduits:</i>" ), this );
+ mConduitsTextLabel->setAlignment( AlignAuto | AlignTop | ExpandTabs );
+ mLayout->addWidget( mConduitsTextLabel, row, 0 );
+ mConduitsLabel = new QLabel( i18n( "No information available" ), this );
+ mConduitsLabel->setAlignment( mConduitsLabel->alignment() | Qt::WordBreak );
+ mLayout->addMultiCellWidget( mConduitsLabel, row, row, 1, 3 );
+
+ // widgets shown if kpilotDaemon is not running
+ row++;
+ mNoConnectionLabel = new QLabel( i18n( "KPilot is currently not running." ), this );
+ mLayout->addMultiCellWidget( mNoConnectionLabel, row, row, 1, 2 );
+ mNoConnectionStartLabel = new KURLLabel( "", i18n( "[Start KPilot]" ), this );
+ mLayout->addWidget( mNoConnectionStartLabel, row, 3 );
+ connect( mNoConnectionStartLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( startKPilot() ) );
+
+ if ( !kapp->dcopClient()->isApplicationRegistered( "kpilotDaemon" ) ) {
+ startKPilot();
+ }
+
+ connectDCOPSignal( 0, 0, "kpilotDaemonStatusDetails(QDateTime,QString,QStringList,QString,QString,QString,bool)",
+ "receiveDaemonStatusDetails(QDateTime,QString,QStringList,QString,QString,QString,bool)", false );
+ connect( kapp->dcopClient(), SIGNAL( applicationRemoved( const QCString & ) ), SLOT( slotAppRemoved( const QCString& ) ) );
+}
+
+SummaryWidget::~SummaryWidget()
+{
+ if ( mStartedDaemon && mShouldStopDaemon ) {
+ PilotDaemonDCOP_stub dcopToDaemon( "kpilotDaemon", "KPilotDaemonIface" );
+ dcopToDaemon.quitNow(); // ASYNC, always succeeds.
+ }
+}
+
+QStringList SummaryWidget::configModules() const
+{
+ QStringList modules;
+ modules << "kpilot_config.desktop";
+ return modules;
+}
+
+void SummaryWidget::receiveDaemonStatusDetails(QDateTime lastSyncTime, QString status, QStringList conduits, QString logFileName, QString userName, QString pilotDevice, bool killOnExit )
+{
+ mDCOPSuccess = true;
+ mLastSyncTime = lastSyncTime;
+ mDaemonStatus = status;
+ mConduits = conduits;
+ mSyncLog = logFileName;
+ mUserName = userName;
+ mPilotDevice = pilotDevice;
+ mShouldStopDaemon = killOnExit;
+ updateView();
+}
+
+void SummaryWidget::updateView()
+{
+ if ( mDCOPSuccess ) {
+ if ( mLastSyncTime.isValid() ) {
+ mSyncTimeLabel->setText( mLastSyncTime.toString(Qt::LocalDate) );
+ } else {
+ mSyncTimeLabel->setText( i18n( "No information available" ) );
+ }
+ if ( !mSyncLog.isEmpty() ) {
+ mShowSyncLogLabel->setEnabled( true );
+ mShowSyncLogLabel->setURL( mSyncLog );
+ } else {
+ mShowSyncLogLabel->setEnabled( false );
+ }
+ mPilotUserLabel->setText( mUserName.isEmpty() ? i18n( "unknown" ) : mUserName );
+ mPilotDeviceLabel->setText( mPilotDevice.isEmpty() ? i18n( "unknown" ) : mPilotDevice );
+ mDaemonStatusLabel->setText( mDaemonStatus );
+ mConduitsLabel->setText( mConduits.join( ", " ) );
+ } else {
+ mSyncTimeLabel->setText( i18n( "No information available (Daemon not running?)" ) );
+ mShowSyncLogLabel->setEnabled( false );
+ mPilotUserLabel->setText( i18n( "unknown" ) );
+ mPilotDeviceLabel->setText( i18n( "unknown" ) );
+ mDaemonStatusLabel->setText( i18n( "No communication with the daemon possible" ) );
+ mConduitsLabel->setText( i18n( "No information available" ) );
+ }
+
+ mSyncTimeTextLabel->setShown( mDCOPSuccess );
+ mSyncTimeLabel->setShown( mDCOPSuccess );
+ mShowSyncLogLabel->setShown( mDCOPSuccess );
+ mPilotUserTextLabel->setShown( mDCOPSuccess );
+ mPilotUserLabel->setShown( mDCOPSuccess );
+ mPilotDeviceTextLabel->setShown( mDCOPSuccess );
+ mPilotDeviceLabel->setShown( mDCOPSuccess );
+ mDaemonStatusTextLabel->setShown( mDCOPSuccess );
+ mDaemonStatusLabel->setShown( mDCOPSuccess );
+ mConduitsTextLabel->setShown( mDCOPSuccess );
+ mConduitsLabel->setShown( mDCOPSuccess );
+ mNoConnectionLabel->setShown( !mDCOPSuccess );
+ mNoConnectionStartLabel->setShown( !mDCOPSuccess );
+}
+
+void SummaryWidget::showSyncLog( const QString &filename )
+{
+ KDialogBase dlg( this, 0, true, QString::null, KDialogBase::Ok, KDialogBase::Ok );
+ dlg.setCaption( i18n( "KPilot HotSync Log" ) );
+
+ QTextEdit *edit = new QTextEdit( dlg.makeVBoxMainWidget() );
+ edit->setReadOnly( true );
+
+ QFile f(filename);
+ if ( !f.open( IO_ReadOnly ) ) {
+ KMessageBox::error( this, i18n( "Unable to open Hotsync log %1." ).arg( filename ) );
+ return;
+ }
+
+ QTextStream s( &f );
+ while ( !s.eof() )
+ edit->append( s.readLine() );
+
+ edit->moveCursor( QTextEdit::MoveHome, false );
+
+ f.close();
+
+ dlg.setInitialSize( QSize( 400, 350 ) );
+ dlg.exec();
+}
+
+void SummaryWidget::startKPilot()
+{
+ QString error;
+ QCString appID;
+ if ( !KApplication::kdeinitExec( "kpilotDaemon", QString( "--fail-silently" ) ) ) {
+ kdDebug(5602) << "No service available..." << endl;
+ mStartedDaemon = true;
+ }
+}
+
+void SummaryWidget::slotAppRemoved( const QCString & appId )
+{
+ if ( appId == "kpilotDaemon" )
+ {
+ mDCOPSuccess = false;
+ updateView();
+ }
+}
+
+
+#include "summarywidget.moc"
+
diff --git a/kontact/plugins/kpilot/summarywidget.h b/kontact/plugins/kpilot/summarywidget.h
new file mode 100644
index 000000000..94fda7e55
--- /dev/null
+++ b/kontact/plugins/kpilot/summarywidget.h
@@ -0,0 +1,99 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ 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 "summary.h"
+
+#include <dcopobject.h>
+#include <pilotDaemonDCOP.h>
+
+#include <qmap.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qwidget.h>
+#include <qdatetime.h>
+
+class QGridLayout;
+class QLabel;
+class KURLLabel;
+
+class SummaryWidget : public Kontact::Summary, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+
+ public:
+ SummaryWidget( QWidget *parent, const char *name = 0 );
+ virtual ~SummaryWidget();
+
+ int summaryHeight() const { return 1; }
+
+ QStringList configModules() const;
+
+ k_dcop:
+ // all the information is pushed to Kontact by the daemon, to remove the chance of Kontact calling a daemon
+ // that is blocked for some reason, and blocking itself.
+ void receiveDaemonStatusDetails( QDateTime, QString, QStringList, QString, QString, QString, bool );
+ private slots:
+ void updateView();
+ void showSyncLog( const QString &filename );
+ void startKPilot();
+ void slotAppRemoved( const QCString & );
+ private:
+ QTimer mTimer;
+
+ QLabel*mSyncTimeTextLabel;
+ QLabel*mSyncTimeLabel;
+ KURLLabel*mShowSyncLogLabel;
+ QLabel*mPilotUserTextLabel;
+ QLabel*mPilotUserLabel;
+ QLabel*mPilotDeviceTextLabel;
+ QLabel*mPilotDeviceLabel;
+ QLabel*mDaemonStatusTextLabel;
+ QLabel*mDaemonStatusLabel;
+ QLabel*mConduitsTextLabel;
+ QLabel*mConduitsLabel;
+ QLabel*mNoConnectionLabel;
+ KURLLabel*mNoConnectionStartLabel;
+
+ QGridLayout *mLayout;
+
+ QDateTime mLastSyncTime;
+ QString mDaemonStatus;
+ QStringList mConduits;
+ QString mSyncLog;
+ QString mUserName;
+ QString mPilotDevice;
+ bool mDCOPSuccess;
+
+ bool mStartedDaemon; // Record whether the daemon was started by kontact
+ bool mShouldStopDaemon;
+};
+
+#endif
+
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
diff --git a/kontact/plugins/specialdates/Makefile.am b/kontact/plugins/specialdates/Makefile.am
new file mode 100644
index 000000000..7bedb2051
--- /dev/null
+++ b/kontact/plugins/specialdates/Makefile.am
@@ -0,0 +1,31 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces \
+ -I$(top_srcdir)/libkdepim \
+ -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_specialdatesplugin.la kcm_sdsummary.la
+libkontact_specialdatesplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_specialdatesplugin_la_LIBADD = \
+ $(top_builddir)/kontact/interfaces/libkpinterfaces.la \
+ $(top_builddir)/libkdepim/libkdepim.la \
+ $(top_builddir)/libkholidays/libkholidays.la \
+ $(top_builddir)/korganizer/libkorganizer_calendar.la \
+ $(top_builddir)/kaddressbook/libkaddressbook.la
+
+libkontact_specialdatesplugin_la_SOURCES = specialdates_plugin.cpp \
+ sdsummarywidget.cpp
+
+kcm_sdsummary_la_SOURCES = kcmsdsummary.cpp
+kcm_sdsummary_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) \
+ -avoid-version -no-undefined
+kcm_sdsummary_la_LIBADD = $(LIB_KDEUI)
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = specialdatesplugin.desktop
+
+kde_services_DATA = kcmsdsummary.desktop
+
+specialdatesiface_DIR = $(top_srcdir)/specialdates
+kmailIface_DIR = $(top_srcdir)/kmail
+kmailIface_DCOPIDLNG = true
diff --git a/kontact/plugins/specialdates/kcmsdsummary.cpp b/kontact/plugins/specialdates/kcmsdsummary.cpp
new file mode 100644
index 000000000..9bb0211a5
--- /dev/null
+++ b/kontact/plugins/specialdates/kcmsdsummary.cpp
@@ -0,0 +1,248 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2004 Allen Winter <winter@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 <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kaccelmanager.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+
+#include "kcmsdsummary.h"
+
+#include <kdepimmacros.h>
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_sdsummary( QWidget *parent, const char * )
+ {
+ return new KCMSDSummary( parent, "kcmsdsummary" );
+ }
+}
+
+KCMSDSummary::KCMSDSummary( QWidget *parent, const char *name )
+ : KCModule( parent, name )
+{
+ initGUI();
+
+ customDaysChanged( 1 );
+
+ connect( mDaysGroup, SIGNAL( clicked( int ) ), SLOT( modified() ) );
+ connect( mDaysGroup, SIGNAL( clicked( int ) ), SLOT( buttonClicked( int ) ) );
+ connect( mCalendarGroup, SIGNAL( clicked( int ) ), SLOT( modified() ) );
+ connect( mContactGroup, SIGNAL( clicked( int ) ), SLOT( modified() ) );
+ connect( mCustomDays, SIGNAL( valueChanged( int ) ), SLOT( modified() ) );
+ connect( mCustomDays, SIGNAL( valueChanged( int ) ), SLOT( customDaysChanged( int ) ) );
+
+ KAcceleratorManager::manage( this );
+
+ load();
+}
+
+void KCMSDSummary::modified()
+{
+ emit changed( true );
+}
+
+void KCMSDSummary::buttonClicked( int id )
+{
+ mCustomDays->setEnabled( id == 4 );
+}
+
+void KCMSDSummary::customDaysChanged( int value )
+{
+ mCustomDays->setSuffix( i18n( " day", " days", value ) );
+}
+
+void KCMSDSummary::initGUI()
+{
+ QGridLayout *layout = new QGridLayout( this, 3, 2, KDialog::spacingHint() );
+
+ mDaysGroup = new QButtonGroup( 0, Vertical, i18n( "Special Dates Summary" ), this );
+ QVBoxLayout *boxLayout = new QVBoxLayout( mDaysGroup->layout(),
+ KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "How many days should the special dates summary show at once?" ), mDaysGroup );
+ boxLayout->addWidget( label );
+
+ QRadioButton *button = new QRadioButton( i18n( "One day" ), mDaysGroup );
+ boxLayout->addWidget( button );
+
+ button = new QRadioButton( i18n( "Five days" ), mDaysGroup );
+ boxLayout->addWidget( button );
+
+ button = new QRadioButton( i18n( "One week" ), mDaysGroup );
+ boxLayout->addWidget( button );
+
+ button = new QRadioButton( i18n( "One month" ), mDaysGroup );
+ boxLayout->addWidget( button );
+
+ QHBoxLayout *hbox = new QHBoxLayout( boxLayout, KDialog::spacingHint() );
+
+ button = new QRadioButton( "", mDaysGroup );
+ hbox->addWidget( button );
+
+ mCustomDays = new QSpinBox( 1, 365, 1, mDaysGroup );
+ mCustomDays->setEnabled( false );
+ hbox->addWidget( mCustomDays );
+
+ hbox->addStretch( 1 );
+
+ layout->addMultiCellWidget( mDaysGroup, 0, 0, 0, 1 );
+
+ mCalendarGroup = new QButtonGroup( 1, Horizontal, i18n( "Special Dates From Calendar" ), this );
+
+ mShowBirthdaysFromCal = new QCheckBox( i18n( "Show birthdays" ), mCalendarGroup );
+ mShowAnniversariesFromCal = new QCheckBox( i18n( "Show anniversaries" ), mCalendarGroup );
+ mShowHolidays = new QCheckBox( i18n( "Show holidays" ), mCalendarGroup );
+
+ mShowSpecialsFromCal = new QCheckBox( i18n( "Show special occasions" ), mCalendarGroup );
+
+ mContactGroup = new QButtonGroup( 1, Horizontal, i18n( "Special Dates From Contact List" ), this );
+
+ mShowBirthdaysFromKAB = new QCheckBox( i18n( "Show birthdays" ), mContactGroup );
+ mShowAnniversariesFromKAB = new QCheckBox( i18n( "Show anniversaries" ), mContactGroup );
+
+ layout->addWidget( mCalendarGroup, 1, 0 );
+ layout->addWidget( mContactGroup, 1, 1 );
+
+ layout->setRowStretch( 2, 1 );
+}
+
+void KCMSDSummary::load()
+{
+ KConfig config( "kcmsdsummaryrc" );
+
+ config.setGroup( "Days" );
+ int days = config.readNumEntry( "DaysToShow", 7 );
+ if ( days == 1 )
+ mDaysGroup->setButton( 0 );
+ else if ( days == 5 )
+ mDaysGroup->setButton( 1 );
+ else if ( days == 7 )
+ mDaysGroup->setButton( 2 );
+ else if ( days == 31 )
+ mDaysGroup->setButton( 3 );
+ else {
+ mDaysGroup->setButton( 4 );
+ mCustomDays->setValue( days );
+ mCustomDays->setEnabled( true );
+ }
+
+ config.setGroup( "EventTypes" );
+
+ mShowBirthdaysFromKAB->
+ setChecked( config.readBoolEntry( "ShowBirthdaysFromContacts", true ) );
+ mShowBirthdaysFromCal->
+ setChecked( config.readBoolEntry( "ShowBirthdaysFromCalendar", true ) );
+
+ mShowAnniversariesFromKAB->
+ setChecked( config.readBoolEntry( "ShowAnniversariesFromContacts", true ) );
+ mShowAnniversariesFromCal->
+ setChecked( config.readBoolEntry( "ShowAnniversariesFromCalendar", true ) );
+
+ mShowHolidays->
+ setChecked( config.readBoolEntry( "ShowHolidays", true ) );
+
+ mShowSpecialsFromCal->
+ setChecked( config.readBoolEntry( "ShowSpecialsFromCalendar", true ) );
+
+ emit changed( false );
+}
+
+void KCMSDSummary::save()
+{
+ KConfig config( "kcmsdsummaryrc" );
+
+ config.setGroup( "Days" );
+
+ int days;
+ switch ( mDaysGroup->selectedId() ) {
+ case 0: days = 1; break;
+ case 1: days = 5; break;
+ case 2: days = 7; break;
+ case 3: days = 31; break;
+ case 4:
+ default: days = mCustomDays->value(); break;
+ }
+ config.writeEntry( "DaysToShow", days );
+
+ config.setGroup( "EventTypes" );
+
+ config.writeEntry( "ShowBirthdaysFromContacts",
+ mShowBirthdaysFromKAB->isChecked() );
+ config.writeEntry( "ShowBirthdaysFromCalendar",
+ mShowBirthdaysFromCal->isChecked() );
+
+ config.writeEntry( "ShowAnniversariesFromContacts",
+ mShowAnniversariesFromKAB->isChecked() );
+ config.writeEntry( "ShowAnniversariesFromCalendar",
+ mShowAnniversariesFromCal->isChecked() );
+
+ config.writeEntry( "ShowHolidays",
+ mShowHolidays->isChecked() );
+
+ config.writeEntry( "ShowSpecialsFromCalendar",
+ mShowSpecialsFromCal->isChecked() );
+
+ config.sync();
+
+ emit changed( false );
+}
+
+void KCMSDSummary::defaults()
+{
+ mDaysGroup->setButton( 7 );
+ mShowBirthdaysFromKAB->setChecked( true );
+ mShowBirthdaysFromCal->setChecked( true );
+ mShowAnniversariesFromKAB->setChecked( true );
+ mShowAnniversariesFromCal->setChecked( true );
+ mShowHolidays->setChecked( true );
+ mShowSpecialsFromCal->setChecked( true );
+
+ emit changed( true );
+}
+
+const KAboutData* KCMSDSummary::aboutData() const
+{
+ KAboutData *about = new KAboutData( I18N_NOOP( "kcmsdsummary" ),
+ I18N_NOOP( "Special Dates Configuration Dialog" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c) 2004 Tobias Koenig" ) );
+
+ about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" );
+ about->addAuthor( "Allen Winter", 0, "winter@kde.org" );
+
+ return about;
+}
+
+#include "kcmsdsummary.moc"
diff --git a/kontact/plugins/specialdates/kcmsdsummary.desktop b/kontact/plugins/specialdates/kcmsdsummary.desktop
new file mode 100644
index 000000000..f294c3835
--- /dev/null
+++ b/kontact/plugins/specialdates/kcmsdsummary.desktop
@@ -0,0 +1,126 @@
+[Desktop Entry]
+Icon=cookie
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=sdsummary
+X-KDE-FactoryName=sdsummary
+X-KDE-ParentApp=kontact_specialdatesplugin
+X-KDE-ParentComponents=kontact_specialdatesplugin
+X-KDE-CfgDlgHierarchy=KontactSummary
+
+Name=Special Dates Overview
+Name[bg]=Преглед на специални случаи
+Name[ca]=Resum de dates especials
+Name[da]=Oversigt over særlige datoer
+Name[de]=Übersicht über besondere Termine
+Name[el]=Επισκόπηση σημαντικών ημερομηνιών
+Name[es]=Resumen de fechas especiales
+Name[et]=Tähtpäevade ülevaade
+Name[fr]=Aperçu des dates importantes
+Name[is]=Yfirlit sérstakra daga
+Name[it]=Panoramica delle date speciali
+Name[ja]=特別な日の要約
+Name[km]=ទិដ្ឋភាព​កាលបរិច្ឆេទ​ពិសេស
+Name[nds]=Översicht besünner Daten
+Name[nl]=Overzicht van speciale data
+Name[pl]=Daty specjalne
+Name[pt_BR]=Resumo de Datas Especiais
+Name[ru]=Сводка особых дат
+Name[sr]=Преглед посебних датума
+Name[sr@Latn]=Pregled posebnih datuma
+Name[sv]=Översikt av speciella datum
+Name[tr]=Özel Tarihlere Genel Bakış
+Name[zh_CN]=特殊日期概览
+Name[zh_TW]=特殊日期概觀
+Comment=Special Dates Summary Setup
+Comment[af]=Spesiale datums opsomming opstelling
+Comment[bg]=Настройки на специалните случаи
+Comment[ca]=Configuració del resum de les dates especials
+Comment[cs]=Nastavení souhrnu speciálních datumů
+Comment[da]=Opsummering af opsætning af særlige datoer
+Comment[de]=Einstellung der Übersicht über besondere Termine
+Comment[el]=Ρύθμιση σύνοψης σημαντικών ημερομηνιών
+Comment[es]=Configuración del resumen de las fechas especiales
+Comment[et]=Tähtpäevade kokkuvõtte seadistus
+Comment[eu]=Data berezien laburpenen konfigurazioa
+Comment[fa]=برپایی خلاصۀ تاریخهای ویژه
+Comment[fi]=Erikoispäivien yhteenvedon asetukset
+Comment[fr]=Configuration du résumé des dates particulières
+Comment[fy]=Spesjale datums oersichts opset
+Comment[gl]=Configuración do Resumo de Datas Especiais
+Comment[he]=תצורת תאריכים מיוחדים
+Comment[hu]=A fontos dátumok áttekintőjének beállításai
+Comment[is]=Yfirlitsuppsetning sérstakra daga
+Comment[it]=Impostazioni per le date speciali
+Comment[ja]=特別な日の要約設定
+Comment[ka]=განსაკუთრებულ თარიღთა დაიჯესტის კონფიგურაცია
+Comment[kk]=Ерекше күндер тұжырымының баптауы
+Comment[km]=រៀបចំ​សេចក្ដី​សង្ខេប​ថ្ងៃ​ពិសេស
+Comment[lt]=Ypatingų datų santraukos sąranka
+Comment[mk]=Поставувања за прегледот на специјални датуми
+Comment[ms]=Setup Ringkasan Tarikh Khusus
+Comment[nb]=Sammendragsoppsett for spesielle datoer
+Comment[nds]=Översicht över besünner Daag instellen
+Comment[ne]=विशेष मिति सारांश सेटअप
+Comment[nl]=Instellingen voor speciale data in overzicht
+Comment[nn]=Oppsett av samandrag for spesielle datoar
+Comment[pl]=Ustawienia podsumowania dat specjalnych
+Comment[pt]=Configuração do Sumário de Datas Especiais
+Comment[pt_BR]=Configuração do Resumo de Datas Especiais
+Comment[ru]=Настройка особых дат
+Comment[sk]=Nastavenie súhrnu špeciálnych dátumov
+Comment[sl]=Nastavitve povzetka posebnih datumov
+Comment[sr]=Подешавање сажетка посебних датума
+Comment[sr@Latn]=Podešavanje sažetka posebnih datuma
+Comment[sv]=Inställning av översikt av speciella datum
+Comment[ta]=விசேஷ தேதிகள் சுருக்க அமைப்பு
+Comment[th]=ต้้งค่าส่วนสรุปวันพิเศษ
+Comment[tr]=Özel Tarih Özeti Yapılandırması
+Comment[uk]=Налаштування підсумку особливих дат
+Comment[zh_CN]=特殊日期摘要设置
+Comment[zh_TW]=特殊日期摘要設定
+Keywords=birthday, anniversary, holiday, configure, settings
+Keywords[af]=birtday,anniversary, holiday, conifugre, settings, verjaarsdag, herdenking, vakansie
+Keywords[bg]=рождени, рожден, дни, ден, годишнина, годишнини, обобщение, birthday, anniversary, configure, settings
+Keywords[ca]=data de naixement, aniversari, vacances, configuració, arranjament
+Keywords[cs]=narozeniny,výročí,nastavení,nastavit,svátek
+Keywords[da]=fødselsdag, årsdag, helligdage, indstil, opsætning
+Keywords[de]=Geburtstag,Jahrestag,Feiertag,einstellen,Einstellungen,Einrichten
+Keywords[el]=γενέθλια, επέτειος, εορτή, ρύθμιση, ρυθμίσεις
+Keywords[es]=cumpleaños, aniversario, vacaciones, configurar, preferencias
+Keywords[et]=sünnipäev, tähtpäev, pidupäev, seadistamine, seadistused
+Keywords[eu]=urtebetezea, urteurrena, jaia, konfiguratu, ezarpenak
+Keywords[fa]=تولد، جشن سالانه، تعطیلات، پیکربندی، تنظیمات
+Keywords[fi]=syntymäpäivä, juhlapäivä, loma, aseta, asetukset
+Keywords[fr]=anniversaire,date de naissance,vacances,configurer,paramètres,préférences
+Keywords[fy]=verjaardag,jubileum,vakantie,instellingen,configuratie,feestdag, jierdei, fakânsje, ynstellings, feestdei
+Keywords[gl]=cumpreanos, aniversario, vacacións, configurar, opcións
+Keywords[he]=birthday, anniversary, holiday, configure, settings, יום הולדת, הולדת, שנה, יום שנה, חג, חגים, תצורה, הגדרות
+Keywords[hu]=születésnap,évforduló,szabadság,konfigurálás,beállítások
+Keywords[is]=afmæli, frídagar, stillingar, stilla
+Keywords[it]=compleanno, anniversario, vacanze, configura, impostazioni
+Keywords[ja]=誕生日,記念日,休日,設定,設定
+Keywords[ka]=დაბადების დღე,სახელობის დღე,დასვენების დღე,კონფიგურაცია,პარამეტრები
+Keywords[km]=ថ្ងៃ​ខួប​កំណើត,បុណ្យ​ខួប,វិស្សមកាល,កំណត់​រចនាសម្ព័ន្ធ,ការ​កំណត់
+Keywords[lt]=birthday, anniversary, holiday, configure, settings, konfigūruoti, nustatymai, gimtadieniai, išeiginės,sukaktys
+Keywords[mk]=birthday, anniversary, holiday, configure, settings, роденден, годишнина, конфигурирање, конфигурација, поставувања
+Keywords[ms]=tarikh lahir, ulang tahun, cuti, konfigur, seting
+Keywords[nb]=fødselsdag, jubileum, ferie, sette opp, innstillinger
+Keywords[nds]=Geboortsdag,Johrdag,Fierdag,instellen
+Keywords[ne]=जन्मदिन, वार्षिकोत्सव, बिदा, कन्फिगर, सेटिङ
+Keywords[nl]=verjaardag,jubileum,vakantie,instellingen,configuratie,feestdag
+Keywords[nn]=fødselsdag,bursdag,gebursdag,jubileum,ferie,helgedag,merkedag,oppsett,innstillingar
+Keywords[pl]=urodziny,rocznica,rocznice,wakacje,urlop,konfiguracja,ustawienia
+Keywords[pt]=data de nascimento, aniversário, feriado, configurar, configuração
+Keywords[pt_BR]=aniversário,aniversário de casamento, feriados,configurar,configurações
+Keywords[ru]=birthday,anniversary,configure,settings,дни рождения,настройки,праздники,годовщины
+Keywords[sl]=rojstni dan, obletnica, praznik, nastavi, nastavitve
+Keywords[sr]=birthday, anniversary, holiday, configure, settings, рођендан, годишњица, подеси, поставке, подешавања
+Keywords[sr@Latn]=birthday, anniversary, holiday, configure, settings, rođendan, godišnjica, podesi, postavke, podešavanja
+Keywords[sv]=födelsedag,årsdag,helgdag,anpassa,inställningar
+Keywords[ta]=பிறந்தநாள், ஆண்டுவிழா, விடுமுறை, வடிவமைப்பு, அமைப்புகள்
+Keywords[tr]=doğumgünü, evlilik yıldönümü, tatil, yapılandır, ypılandırma
+Keywords[uk]=birthday, anniversary, holiday, configure, settings, день народження, ювілей, свято, налаштування, параметри
+Keywords[zh_CN]=birthday, anniversary, holiday, configure, settings, 周年纪念, 配置, 设置, 假日
diff --git a/kontact/plugins/specialdates/kcmsdsummary.h b/kontact/plugins/specialdates/kcmsdsummary.h
new file mode 100644
index 000000000..60b2ea082
--- /dev/null
+++ b/kontact/plugins/specialdates/kcmsdsummary.h
@@ -0,0 +1,69 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2004 Allen Winter <winter@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 KCMSDSUMMARY_H
+#define KCMSDSUMMARY_H
+
+#include <kcmodule.h>
+
+class QButtonGroup;
+class QCheckBox;
+class QSpinBox;
+
+class KAboutData;
+
+class KCMSDSummary : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMSDSummary( QWidget *parent = 0, const char *name = 0 );
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+ virtual const KAboutData* aboutData() const;
+
+ private slots:
+ void modified();
+ void buttonClicked( int );
+ void customDaysChanged( int );
+
+ private:
+ void initGUI();
+
+ QButtonGroup *mDaysGroup;
+ QButtonGroup *mCalendarGroup;
+ QButtonGroup *mContactGroup;
+ QCheckBox *mShowBirthdaysFromKAB;
+ QCheckBox *mShowBirthdaysFromCal;
+ QCheckBox *mShowAnniversariesFromKAB;
+ QCheckBox *mShowAnniversariesFromCal;
+ QCheckBox *mShowHolidays;
+ QCheckBox *mShowHolidaysFromCal;
+ QCheckBox *mShowSpecialsFromCal;
+ QSpinBox *mCustomDays;
+};
+
+#endif
diff --git a/kontact/plugins/specialdates/sdsummarywidget.cpp b/kontact/plugins/specialdates/sdsummarywidget.cpp
new file mode 100644
index 000000000..721073490
--- /dev/null
+++ b/kontact/plugins/specialdates/sdsummarywidget.cpp
@@ -0,0 +1,637 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2004 Allen Winter <winter@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 <qcursor.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qimage.h>
+#include <qtooltip.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <kabc/stdaddressbook.h>
+#include <korganizer/stdcalendar.h>
+#include <kapplication.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kparts/part.h>
+#include <kpopupmenu.h>
+#include <kstandarddirs.h>
+#include <kurllabel.h>
+#include <libkcal/event.h>
+#include <libkcal/resourcecalendar.h>
+#include <libkcal/resourcelocal.h>
+#include <libkdepim/kpimprefs.h>
+
+#include "core.h"
+#include "plugin.h"
+
+#include "sdsummarywidget.h"
+
+enum SDIncidenceType {
+ IncidenceTypeContact, IncidenceTypeEvent
+};
+enum SDCategory {
+ CategoryBirthday, CategoryAnniversary, CategoryHoliday, CategoryOther
+};
+
+class SDEntry
+{
+ public:
+ SDIncidenceType type;
+ SDCategory category;
+ int yearsOld;
+ int daysTo;
+ QDate date;
+ QString summary;
+ QString desc;
+ int span; // #days in the special occassion.
+ KABC::Addressee addressee;
+
+ bool operator<( const SDEntry &entry ) const
+ {
+ return daysTo < entry.daysTo;
+ }
+};
+
+SDSummaryWidget::SDSummaryWidget( Kontact::Plugin *plugin, QWidget *parent,
+ const char *name )
+ : Kontact::Summary( parent, name ), mPlugin( plugin ), mCalendar( 0 ), mHolidays( 0 )
+{
+ // Create the Summary Layout
+ QVBoxLayout *mainLayout = new QVBoxLayout( this, 3, 3 );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "cookie",
+ KIcon::Desktop, KIcon::SizeMedium );
+
+ QWidget *header = createHeader( this, icon, i18n( "Special Dates" ) );
+ mainLayout->addWidget(header);
+
+ mLayout = new QGridLayout( mainLayout, 7, 6, 3 );
+ mLayout->setRowStretch( 6, 1 );
+
+ // Setup the Addressbook
+ KABC::StdAddressBook *ab = KABC::StdAddressBook::self( true );
+ connect( ab, SIGNAL( addressBookChanged( AddressBook* ) ),
+ this, SLOT( updateView() ) );
+ connect( mPlugin->core(), SIGNAL( dayChanged( const QDate& ) ),
+ this, SLOT( updateView() ) );
+
+ // Setup the Calendar
+ mCalendar = new KCal::CalendarResources( KPimPrefs::timezone() );
+ mCalendar->readConfig();
+
+ KCal::CalendarResourceManager *manager = mCalendar->resourceManager();
+ if ( manager->isEmpty() ) {
+ KConfig config( "korganizerrc" );
+ config.setGroup( "General" );
+ QString fileName = config.readPathEntry( "Active Calendar" );
+
+ QString resourceName;
+ if ( fileName.isEmpty() ) {
+ fileName = locateLocal( "data", "korganizer/std.ics" );
+ resourceName = i18n( "Default KOrganizer resource" );
+ } else {
+ resourceName = i18n( "Active Calendar" );
+ }
+
+ KCal::ResourceCalendar *defaultResource =
+ new KCal::ResourceLocal( fileName );
+
+ defaultResource->setResourceName( resourceName );
+
+ manager->add( defaultResource );
+ manager->setStandardResource( defaultResource );
+ }
+ mCalendar = KOrg::StdCalendar::self();
+ mCalendar->load();
+
+ connect( mCalendar, SIGNAL( calendarChanged() ),
+ this, SLOT( updateView() ) );
+ connect( mPlugin->core(), SIGNAL( dayChanged( const QDate& ) ),
+ this, SLOT( updateView() ) );
+
+ // Update Configuration
+ configUpdated();
+}
+
+void SDSummaryWidget::configUpdated()
+{
+ KConfig config( "kcmsdsummaryrc" );
+
+ config.setGroup( "Days" );
+ mDaysAhead = config.readNumEntry( "DaysToShow", 7 );
+
+ config.setGroup( "EventTypes" );
+ mShowBirthdaysFromKAB =
+ config.readBoolEntry( "ShowBirthdaysFromContacts", true );
+ mShowBirthdaysFromCal =
+ config.readBoolEntry( "ShowBirthdaysFromCalendar", true );
+
+ mShowAnniversariesFromKAB =
+ config.readBoolEntry( "ShowAnniversariesFromContacts", true );
+ mShowAnniversariesFromCal =
+ config.readBoolEntry( "ShowAnniversariesFromCalendar", true );
+
+ mShowHolidays =
+ config.readBoolEntry( "ShowHolidays", true );
+
+ mShowSpecialsFromCal =
+ config.readBoolEntry( "ShowSpecialsFromCalendar", true );
+
+ updateView();
+}
+
+bool SDSummaryWidget::initHolidays()
+{
+ KConfig hconfig( "korganizerrc" );
+ hconfig.setGroup( "Time & Date" );
+ QString location = hconfig.readEntry( "Holidays" );
+ if ( !location.isEmpty() ) {
+ if ( mHolidays ) delete mHolidays;
+ mHolidays = new KHolidays( location );
+ return true;
+ }
+ return false;
+}
+
+// number of days remaining in an Event
+int SDSummaryWidget::span( KCal::Event *event )
+{
+ int span=1;
+ if ( event->isMultiDay() && event->doesFloat() ) {
+ QDate d = event->dtStart().date();
+ if ( d < QDate::currentDate() ) {
+ d = QDate::currentDate();
+ }
+ while ( d < event->dtEnd().date() ) {
+ span++;
+ d=d.addDays( 1 );
+ }
+ }
+ return span;
+}
+
+// day of a multiday Event
+int SDSummaryWidget::dayof( KCal::Event *event, const QDate& date )
+{
+ int dayof=1;
+ QDate d = event->dtStart().date();
+ if ( d < QDate::currentDate() ) {
+ d = QDate::currentDate();
+ }
+ while ( d < event->dtEnd().date() ) {
+ if ( d < date ) {
+ dayof++;
+ }
+ d = d.addDays( 1 );
+ }
+ return dayof;
+}
+
+
+
+void SDSummaryWidget::updateView()
+{
+ mLabels.setAutoDelete( true );
+ mLabels.clear();
+ mLabels.setAutoDelete( false );
+
+ KABC::StdAddressBook *ab = KABC::StdAddressBook::self( true );
+ QValueList<SDEntry> dates;
+ QLabel *label = 0;
+
+ // No reason to show the date year
+ QString savefmt = KGlobal::locale()->dateFormat();
+ KGlobal::locale()->setDateFormat( KGlobal::locale()->
+ dateFormat().replace( 'Y', ' ' ) );
+
+ // Search for Birthdays and Anniversaries in the Addressbook
+ KABC::AddressBook::Iterator it;
+ for ( it = ab->begin(); it != ab->end(); ++it ) {
+ QDate birthday = (*it).birthday().date();
+ if ( birthday.isValid() && mShowBirthdaysFromKAB ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeContact;
+ entry.category = CategoryBirthday;
+ dateDiff( birthday, entry.daysTo, entry.yearsOld );
+
+ entry.date = birthday;
+ entry.addressee = *it;
+ entry.span = 1;
+ if ( entry.daysTo <= mDaysAhead )
+ dates.append( entry );
+ }
+
+ QString anniversaryAsString =
+ (*it).custom( "KADDRESSBOOK" , "X-Anniversary" );
+ if ( !anniversaryAsString.isEmpty() ) {
+ QDate anniversary = QDate::fromString( anniversaryAsString, Qt::ISODate );
+ if ( anniversary.isValid() && mShowAnniversariesFromKAB ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeContact;
+ entry.category = CategoryAnniversary;
+ dateDiff( anniversary, entry.daysTo, entry.yearsOld );
+
+ entry.date = anniversary;
+ entry.addressee = *it;
+ entry.span = 1;
+ if ( entry.daysTo <= mDaysAhead )
+ dates.append( entry );
+ }
+ }
+ }
+
+ // Search for Birthdays, Anniversaries, Holidays, and Special Occasions
+ // in the Calendar
+ QDate dt;
+ QDate currentDate = QDate::currentDate();
+ for ( dt=currentDate;
+ dt<=currentDate.addDays( mDaysAhead - 1 );
+ dt=dt.addDays(1) ) {
+ KCal::Event::List events = mCalendar->events( dt,
+ KCal::EventSortStartDate,
+ KCal::SortDirectionAscending );
+ KCal::Event *ev;
+ KCal::Event::List::ConstIterator it;
+ for ( it=events.begin(); it!=events.end(); ++it ) {
+ ev = *it;
+ if ( !ev->categoriesStr().isEmpty() ) {
+ QStringList::ConstIterator it2;
+ QStringList c = ev->categories();
+ for ( it2=c.begin(); it2!=c.end(); ++it2 ) {
+
+ // Append Birthday Event?
+ if ( mShowBirthdaysFromCal &&
+ ( ( *it2 ).upper() == i18n( "BIRTHDAY" ) ) ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeEvent;
+ entry.category = CategoryBirthday;
+ entry.date = dt;
+ entry.summary = ev->summary();
+ entry.desc = ev->description();
+ dateDiff( ev->dtStart().date(), entry.daysTo, entry.yearsOld );
+ entry.span = 1;
+ dates.append( entry );
+ break;
+ }
+
+ // Append Anniversary Event?
+ if ( mShowAnniversariesFromCal &&
+ ( ( *it2 ).upper() == i18n( "ANNIVERSARY" ) ) ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeEvent;
+ entry.category = CategoryAnniversary;
+ entry.date = dt;
+ entry.summary = ev->summary();
+ entry.desc = ev->description();
+ dateDiff( ev->dtStart().date(), entry.daysTo, entry.yearsOld );
+ entry.span = 1;
+ dates.append( entry );
+ break;
+ }
+
+ // Append Holiday Event?
+ if ( mShowHolidays &&
+ ( ( *it2 ).upper() == i18n( "HOLIDAY" ) ) ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeEvent;
+ entry.category = CategoryHoliday;
+ entry.date = dt;
+ entry.summary = ev->summary();
+ entry.desc = ev->description();
+ dateDiff( dt, entry.daysTo, entry.yearsOld );
+ entry.yearsOld = -1; //ignore age of holidays
+ entry.span = span( ev );
+ if ( entry.span > 1 && dayof( ev, dt ) > 1 ) // skip days 2,3,...
+ break;
+ dates.append( entry );
+ break;
+ }
+
+ // Append Special Occasion Event?
+ if ( mShowSpecialsFromCal &&
+ ( ( *it2 ).upper() == i18n( "SPECIAL OCCASION" ) ) ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeEvent;
+ entry.category = CategoryOther;
+ entry.date = dt;
+ entry.summary = ev->summary();
+ entry.desc = ev->description();
+ dateDiff( dt, entry.daysTo, entry.yearsOld );
+ entry.yearsOld = -1; //ignore age of special occasions
+ entry.span = span( ev );
+ if ( entry.span > 1 && dayof( ev, dt ) > 1 ) // skip days 2,3,...
+ break;
+ dates.append( entry );
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Seach for Holidays
+ if ( mShowHolidays ) {
+ if ( initHolidays() ) {
+ for ( dt=currentDate;
+ dt<=currentDate.addDays( mDaysAhead - 1 );
+ dt=dt.addDays(1) ) {
+ QValueList<KHoliday> holidays = mHolidays->getHolidays( dt );
+ QValueList<KHoliday>::ConstIterator it = holidays.begin();
+ for ( ; it != holidays.end(); ++it ) {
+ SDEntry entry;
+ entry.type = IncidenceTypeEvent;
+ entry.category = ((*it).Category==KHolidays::HOLIDAY)?CategoryHoliday:CategoryOther;
+ entry.date = dt;
+ entry.summary = (*it).text;
+ dateDiff( dt, entry.daysTo, entry.yearsOld );
+ entry.yearsOld = -1; //ignore age of holidays
+ entry.span = 1;
+ dates.append( entry );
+ }
+ }
+ }
+ }
+
+ // Sort, then Print the Special Dates
+ qHeapSort( dates );
+
+ if ( !dates.isEmpty() ) {
+ int counter = 0;
+ QValueList<SDEntry>::Iterator addrIt;
+ QString lines;
+ for ( addrIt = dates.begin(); addrIt != dates.end(); ++addrIt ) {
+ bool makeBold = (*addrIt).daysTo == 0; // i.e., today
+
+ // Pixmap
+ QImage icon_img;
+ QString icon_name;
+ KABC::Picture pic;
+ switch( (*addrIt).category ) { // TODO: better icons
+ case CategoryBirthday:
+ icon_name = "cookie";
+ pic = (*addrIt).addressee.photo();
+ if ( pic.isIntern() && !pic.data().isNull() ) {
+ QImage img = pic.data();
+ if ( img.width() > img.height() ) {
+ icon_img = img.scaleWidth( 32 );
+ } else {
+ icon_img = img.scaleHeight( 32 );
+ }
+ }
+ break;
+ case CategoryAnniversary:
+ icon_name = "kdmconfig";
+ pic = (*addrIt).addressee.photo();
+ if ( pic.isIntern() && !pic.data().isNull() ) {
+ QImage img = pic.data();
+ if ( img.width() > img.height() ) {
+ icon_img = img.scaleWidth( 32 );
+ } else {
+ icon_img = img.scaleHeight( 32 );
+ }
+ }
+ break;
+ case CategoryHoliday:
+ icon_name = "kdmconfig"; break;
+ case CategoryOther:
+ icon_name = "cookie"; break;
+ }
+ label = new QLabel( this );
+ if ( icon_img.isNull() ) {
+ label->setPixmap( KGlobal::iconLoader()->loadIcon( icon_name,
+ KIcon::Small ) );
+ } else {
+ label->setPixmap( icon_img );
+ }
+ label->setMaximumWidth( label->minimumSizeHint().width() );
+ label->setAlignment( AlignVCenter );
+ mLayout->addWidget( label, counter, 0 );
+ mLabels.append( label );
+
+ // Event date
+ QString datestr;
+
+ //Muck with the year -- change to the year 'daysTo' days away
+ int year = currentDate.addDays( (*addrIt).daysTo ).year();
+ QDate sD = QDate::QDate( year,
+ (*addrIt).date.month(), (*addrIt).date.day() );
+
+ if ( (*addrIt).daysTo == 0 ) {
+ datestr = i18n( "Today" );
+ } else if ( (*addrIt).daysTo == 1 ) {
+ datestr = i18n( "Tomorrow" );
+ } else {
+ datestr = KGlobal::locale()->formatDate( sD );
+ }
+ // Print the date span for multiday, floating events, for the
+ // first day of the event only.
+ if ( (*addrIt).span > 1 ) {
+ QString endstr =
+ KGlobal::locale()->formatDate( sD.addDays( (*addrIt).span - 1 ) );
+ datestr += " -\n " + endstr;
+ }
+
+ label = new QLabel( datestr, this );
+ label->setAlignment( AlignLeft | AlignVCenter );
+ mLayout->addWidget( label, counter, 1 );
+ mLabels.append( label );
+ if ( makeBold ) {
+ QFont font = label->font();
+ font.setBold( true );
+ label->setFont( font );
+ }
+
+ // Countdown
+ label = new QLabel( this );
+ if ( (*addrIt).daysTo == 0 ) {
+ label->setText( i18n( "now" ) );
+ } else {
+ label->setText( i18n( "in 1 day", "in %n days", (*addrIt).daysTo ) );
+ }
+
+ label->setAlignment( AlignLeft | AlignVCenter );
+ mLayout->addWidget( label, counter, 2 );
+ mLabels.append( label );
+
+ // What
+ QString what;
+ switch( (*addrIt).category ) {
+ case CategoryBirthday:
+ what = i18n( "Birthday" ); break;
+ case CategoryAnniversary:
+ what = i18n( "Anniversary" ); break;
+ case CategoryHoliday:
+ what = i18n( "Holiday" ); break;
+ case CategoryOther:
+ what = i18n( "Special Occasion" ); break;
+ }
+ label = new QLabel( this );
+ label->setText( what );
+ label->setAlignment( AlignLeft | AlignVCenter );
+ mLayout->addWidget( label, counter, 3 );
+ mLabels.append( label );
+
+ // Description
+ if ( (*addrIt).type == IncidenceTypeContact ) {
+ KURLLabel *urlLabel = new KURLLabel( this );
+ urlLabel->installEventFilter( this );
+ urlLabel->setURL( (*addrIt).addressee.uid() );
+ urlLabel->setText( (*addrIt).addressee.realName() );
+ urlLabel->setTextFormat( Qt::RichText );
+ mLayout->addWidget( urlLabel, counter, 4 );
+ mLabels.append( urlLabel );
+
+ connect( urlLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( mailContact( const QString& ) ) );
+ connect( urlLabel, SIGNAL( rightClickedURL( const QString& ) ),
+ this, SLOT( popupMenu( const QString& ) ) );
+ } else {
+ label = new QLabel( this );
+ label->setText( (*addrIt).summary );
+ label->setTextFormat( Qt::RichText );
+ mLayout->addWidget( label, counter, 4 );
+ mLabels.append( label );
+ if ( !(*addrIt).desc.isEmpty() ) {
+ QToolTip::add( label, (*addrIt).desc );
+ }
+ }
+
+ // Age
+ if ( (*addrIt).category == CategoryBirthday ||
+ (*addrIt).category == CategoryAnniversary ) {
+ label = new QLabel( this );
+ if ( (*addrIt).yearsOld <= 0 ) {
+ label->setText( "" );
+ } else {
+ label->setText( i18n( "one year", "%n years", (*addrIt).yearsOld ) );
+ }
+ label->setAlignment( AlignLeft | AlignVCenter );
+ mLayout->addWidget( label, counter, 5 );
+ mLabels.append( label );
+ }
+
+ counter++;
+ }
+ } else {
+ label = new QLabel(
+ i18n( "No special dates within the next 1 day",
+ "No special dates pending within the next %n days",
+ mDaysAhead ), this, "nothing to see" );
+ label->setAlignment( AlignHCenter | AlignVCenter );
+ mLayout->addMultiCellWidget( label, 0, 0, 0, 4 );
+ mLabels.append( label );
+ }
+
+ for ( label = mLabels.first(); label; label = mLabels.next() )
+ label->show();
+
+ KGlobal::locale()->setDateFormat( savefmt );
+}
+
+void SDSummaryWidget::mailContact( const QString &uid )
+{
+ KABC::StdAddressBook *ab = KABC::StdAddressBook::self( true );
+ QString email = ab->findByUid( uid ).fullEmail();
+
+ kapp->invokeMailer( email, QString::null );
+}
+
+void SDSummaryWidget::viewContact( const QString &uid )
+{
+ if ( !mPlugin->isRunningStandalone() )
+ mPlugin->core()->selectPlugin( "kontact_kaddressbookplugin" );
+ else
+ mPlugin->bringToForeground();
+
+ DCOPRef dcopCall( "kaddressbook", "KAddressBookIface" );
+ dcopCall.send( "showContactEditor(QString)", uid );
+}
+
+void SDSummaryWidget::popupMenu( const QString &uid )
+{
+ KPopupMenu popup( this );
+ popup.insertItem( KGlobal::iconLoader()->loadIcon( "kmail", KIcon::Small ),
+ i18n( "Send &Mail" ), 0 );
+ popup.insertItem( KGlobal::iconLoader()->loadIcon( "kaddressbook", KIcon::Small ),
+ i18n( "View &Contact" ), 1 );
+
+ switch ( popup.exec( QCursor::pos() ) ) {
+ case 0:
+ mailContact( uid );
+ break;
+ case 1:
+ viewContact( uid );
+ break;
+ }
+}
+
+bool SDSummaryWidget::eventFilter( QObject *obj, QEvent* e )
+{
+ if ( obj->inherits( "KURLLabel" ) ) {
+ KURLLabel* label = static_cast<KURLLabel*>( obj );
+ if ( e->type() == QEvent::Enter )
+ emit message( i18n( "Mail to:\"%1\"" ).arg( label->text() ) );
+ if ( e->type() == QEvent::Leave )
+ emit message( QString::null );
+ }
+
+ return Kontact::Summary::eventFilter( obj, e );
+}
+
+void SDSummaryWidget::dateDiff( const QDate &date, int &days, int &years )
+{
+ QDate currentDate;
+ QDate eventDate;
+
+ if ( QDate::leapYear( date.year() ) && date.month() == 2 && date.day() == 29 ) {
+ currentDate = QDate( date.year(), QDate::currentDate().month(), QDate::currentDate().day() );
+ if ( !QDate::leapYear( QDate::currentDate().year() ) )
+ eventDate = QDate( date.year(), date.month(), 28 ); // celebrate one day earlier ;)
+ else
+ eventDate = QDate( date.year(), date.month(), date.day() );
+ } else {
+ currentDate = QDate( 0, QDate::currentDate().month(), QDate::currentDate().day() );
+ eventDate = QDate( 0, date.month(), date.day() );
+ }
+
+ int offset = currentDate.daysTo( eventDate );
+ if ( offset < 0 ) {
+ days = 365 + offset;
+ years = QDate::currentDate().year() + 1 - date.year();
+ } else {
+ days = offset;
+ years = QDate::currentDate().year() - date.year();
+ }
+}
+
+QStringList SDSummaryWidget::configModules() const
+{
+ return QStringList( "kcmsdsummary.desktop" );
+}
+
+#include "sdsummarywidget.moc"
diff --git a/kontact/plugins/specialdates/sdsummarywidget.h b/kontact/plugins/specialdates/sdsummarywidget.h
new file mode 100644
index 000000000..74cd08942
--- /dev/null
+++ b/kontact/plugins/specialdates/sdsummarywidget.h
@@ -0,0 +1,84 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2004 Allen Winter <winter@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 SDSUMMARYWIDGET_H
+#define SDSUMMARYWIDGET_H
+
+#include <qptrlist.h>
+#include <qwidget.h>
+
+#include <libkcal/calendarresources.h>
+#include <libkholidays/kholidays.h>
+
+#include "summary.h"
+
+namespace Kontact {
+ class Plugin;
+}
+
+class QGridLayout;
+class QLabel;
+
+class SDSummaryWidget : public Kontact::Summary
+{
+ Q_OBJECT
+
+ public:
+ SDSummaryWidget( Kontact::Plugin *plugin, QWidget *parent,
+ const char *name = 0 );
+
+ QStringList configModules() const;
+ void configUpdated();
+ void updateSummary( bool force = false ) { Q_UNUSED( force ); updateView(); }
+
+ protected:
+ virtual bool eventFilter( QObject *obj, QEvent* e );
+
+ private slots:
+ void updateView();
+ void popupMenu( const QString &uid );
+ void mailContact( const QString &uid );
+ void viewContact( const QString &uid );
+
+ private:
+ int span( KCal::Event *event );
+ int dayof( KCal::Event *event, const QDate &date );
+ bool initHolidays();
+ void dateDiff( const QDate &date, int &days, int &years );
+ QGridLayout *mLayout;
+ QPtrList<QLabel> mLabels;
+ Kontact::Plugin *mPlugin;
+ KCal::CalendarResources *mCalendar;
+ int mDaysAhead;
+ bool mShowBirthdaysFromKAB;
+ bool mShowBirthdaysFromCal;
+ bool mShowAnniversariesFromKAB;
+ bool mShowAnniversariesFromCal;
+ bool mShowHolidays;
+ bool mShowSpecialsFromCal;
+
+ KHolidays::KHolidays *mHolidays;
+};
+
+#endif
diff --git a/kontact/plugins/specialdates/specialdates_plugin.cpp b/kontact/plugins/specialdates/specialdates_plugin.cpp
new file mode 100644
index 000000000..f0149fd9a
--- /dev/null
+++ b/kontact/plugins/specialdates/specialdates_plugin.cpp
@@ -0,0 +1,70 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2004-2005 Allen Winter <winter@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 <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kparts/componentfactory.h>
+
+#include "core.h"
+#include "sdsummarywidget.h"
+
+#include "specialdates_plugin.h"
+
+typedef KGenericFactory< SpecialdatesPlugin, Kontact::Core > SpecialdatesPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_specialdatesplugin,
+ SpecialdatesPluginFactory( "kontact_specialdatesplugin" ) )
+
+SpecialdatesPlugin::SpecialdatesPlugin( Kontact::Core *core, const char *name, const QStringList& )
+ : Kontact::Plugin( core, core, name ),
+ mAboutData( 0 )
+{
+ setInstance( SpecialdatesPluginFactory::instance() );
+}
+
+SpecialdatesPlugin::~SpecialdatesPlugin()
+{
+}
+
+Kontact::Summary *SpecialdatesPlugin::createSummaryWidget( QWidget *parentWidget )
+{
+ return new SDSummaryWidget( this, parentWidget );
+}
+
+const KAboutData *SpecialdatesPlugin::aboutData()
+{
+ if ( !mAboutData ) {
+ mAboutData = new KAboutData( "specialdates",
+ I18N_NOOP( "Special Dates Summary" ),
+ "1.0",
+ I18N_NOOP( "Kontact Special Dates Summary" ),
+ KAboutData::License_LGPL,
+ I18N_NOOP( "(c) 2004-2005 The KDE PIM Team" ) );
+ mAboutData->addAuthor( "Allen Winter", "Current Maintainer", "winter@kde.org" );
+ mAboutData->addAuthor( "Tobias Koenig", "", "tokoe@kde.org" );
+ mAboutData->setProductName( "kontact/specialdates" );
+ }
+
+ return mAboutData;
+}
diff --git a/kontact/plugins/specialdates/specialdates_plugin.h b/kontact/plugins/specialdates/specialdates_plugin.h
new file mode 100644
index 000000000..6534afb5c
--- /dev/null
+++ b/kontact/plugins/specialdates/specialdates_plugin.h
@@ -0,0 +1,52 @@
+/*
+ This file is part of Kontact.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+ Copyright (c) 2004 Allen Winter <winter@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 SPECIALDATES_PLUGIN_H
+#define SPECIALDATES_PLUGIN_H
+
+#include "plugin.h"
+
+class SDSummaryWidget;
+
+class SpecialdatesPlugin : public Kontact::Plugin
+{
+ public:
+ SpecialdatesPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ ~SpecialdatesPlugin();
+
+ int weight() const { return 310; }
+
+ const KAboutData *aboutData();
+
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parentWidget );
+
+ protected:
+ virtual KParts::ReadOnlyPart *createPart() { return false; }
+
+ private:
+ KAboutData *mAboutData;
+
+};
+
+#endif
diff --git a/kontact/plugins/specialdates/specialdatesplugin.desktop b/kontact/plugins/specialdates/specialdatesplugin.desktop
new file mode 100644
index 000000000..bceb13ada
--- /dev/null
+++ b/kontact/plugins/specialdates/specialdatesplugin.desktop
@@ -0,0 +1,92 @@
+[Desktop Entry]
+Type=Service
+Icon=cookie
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_specialdatesplugin
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPluginHasPart=false
+X-KDE-KontactPluginHasSummary=true
+
+X-KDE-PluginInfo-Name=kontact_specialdatesplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Name=Special Dates
+Name[af]=Spesiale datums
+Name[ar]=التواريخ المرقومة
+Name[bg]=Специални случаи
+Name[br]=Deiziadoù dibar
+Name[ca]=Dates especials
+Name[cs]=Speciální data
+Name[da]=Særlige datoer
+Name[de]=Besondere Termine
+Name[el]=Σημαντικές ημερομηνίες
+Name[eo]=Specialaj Datoj
+Name[es]=Fechas especiales
+Name[et]=Tähtpäevad
+Name[eu]=Data bereziak
+Name[fa]=تاریخهای ویژه
+Name[fi]=Erikoispäivät
+Name[fr]=Dates importantes
+Name[fy]=Spesjale datums
+Name[ga]=Dátaí Speisialta
+Name[gl]=Datas Especiais
+Name[he]=תאריכים מיוחדים
+Name[hu]=Fontos dátumok
+Name[is]=Sérstakir dagar
+Name[it]=Date speciali
+Name[ja]=特別な日
+Name[ka]=განსაკუტრებული თარიღები
+Name[kk]=Ерекше күндер
+Name[km]=ថ្ងៃ​ពិសេស
+Name[lt]=Ypatingos datos
+Name[mk]=Специјални датуми
+Name[ms]=Tarikh Khusus
+Name[nb]=Spesielle datoer
+Name[nds]=Besünner Daag
+Name[ne]=विशेष मिति
+Name[nl]=Speciale data
+Name[nn]=Spesielle datoar
+Name[pl]=Daty specjalne
+Name[pt]=Datas Especiais
+Name[pt_BR]=Datas Especiais
+Name[ru]=Особые даты
+Name[sk]=Špeciálne dátumy
+Name[sl]=Posebni datumi
+Name[sr]=Посебни датуми
+Name[sr@Latn]=Posebni datumi
+Name[sv]=Speciella datum
+Name[ta]=விசேஷ தேதிகள்
+Name[th]=วันพิเศษ
+Name[tr]=Özel Tarihler
+Name[uk]=Особливі дати
+Name[uz]=Maxsus kunlar
+Name[uz@cyrillic]=Махсус кунлар
+Name[zh_CN]=特殊日期
+Name[zh_TW]=特殊日期
+Comment=Special Dates Component
+Comment[bg]=Обобщение на специалните случаи
+Comment[ca]=Component de dates especials
+Comment[da]=Komponent til særlige datoer
+Comment[de]=Komponente für Übersicht über besondere Termine
+Comment[el]=Συστατικό σημαντικών ημερομηνιών
+Comment[es]=Componente de fechas especiales
+Comment[et]=Tähtpäevade plugin
+Comment[fr]=Composant des dates importantes
+Comment[is]=Eining fyrir sérstaka daga
+Comment[it]=Componente per le date speciali
+Comment[ja]=特別な日コンポーネント
+Comment[km]=សមាសភាគ​កាលបរិច្ឆេទ​ពិសេស
+Comment[nds]=Komponent för besünner Daten
+Comment[nl]=Component voor overzicht van speciale data
+Comment[pl]=Składnik dat specjalnych
+Comment[pt_BR]=Componente de Datas Especiais
+Comment[ru]=Особые даты
+Comment[sr]=Компонента посебних датума
+Comment[sr@Latn]=Komponenta posebnih datuma
+Comment[sv]=Speciella datumkomponent
+Comment[tr]=Özel Tarihler Bileşeni
+Comment[zh_CN]=特殊日期组件
+Comment[zh_TW]=特殊日期組件
diff --git a/kontact/plugins/summary/Makefile.am b/kontact/plugins/summary/Makefile.am
new file mode 100644
index 000000000..ab83c72a5
--- /dev/null
+++ b/kontact/plugins/summary/Makefile.am
@@ -0,0 +1,26 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir)/certmanager/lib \
+ -I$(top_srcdir)/libkdepim \
+ -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_summaryplugin.la kcm_kontactsummary.la
+libkontact_summaryplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_summaryplugin_la_LIBADD = -lkutils \
+ $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS) \
+ $(top_builddir)/libkdepim/libkdepim.la $(top_builddir)/libkpimidentities/libkpimidentities.la
+
+libkontact_summaryplugin_la_SOURCES = summaryview_plugin.cpp summaryview_part.cpp dropwidget.cpp
+
+kcm_kontactsummary_la_SOURCES = kcmkontactsummary.cpp
+kcm_kontactsummary_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) \
+ -avoid-version -no-undefined
+kcm_kontactsummary_la_LIBADD = $(LIB_KDEUI) $(LIB_KUTILS)
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = summaryplugin.desktop
+
+kde_services_DATA = kcmkontactsummary.desktop
+
+kpartrcdir = $(kde_datadir)/kontactsummary
+kpartrc_DATA = kontactsummary_part.rc
diff --git a/kontact/plugins/summary/dropwidget.cpp b/kontact/plugins/summary/dropwidget.cpp
new file mode 100644
index 000000000..0d6aa5305
--- /dev/null
+++ b/kontact/plugins/summary/dropwidget.cpp
@@ -0,0 +1,44 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (C) 2004 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 <qdragobject.h>
+
+#include "dropwidget.h"
+
+DropWidget::DropWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ setAcceptDrops( true );
+}
+
+void DropWidget::dragEnterEvent( QDragEnterEvent *event )
+{
+ event->accept( QTextDrag::canDecode( event ) );
+}
+
+void DropWidget::dropEvent( QDropEvent *event )
+{
+ int alignment = ( event->pos().x() < (width() / 2) ? Qt::AlignLeft : Qt::AlignRight );
+ alignment |= ( event->pos().y() < (height() / 2) ? Qt::AlignTop : Qt::AlignBottom );
+ emit summaryWidgetDropped( this, event->source(), alignment );
+}
+
+#include "dropwidget.moc"
diff --git a/kontact/plugins/summary/dropwidget.h b/kontact/plugins/summary/dropwidget.h
new file mode 100644
index 000000000..7cde7f5e0
--- /dev/null
+++ b/kontact/plugins/summary/dropwidget.h
@@ -0,0 +1,42 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (C) 2004 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 DROP_WIDGET_H
+#define DROP_WIDGET_H
+
+#include <qwidget.h>
+
+class DropWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ DropWidget( QWidget *parent, const char *name = 0 );
+
+ signals:
+ void summaryWidgetDropped( QWidget *target, QWidget *widget, int alignment );
+
+ protected:
+ virtual void dragEnterEvent( QDragEnterEvent* );
+ virtual void dropEvent( QDropEvent* );
+};
+
+#endif
diff --git a/kontact/plugins/summary/kcmkontactsummary.cpp b/kontact/plugins/summary/kcmkontactsummary.cpp
new file mode 100644
index 000000000..d52d991fc
--- /dev/null
+++ b/kontact/plugins/summary/kcmkontactsummary.cpp
@@ -0,0 +1,189 @@
+/*
+ This file is part of KDE 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.
+*/
+
+#include <kaboutdata.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <plugin.h>
+#include <kplugininfo.h>
+#include <ktrader.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+
+#include "kcmkontactsummary.h"
+
+#include <kdepimmacros.h>
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_kontactsummary( QWidget *parent, const char * ) {
+ return new KCMKontactSummary( parent, "kcmkontactsummary" );
+ }
+}
+
+class PluginItem : public QCheckListItem
+{
+ public:
+ PluginItem( KPluginInfo *info, KListView *parent )
+ : QCheckListItem( parent, QString::null, QCheckListItem::CheckBox ),
+ mInfo( info )
+ {
+ QPixmap pm = KGlobal::iconLoader()->loadIcon( mInfo->icon(), KIcon::Small );
+ setPixmap( 0, pm );
+ }
+
+ KPluginInfo* pluginInfo() const
+ {
+ return mInfo;
+ }
+
+ virtual QString text( int column ) const
+ {
+ if ( column == 0 )
+ return mInfo->name();
+ else if ( column == 1 )
+ return mInfo->comment();
+ else
+ return QString::null;
+ }
+
+ private:
+ KPluginInfo *mInfo;
+};
+
+PluginView::PluginView( QWidget *parent, const char *name )
+ : KListView( parent, name )
+{
+ addColumn( i18n( "Name" ) );
+ setAllColumnsShowFocus( true );
+ setFullWidth( true );
+}
+
+PluginView::~PluginView()
+{
+}
+
+KCMKontactSummary::KCMKontactSummary( QWidget *parent, const char *name )
+ : KCModule( parent, name )
+{
+ QVBoxLayout *layout = new QVBoxLayout( this, 0, KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "Here you can select which summary plugins to have visible in your summary view." ), this );
+ layout->addWidget( label );
+
+ mPluginView = new PluginView( this );
+ layout->addWidget( mPluginView );
+
+ layout->setStretchFactor( mPluginView, 1 );
+
+ connect( mPluginView, SIGNAL( clicked( QListViewItem* ) ),
+ this, SLOT( itemClicked( QListViewItem* ) ) );
+ load();
+
+ KAboutData *about = new KAboutData( I18N_NOOP( "kontactsummary" ),
+ I18N_NOOP( "KDE Kontact Summary" ),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP( "(c), 2004 Tobias Koenig" ) );
+
+ about->addAuthor( "Tobias Koenig", 0, "tokoe@kde.org" );
+ setAboutData( about );
+}
+
+void KCMKontactSummary::load()
+{
+ KTrader::OfferList offers = KTrader::self()->query(
+ QString::fromLatin1( "Kontact/Plugin" ),
+ QString( "[X-KDE-KontactPluginVersion] == %1" ).arg( KONTACT_PLUGIN_VERSION ) );
+
+ QStringList activeSummaries;
+
+ KConfig config( "kontact_summaryrc" );
+ if ( !config.hasKey( "ActiveSummaries" ) ) {
+ activeSummaries << "kontact_kaddressbookplugin";
+ activeSummaries << "kontact_specialdatesplugin";
+ activeSummaries << "kontact_korganizerplugin";
+ activeSummaries << "kontact_todoplugin";
+ activeSummaries << "kontact_kpilotplugin";
+ activeSummaries << "kontact_weatherplugin";
+ activeSummaries << "kontact_newstickerplugin";
+ } else {
+ activeSummaries = config.readListEntry( "ActiveSummaries" );
+ }
+
+ mPluginView->clear();
+ mPluginList.clear();
+
+ mPluginList = KPluginInfo::fromServices( offers, &config, "Plugins" );
+ KPluginInfo::List::Iterator it;
+ for ( it = mPluginList.begin(); it != mPluginList.end(); ++it ) {
+ (*it)->load();
+
+ if ( !(*it)->isPluginEnabled() )
+ continue;
+
+ QVariant var = (*it)->property( "X-KDE-KontactPluginHasSummary" );
+ if ( !var.isValid() )
+ continue;
+
+ if ( var.toBool() == true ) {
+ PluginItem *item = new PluginItem( *it, mPluginView );
+
+ if ( activeSummaries.find( (*it)->pluginName() ) != activeSummaries.end() )
+ item->setOn( true );
+ }
+ }
+}
+
+void KCMKontactSummary::save()
+{
+ QStringList activeSummaries;
+
+ QListViewItemIterator it( mPluginView, QListViewItemIterator::Checked );
+ while ( it.current() ) {
+ PluginItem *item = static_cast<PluginItem*>( it.current() );
+ activeSummaries.append( item->pluginInfo()->pluginName() );
+ ++it;
+ }
+
+ KConfig config( "kontact_summaryrc" );
+ config.writeEntry( "ActiveSummaries", activeSummaries );
+}
+
+void KCMKontactSummary::defaults()
+{
+ emit changed( true );
+}
+
+void KCMKontactSummary::itemClicked( QListViewItem* )
+{
+ emit changed( true );
+}
+
+#include "kcmkontactsummary.moc"
diff --git a/kontact/plugins/summary/kcmkontactsummary.desktop b/kontact/plugins/summary/kcmkontactsummary.desktop
new file mode 100644
index 000000000..5442d5c0b
--- /dev/null
+++ b/kontact/plugins/summary/kcmkontactsummary.desktop
@@ -0,0 +1,79 @@
+[Desktop Entry]
+Icon=kontact_summary
+Type=Service
+ServiceTypes=KCModule
+
+X-KDE-ModuleType=Library
+X-KDE-Library=kontactsummary
+X-KDE-FactoryName=kontactsummary
+X-KDE-ParentApp=kontact_summaryplugin
+X-KDE-ParentComponents=kontact_summaryplugin
+X-KDE-CfgDlgHierarchy=KontactSummary
+
+Name=Summary View Items
+Name[bg]=Обобщение
+Name[ca]=Vista resum d'elements
+Name[da]=Elementer i opsummeringsvisning
+Name[de]=Elemente der Zusammenfassungsansicht
+Name[el]=Αντικείμενα προβολής σύνοψης
+Name[es]=Elementos de la vista de sumario
+Name[et]=Kokkuvõttevaate elemendid
+Name[it]=Elementi vista sommario
+Name[ja]=要約ビューの項目
+Name[km]=ធាតុ​ទិដ្ឋភាព​សង្ខេប
+Name[nds]=Översicht-Indrääg
+Name[nl]=Overzichtsweergave-items
+Name[pl]=Elementy widoku podsumowania
+Name[sr]=Ставке приказа сажетка
+Name[sr@Latn]=Stavke prikaza sažetka
+Name[sv]=Objekt i översiktsvy
+Name[tr]=Özet Görünüm Ögeleri
+Name[zh_CN]=摘要视图项目
+Name[zh_TW]=摘要檢視項目
+Comment=General Configuration of Kontact's Summary View
+Comment[af]=Algemene opstelling van Kontact se opsomming aansig
+Comment[bg]=Настройка на обобщението
+Comment[bs]=Opšte podešavanje Kontactovog prozora Sažetak
+Comment[ca]=Configuració general de la vista de resum del Kontact
+Comment[cs]=Obecné nastavení souhrnného pohledu pro Kontact
+Comment[da]=Generel indstilling af Kontact's sammendragsvisning
+Comment[de]=Allgemeine Einstellungen für die Übersichtsansicht von Kontact
+Comment[el]=Γενικές ρυθμίσεις της Προβολής Σύνοψης του Kontact
+Comment[es]=Configuración general de la vista del resumen de Kontact
+Comment[et]=Kontacti kokkuvõttevaate üldised seadistused
+Comment[eu]=Kontact-en laburpen ikuspegiaren konfigurazio orokorra
+Comment[fa]=پیکربندی عمومی نمای خلاصۀ Kontact
+Comment[fi]=Kontactin yhteenvetonäkymän yleiset asetukset
+Comment[fr]=Configuration générale de la vue résumée de Kontact
+Comment[fy]=Algemiene ynstellings fan Kontact's oersichtswerjefte
+Comment[gl]=Configuración xeral para a vista de resumo de Kontact
+Comment[hu]=A Kontact áttekintő nézetének beállításai
+Comment[is]=Almennar stillingar fyrir Kontact yfirlitssýn
+Comment[it]=Configurazione generale della vista sommario di Kontact
+Comment[ja]=Kontact の要約表示の一般的な設定
+Comment[ka]=Kontact დაიჯესტის ხედის ზოგადი პარამეტრები
+Comment[kk]=Тұжырымдаманың жалпы параметрлері
+Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​ទូទៅ​នៃ​ទិដ្ឋភាព​សង្ខេប​របស់ Kontact
+Comment[lt]=Kontact Santraukos vaizdo bendrasis konfigūravimas
+Comment[mk]=Општа конфигурација на прегледот на Контакт
+Comment[ms]=Konfigurasi Am Paparan Ringkasan Kontact
+Comment[nb]=Generelt oppsett av Kontact's sammendragsoversikt
+Comment[nds]=Allgemeen Instellen för de Översichtansicht von Kontact
+Comment[ne]=सम्पर्कको सारांश दृश्यको साधारण कन्फिगरेसन
+Comment[nl]=Algemene instellingen van Kontact's overzichtsweergave
+Comment[nn]=Generelt oppsett av samandragsvisinga i Kontact
+Comment[pl]=Ogólna konfiguracja widoku podsumowania w Kontact
+Comment[pt]=Configuração Geral da Vista Sumária do Kontact
+Comment[pt_BR]=Configuração Geral da Visão de Resumo do Kontact
+Comment[ru]=Настройка сводок Kontact
+Comment[sk]=Všeobecné nastavenie súhrnu Kontact
+Comment[sl]=Splošne nastavitve za prikaz povzetka v Kontract
+Comment[sr]=Опште подешавање Kontact-овог приказа сажетка
+Comment[sr@Latn]=Opšte podešavanje Kontact-ovog prikaza sažetka
+Comment[sv]=Allmän inställning av Kontacts översiktsvy
+Comment[ta]=கான்டாக்கின் சுருக்க காட்சியின் பொது கட்டமைப்பு
+Comment[tg]=Танзимотҳои умумии дайджести Kontact
+Comment[tr]=Kontact'ın Özet Görünümü için Genel Yapılandırma
+Comment[uk]=Загальні параметри підсумків Kontact
+Comment[zh_CN]=Kontact 概览视图的常规配置
+Comment[zh_TW]=Kontacts 摘要檢視的一般設定
diff --git a/kontact/plugins/summary/kcmkontactsummary.h b/kontact/plugins/summary/kcmkontactsummary.h
new file mode 100644
index 000000000..3c6c6d05d
--- /dev/null
+++ b/kontact/plugins/summary/kcmkontactsummary.h
@@ -0,0 +1,62 @@
+/*
+ This file is part of KDE 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 KCMKONTACTSUMMARY_H
+#define KCMKONTACTSUMMARY_H
+
+#include <kcmodule.h>
+#include <klistview.h>
+
+class KPluginInfo;
+
+class PluginView : public KListView
+{
+ Q_OBJECT
+
+ public:
+ PluginView( QWidget *parent, const char *name = 0 );
+ ~PluginView();
+};
+
+class KCMKontactSummary : public KCModule
+{
+ Q_OBJECT
+
+ public:
+ KCMKontactSummary( QWidget *parent = 0, const char *name = 0 );
+
+ virtual void load();
+ virtual void save();
+ virtual void defaults();
+
+ private slots:
+ void itemClicked( QListViewItem* );
+
+ private:
+ PluginView *mPluginView;
+
+ KPluginInfo::List mPluginList;
+};
+
+#endif
diff --git a/kontact/plugins/summary/kontactsummary_part.rc b/kontact/plugins/summary/kontactsummary_part.rc
new file mode 100644
index 000000000..9c121426c
--- /dev/null
+++ b/kontact/plugins/summary/kontactsummary_part.rc
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!DOCTYPE gui>
+<gui name="kontactsummary" version="3">
+ <MenuBar>
+ <Menu name="settings"><text>&amp;Settings</text>
+ <Action name="summaryview_configure" group="settings_configure"/>
+ </Menu>
+ </MenuBar>
+</gui>
diff --git a/kontact/plugins/summary/summaryplugin.desktop b/kontact/plugins/summary/summaryplugin.desktop
new file mode 100644
index 000000000..d2aa1c956
--- /dev/null
+++ b/kontact/plugins/summary/summaryplugin.desktop
@@ -0,0 +1,97 @@
+[Desktop Entry]
+Type=Service
+Icon=kontact_summary
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkontact_summaryplugin
+X-KDE-KontactPluginVersion=6
+
+X-KDE-PluginInfo-Name=kontact_summaryplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=LGPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Summary View Component
+Comment[bg]=Обобщение
+Comment[ca]=Component de vista resum
+Comment[da]=Komponent for opsummeringsvisning
+Comment[de]=Zusammenfassungsansicht-Komponente
+Comment[el]=Συστατικό προβολής σύνοψης
+Comment[es]=Componente Vista de resumen
+Comment[et]=Kokkuvõttevaate plugin
+Comment[fr]=Composant de la vue résumée
+Comment[is]=Eining fyrir yfirlitssýn
+Comment[it]=Componente vista sommario
+Comment[ja]=要約ビューコンポーネント
+Comment[km]=សមាសភាគ​ទិដ្ឋភាព​សង្ខេប
+Comment[nds]=Översicht-Komponent
+Comment[nl]=Overzichtsweergaveitem
+Comment[pl]=Składnik widoku podsumowania
+Comment[ru]=Просмотр сводок
+Comment[sr]=Компонента приказа сажетка
+Comment[sr@Latn]=Komponenta prikaza sažetka
+Comment[sv]=Översiktsvykomponent
+Comment[tr]=Özet Görünüm Bileşeni
+Comment[zh_CN]=摘要视图组件
+Comment[zh_TW]=摘要檢視組件
+Name=Summary
+Name[af]=Opsomming
+Name[ar]=الموجز
+Name[bg]=Обобщение
+Name[br]=Diverrañ
+Name[bs]=Sažetak
+Name[ca]=Resum
+Name[cs]=Souhrn
+Name[cy]=Crynodeb
+Name[da]=Opsummering
+Name[de]=Übersicht
+Name[el]=Σύνοψη
+Name[eo]=Resumo
+Name[es]=Resumen
+Name[et]=Kokkuvõte
+Name[eu]=Laburpena
+Name[fa]=خلاصه
+Name[fi]=Yhteenveto
+Name[fr]=Résumé
+Name[fy]=Oersicht
+Name[ga]=Achoimre
+Name[gl]=Resumo
+Name[he]=תקציר
+Name[hi]=सारांश
+Name[hu]=Áttekintő
+Name[is]=Yfirlit
+Name[it]=Sommario
+Name[ja]=要約
+Name[ka]=დაიჯესტი
+Name[kk]=Тұжырым
+Name[km]=សង្ខេប
+Name[lt]=Santrauka
+Name[mk]=Преглед
+Name[ms]=Ringkasan
+Name[nb]=Sammendrag
+Name[nds]=Översicht
+Name[ne]=सारांश
+Name[nl]=Overzicht
+Name[nn]=Samandrag
+Name[pl]=Podsumowanie
+Name[pt]=Resumo
+Name[pt_BR]=Resumo
+Name[ro]=Sumar
+Name[ru]=Сводки
+Name[se]=Čoahkkáigeassu
+Name[sk]=Súhrn
+Name[sl]=Povzetek
+Name[sr]=Сажетак
+Name[sr@Latn]=Sažetak
+Name[sv]=Översikt
+Name[ta]=சுருக்கம்
+Name[tg]=Дайджест
+Name[th]=หน้าสรุป
+Name[tr]=Özet
+Name[uk]=Зведення
+Name[uz]=Hisobot
+Name[uz@cyrillic]=Ҳисобот
+Name[zh_CN]=概览
+Name[zh_TW]=摘要
+#Always last
+InitialPreference=0
diff --git a/kontact/plugins/summary/summaryview_part.cpp b/kontact/plugins/summary/summaryview_part.cpp
new file mode 100644
index 000000000..9597de674
--- /dev/null
+++ b/kontact/plugins/summary/summaryview_part.cpp
@@ -0,0 +1,434 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (C) 2003 Sven Lüppken <sven@kde.org>
+ Copyright (C) 2003 Tobias König <tokoe@kde.org>
+ Copyright (C) 2003 Daniel Molkentin <molkentin@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 <qframe.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtimer.h>
+
+#include <dcopclient.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdcopservicestarter.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kservice.h>
+#include <ktrader.h>
+#include <kstandarddirs.h>
+#include <qscrollview.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kcmultidialog.h>
+
+#include <kparts/componentfactory.h>
+#include <kparts/event.h>
+
+#include <libkpimidentities/identity.h>
+#include <libkpimidentities/identitymanager.h>
+
+#include <infoextension.h>
+#include <sidebarextension.h>
+
+#include "plugin.h"
+#include "summary.h"
+
+#include "summaryview_part.h"
+
+#include "broadcaststatus.h"
+using KPIM::BroadcastStatus;
+
+namespace Kontact
+{
+ class MainWindow;
+}
+
+SummaryViewPart::SummaryViewPart( Kontact::Core *core, const char*,
+ const KAboutData *aboutData,
+ QObject *parent, const char *name )
+ : KParts::ReadOnlyPart( parent, name ),
+ mCore( core ), mFrame( 0 ), mConfigAction( 0 )
+{
+ setInstance( new KInstance( aboutData ) );
+
+ loadLayout();
+
+ initGUI( core );
+
+ connect( kapp, SIGNAL( kdisplayPaletteChanged() ), SLOT( slotAdjustPalette() ) );
+ slotAdjustPalette();
+
+ setDate( QDate::currentDate() );
+ connect( mCore, SIGNAL( dayChanged( const QDate& ) ),
+ SLOT( setDate( const QDate& ) ) );
+
+ KParts::InfoExtension *info = new KParts::InfoExtension( this, "Summary" );
+ connect( this, SIGNAL( textChanged( const QString& ) ),
+ info, SIGNAL( textChanged( const QString& ) ) );
+
+ mConfigAction = new KAction( i18n( "&Configure Summary View..." ),
+ "configure", 0, this,
+ SLOT( slotConfigure() ), actionCollection(),
+ "summaryview_configure" );
+
+ setXMLFile( "kontactsummary_part.rc" );
+
+ QTimer::singleShot( 0, this, SLOT( slotTextChanged() ) );
+}
+
+SummaryViewPart::~SummaryViewPart()
+{
+ saveLayout();
+}
+
+bool SummaryViewPart::openFile()
+{
+ kdDebug(5006) << "SummaryViewPart:openFile()" << endl;
+ return true;
+}
+
+void SummaryViewPart::partActivateEvent( KParts::PartActivateEvent *event )
+{
+ // inform the plugins that the part has been activated so that they can
+ // update the displayed information
+ if ( event->activated() && ( event->part() == this ) ) {
+ updateSummaries();
+ }
+
+ KParts::ReadOnlyPart::partActivateEvent( event );
+}
+
+void SummaryViewPart::updateSummaries()
+{
+ QMap<QString, Kontact::Summary*>::Iterator it;
+ for ( it = mSummaries.begin(); it != mSummaries.end(); ++it )
+ it.data()->updateSummary( false );
+}
+
+void SummaryViewPart::updateWidgets()
+{
+ mMainWidget->setUpdatesEnabled( false );
+
+ delete mFrame;
+
+ KPIM::IdentityManager idm( true, this );
+ const KPIM::Identity &id = idm.defaultIdentity();
+
+ QString currentUser = i18n( "Summary for %1" ).arg( id.fullName() );
+ mUsernameLabel->setText( QString::fromLatin1( "<b>%1</b>" ).arg( currentUser ) );
+
+ mSummaries.clear();
+
+ mFrame = new DropWidget( mMainWidget );
+ connect( mFrame, SIGNAL( summaryWidgetDropped( QWidget*, QWidget*, int ) ),
+ this, SLOT( summaryWidgetMoved( QWidget*, QWidget*, int ) ) );
+
+ mMainLayout->insertWidget( 2, mFrame );
+
+ QStringList activeSummaries;
+
+ KConfig config( "kontact_summaryrc" );
+ if ( !config.hasKey( "ActiveSummaries" ) ) {
+ activeSummaries << "kontact_kmailplugin";
+ activeSummaries << "kontact_specialdatesplugin";
+ activeSummaries << "kontact_korganizerplugin";
+ activeSummaries << "kontact_todoplugin";
+ activeSummaries << "kontact_newstickerplugin";
+ } else {
+ activeSummaries = config.readListEntry( "ActiveSummaries" );
+ }
+
+ // Collect all summary widgets with a summaryHeight > 0
+ QStringList loadedSummaries;
+
+ QValueList<Kontact::Plugin*> plugins = mCore->pluginList();
+ QValueList<Kontact::Plugin*>::ConstIterator end = plugins.end();
+ QValueList<Kontact::Plugin*>::ConstIterator it = plugins.begin();
+ for ( ; it != end; ++it ) {
+ Kontact::Plugin *plugin = *it;
+ if ( activeSummaries.find( plugin->identifier() ) == activeSummaries.end() )
+ continue;
+
+ Kontact::Summary *summary = plugin->createSummaryWidget( mFrame );
+ if ( summary ) {
+ if ( summary->summaryHeight() > 0 ) {
+ mSummaries.insert( plugin->identifier(), summary );
+
+ connect( summary, SIGNAL( message( const QString& ) ),
+ BroadcastStatus::instance(), SLOT( setStatusMsg( const QString& ) ) );
+ connect( summary, SIGNAL( summaryWidgetDropped( QWidget*, QWidget*, int ) ),
+ this, SLOT( summaryWidgetMoved( QWidget*, QWidget*, int ) ) );
+
+ if ( !mLeftColumnSummaries.contains( plugin->identifier() ) &&
+ !mRightColumnSummaries.contains( plugin->identifier() ) ) {
+ mLeftColumnSummaries.append( plugin->identifier() );
+ }
+
+ loadedSummaries.append( plugin->identifier() );
+ } else {
+ summary->hide();
+ }
+ }
+ }
+
+ // Remove all unavailable summary widgets
+ {
+ QStringList::Iterator strIt;
+ for ( strIt = mLeftColumnSummaries.begin(); strIt != mLeftColumnSummaries.end(); ++strIt ) {
+ if ( loadedSummaries.find( *strIt ) == loadedSummaries.end() ) {
+ strIt = mLeftColumnSummaries.remove( strIt );
+ --strIt;
+ }
+ }
+ for ( strIt = mRightColumnSummaries.begin(); strIt != mRightColumnSummaries.end(); ++strIt ) {
+ if ( loadedSummaries.find( *strIt ) == loadedSummaries.end() ) {
+ strIt = mRightColumnSummaries.remove( strIt );
+ --strIt;
+ }
+ }
+ }
+
+ // Add vertical line between the two rows of summary widgets.
+ QFrame *vline = new QFrame( mFrame );
+ vline->setFrameStyle( QFrame::VLine | QFrame::Plain );
+
+ QHBoxLayout *layout = new QHBoxLayout( mFrame );
+
+ mLeftColumn = new QVBoxLayout( layout, KDialog::spacingHint() );
+ layout->addWidget( vline );
+ mRightColumn = new QVBoxLayout( layout, KDialog::spacingHint() );
+
+
+ QStringList::Iterator strIt;
+ for ( strIt = mLeftColumnSummaries.begin(); strIt != mLeftColumnSummaries.end(); ++strIt ) {
+ if ( mSummaries.find( *strIt ) != mSummaries.end() )
+ mLeftColumn->addWidget( mSummaries[ *strIt ] );
+ }
+
+ for ( strIt = mRightColumnSummaries.begin(); strIt != mRightColumnSummaries.end(); ++strIt ) {
+ if ( mSummaries.find( *strIt ) != mSummaries.end() )
+ mRightColumn->addWidget( mSummaries[ *strIt ] );
+ }
+
+ mFrame->show();
+
+ mMainWidget->setUpdatesEnabled( true );
+ mMainWidget->update();
+
+ mLeftColumn->addStretch();
+ mRightColumn->addStretch();
+}
+
+void SummaryViewPart::summaryWidgetMoved( QWidget *target, QWidget *widget, int alignment )
+{
+ if ( target == widget )
+ return;
+
+ if ( target == mFrame ) {
+ if ( mLeftColumn->findWidget( widget ) == -1 && mRightColumn->findWidget( widget ) == -1 )
+ return;
+ } else {
+ if ( mLeftColumn->findWidget( target ) == -1 && mRightColumn->findWidget( target ) == -1 ||
+ mLeftColumn->findWidget( widget ) == -1 && mRightColumn->findWidget( widget ) == -1 )
+ return;
+ }
+
+ if ( mLeftColumn->findWidget( widget ) != -1 ) {
+ mLeftColumn->remove( widget );
+ mLeftColumnSummaries.remove( widgetName( widget ) );
+ } else if ( mRightColumn->findWidget( widget ) != -1 ) {
+ mRightColumn->remove( widget );
+ mRightColumnSummaries.remove( widgetName( widget ) );
+ }
+
+ if ( target == mFrame ) {
+ int pos = 0;
+
+ if ( alignment & Qt::AlignTop )
+ pos = 0;
+
+ if ( alignment & Qt::AlignLeft ) {
+ if ( alignment & Qt::AlignBottom )
+ pos = mLeftColumnSummaries.count();
+
+ mLeftColumn->insertWidget( pos, widget );
+ mLeftColumnSummaries.insert( mLeftColumnSummaries.at( pos ), widgetName( widget ) );
+ } else {
+ if ( alignment & Qt::AlignBottom )
+ pos = mRightColumnSummaries.count();
+
+ mRightColumn->insertWidget( pos, widget );
+ mRightColumnSummaries.insert( mRightColumnSummaries.at( pos ), widgetName( widget ) );
+ }
+
+ return;
+ }
+
+ int targetPos = mLeftColumn->findWidget( target );
+ if ( targetPos != -1 ) {
+ if ( alignment == Qt::AlignBottom )
+ targetPos++;
+
+ mLeftColumn->insertWidget( targetPos, widget );
+ mLeftColumnSummaries.insert( mLeftColumnSummaries.at( targetPos ), widgetName( widget ) );
+ } else {
+ targetPos = mRightColumn->findWidget( target );
+
+ if ( alignment == Qt::AlignBottom )
+ targetPos++;
+
+ mRightColumn->insertWidget( targetPos, widget );
+ mRightColumnSummaries.insert( mRightColumnSummaries.at( targetPos ), widgetName( widget ) );
+ }
+}
+
+void SummaryViewPart::slotTextChanged()
+{
+ emit textChanged( i18n( "What's next?" ) );
+}
+
+void SummaryViewPart::slotAdjustPalette()
+{
+ mMainWidget->setPaletteBackgroundColor( kapp->palette().active().base() );
+}
+
+void SummaryViewPart::setDate( const QDate& newDate )
+{
+ QString date( "<b>%1</b>" );
+ date = date.arg( KGlobal::locale()->formatDate( newDate ) );
+ mDateLabel->setText( date );
+}
+
+void SummaryViewPart::slotConfigure()
+{
+ KCMultiDialog dlg( mMainWidget, "ConfigDialog", true );
+
+ QStringList modules = configModules();
+ modules.prepend( "kcmkontactsummary.desktop" );
+ connect( &dlg, SIGNAL( configCommitted() ),
+ this, SLOT( updateWidgets() ) );
+
+ QStringList::ConstIterator strIt;
+ for ( strIt = modules.begin(); strIt != modules.end(); ++strIt )
+ dlg.addModule( *strIt );
+
+ dlg.exec();
+}
+
+QStringList SummaryViewPart::configModules() const
+{
+ QStringList modules;
+
+ QMap<QString, Kontact::Summary*>::ConstIterator it;
+ for ( it = mSummaries.begin(); it != mSummaries.end(); ++it ) {
+ QStringList cm = it.data()->configModules();
+ QStringList::ConstIterator strIt;
+ for ( strIt = cm.begin(); strIt != cm.end(); ++strIt )
+ if ( !(*strIt).isEmpty() && !modules.contains( *strIt ) )
+ modules.append( *strIt );
+ }
+
+ return modules;
+}
+
+void SummaryViewPart::initGUI( Kontact::Core *core )
+{
+ QScrollView *sv = new QScrollView( core );
+
+ sv->setResizePolicy( QScrollView::AutoOneFit );
+ sv->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+ sv->setHScrollBarMode( QScrollView::AlwaysOff );
+
+ mMainWidget = new QFrame( sv->viewport() );
+ sv->addChild( mMainWidget );
+ mMainWidget->setFrameStyle( QFrame::Panel | QFrame::Sunken );
+ sv->setFocusPolicy( QWidget::StrongFocus );
+ setWidget( sv );
+
+ mMainLayout = new QVBoxLayout( mMainWidget,KDialog::marginHint(),
+ KDialog::spacingHint() );
+
+ QHBoxLayout *hbl = new QHBoxLayout( mMainLayout );
+ mUsernameLabel = new QLabel( mMainWidget );
+ hbl->addWidget( mUsernameLabel );
+ mDateLabel = new QLabel( mMainWidget );
+ mDateLabel->setAlignment( AlignRight );
+ hbl->addWidget( mDateLabel );
+
+ QFrame *hline = new QFrame( mMainWidget );
+ hline->setFrameStyle( QFrame::HLine | QFrame::Plain );
+ mMainLayout->insertWidget( 1, hline );
+
+ mFrame = new DropWidget( mMainWidget );
+ mMainLayout->insertWidget( 2, mFrame );
+
+ connect( mFrame, SIGNAL( summaryWidgetDropped( QWidget*, QWidget*, int ) ),
+ this, SLOT( summaryWidgetMoved( QWidget*, QWidget*, int ) ) );
+
+ updateWidgets();
+}
+
+void SummaryViewPart::loadLayout()
+{
+ KConfig config( "kontact_summaryrc" );
+
+ if ( !config.hasKey( "LeftColumnSummaries" ) ) {
+ mLeftColumnSummaries << "kontact_korganizerplugin";
+ mLeftColumnSummaries << "kontact_todoplugin";
+ mLeftColumnSummaries << "kontact_kaddressbookplugin";
+ mLeftColumnSummaries << "kontact_specialdatesplugin";
+ } else {
+ mLeftColumnSummaries = config.readListEntry( "LeftColumnSummaries" );
+ }
+
+ if ( !config.hasKey( "RightColumnSummaries" ) ) {
+ mRightColumnSummaries << "kontact_newstickerplugin";
+ } else {
+ mRightColumnSummaries = config.readListEntry( "RightColumnSummaries" );
+ }
+}
+
+void SummaryViewPart::saveLayout()
+{
+ KConfig config( "kontact_summaryrc" );
+
+ config.writeEntry( "LeftColumnSummaries", mLeftColumnSummaries );
+ config.writeEntry( "RightColumnSummaries", mRightColumnSummaries );
+
+ config.sync();
+}
+
+QString SummaryViewPart::widgetName( QWidget *widget ) const
+{
+ QMap<QString, Kontact::Summary*>::ConstIterator it;
+ for ( it = mSummaries.begin(); it != mSummaries.end(); ++it ) {
+ if ( it.data() == widget )
+ return it.key();
+ }
+
+ return QString::null;
+}
+
+#include "summaryview_part.moc"
diff --git a/kontact/plugins/summary/summaryview_part.h b/kontact/plugins/summary/summaryview_part.h
new file mode 100644
index 000000000..f98d7d065
--- /dev/null
+++ b/kontact/plugins/summary/summaryview_part.h
@@ -0,0 +1,103 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (C) 2003 Sven Lüppken <sven@kde.org>
+ Copyright (C) 2003 Tobias König <tokoe@kde.org>
+ Copyright (C) 2003 Daniel Molkentin <molkentin@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 SUMMARYVIEW_PART_H
+#define SUMMARYVIEW_PART_H
+
+#include <qdatetime.h>
+#include <qmap.h>
+
+#include <kparts/part.h>
+
+#include "core.h"
+#include "dropwidget.h"
+
+namespace Kontact
+{
+ class Plugin;
+ class Summary;
+}
+
+namespace KParts
+{
+ class PartActivateEvent;
+}
+
+class QFrame;
+class QLabel;
+class QGridLayout;
+class KAction;
+class KCMultiDialog;
+
+class SummaryViewPart : public KParts::ReadOnlyPart
+{
+ Q_OBJECT
+
+ public:
+ SummaryViewPart( Kontact::Core *core, const char *widgetName,
+ const KAboutData *aboutData,
+ QObject *parent = 0, const char *name = 0 );
+ ~SummaryViewPart();
+
+ public slots:
+ void slotTextChanged();
+ void slotAdjustPalette();
+ void setDate( const QDate& newDate );
+ void updateSummaries();
+
+ signals:
+ void textChanged( const QString& );
+
+ protected:
+ virtual bool openFile();
+ virtual void partActivateEvent( KParts::PartActivateEvent *event );
+
+ protected slots:
+ void slotConfigure();
+ void updateWidgets();
+ void summaryWidgetMoved( QWidget *target, QWidget *widget, int alignment );
+
+ private:
+ void initGUI( Kontact::Core *core );
+ void loadLayout();
+ void saveLayout();
+ QString widgetName( QWidget* ) const;
+
+ QStringList configModules() const;
+
+ QMap<QString, Kontact::Summary*> mSummaries;
+ Kontact::Core *mCore;
+ DropWidget *mFrame;
+ QFrame *mMainWidget;
+ QVBoxLayout *mMainLayout;
+ QVBoxLayout *mLeftColumn;
+ QVBoxLayout *mRightColumn;
+ QLabel *mUsernameLabel;
+ QLabel *mDateLabel;
+ KAction *mConfigAction;
+
+ QStringList mLeftColumnSummaries;
+ QStringList mRightColumnSummaries;
+};
+
+#endif
diff --git a/kontact/plugins/summary/summaryview_plugin.cpp b/kontact/plugins/summary/summaryview_plugin.cpp
new file mode 100644
index 000000000..a73faf7e0
--- /dev/null
+++ b/kontact/plugins/summary/summaryview_plugin.cpp
@@ -0,0 +1,123 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Sven L�ppken <sven@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 "summaryview_plugin.h"
+#include "core.h"
+#include "summaryview_part.h"
+
+#include <dcopref.h>
+#include <kgenericfactory.h>
+#include <kparts/componentfactory.h>
+#include <kaboutdata.h>
+#include <kaction.h>
+
+#include <qpopupmenu.h>
+
+typedef KGenericFactory< SummaryView, Kontact::Core > SummaryViewFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_summaryplugin,
+ SummaryViewFactory( "kontact_summaryplugin" ) )
+
+SummaryView::SummaryView( Kontact::Core *core, const char *name, const QStringList& )
+ : Kontact::Plugin( core, core, name),
+ mAboutData( 0 ), mPart( 0 )
+{
+ setInstance( SummaryViewFactory::instance() );
+
+ mSyncAction = new KSelectAction( i18n( "Synchronize All" ), "reload", 0, this,
+ SLOT( doSync() ), actionCollection(),
+ "kontact_summary_sync" );
+ connect( mSyncAction, SIGNAL( activated( const QString& ) ), this, SLOT( syncAccount( const QString& ) ) );
+ connect( mSyncAction->popupMenu(), SIGNAL( aboutToShow() ), this, SLOT( fillSyncActionSubEntries() ) );
+
+ insertSyncAction( mSyncAction );
+ fillSyncActionSubEntries();
+}
+
+void SummaryView::fillSyncActionSubEntries()
+{
+ QStringList menuItems;
+ menuItems.append( i18n("All") );
+
+ DCOPRef ref( "kmail", "KMailIface" );
+ DCOPReply reply = ref.call( "accounts" );
+
+ if ( reply.isValid() )
+ {
+ const QStringList accounts = reply;
+ menuItems += accounts;
+ }
+ mSyncAction->clear();
+ mSyncAction->setItems( menuItems );
+}
+
+void SummaryView::syncAccount( const QString& account )
+{
+ const QString acc = account == i18n("All") ? QString() : account;
+ DCOPRef ref( "kmail", "KMailIface" );
+ ref.send( "checkAccount", acc );
+ fillSyncActionSubEntries();
+}
+
+SummaryView::~SummaryView()
+{
+}
+
+void SummaryView::doSync()
+{
+ if ( mPart )
+ mPart->updateSummaries();
+
+ const QValueList<Kontact::Plugin*> pluginList = core()->pluginList();
+ for ( QValueList<Kontact::Plugin*>::ConstIterator it = pluginList.begin(), end = pluginList.end();
+ it != end; ++it ) {
+ // execute all sync actions but our own
+ QPtrList<KAction> *actions = (*it)->syncActions();
+ for ( QPtrList<KAction>::Iterator jt = actions->begin(), end = actions->end(); jt != end; ++jt ) {
+ if ( *jt != mSyncAction )
+ (*jt)->activate();
+ }
+ }
+ fillSyncActionSubEntries();
+}
+
+KParts::ReadOnlyPart *SummaryView::createPart()
+{
+ mPart = new SummaryViewPart( core(), "summarypartframe", aboutData(),
+ this, "summarypart" );
+ return mPart;
+}
+
+const KAboutData *SummaryView::aboutData()
+{
+ if ( !mAboutData ) {
+ mAboutData = new KAboutData( "kontactsummary", I18N_NOOP("Kontact Summary"),
+ "1.1",
+ I18N_NOOP("Kontact Summary View"),
+ KAboutData::License_LGPL,
+ I18N_NOOP("(c) 2003 The Kontact developers" ) );
+ mAboutData->addAuthor( "Sven Lueppken", "", "sven@kde.org" );
+ mAboutData->addAuthor( "Cornelius Schumacher", "", "schumacher@kde.org" );
+ mAboutData->addAuthor( "Tobias Koenig", "", "tokoe@kde.org" );
+ mAboutData->setProductName( "kontact/summary" );
+ }
+
+ return mAboutData;
+}
+
+#include "summaryview_plugin.moc"
diff --git a/kontact/plugins/summary/summaryview_plugin.h b/kontact/plugins/summary/summaryview_plugin.h
new file mode 100644
index 000000000..9093a1b34
--- /dev/null
+++ b/kontact/plugins/summary/summaryview_plugin.h
@@ -0,0 +1,62 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (C) 2003 Sven L�ppken <sven@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 SUMMARYVIEW_PLUGIN_H
+#define SUMMARYVIEW_PLUGIN_H
+#include "plugin.h"
+
+#include <klocale.h>
+#include <kparts/part.h>
+
+#include <qmap.h>
+
+class KSelectAction;
+
+class SummaryViewPart;
+
+class SummaryView : public Kontact::Plugin
+{
+ Q_OBJECT
+
+ public:
+ SummaryView( Kontact::Core *core, const char *name, const QStringList& );
+ ~SummaryView();
+
+ int weight() const { return 100; }
+
+ const KAboutData *aboutData();
+
+ protected:
+ virtual KParts::ReadOnlyPart* createPart();
+
+ private slots:
+
+ void doSync();
+ void syncAccount( const QString& account );
+ void fillSyncActionSubEntries();
+
+ private:
+ KAboutData *mAboutData;
+ SummaryViewPart *mPart;
+ KSelectAction *mSyncAction;
+};
+
+#endif
diff --git a/kontact/plugins/test/Makefile.am b/kontact/plugins/test/Makefile.am
new file mode 100644
index 000000000..3fbac9eb3
--- /dev/null
+++ b/kontact/plugins/test/Makefile.am
@@ -0,0 +1,20 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces $(all_includes)
+
+kde_module_LTLIBRARIES = libkptestplugin.la
+libkptestplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkptestplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS)
+
+libkptestplugin_la_SOURCES = test_plugin.cpp test_part.cpp kaddressbookiface.stub
+
+kaddressbookiface_DIR = $(top_srcdir)/kaddressbook
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kptestplugin.desktop
+
+rc_DATA = kptestplugin.rc
+rcdir = $(kde_datadir)/kptestplugin
+
+kpartrc_DATA = testpartui.rc
+kpartrcdir = $(kde_datadir)/testpart
diff --git a/kontact/plugins/test/kptestplugin.desktop b/kontact/plugins/test/kptestplugin.desktop
new file mode 100644
index 000000000..17a3e52e9
--- /dev/null
+++ b/kontact/plugins/test/kptestplugin.desktop
@@ -0,0 +1,113 @@
+[Desktop Entry]
+Type=Service
+Icon=konsole
+ServiceTypes=Kontact/Plugin,KPluginInfo
+
+X-KDE-Library=libkptestplugin
+X-KDE-KontactPluginVersion=6
+
+X-KDE-PluginInfo-Name=kptestplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-EnabledByDefault=false
+
+Comment=Kontact Test Plugin
+Comment[af]=Kontact toets inprop module
+Comment[be]=Тэставае дапаўненне Кантакту
+Comment[bg]=Приставка за проба
+Comment[bs]=Kontact testni dodatak
+Comment[ca]=Endollable de prova per a Kontact
+Comment[cy]=Ategyn Prawf Kontact
+Comment[da]=Kontact Test-plugin
+Comment[de]=Test-Modul für Kontact
+Comment[el]=Δοκιμαστικό πρόσθετο του Kontact
+Comment[eo]=Kontact-Testkromaĵo
+Comment[es]=Plugin de prueba para Kontact
+Comment[et]=Kontacti testplugin
+Comment[eu]=Kontact-en proba plugin-a
+Comment[fa]=وصلۀ آزمون Kontact
+Comment[fi]=Kontactin testiliitännäinen
+Comment[fr]=Module de test pour Kontact
+Comment[fy]=Kontact Test-plugin
+Comment[gl]=Extensión de Proba para Kontact
+Comment[he]=תוסף ניסיון עבור Kontact
+Comment[hi]=कॉन्टेक्ट जांच प्लगइन
+Comment[hu]=Kontact tesztmodul
+Comment[is]=Kontact prufu íforrit
+Comment[it]=Plugin test Kontact
+Comment[ja]=Kontact テストプラグイン
+Comment[ka]=Kontact სატესტო მოდული
+Comment[kk]=Сынақ модулі
+Comment[km]=កម្មវិធី​ជំនួយ​ការ​សាកល្បង​ក្នុង Kontact
+Comment[lt]=Kontact bandymo priedas
+Comment[mk]=Приклучок за тест на Контакт
+Comment[ms]=Plugin Ujian Kontact
+Comment[nb]=Kontact test-programtillegg
+Comment[nds]=Test-Moduul för Kontact
+Comment[ne]=परीक्षण प्लगइनमा सम्पर्क गर्नुहोस्
+Comment[nl]=Kontact Test-plugin
+Comment[nn]=Kontact, test-programtillegg
+Comment[pl]=Wtyczka Kontact do testowania
+Comment[pt]='Plugin' de Teste do Kontact
+Comment[pt_BR]=Plug-in para Teste do Kontact
+Comment[ro]=Modul de test Kontact
+Comment[ru]=Проверочный модуль Kontact
+Comment[se]=Kontact, geahččalanlassemoduvla
+Comment[sl]=Preizkusni vstavek za Kontact
+Comment[sr]=Пробни прикључак Kontact-а
+Comment[sr@Latn]=Probni priključak Kontact-a
+Comment[sv]=Kontact-testinsticksprogram
+Comment[ta]=பரிசோதனை சொருகுப்பொருளை தொடர்பு கொள்
+Comment[tg]=Модули матнии Kontact
+Comment[tr]=Kontact Test Eklentisi
+Comment[uk]=Тестовий втулок Kontact
+Comment[uz]=Kontact uchun sinash plagini
+Comment[uz@cyrillic]=Kontact учун синаш плагини
+Comment[zh_CN]=Kontact Test 插件
+Comment[zh_TW]=Kontact 測試外掛程式
+Name=TestPlugin
+Name[af]=Toets inprop module
+Name[be]=Тэставае дапаўненне
+Name[bg]=Приставка за тестване
+Name[ca]=Endollable de prova
+Name[cy]=AtegynPrawf
+Name[de]=TestModul
+Name[el]=Πρόσθετο ελέγχου
+Name[eo]=Testo-kromaĵo
+Name[fa]=وصلۀ آزمون
+Name[fr]=Module de test
+Name[fy]=Test-plugin
+Name[he]=תוסף ניסיון
+Name[hi]=टेस्ट-प्लगइन
+Name[hr]=Probni dodatak
+Name[hu]=Tesztmodul
+Name[is]=Prufu íforrit
+Name[it]=Plugin Test
+Name[ja]=テストプラグイン
+Name[ka]=სატესტო მოდული
+Name[kk]=Сынақ модулі
+Name[km]=កម្មវិធី​ជំនួយ​ការ​សាកល្បង
+Name[mk]=Приклучок за тест
+Name[ms]=Plugin Ujian
+Name[nb]=Test-programtillegg
+Name[nds]=Testmoduul
+Name[ne]=परीक्षण प्लगइन
+Name[nl]=Test-plugin
+Name[nn]=Test-programtillegg
+Name[nso]=Plugin ya Teko
+Name[pl]=Wtyczka testowa
+Name[pt_BR]=Plug-in de Teste
+Name[ro]=Modul de test
+Name[ru]=Проверочный модуль
+Name[se]=Geahččalan-lassemoduvla
+Name[sk]=TestModul
+Name[sl]=Preizkusni vstavek
+Name[sr]=Пробни прикључак
+Name[sr@Latn]=Probni priključak
+Name[sv]=Testinsticksprogram
+Name[ta]=சோதனை சொருகுப்பொருள்
+Name[tg]=Модули матнӣ
+Name[tr]=Test Eklentisi
+Name[uk]=Тестовий втулок
+Name[ven]=Lingani Plugin
+Name[zh_CN]=Test 插件
+Name[zh_TW]=測試外掛程式
diff --git a/kontact/plugins/test/kptestplugin.rc b/kontact/plugins/test/kptestplugin.rc
new file mode 100644
index 000000000..0931d6c90
--- /dev/null
+++ b/kontact/plugins/test/kptestplugin.rc
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE gui>
+<gui name="kptestplugin" version="1">
+<MenuBar>
+ <Menu name="edit"><Text>&amp;Edit</Text>
+ <Action name="edit_test"/>
+ </Menu>
+</MenuBar>
+</gui>
+
diff --git a/kontact/plugins/test/test_part.cpp b/kontact/plugins/test/test_part.cpp
new file mode 100644
index 000000000..6477d1420
--- /dev/null
+++ b/kontact/plugins/test/test_part.cpp
@@ -0,0 +1,117 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 "test_part.h"
+#include "kaddressbookiface_stub.h"
+
+#include <qtextedit.h>
+#include <qcombobox.h>
+
+#include "sidebarextension.h"
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <dcopclient.h>
+#include <kdcopservicestarter.h>
+#include <ktrader.h>
+#include <kservice.h>
+
+
+TestPart::TestPart(QObject *parent, const char *name) // ## parentWidget
+ : KParts::ReadOnlyPart(parent, name)
+{
+ setInstance( new KInstance("testpart") ); // ## memleak
+ m_edit = new QTextEdit;
+ setWidget(m_edit);
+ setXMLFile("testpartui.rc");
+ new KAction( "new contact (test)", 0, this, SLOT( newContact() ), actionCollection(), "test_deleteevent" );
+ m_kab_stub = 0L;
+
+ new KParts::SideBarExtension(new QComboBox(this), this, "sbe");
+
+ kapp->dcopClient()->setNotifications( true );
+ connect( kapp->dcopClient(), SIGNAL( applicationRemoved( const QCString&)),
+ this, SLOT( unregisteredFromDCOP( const QCString& )) );
+}
+
+TestPart::~TestPart()
+{
+ kapp->dcopClient()->setNotifications( false );
+ delete m_kab_stub;
+}
+
+void TestPart::newContact()
+{
+ if ( !connectToAddressBook() )
+ return;
+
+ kdDebug(5602) << "Calling newContact" << endl;
+ m_kab_stub->newContact();
+
+ // If critical call: test that it worked ok
+ if ( !m_kab_stub->ok() ) {
+ kdDebug(5602) << "Communication problem - ERROR" << endl;
+ // TODO handle the error
+ }
+}
+
+bool TestPart::connectToAddressBook()
+{
+ if ( !m_kab_stub )
+ {
+ QString error;
+ QCString dcopService;
+ int result = KDCOPServiceStarter::self()->findServiceFor( "DCOP/AddressBook", QString::null, QString::null, &error, &dcopService );
+ if ( result != 0 ) {
+ // You might want to show "error" (if not empty) here, using e.g. KMessageBox
+ return false;
+ }
+ // TODO document the required named for the dcop interfaces e.g. "CalendarIface".
+ QCString dcopObjectId = "KAddressBookIface";
+ m_kab_stub = new KAddressBookIface_stub(kapp->dcopClient(), dcopService, dcopObjectId);
+ }
+ return m_kab_stub != 0L;
+}
+
+void TestPart::unregisteredFromDCOP( const QCString& appId )
+{
+ if ( m_kab_stub && m_kab_stub->app() == appId )
+ {
+ // Delete the stub so that the next time we need the addressbook,
+ // we'll know that we need to start a new one.
+ delete m_kab_stub;
+ m_kab_stub = 0L;
+ }
+}
+
+bool TestPart::openFile()
+{
+ m_edit->setText(m_file);
+ return true;
+}
+
+#include "test_part.moc"
diff --git a/kontact/plugins/test/test_part.h b/kontact/plugins/test/test_part.h
new file mode 100644
index 000000000..8f2a927c1
--- /dev/null
+++ b/kontact/plugins/test/test_part.h
@@ -0,0 +1,61 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 TEST_PART_H
+#define TEST_PART_H
+
+
+
+#include <kparts/part.h>
+
+class QTextEdit;
+class KAddressBookIface_stub;
+
+class TestPart : public KParts::ReadOnlyPart
+{
+ Q_OBJECT
+
+public:
+
+ TestPart(QObject *parent=0, const char *name=0);
+ ~TestPart();
+
+protected:
+
+ virtual bool openFile();
+ bool connectToAddressBook();
+
+protected slots:
+
+ void newContact();
+ void unregisteredFromDCOP( const QCString& );
+
+private:
+
+ QTextEdit *m_edit;
+ KAddressBookIface_stub *m_kab_stub;
+
+};
+
+
+#endif
diff --git a/kontact/plugins/test/test_plugin.cpp b/kontact/plugins/test/test_plugin.cpp
new file mode 100644
index 000000000..62bd74bd2
--- /dev/null
+++ b/kontact/plugins/test/test_plugin.cpp
@@ -0,0 +1,61 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 <kmessagebox.h>
+#include <kaction.h>
+#include <kgenericfactory.h>
+#include <kstatusbar.h>
+
+#include "core.h"
+
+#include "test_plugin.h"
+#include "test_part.h"
+
+typedef KGenericFactory< TestPlugin, Kontact::Core > TestPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkptestplugin, TestPluginFactory( "kptestplugin" ) )
+
+TestPlugin::TestPlugin(Kontact::Core *_core, const char *name, const QStringList &)
+ : Kontact::Plugin(_core, _core, name)
+{
+ setInstance(TestPluginFactory::instance());
+
+ insertNewAction(new KAction("Test", 0, this, SLOT(slotTestMenu()), actionCollection(), "edit_test"));
+
+ setXMLFile("kptestplugin.rc");
+}
+
+TestPlugin::~TestPlugin()
+{
+}
+
+void TestPlugin::slotTestMenu()
+{
+ core()->statusBar()->message("Test menu activated");
+}
+
+KParts::Part* TestPlugin::createPart()
+{
+ return new TestPart(this, "testpart");
+}
+
+#include "test_plugin.moc"
diff --git a/kontact/plugins/test/test_plugin.h b/kontact/plugins/test/test_plugin.h
new file mode 100644
index 000000000..35b60283d
--- /dev/null
+++ b/kontact/plugins/test/test_plugin.h
@@ -0,0 +1,51 @@
+/*
+ This file is part of KDE Kontact.
+
+ Copyright (c) 2001 Matthias Hoelzer-Kluepfel <mhk@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 TEST_PLUGIN_H
+#define TEST_PLUGIN_H
+
+
+#include "plugin.h"
+
+
+class TestPart;
+
+
+class TestPlugin : public Kontact::Plugin
+{
+ Q_OBJECT
+
+public:
+
+ TestPlugin(Kontact::Core *core, const char *name, const QStringList &);
+ ~TestPlugin();
+
+protected:
+ KParts::Part* createPart();
+
+private slots:
+
+ void slotTestMenu();
+};
+
+#endif
diff --git a/kontact/plugins/test/testpartui.rc b/kontact/plugins/test/testpartui.rc
new file mode 100644
index 000000000..ad5c6764d
--- /dev/null
+++ b/kontact/plugins/test/testpartui.rc
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!DOCTYPE gui>
+<gui name="testpart" version="1">
+<MenuBar>
+ <Menu name="edit"><Text>&amp;Edit</Text>
+ <Action name="test_deleteevent"/>
+ </Menu>
+</MenuBar>
+</gui>
+
diff --git a/kontact/plugins/weather/Makefile.am b/kontact/plugins/weather/Makefile.am
new file mode 100644
index 000000000..dc547a0ce
--- /dev/null
+++ b/kontact/plugins/weather/Makefile.am
@@ -0,0 +1,13 @@
+INCLUDES = -I$(top_srcdir)/kontact/interfaces -I$(top_srcdir)/libkdepim -I$(top_srcdir) $(all_includes)
+
+kde_module_LTLIBRARIES = libkontact_weatherplugin.la
+libkontact_weatherplugin_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkontact_weatherplugin_la_LIBADD = $(top_builddir)/kontact/interfaces/libkpinterfaces.la $(LIB_KPARTS) $(top_builddir)/libkdepim/libkdepim.la
+
+libkontact_weatherplugin_la_SOURCES = weather_plugin.cpp summarywidget.cpp \
+ summarywidget.skel
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)/kontact
+service_DATA = weatherplugin.desktop
diff --git a/kontact/plugins/weather/summarywidget.cpp b/kontact/plugins/weather/summarywidget.cpp
new file mode 100644
index 000000000..04a559ae4
--- /dev/null
+++ b/kontact/plugins/weather/summarywidget.cpp
@@ -0,0 +1,230 @@
+/*
+ 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 <qimage.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kurllabel.h>
+
+#include "summarywidget.h"
+
+SummaryWidget::SummaryWidget( QWidget *parent, const char *name )
+ : Kontact::Summary( parent, name ),
+ DCOPObject( "WeatherSummaryWidget" ), mProc( 0 )
+{
+ mLayout = new QVBoxLayout( this, 3, 3 );
+ mLayout->setAlignment( Qt::AlignTop );
+
+ QPixmap icon = KGlobal::iconLoader()->loadIcon( "kweather", KIcon::Desktop, KIcon::SizeMedium );
+ QWidget *header = createHeader( this, icon, i18n( "Weather Service" ) );
+ mLayout->addWidget( header );
+
+ QString error;
+ QCString appID;
+ bool serviceAvailable = true;
+ if ( !kapp->dcopClient()->isApplicationRegistered( "KWeatherService" ) ) {
+ if ( KApplication::startServiceByDesktopName( "kweatherservice", QStringList(), &error, &appID ) ) {
+ QLabel *label = new QLabel( i18n( "No weather dcop service available;\nyou need KWeather to use this plugin." ), this );
+ mLayout->addWidget( label, Qt::AlignHCenter | AlignVCenter );
+ serviceAvailable = false;
+ }
+ }
+
+ if ( serviceAvailable ) {
+ connectDCOPSignal( 0, 0, "fileUpdate(QString)", "refresh(QString)", false );
+ connectDCOPSignal( 0, 0, "stationRemoved(QString)", "stationRemoved(QString)", false );
+
+ DCOPRef dcopCall( "KWeatherService", "WeatherService" );
+ DCOPReply reply = dcopCall.call( "listStations()", true );
+ if ( reply.isValid() ) {
+ mStations = reply;
+
+ connect( &mTimer, SIGNAL( timeout() ), this, SLOT( timeout() ) );
+ mTimer.start( 0 );
+ } else {
+ kdDebug(5602) << "ERROR: dcop reply not valid..." << endl;
+ }
+ }
+}
+
+
+void SummaryWidget::updateView()
+{
+ mLayouts.setAutoDelete( true );
+ mLayouts.clear();
+ mLayouts.setAutoDelete( false );
+
+ mLabels.setAutoDelete( true );
+ mLabels.clear();
+ mLabels.setAutoDelete( false );
+
+ if ( mStations.count() == 0 ) {
+ kdDebug(5602) << "No weather stations defined..." << endl;
+ return;
+ }
+
+
+ QValueList<WeatherData> dataList = mWeatherMap.values();
+ qHeapSort( dataList );
+
+ QValueList<WeatherData>::Iterator it;
+ for ( it = dataList.begin(); it != dataList.end(); ++it ) {
+ QString cover;
+ for ( uint i = 0; i < (*it).cover().count(); ++i )
+ cover += QString( "- %1\n" ).arg( (*it).cover()[ i ] );
+
+ QImage img;
+ img = (*it).icon();
+
+ QGridLayout *layout = new QGridLayout( mLayout, 3, 3, 3 );
+ mLayouts.append( layout );
+
+ KURLLabel* urlLabel = new KURLLabel( this );
+ urlLabel->installEventFilter( this );
+ urlLabel->setURL( (*it).stationID() );
+ urlLabel->setPixmap( img.smoothScale( 32, 32 ) );
+ urlLabel->setMaximumSize( urlLabel->sizeHint() );
+ urlLabel->setAlignment( AlignTop );
+ layout->addMultiCellWidget( urlLabel, 0, 1, 0, 0 );
+ mLabels.append( urlLabel );
+ connect ( urlLabel, SIGNAL( leftClickedURL( const QString& ) ),
+ this, SLOT( showReport( const QString& ) ) );
+
+ QLabel* label = new QLabel( this );
+ label->setText( QString( "%1 (%2)" ).arg( (*it).name() ).arg( (*it).temperature() ) );
+ QFont font = label->font();
+ font.setBold( true );
+ label->setFont( font );
+ label->setAlignment( AlignLeft );
+ layout->addMultiCellWidget( label, 0, 0, 1, 2 );
+ mLabels.append( label );
+
+ QString labelText;
+ labelText = QString( "<b>%1:</b> %2<br>"
+ "<b>%3:</b> %4<br>"
+ "<b>%5:</b> %6" )
+ .arg( i18n( "Last updated on" ) )
+ .arg( (*it).date() )
+ .arg( i18n( "Wind Speed" ) )
+ .arg( (*it).windSpeed() )
+ .arg( i18n( "Rel. Humidity" ) )
+ .arg( (*it).relativeHumidity() );
+
+ QToolTip::add( label, labelText.replace( " ", "&nbsp;" ) );
+
+ label = new QLabel( cover, this );
+ label->setAlignment( AlignLeft );
+ layout->addMultiCellWidget( label, 1, 1, 1, 2 );
+ mLabels.append( label );
+ }
+
+ for ( QLabel *label = mLabels.first(); label; label = mLabels.next() )
+ label->show();
+}
+
+void SummaryWidget::timeout()
+{
+ mTimer.stop();
+
+ DCOPRef dcopCall( "KWeatherService", "WeatherService" );
+ dcopCall.send( "updateAll()" );
+
+ mTimer.start( 15 * 60000 );
+}
+
+void SummaryWidget::refresh( QString station )
+{
+ DCOPRef dcopCall( "KWeatherService", "WeatherService" );
+
+ mWeatherMap[ station ].setIcon( dcopCall.call( "currentIcon(QString)", station, true ) );
+ mWeatherMap[ station ].setName( dcopCall.call( "stationName(QString)", station, true ) );
+ mWeatherMap[ station ].setCover( dcopCall.call( "cover(QString)", station, true ) );
+ mWeatherMap[ station ].setDate( dcopCall.call( "date(QString)", station, true ) );
+ mWeatherMap[ station ].setTemperature( dcopCall.call( "temperature(QString)", station, true ) );
+ mWeatherMap[ station ].setWindSpeed( dcopCall.call( "wind(QString)", station, true ) );
+ mWeatherMap[ station ].setRelativeHumidity( dcopCall.call( "relativeHumidity(QString)", station, true ) );
+ mWeatherMap[ station ].setStationID(station);
+
+ updateView();
+}
+
+void SummaryWidget::stationRemoved( QString station )
+{
+ mWeatherMap.remove( station );
+ updateView();
+}
+
+bool SummaryWidget::eventFilter( QObject *obj, QEvent* e )
+{
+ if ( obj->inherits( "KURLLabel" ) ) {
+ if ( e->type() == QEvent::Enter )
+ emit message(
+ i18n( "View Weather Report for Station" ) );
+ if ( e->type() == QEvent::Leave )
+ emit message( QString::null );
+ }
+
+ return Kontact::Summary::eventFilter( obj, e );
+}
+
+QStringList SummaryWidget::configModules() const
+{
+ return QStringList( "kcmweatherservice.desktop" );
+}
+
+void SummaryWidget::updateSummary( bool )
+{
+ timeout();
+}
+
+void SummaryWidget::showReport( const QString &stationID )
+{
+ mProc = new KProcess;
+ QApplication::connect( mProc, SIGNAL( processExited( KProcess* ) ),
+ this, SLOT( reportFinished( KProcess* ) ) );
+ *mProc << "kweatherreport";
+ *mProc << stationID;
+
+ if ( !mProc->start() ) {
+ delete mProc;
+ mProc = 0;
+ }
+}
+
+void SummaryWidget::reportFinished( KProcess* )
+{
+ mProc->deleteLater();
+ mProc = 0;
+}
+
+#include "summarywidget.moc"
diff --git a/kontact/plugins/weather/summarywidget.h b/kontact/plugins/weather/summarywidget.h
new file mode 100644
index 000000000..40e0bb705
--- /dev/null
+++ b/kontact/plugins/weather/summarywidget.h
@@ -0,0 +1,123 @@
+/*
+ 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 "summary.h"
+
+#include <dcopobject.h>
+
+#include <qmap.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+class KProcess;
+
+class QGridLayout;
+class QLabel;
+class QVBoxLayout;
+
+class WeatherData
+{
+ public:
+ void setIcon( const QPixmap &icon ) { mIcon = icon; }
+ QPixmap icon() const { return mIcon; }
+
+ void setName( const QString &name ) { mName = name; }
+ QString name() const { return mName; }
+
+ void setCover( const QStringList& cover ) { mCover = cover; }
+ QStringList cover() const { return mCover; }
+
+ void setDate( const QString &date ) { mDate = date; }
+ QString date() const { return mDate; }
+
+ void setTemperature( const QString &temperature ) { mTemperature = temperature; }
+ QString temperature() const { return mTemperature; }
+
+ void setWindSpeed( const QString &windSpeed ) { mWindSpeed = windSpeed; }
+ QString windSpeed() const { return mWindSpeed; }
+
+ void setRelativeHumidity( const QString &relativeHumidity ) { mRelativeHumidity = relativeHumidity; }
+ QString relativeHumidity() const { return mRelativeHumidity; }
+
+ void setStationID( const QString &station ) { mStationID = station;}
+ QString stationID() { return mStationID; }
+
+ bool operator< ( const WeatherData &data )
+ {
+ return ( QString::localeAwareCompare( mName, data.mName ) < 0 );
+ }
+
+ private:
+ QPixmap mIcon;
+ QString mName;
+ QStringList mCover;
+ QString mDate;
+ QString mTemperature;
+ QString mWindSpeed;
+ QString mRelativeHumidity;
+ QString mStationID;
+};
+
+class SummaryWidget : public Kontact::Summary, public DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+ public:
+ SummaryWidget( QWidget *parent, const char *name = 0 );
+
+ QStringList configModules() const;
+
+ void updateSummary( bool force = false );
+
+ k_dcop:
+ virtual void refresh( QString );
+ virtual void stationRemoved( QString );
+
+ protected:
+ virtual bool eventFilter( QObject *obj, QEvent *e );
+
+ private slots:
+ void updateView();
+ void timeout();
+ void showReport( const QString& );
+ void reportFinished( KProcess* );
+
+ private:
+ QStringList mStations;
+ QMap<QString, WeatherData> mWeatherMap;
+ QTimer mTimer;
+
+ QPtrList<QLabel> mLabels;
+ QPtrList<QGridLayout> mLayouts;
+ QVBoxLayout *mLayout;
+
+ KProcess* mProc;
+};
+
+#endif
diff --git a/kontact/plugins/weather/weather_plugin.cpp b/kontact/plugins/weather/weather_plugin.cpp
new file mode 100644
index 000000000..4c1a91e6e
--- /dev/null
+++ b/kontact/plugins/weather/weather_plugin.cpp
@@ -0,0 +1,61 @@
+/*
+ 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 <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <kparts/componentfactory.h>
+
+#include "core.h"
+#include "summarywidget.h"
+
+#include "weather_plugin.h"
+
+typedef KGenericFactory< WeatherPlugin, Kontact::Core > WeatherPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkontact_weatherplugin,
+ WeatherPluginFactory( "kontact_weatherplugin" ) )
+
+WeatherPlugin::WeatherPlugin( Kontact::Core *core, const char *name, const QStringList& )
+ : Kontact::Plugin( core, core, name ), mAboutData( 0 )
+{
+ setInstance( WeatherPluginFactory::instance() );
+}
+
+Kontact::Summary *WeatherPlugin::createSummaryWidget( QWidget *parentWidget )
+{
+ return new SummaryWidget( parentWidget );
+}
+
+const KAboutData *WeatherPlugin::aboutData()
+{
+ if ( !mAboutData ) {
+ mAboutData = new KAboutData( "weatherplugin", I18N_NOOP( "Weather Information" ),
+ "0.1",
+ I18N_NOOP( "Weather Information" ),
+ KAboutData::License_GPL_V2,
+ "(c) 2003 The Kontact developers" );
+ mAboutData->addAuthor( "Ian Reinhart Geiser", "", "geiseri@kde.org" );
+ mAboutData->addAuthor( "Tobias Koenig", "", "tokoe@kde.org" );
+ mAboutData->addCredit( "John Ratke",
+ I18N_NOOP( "Improvements and more code cleanups" ),
+ "jratke@comcast.net" );
+ }
+
+ return mAboutData;
+}
diff --git a/kontact/plugins/weather/weather_plugin.h b/kontact/plugins/weather/weather_plugin.h
new file mode 100644
index 000000000..637ebea9c
--- /dev/null
+++ b/kontact/plugins/weather/weather_plugin.h
@@ -0,0 +1,44 @@
+/*
+ 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 WEATHER_PLUGIN_H
+#define WEATHER_PLUGIN_H
+
+#include "plugin.h"
+
+class SummaryWidget;
+
+class WeatherPlugin : public Kontact::Plugin
+{
+ public:
+ WeatherPlugin( Kontact::Core *core, const char *name, const QStringList& );
+ WeatherPlugin();
+
+ virtual Kontact::Summary *createSummaryWidget( QWidget *parentWidget );
+
+ const KAboutData *aboutData();
+
+ protected:
+ virtual KParts::ReadOnlyPart *createPart() { return 0; }
+ private:
+ KAboutData *mAboutData;
+};
+
+#endif
diff --git a/kontact/plugins/weather/weatherplugin.desktop b/kontact/plugins/weather/weatherplugin.desktop
new file mode 100644
index 000000000..68c1924e3
--- /dev/null
+++ b/kontact/plugins/weather/weatherplugin.desktop
@@ -0,0 +1,92 @@
+[Desktop Entry]
+Type=Service
+Icon=kweather
+ServiceTypes=Kontact/Plugin,KPluginInfo
+TryExec=kweatherservice
+
+X-KDE-Library=libkontact_weatherplugin
+X-KDE-KontactIdentifier=weather
+X-KDE-KontactPluginVersion=6
+X-KDE-KontactPluginHasSummary=true
+X-KDE-KontactPluginHasPart=false
+
+X-KDE-PluginInfo-Name=kontact_weatherplugin
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-License=LGPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+Comment=Kontact Weather Component
+Comment[bg]=Приставка за метеорологичното време
+Comment[ca]=Component del temps del Kontact
+Comment[da]=Vejrkomponent til Kontact
+Comment[de]=Wetter-Komponente für Kontact
+Comment[el]=Συστατικό καιρού του Kontact
+Comment[es]=Extensión de meteorología para Kontact
+Comment[et]=Kontacti ilmaplugin
+Comment[fr]=Composant météo pour Kontact
+Comment[is]=Kontact veðurfréttaeining
+Comment[it]=Componente meteorologico di Kontact
+Comment[ja]=Kontact 気象情報コンポーネント
+Comment[km]=សមាសភាគ​អាកាសធាតុ Kontact
+Comment[nds]=Kontact-Wederkomponent
+Comment[nl]=Kontact Weercomponent
+Comment[pl]=Składnik Kontaktu wiadomości o pogodzie
+Comment[ru]=Компонент информации о погоде для Kontact
+Comment[sr]=Компонента времена за Kontact
+Comment[sr@Latn]=Komponenta vremena za Kontact
+Comment[sv]=Kontacts väderkomponent
+Comment[tr]=Kontact Hava Durumu Bileşeni
+Comment[zh_CN]=Kontact 天气插件
+Comment[zh_TW]=Kontact 天氣組件
+Name=Weather Service
+Name[af]=Weer diens
+Name[ar]=خدمة الطقس
+Name[bg]=Информация за времето
+Name[br]=Servij an amzer
+Name[ca]=Servei meteorològic
+Name[cs]=Služba počasí
+Name[cy]=GwasanaethTywydd
+Name[da]=Vejrtjeneste
+Name[de]=Wetterdienst
+Name[el]=Υπηρεσία πρόβλεψης Καιρού
+Name[eo]=Veterservo
+Name[es]=Servicio meteorológico
+Name[et]=Ilmateade
+Name[eu]=Eguraldiaren zerbitzua
+Name[fa]=خدمت آب و هوا
+Name[fi]=Sääpalvelu
+Name[fr]=KWeatherService
+Name[fy]=Waarberjocht
+Name[ga]=Seirbhís Aimsire
+Name[gl]=Servicio do Tempo
+Name[he]=שירות מזג אוויר
+Name[hu]=Időjárás
+Name[is]=Veðurþjónusta
+Name[it]=Servizio meteorologico
+Name[ja]=気象サービス
+Name[ka]=ამინდის მომსახურება
+Name[kk]=Ауа райы қызметі
+Name[km]=សេវា​អាកាសធាតុ
+Name[lt]=Orų tarnyba
+Name[mk]=Временска прогноза
+Name[nb]=Værtjeneste
+Name[nds]=Wederdeenst
+Name[ne]=मौसम कार्य
+Name[nl]=Weerbericht
+Name[nn]=Vêrmelding
+Name[pl]=Pogoda
+Name[pt]=Serviço Meteorológico
+Name[pt_BR]=Serviço de Previsão do Tempo
+Name[ru]=Погода
+Name[sk]=Služba počasie
+Name[sl]=Vremenska storitev
+Name[sr]=Време
+Name[sr@Latn]=Vreme
+Name[sv]=Väderleksprognos
+Name[th]=รายงานอากาศ
+Name[tr]=Hava Durumu Servisi
+Name[uk]=Служба погоди
+Name[uz]=Ob-havo xizmati
+Name[uz@cyrillic]=Об-ҳаво хизмати
+Name[zh_CN]=天气服务
+Name[zh_TW]=天氣服務