4 #include <tdecmdlineargs.h> 5 #include <tdeapplication.h> 6 #include <klibloader.h> 9 #include <tdemessagebox.h> 10 #include <tdeconfig.h> 11 #include <tdelocale.h> 12 #include <tdemainwindow.h> 13 #include <tdeparts/componentfactory.h> 16 #include <kdialogbase.h> 17 #include <tdecmdlineargs.h> 18 #include <kstandarddirs.h> 19 #include <kstatusbar.h> 20 #include <kiconloader.h> 23 #include <kdevplugin.h> 24 #include <kdevmakefrontend.h> 25 #include <kdevappfrontend.h> 26 #include <kdevdifffrontend.h> 27 #include <kdevsourceformatter.h> 28 #include <kdevcreatefile.h> 29 #include <kdevplugininfo.h> 30 #include <tdeaction.h> 32 #include <profileengine.h> 37 #include "projectmanager.h" 40 #include "plugincontroller.h" 41 #include "pluginselectdialog.h" 43 #include "shellextension.h" 49 template <
class ComponentType>
50 ComponentType *loadDefaultPart(
const TQString &serviceType )
52 TDETrader::OfferList offers = TDETrader::self()->query(serviceType, TQString(
"[X-TDevelop-Version] == %1").arg(TDEVELOP_PLUGIN_VERSION));
53 TDETrader::OfferList::ConstIterator serviceIt = offers.begin();
54 for ( ; serviceIt != offers.end(); ++serviceIt ) {
55 KService::Ptr service = *serviceIt;
57 ComponentType *part = KParts::ComponentFactory
58 ::createInstanceFromService< ComponentType >( service, API::getInstance(), 0,
59 PluginController::argumentsFromService( service ) );
79 PluginController::PluginController()
80 : KDevPluginController()
87 TDECmdLineArgs* args = TDECmdLineArgs::parsedArgs();
88 if( args->isSet(
"profile") ){
89 m_profile = TQString::fromLocal8Bit( args->getOption(
"profile") );
97 void PluginController::loadInitialPlugins()
101 TQStringList disableList;
102 Profile * profile = engine().findProfile( currentProfile() );
105 Profile::EntryList disableEntryList = profile->list( Profile::ExplicitDisable );
106 for ( Profile::EntryList::const_iterator it = disableEntryList.constBegin(); it != disableEntryList.constEnd(); ++it )
108 disableList << (*it).name;
111 loadGlobalPlugins( disableList );
115 PluginController::~PluginController()
120 void PluginController::loadCorePlugins()
122 TDETrader::OfferList coreOffers = m_engine.offers(m_profile, ProfileEngine::Core);
123 loadPlugins( coreOffers );
126 void PluginController::loadGlobalPlugins(
const TQStringList & ignorePlugins )
128 TDETrader::OfferList globalOffers = m_engine.offers(m_profile, ProfileEngine::Global);
129 loadPlugins( globalOffers, ignorePlugins );
132 void PluginController::loadProjectPlugins(
const TQStringList & ignorePlugins )
134 TDETrader::OfferList projectOffers = m_engine.offers(m_profile, ProfileEngine::Project);
135 loadPlugins( projectOffers, ignorePlugins );
138 void PluginController::loadPlugins( TDETrader::OfferList offers,
const TQStringList & ignorePlugins )
142 for (TDETrader::OfferList::ConstIterator it = offers.begin(); it != offers.end(); ++it)
144 TQString name = (*it)->desktopEntryName();
147 if( m_parts[ name ] != 0 || ignorePlugins.contains( name ) )
150 emit loadingPlugin(i18n(
"Loading: %1").arg((*it)->genericName()));
152 KDevPlugin *plugin = loadPlugin( *it );
155 m_parts.insert( name, plugin );
156 integratePart( plugin );
161 void PluginController::unloadPlugins()
163 for( TQDictIterator<KDevPlugin> it( m_parts ); !it.isEmpty(); )
165 KDevPlugin* part = it.current();
167 m_parts.remove( it.currentKey() );
172 void PluginController::unloadProjectPlugins( )
176 TDETrader::OfferList offers = TDETrader::self()->query(
"TDevelop/VersionControl",
"");
178 offers += m_engine.offers(m_profile, ProfileEngine::Project);
179 for (TDETrader::OfferList::ConstIterator it = offers.begin(); it != offers.end(); ++it)
181 TQString name = (*it)->desktopEntryName();
183 if ( KDevPlugin * plugin = m_parts[ name ] )
185 kdDebug(9000) <<
" *** Removing: " << name << endl;
186 removeAndForgetPart( name, plugin );
192 void PluginController::unloadPlugins( TQStringList
const & unloadParts )
194 TQStringList::ConstIterator it = unloadParts.begin();
195 while ( it != unloadParts.end() )
197 KDevPlugin* part = m_parts[ *it ];
200 kdDebug(9000) <<
" *** Removing: " << *it << endl;
202 m_parts.remove( *it );
209 KDevPlugin *PluginController::loadPlugin(
const KService::Ptr &service )
212 KDevPlugin * pl = KParts::ComponentFactory
213 ::createInstanceFromService<KDevPlugin>( service, API::getInstance(), 0,
214 argumentsFromService( service ), &err );
219 i18n(
"<b>Could not load plugin</b><br>" 220 "Plugin %1 could not be loaded<br>" 221 "Library loader error: %2").arg(service->name()).
222 arg(KLibLoader::self()->lastErrorMessage()),
223 i18n(
"Could not load plugin"));
229 TQStringList PluginController::argumentsFromService(
const KService::Ptr &service )
235 TQVariant prop = service->property(
"X-TDevelop-Args" );
236 if ( prop.isValid() )
237 args = TQStringList::split(
" ", prop.toString() );
241 void PluginController::integratePart(KXMLGUIClient *part)
243 if ( ! part )
return;
247 connect( part->actionCollection(), TQT_SIGNAL( actionStatusText(
const TQString & ) ),
248 TopLevel::getInstance()->main()->actionCollection(), TQT_SIGNAL( actionStatusText(
const TQString & ) ) );
251 void PluginController::integrateAndRememberPart(
const TQString &name, KDevPlugin *part)
253 m_parts.insert(name, part);
257 void PluginController::removePart(KXMLGUIClient *part)
259 if (TopLevel::mainWindowValid())
263 void PluginController::removeAndForgetPart(
const TQString &name, KDevPlugin *part)
265 kdDebug() <<
"removing: " << name << endl;
266 m_parts.remove(name);
270 const TQValueList<KDevPlugin*> PluginController::loadedPlugins()
272 TQValueList<KDevPlugin*> plugins;
273 TQDictIterator<KDevPlugin> itt(m_parts);
274 while( itt.current() )
276 plugins.append( itt.current() );
282 KDevPlugin * PluginController::extension(
const TQString & serviceType,
const TQString & constraint )
284 TDETrader::OfferList offers = KDevPluginController::query(serviceType, constraint);
285 for (TDETrader::OfferList::const_iterator it = offers.constBegin(); it != offers.end(); ++it)
287 KDevPlugin *ext = m_parts[(*it)->desktopEntryName()];
293 KDevPlugin * PluginController::loadPlugin(
const TQString & serviceType,
const TQString & constraint )
295 TDETrader::OfferList offers = KDevPluginController::query( serviceType, constraint );
296 if ( !offers.size() == 1 )
return 0;
298 TDETrader::OfferList::const_iterator it = offers.constBegin();
299 TQString name = (*it)->desktopEntryName();
301 KDevPlugin * plugin = 0;
302 if ( plugin = m_parts[ name ] )
307 if ( plugin = loadPlugin( *it ) )
309 m_parts.insert( name, plugin );
310 integratePart( plugin );
316 void PluginController::unloadPlugin(
const TQString & plugin )
318 TQStringList pluginList;
319 pluginList << plugin;
320 unloadPlugins( pluginList );
323 KURL::List PluginController::profileResources(
const TQString &nameFilter)
325 return m_engine.resources(currentProfile(), nameFilter);
328 KURL::List PluginController::profileResourcesRecursive(
const TQString &nameFilter)
330 return m_engine.resourcesRecursive(currentProfile(), nameFilter);
333 TQString PluginController::changeProfile(
const TQString &newProfile)
335 kdDebug() <<
"CHANGING PROFILE: from " << currentProfile() <<
" to " << newProfile << endl;
337 TDETrader::OfferList coreLoad;
338 TDETrader::OfferList globalLoad;
339 m_engine.diffProfiles(ProfileEngine::Core, currentProfile(), newProfile, unload, coreLoad);
340 m_engine.diffProfiles(ProfileEngine::Global, currentProfile(), newProfile, unload, globalLoad);
342 TQString oldProfile = m_profile;
343 m_profile = newProfile;
345 unloadPlugins(unload);
346 loadPlugins( coreLoad );
347 loadPlugins( globalLoad );
352 void PluginController::selectPlugins( )
354 kdDebug(9000) << k_funcinfo << endl;
356 PluginSelectDialog dlg;
357 if ( dlg.exec() == TQDialog::Accepted )
359 TQStringList unselectedPlugins = dlg.unselectedPluginNames();
361 kdDebug(9000) << unselectedPlugins << endl;
363 unloadPlugins( unselectedPlugins );
364 loadGlobalPlugins( unselectedPlugins );
366 if ( ProjectManager::getInstance()->projectLoaded() )
368 loadProjectPlugins( unselectedPlugins );
369 DomUtil::writeListEntry( *API::getInstance()->projectDom(),
"/general/ignoreparts",
"part", unselectedPlugins );
390 #include "plugincontroller.moc" Plugin controller implementation.
static void setupShourtcutTips(KXMLGUIClient *client=0)
Setup shourtcut tips.
virtual TQString defaultProfile()=0
Reimplement to set a default profile for the shell.
static KDevMainWindow * getInstance()
Get a pointer to the single KDevTopLevel object.
static ShellExtension * getInstance()
Returns an instance of a shell.