1 /* This file is part of the KDE project
2 Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
3 Copyright (C) 1999 David Faure <faure@kde.org>
4 Copyright (C) 1999 Torben Weis <weis@kde.org>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 #include "konqfactory.h"
29 #include <QtGui/QWidget>
30 #include <QtCore/QFile>
31 #include <QtCore/QCoreApplication>
34 #include <kaboutdata.h>
37 #include <kmessagebox.h>
38 #include <kmimetypetrader.h>
39 #include <kparts/factory.h>
40 #include <kparts/part.h>
41 #include <kservicetypetrader.h>
42 #include <kdeversion.h>
45 #include "konqsettings.h"
46 #include "konqmainwindow.h"
49 static KAboutData
*s_aboutData
= 0;
50 static void cleanupKAboutData()
55 KonqViewFactory::KonqViewFactory(const QString
& libName
, KLibFactory
*factory
)
56 : m_libName(libName
), m_factory(factory
),
61 void KonqViewFactory::setArgs(const QVariantList
&args
)
66 KParts::ReadOnlyPart
*KonqViewFactory::create( QWidget
*parentWidget
, QObject
* parent
)
71 KParts::ReadOnlyPart
* part
= m_factory
->create
<KParts::ReadOnlyPart
>( parentWidget
, parent
, QString(), m_args
);
74 kError(1202) << "No KParts::ReadOnlyPart created from" << m_libName
;
76 QFrame
* frame
= qobject_cast
<QFrame
*>( part
->widget() );
78 frame
->setFrameStyle( QFrame::NoFrame
);
84 static KonqViewFactory
tryLoadingService(KService::Ptr service
)
86 KPluginLoader
pluginLoader(*service
);
87 KPluginFactory
* factory
= pluginLoader
.factory();
90 i18n("There was an error loading the module %1.\nThe diagnostics is:\n%2",
91 service
->name(), pluginLoader
.errorString()));
92 return KonqViewFactory();
95 return KonqViewFactory(service
->library(), factory
);
99 KonqViewFactory
KonqFactory::createView( const QString
&serviceType
,
100 const QString
&serviceName
,
101 KService::Ptr
*serviceImpl
,
102 KService::List
*partServiceOffers
,
103 KService::List
*appServiceOffers
,
104 bool forceAutoEmbed
)
106 kDebug(1202) << "Trying to create view for" << serviceType
<< serviceName
;
108 // We need to get those in any case
109 KService::List offers
, appOffers
;
112 getOffers( serviceType
, &offers
, &appOffers
);
114 if ( partServiceOffers
)
115 (*partServiceOffers
) = offers
;
116 if ( appServiceOffers
)
117 (*appServiceOffers
) = appOffers
;
119 // We ask ourselves whether to do it or not only if no service was specified.
120 // If it was (from the View menu or from RMB + Embedding service), just do it.
121 forceAutoEmbed
= forceAutoEmbed
|| !serviceName
.isEmpty();
122 // Or if we have no associated app anyway, then embed.
123 forceAutoEmbed
= forceAutoEmbed
|| ( appOffers
.isEmpty() && !offers
.isEmpty() );
124 // Or if the associated app is konqueror itself, then embed.
125 if ( !appOffers
.isEmpty() )
126 forceAutoEmbed
= forceAutoEmbed
|| KonqMainWindow::isMimeTypeAssociatedWithSelf( serviceType
, appOffers
.first() );
128 if ( ! forceAutoEmbed
)
130 if ( ! KonqFMSettings::settings()->shouldEmbed( serviceType
) )
132 kDebug(1202) << "KonqFMSettings says: don't embed this servicetype";
133 return KonqViewFactory();
137 KService::Ptr service
;
139 // Look for this service
140 if (!serviceName
.isEmpty()) {
141 KService::List::const_iterator it
= offers
.constBegin();
142 for ( ; it
!= offers
.constEnd() && !service
; ++it
) {
143 if ( (*it
)->desktopEntryName() == serviceName
) {
144 kDebug(1202) << "Found requested service" << serviceName
;
150 KonqViewFactory viewFactory
;
152 kDebug(1202) << "Trying to open lib for requested service " << service
->desktopEntryName();
153 viewFactory
= tryLoadingService(service
);
154 // If this fails, then return an error.
155 // When looking for konq_sidebartng or konq_aboutpage, we don't want to end up
156 // with khtml or another Browser/View part in case of an error...
158 KService::List::Iterator it
= offers
.begin();
159 for ( ; viewFactory
.isNull() /* exit as soon as we get one */ && it
!= offers
.end() ; ++it
) {
161 // Allowed as default ?
162 QVariant prop
= service
->property( "X-KDE-BrowserView-AllowAsDefault" );
163 kDebug(1202) << service
->desktopEntryName() << " : X-KDE-BrowserView-AllowAsDefault is valid : " << prop
.isValid();
164 if ( !prop
.isValid() || prop
.toBool() ) { // defaults to true
165 //kDebug(1202) << "Trying to open lib for service " << service->name();
166 viewFactory
= tryLoadingService(service
);
167 // If this works, we exit the loop.
169 kDebug(1202) << "Not allowed as default " << service
->desktopEntryName();
175 (*serviceImpl
) = service
;
177 if (viewFactory
.isNull()) {
178 if (offers
.isEmpty())
179 kWarning(1202) << "no part was associated with" << serviceType
;
181 kWarning(1202) << "no part could be loaded"; // full error was shown to user already
186 const QVariant prop
= service
->property( "X-KDE-BrowserView-Args" );
187 if (prop
.isValid()) {
188 Q_FOREACH(const QString
& str
, prop
.toString().split(' '))
189 args
<< QVariant(str
);
192 if (service
->serviceTypes().contains("Browser/View"))
193 args
<< QLatin1String("Browser/View");
195 viewFactory
.setArgs(args
);
199 void KonqFactory::getOffers( const QString
& serviceType
,
200 KService::List
*partServiceOffers
,
201 KService::List
*appServiceOffers
)
204 #warning Temporary hack -- must separate mimetypes and servicetypes better
206 if ( partServiceOffers
&& serviceType
.length() > 0 && serviceType
[0].isUpper() ) {
207 *partServiceOffers
= KServiceTypeTrader::self()->query( serviceType
,
208 "DesktopEntryName != 'kfmclient' and DesktopEntryName != 'kfmclient_dir' and DesktopEntryName != 'kfmclient_html'");
212 if ( appServiceOffers
)
214 *appServiceOffers
= KMimeTypeTrader::self()->query( serviceType
, "Application",
215 "DesktopEntryName != 'kfmclient' and DesktopEntryName != 'kfmclient_dir' and DesktopEntryName != 'kfmclient_html'");
218 if ( partServiceOffers
)
220 *partServiceOffers
= KMimeTypeTrader::self()->query( serviceType
, "KParts/ReadOnlyPart" );
225 const KAboutData
*KonqFactory::aboutData()
229 s_aboutData
= new KAboutData( "konqueror", 0, ki18n("Konqueror"),
231 ki18n("Web browser, file manager and document viewer."),
232 KAboutData::License_GPL
,
233 ki18n("(C) 1999-2008, The Konqueror developers"),
235 I18N_NOOP("http://konqueror.kde.org") );
236 s_aboutData
->addAuthor( ki18n("David Faure"), ki18n("Developer (framework, parts, JavaScript, I/O library) and maintainer"), "faure@kde.org" );
237 s_aboutData
->addAuthor( ki18n("Simon Hausmann"), ki18n("Developer (framework, parts)"), "hausmann@kde.org" );
238 s_aboutData
->addAuthor( ki18n("Michael Reiher"), ki18n("Developer (framework)"), "michael.reiher@gmx.de" );
239 s_aboutData
->addAuthor( ki18n("Matthias Welk"), ki18n("Developer"), "welk@fokus.gmd.de" );
240 s_aboutData
->addAuthor( ki18n("Alexander Neundorf"), ki18n("Developer (List views)"), "neundorf@kde.org" );
241 s_aboutData
->addAuthor( ki18n("Michael Brade"), ki18n("Developer (List views, I/O library)"), "brade@kde.org" );
242 s_aboutData
->addAuthor( ki18n("Lars Knoll"), ki18n("Developer (HTML rendering engine)"), "knoll@kde.org" );
243 s_aboutData
->addAuthor( ki18n("Dirk Mueller"), ki18n("Developer (HTML rendering engine)"), "mueller@kde.org" );
244 s_aboutData
->addAuthor( ki18n("Peter Kelly"), ki18n("Developer (HTML rendering engine)"), "pmk@post.com" );
245 s_aboutData
->addAuthor( ki18n("Waldo Bastian"), ki18n("Developer (HTML rendering engine, I/O library)"), "bastian@kde.org" );
246 s_aboutData
->addAuthor( ki18n("Germain Garand"), ki18n("Developer (HTML rendering engine)"), "germain@ebooksfrance.org" );
247 s_aboutData
->addAuthor( ki18n("Leo Savernik"), ki18n("Developer (HTML rendering engine)"), "l.savernik@aon.at" );
248 s_aboutData
->addAuthor( ki18n("Stephan Kulow"), ki18n("Developer (HTML rendering engine, I/O library, regression test framework)"), "coolo@kde.org" );
249 s_aboutData
->addAuthor( ki18n("Antti Koivisto"), ki18n("Developer (HTML rendering engine)"), "koivisto@kde.org" );
250 s_aboutData
->addAuthor( ki18n("Zack Rusin"), ki18n("Developer (HTML rendering engine)"), "zack@kde.org" );
251 s_aboutData
->addAuthor( ki18n("Tobias Anton"), ki18n( "Developer (HTML rendering engine)" ), "anton@stud.fbi.fh-darmstadt.de" );
252 s_aboutData
->addAuthor( ki18n("Lubos Lunak"), ki18n( "Developer (HTML rendering engine)" ), "l.lunak@kde.org" );
253 s_aboutData
->addAuthor( ki18n("Allan Sandfeld Jensen"), ki18n( "Developer (HTML rendering engine)" ), "kde@carewolf.com" );
254 s_aboutData
->addAuthor( ki18n("Apple Safari Developers"), ki18n("Developer (HTML rendering engine, JavaScript)"));
255 s_aboutData
->addAuthor( ki18n("Harri Porten"), ki18n("Developer (JavaScript)"), "porten@kde.org" );
256 s_aboutData
->addAuthor( ki18n("Koos Vriezen"), ki18n("Developer (Java applets and other embedded objects)"), "koos.vriezen@xs4all.nl" );
257 s_aboutData
->addAuthor( ki18n("Matt Koss"), ki18n("Developer (I/O library)"), "koss@miesto.sk" );
258 s_aboutData
->addAuthor( ki18n("Alex Zepeda"), ki18n("Developer (I/O library)"), "zipzippy@sonic.net" );
259 s_aboutData
->addAuthor( ki18n("Richard Moore"), ki18n("Developer (Java applet support)"), "rich@kde.org" );
260 s_aboutData
->addAuthor( ki18n("Dima Rogozin"), ki18n("Developer (Java applet support)"), "dima@mercury.co.il" );
261 s_aboutData
->addAuthor( ki18n("Wynn Wilkes"), ki18n("Developer (Java 2 security manager support,\n and other major improvements to applet support)"), "wynnw@calderasystems.com" );
262 s_aboutData
->addAuthor( ki18n("Stefan Schimanski"), ki18n("Developer (Netscape plugin support)"), "schimmi@kde.org" );
263 s_aboutData
->addAuthor( ki18n("George Staikos"), ki18n("Developer (SSL, Netscape plugins)"), "staikos@kde.org" );
264 s_aboutData
->addAuthor( ki18n("Dawit Alemayehu"),ki18n("Developer (I/O library, Authentication support)"), "adawit@kde.org" );
265 s_aboutData
->addAuthor( ki18n("Carsten Pfeiffer"),ki18n("Developer (framework)"), "pfeiffer@kde.org" );
266 s_aboutData
->addAuthor( ki18n("Torsten Rahn"), ki18n("Graphics/icons"), "torsten@kde.org" );
267 s_aboutData
->addAuthor( ki18n("Torben Weis"), ki18n("KFM author"), "weis@kde.org" );
268 s_aboutData
->addAuthor( ki18n("Joseph Wenninger"), ki18n("Developer (navigation panel framework)"),"jowenn@kde.org");
269 s_aboutData
->addAuthor( ki18n("Stephan Binner"), ki18n("Developer (misc stuff)"),"binner@kde.org");
270 s_aboutData
->addAuthor( ki18n("Ivor Hewitt"), ki18n("Developer (AdBlock filter)"),"ivor@ivor.org");
271 s_aboutData
->addAuthor( ki18n("Eduardo Robles Elvira"), ki18n("Developer (framework)"),"edulix@gmail.com");
272 qAddPostRoutine(cleanupKAboutData
);