You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
387 lines
10 KiB
387 lines
10 KiB
/*
|
|
This file is part of KOrganizer.
|
|
|
|
Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
|
|
Copyright (C) 2003-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 "kocore.h"
|
|
|
|
#include "koprefs.h"
|
|
#include "koglobals.h"
|
|
#include "koidentitymanager.h"
|
|
|
|
#include <calendar/plugin.h>
|
|
#include <korganizer/part.h>
|
|
|
|
#include <klibloader.h>
|
|
#include <kdebug.h>
|
|
#include <kconfig.h>
|
|
#include <kxmlguifactory.h>
|
|
#include <kstandarddirs.h>
|
|
#include <klocale.h>
|
|
|
|
#include <tqwidget.h>
|
|
|
|
KOCore *KOCore::mSelf = 0;
|
|
|
|
KOCore *KOCore::self()
|
|
{
|
|
if ( !mSelf ) {
|
|
mSelf = new KOCore;
|
|
}
|
|
|
|
return mSelf;
|
|
}
|
|
|
|
KOCore::KOCore()
|
|
: mCalendarDecorationsLoaded( false ), mIdentityManager( 0 )
|
|
{
|
|
}
|
|
|
|
KOCore::~KOCore()
|
|
{
|
|
mSelf = 0;
|
|
}
|
|
|
|
KTrader::OfferList KOCore::availablePlugins( const TQString &type, int version )
|
|
{
|
|
TQString constraint;
|
|
if ( version >= 0 ) {
|
|
constraint = TQString("[X-KDE-PluginInterfaceVersion] == %1")
|
|
.arg( TQString::number( version ) );
|
|
}
|
|
|
|
return KTrader::self()->query( type, constraint );
|
|
}
|
|
|
|
KTrader::OfferList KOCore::availablePlugins()
|
|
{
|
|
return availablePlugins( KOrg::Plugin::serviceType(),
|
|
KOrg::Plugin::interfaceVersion() );
|
|
}
|
|
|
|
KTrader::OfferList KOCore::availableCalendarDecorations()
|
|
{
|
|
return availablePlugins( KOrg::CalendarDecoration::serviceType(),
|
|
KOrg::CalendarDecoration::interfaceVersion() );
|
|
}
|
|
|
|
KTrader::OfferList KOCore::availableParts()
|
|
{
|
|
return availablePlugins( KOrg::Part::serviceType(),
|
|
KOrg::Part::interfaceVersion() );
|
|
}
|
|
|
|
KTrader::OfferList KOCore::availablePrintPlugins()
|
|
{
|
|
return availablePlugins( KOrg::PrintPlugin::serviceType(),
|
|
KOrg::PrintPlugin::interfaceVersion() );
|
|
}
|
|
|
|
KOrg::Plugin *KOCore::loadPlugin( KService::Ptr service )
|
|
{
|
|
kdDebug(5850) << "loadPlugin: library: " << service->library() << endl;
|
|
|
|
if ( !service->hasServiceType( KOrg::Plugin::serviceType() ) ) {
|
|
return 0;
|
|
}
|
|
|
|
KLibFactory *factory = KLibLoader::self()->factory(
|
|
service->library().latin1() );
|
|
|
|
if ( !factory ) {
|
|
kdDebug(5850) << "KOCore::loadPlugin(): Factory creation failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
KOrg::PluginFactory *pluginFactory =
|
|
static_cast<KOrg::PluginFactory *>( factory );
|
|
|
|
if ( !pluginFactory ) {
|
|
kdDebug(5850) << "KOCore::loadPlugin(): Cast to KOrg::PluginFactory failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
return pluginFactory->create();
|
|
}
|
|
|
|
KOrg::Plugin *KOCore::loadPlugin( const TQString &name )
|
|
{
|
|
KTrader::OfferList list = availablePlugins();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = list.begin(); it != list.end(); ++it ) {
|
|
if ( (*it)->desktopEntryName() == name ) {
|
|
return loadPlugin( *it );
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
KOrg::CalendarDecoration *KOCore::loadCalendarDecoration(KService::Ptr service)
|
|
{
|
|
kdDebug(5850) << "loadCalendarDecoration: library: " << service->library() << endl;
|
|
|
|
KLibFactory *factory = KLibLoader::self()->factory(service->library().latin1());
|
|
|
|
if (!factory) {
|
|
kdDebug(5850) << "KOCore::loadCalendarDecoration(): Factory creation failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
KOrg::CalendarDecorationFactory *pluginFactory =
|
|
static_cast<KOrg::CalendarDecorationFactory *>(factory);
|
|
|
|
if (!pluginFactory) {
|
|
kdDebug(5850) << "KOCore::loadCalendarDecoration(): Cast failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
return pluginFactory->create();
|
|
}
|
|
|
|
KOrg::CalendarDecoration *KOCore::loadCalendarDecoration( const TQString &name )
|
|
{
|
|
KTrader::OfferList list = availableCalendarDecorations();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = list.begin(); it != list.end(); ++it ) {
|
|
if ( (*it)->desktopEntryName() == name ) {
|
|
return loadCalendarDecoration( *it );
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
KOrg::Part *KOCore::loadPart( KService::Ptr service, KOrg::MainWindow *parent )
|
|
{
|
|
kdDebug(5850) << "loadPart: library: " << service->library() << endl;
|
|
|
|
if ( !service->hasServiceType( KOrg::Part::serviceType() ) ) {
|
|
return 0;
|
|
}
|
|
|
|
KLibFactory *factory = KLibLoader::self()->factory(
|
|
service->library().latin1() );
|
|
|
|
if ( !factory ) {
|
|
kdDebug(5850) << "KOCore::loadPart(): Factory creation failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
KOrg::PartFactory *pluginFactory =
|
|
static_cast<KOrg::PartFactory *>( factory );
|
|
|
|
if ( !pluginFactory ) {
|
|
kdDebug(5850) << "KOCore::loadPart(): Cast failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
return pluginFactory->create( parent );
|
|
}
|
|
|
|
KOrg::PrintPlugin *KOCore::loadPrintPlugin( KService::Ptr service )
|
|
{
|
|
kdDebug(5850) << "loadPart: print plugin in library: " << service->library() << endl;
|
|
|
|
if ( !service->hasServiceType( KOrg::PrintPlugin::serviceType() ) ) {
|
|
return 0;
|
|
}
|
|
|
|
KLibFactory *factory = KLibLoader::self()->factory(
|
|
service->library().latin1() );
|
|
|
|
if ( !factory ) {
|
|
kdDebug(5850) << "KOCore::loadPrintPlugin(): Factory creation failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
KOrg::PrintPluginFactory *pluginFactory =
|
|
static_cast<KOrg::PrintPluginFactory *>( factory );
|
|
|
|
if ( !pluginFactory ) {
|
|
kdDebug(5850) << "KOCore::loadPrintPlugins(): Cast failed" << endl;
|
|
return 0;
|
|
}
|
|
|
|
return pluginFactory->create();
|
|
}
|
|
|
|
void KOCore::addXMLGUIClient( TQWidget *wdg, KXMLGUIClient *guiclient )
|
|
{
|
|
mXMLGUIClients.insert( wdg, guiclient );
|
|
}
|
|
|
|
void KOCore::removeXMLGUIClient( TQWidget *wdg )
|
|
{
|
|
mXMLGUIClients.remove( wdg );
|
|
}
|
|
|
|
KXMLGUIClient* KOCore::xmlguiClient( TQWidget *wdg ) const
|
|
{
|
|
TQWidget *topLevel = wdg->topLevelWidget();
|
|
TQMap<TQWidget*, KXMLGUIClient*>::ConstIterator it = mXMLGUIClients.find( topLevel );
|
|
if ( it != mXMLGUIClients.end() )
|
|
return it.data();
|
|
|
|
return 0;
|
|
}
|
|
|
|
KOrg::Part *KOCore::loadPart( const TQString &name, KOrg::MainWindow *parent )
|
|
{
|
|
KTrader::OfferList list = availableParts();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = list.begin(); it != list.end(); ++it ) {
|
|
if ( (*it)->desktopEntryName() == name ) {
|
|
return loadPart( *it, parent );
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
KOrg::PrintPlugin *KOCore::loadPrintPlugin( const TQString &name )
|
|
{
|
|
KTrader::OfferList list = availablePrintPlugins();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = list.begin(); it != list.end(); ++it ) {
|
|
if ( (*it)->desktopEntryName() == name ) {
|
|
return loadPrintPlugin( *it );
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
KOrg::CalendarDecoration::List KOCore::calendarDecorations()
|
|
{
|
|
if ( !mCalendarDecorationsLoaded ) {
|
|
TQStringList selectedPlugins = KOPrefs::instance()->mSelectedPlugins;
|
|
|
|
mCalendarDecorations.clear();
|
|
KTrader::OfferList plugins = availableCalendarDecorations();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = plugins.begin(); it != plugins.end(); ++it ) {
|
|
if ( (*it)->hasServiceType("Calendar/Decoration") ) {
|
|
TQString name = (*it)->desktopEntryName();
|
|
if ( selectedPlugins.find( name ) != selectedPlugins.end() ) {
|
|
KOrg::CalendarDecoration *d = loadCalendarDecoration(*it);
|
|
mCalendarDecorations.append( d );
|
|
}
|
|
}
|
|
}
|
|
mCalendarDecorationsLoaded = true;
|
|
}
|
|
|
|
return mCalendarDecorations;
|
|
}
|
|
|
|
KOrg::Part::List KOCore::loadParts( KOrg::MainWindow *parent )
|
|
{
|
|
KOrg::Part::List parts;
|
|
|
|
TQStringList selectedPlugins = KOPrefs::instance()->mSelectedPlugins;
|
|
|
|
KTrader::OfferList plugins = availableParts();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = plugins.begin(); it != plugins.end(); ++it ) {
|
|
if ( selectedPlugins.find( (*it)->desktopEntryName() ) !=
|
|
selectedPlugins.end() ) {
|
|
KOrg::Part *part = loadPart( *it, parent );
|
|
if ( part ) {
|
|
if ( !parent->mainGuiClient() ) {
|
|
kdError() << "KOCore::loadParts(): parent has no mainGuiClient."
|
|
<< endl;
|
|
} else {
|
|
parent->mainGuiClient()->insertChildClient( part );
|
|
parts.append( part );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return parts;
|
|
}
|
|
|
|
KOrg::PrintPlugin::List KOCore::loadPrintPlugins()
|
|
{
|
|
KOrg::PrintPlugin::List loadedPlugins;
|
|
|
|
TQStringList selectedPlugins = KOPrefs::instance()->mSelectedPlugins;
|
|
|
|
KTrader::OfferList plugins = availablePrintPlugins();
|
|
KTrader::OfferList::ConstIterator it;
|
|
for( it = plugins.begin(); it != plugins.end(); ++it ) {
|
|
if ( selectedPlugins.find( (*it)->desktopEntryName() ) !=
|
|
selectedPlugins.end() ) {
|
|
KOrg::PrintPlugin *part = loadPrintPlugin( *it );
|
|
if ( part ) loadedPlugins.append( part );
|
|
}
|
|
}
|
|
return loadedPlugins;
|
|
}
|
|
|
|
void KOCore::unloadPlugins()
|
|
{
|
|
KOrg::CalendarDecoration *plugin;
|
|
for( plugin = mCalendarDecorations.first(); plugin;
|
|
plugin = mCalendarDecorations.next() ) {
|
|
delete plugin;
|
|
}
|
|
mCalendarDecorations.clear();
|
|
mCalendarDecorationsLoaded = false;
|
|
}
|
|
|
|
void KOCore::unloadParts( KOrg::MainWindow *parent, KOrg::Part::List &parts )
|
|
{
|
|
KOrg::Part *part;
|
|
for( part = parts.first(); part; part = parts.next() ) {
|
|
parent->mainGuiClient()->removeChildClient( part );
|
|
delete part;
|
|
}
|
|
parts.clear();
|
|
}
|
|
|
|
KOrg::Part::List KOCore::reloadParts( KOrg::MainWindow *parent,
|
|
KOrg::Part::List &parts )
|
|
{
|
|
KXMLGUIFactory *factory = parent->mainGuiClient()->factory();
|
|
factory->removeClient( parent->mainGuiClient() );
|
|
|
|
unloadParts( parent, parts );
|
|
KOrg::Part::List list = loadParts( parent );
|
|
|
|
factory->addClient( parent->mainGuiClient() );
|
|
|
|
return list;
|
|
}
|
|
|
|
void KOCore::reloadPlugins()
|
|
{
|
|
mCalendarDecorationsLoaded = false;
|
|
// Plugins should be unloaded, but e.g. komonthview keeps using the old ones
|
|
unloadPlugins();
|
|
calendarDecorations();
|
|
}
|
|
|
|
KPIM::IdentityManager* KOCore::identityManager()
|
|
{
|
|
if ( !mIdentityManager )
|
|
mIdentityManager = new KOrg::IdentityManager;
|
|
return mIdentityManager;
|
|
}
|