KDevelop API Documentation

src/projectmanager.cpp

Go to the documentation of this file.
00001 #include <qfile.h> 00002 #include <qfileinfo.h> 00003 #include <qdom.h> 00004 #include <qstringlist.h> 00005 #include <qptrlist.h> 00006 #include <qvbox.h> 00007 #include <qsize.h> 00008 00009 class QDomDocument; 00010 00011 #include <kmessagebox.h> 00012 #include <kdebug.h> 00013 #include <klocale.h> 00014 #include <kservice.h> 00015 #include <ktrader.h> 00016 #include <kfiledialog.h> 00017 #include <kmainwindow.h> 00018 #include <kparts/componentfactory.h> 00019 #include <kaction.h> 00020 #include <kapplication.h> 00021 #include <kcmdlineargs.h> 00022 #include <kprocess.h> 00023 #include <kglobal.h> 00024 #include <kstandarddirs.h> 00025 #include <kio/netaccess.h> 00026 #include <ktempfile.h> 00027 00028 #include "kdevproject.h" 00029 #include "kdevlanguagesupport.h" 00030 #include "kdevplugin.h" 00031 #include "kdevcreatefile.h" 00032 00033 00034 #include "toplevel.h" 00035 #include "core.h" 00036 #include "api.h" 00037 #include "plugincontroller.h" 00038 #include "partcontroller.h" 00039 #include "codemodel.h" 00040 #include "partselectwidget.h" 00041 #include "languageselectwidget.h" 00042 #include "generalinfowidget.h" 00043 #include "projectsession.h" 00044 #include "domutil.h" 00045 00046 #include "projectmanager.h" 00047 00048 00049 class ProjectInfo 00050 { 00051 public: 00052 KURL m_projectURL; 00053 QDomDocument m_document; 00054 QString m_projectPlugin, m_language, m_activeLanguage; 00055 QStringList m_ignoreParts, m_loadParts, m_keywords, m_secondaryLanguages; 00056 QDict<KDevPlugin> m_localParts; 00057 00058 QString sessionFile() const; 00059 }; 00060 00061 QString ProjectInfo::sessionFile() const 00062 { 00063 QString sf = m_projectURL.path(-1); 00064 sf.truncate(sf.length() - 8); // without ".kdevelop" 00065 sf += "kdevses"; // suffix for a KDevelop session file 00066 return sf; 00067 } 00068 00069 QString ProjectManager::projectDirectory( const QString& path, bool absolute ) { 00070 if(absolute) 00071 return path; 00072 KURL url(ProjectManager::getInstance()->projectFile(), path); 00073 url.cleanPath(); 00074 return url.path(-1); 00075 } 00076 00077 ProjectManager *ProjectManager::s_instance = 0; 00078 00079 ProjectManager::ProjectManager() 00080 : m_info(0L) 00081 ,m_pProjectSession(new ProjectSession) 00082 { 00083 } 00084 00085 ProjectManager::~ProjectManager() 00086 { 00087 delete m_pProjectSession; 00088 delete m_info; 00089 } 00090 00091 ProjectManager *ProjectManager::getInstance() 00092 { 00093 if (!s_instance) 00094 s_instance = new ProjectManager; 00095 return s_instance; 00096 } 00097 00098 void ProjectManager::createActions( KActionCollection* ac ) 00099 { 00100 KAction *action; 00101 00102 action = new KAction(i18n("&Open Project..."), "project_open", 0, 00103 this, SLOT(slotOpenProject()), 00104 ac, "project_open"); 00105 action->setToolTip( i18n("Open project")); 00106 action->setWhatsThis(i18n("<b>Open project</b><p>Opens a KDevelop3 or KDevelop2 project.")); 00107 00108 m_openRecentProjectAction = 00109 new KRecentFilesAction(i18n("Open &Recent Project..."), 0, 00110 this, SLOT(loadProject(const KURL &)), 00111 ac, "project_open_recent"); 00112 m_openRecentProjectAction->setToolTip(i18n("Open recent project")); 00113 m_openRecentProjectAction->setWhatsThis(i18n("<b>Open recent project</b><p>Opens recently opened project.")); 00114 m_openRecentProjectAction->loadEntries(kapp->config(), "RecentProjects"); 00115 00116 m_closeProjectAction = 00117 new KAction(i18n("C&lose Project"), "fileclose",0, 00118 this, SLOT(closeProject()), 00119 ac, "project_close"); 00120 m_closeProjectAction->setEnabled(false); 00121 m_closeProjectAction->setToolTip(i18n("Close project")); 00122 m_closeProjectAction->setWhatsThis(i18n("<b>Close project</b><p>Closes the current project.")); 00123 00124 m_projectOptionsAction = new KAction(i18n("Project &Options..."), "configure", 0, 00125 this, SLOT(slotProjectOptions()), 00126 ac, "project_options" ); 00127 m_projectOptionsAction->setToolTip(i18n("Project options")); 00128 m_projectOptionsAction->setWhatsThis(i18n("<b>Project options</b><p>Lets you customize project options.")); 00129 m_projectOptionsAction->setEnabled(false); 00130 00131 m_activeLanguage = new KSelectAction(i18n("&Active Language"), 0, ac, "project_active_language"); 00132 m_activeLanguage->setWhatsThis(i18n("<b>Active language</b><p>Sets the active programming language.")); 00133 m_activeLanguage->setEnabled(false); 00134 connect(m_activeLanguage, SIGNAL(activated(const QString&)), 00135 this, SLOT(switchLanguage(const QString&))); 00136 } 00137 00138 void ProjectManager::slotOpenProject() 00139 { 00140 QString defaultProjectsDir = kapp->config()->readPathEntry("DefaultProjectsDir", QDir::homeDirPath()+"/"); 00141 00142 KURL url = KFileDialog::getOpenURL(defaultProjectsDir, 00143 i18n("*.kdevelop|KDevelop 3 Project Files\n" 00144 "*.kdevprj|KDevelop 2 Project Files"), 00145 TopLevel::getInstance()->main(), i18n("Open Project") ); 00146 00147 if( url.isEmpty() ) 00148 return; 00149 00150 if (url.path().endsWith("kdevprj")) 00151 loadKDevelop2Project( url ); 00152 else 00153 loadProject( url ); 00154 } 00155 00156 void ProjectManager::slotProjectOptions() 00157 { 00158 KDialogBase dlg(KDialogBase::TreeList, i18n("Project Options"), 00159 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, TopLevel::getInstance()->main(), 00160 "project options dialog"); 00161 00162 QVBox *box = dlg.addVBoxPage(i18n("General")); 00163 GeneralInfoWidget *g = new GeneralInfoWidget(*API::getInstance()->projectDom(), box, "general informations widget"); 00164 connect (&dlg, SIGNAL(okClicked()), g, SLOT(accept())); 00165 00166 QVBox *vbox = dlg.addVBoxPage(i18n("Plugins")); 00167 PartSelectWidget *w = new PartSelectWidget(*API::getInstance()->projectDom(), vbox, "part selection widget"); 00168 vbox = dlg.addVBoxPage(i18n("Languages")); 00169 LanguageSelectWidget *lw = new LanguageSelectWidget(*API::getInstance()->projectDom(), vbox, "language selection widget"); 00170 connect( &dlg, SIGNAL(okClicked()), w, SLOT(accept()) ); 00171 connect( &dlg, SIGNAL(okClicked()), lw, SLOT(accept()) ); 00172 connect( w, SIGNAL(accepted()), this, SLOT(loadLocalParts()) ); 00173 connect( lw, SIGNAL(accepted()), this, SLOT(updateActiveLangMenu()) ); 00174 00175 KConfig *config = kapp->config(); 00176 config->setGroup("Project Settings Dialog"); 00177 int height = config->readNumEntry( "Height", 600 ); 00178 int width = config->readNumEntry( "Width", 800 ); 00179 00180 dlg.resize( width, height ); 00181 00182 Core::getInstance()->doEmitProjectConfigWidget(&dlg); 00183 dlg.exec(); 00184 00185 saveProjectFile(); 00186 00187 config->setGroup("Project Settings Dialog"); 00188 config->writeEntry( "Height", dlg.size().height() ); 00189 config->writeEntry( "Width", dlg.size().width() ); 00190 } 00191 00192 void ProjectManager::updateActiveLangMenu() 00193 { 00194 getGeneralInfo(); 00195 QStringList list( m_info->m_secondaryLanguages ); 00196 list.prepend( m_info->m_language ); //make sure primary lang comes first 00197 m_activeLanguage->setItems( list ); 00198 m_activeLanguage->setEnabled( m_info->m_secondaryLanguages.count() > 0 ); 00199 m_activeLanguage->setCurrentItem(m_activeLanguage->items().findIndex(m_info->m_activeLanguage)); 00200 } 00201 00202 void ProjectManager::switchLanguage(const QString& lang) 00203 { 00204 // make sure there is a project loaded 00205 if ( !m_info ) return; 00206 00207 unloadLocalParts(); 00208 unloadLanguageSupport(); 00209 m_info->m_loadParts.clear(); 00210 loadLanguageSupport(lang); 00211 loadLocalParts(); 00212 Core::getInstance()->doEmitLanguageChanged(); 00213 } 00214 00215 void ProjectManager::loadSettings() 00216 { 00217 } 00218 00219 void ProjectManager::saveSettings() 00220 { 00221 KConfig *config = kapp->config(); 00222 00223 if (projectLoaded()) 00224 { 00225 config->setGroup("General Options"); 00226 #if defined(KDE_IS_VERSION) 00227 # if KDE_IS_VERSION(3,1,3) 00228 # ifndef _KDE_3_1_3_ 00229 # define _KDE_3_1_3_ 00230 # endif 00231 # endif 00232 #endif 00233 #if defined(_KDE_3_1_3_) 00234 config->writePathEntry("Last Project", ProjectManager::getInstance()->projectFile().url()); 00235 #else 00236 config->writeEntry("Last Project", ProjectManager::getInstance()->projectFile().url()); 00237 #endif 00238 } 00239 00240 m_openRecentProjectAction->saveEntries(config, "RecentProjects"); 00241 } 00242 00243 void ProjectManager::loadDefaultProject() 00244 { 00245 KConfig *config = kapp->config(); 00246 config->setGroup("General Options"); 00247 QString project = config->readPathEntry("Last Project"); 00248 bool readProject = config->readBoolEntry("Read Last Project On Startup", true); 00249 if (!project.isEmpty() && readProject) 00250 { 00251 loadProject(KURL(project)); 00252 } 00253 kapp->processEvents(); 00254 } 00255 00256 bool ProjectManager::loadProject(const KURL &url) 00257 { 00258 if (url.isMalformed()) 00259 return false; 00260 00261 // reopen the already opened project? 00262 if( url.path() == projectFile().path() ) 00263 { 00264 if (KMessageBox::questionYesNo(TopLevel::getInstance()->main(), 00265 i18n("Are you sure you want to reload the current project?")) == KMessageBox::No) 00266 return false; 00267 } 00268 00269 if( projectLoaded() && !closeProject() ) 00270 { 00271 m_openRecentProjectAction->setCurrentItem( -1 ); 00272 return false; 00273 } 00274 00275 m_info = new ProjectInfo; 00276 m_info->m_projectURL = url; 00277 00278 if( !loadProjectFile() ) 00279 { 00280 delete m_info; m_info = 0; 00281 m_openRecentProjectAction->removeURL(url); 00282 saveSettings(); 00283 return false; 00284 } 00285 00286 getGeneralInfo(); 00287 00288 updateActiveLangMenu(); 00289 loadCreateFileSupport(); 00290 00291 if( !loadLanguageSupport(m_info->m_language) ) { 00292 unloadCreateFileSupport(); 00293 delete m_info; m_info = 0; 00294 return false; 00295 } 00296 00297 if( !loadProjectPart() ) { 00298 unloadCreateFileSupport(); 00299 unloadLanguageSupport(); 00300 delete m_info; m_info = 0; 00301 return false; 00302 } 00303 00304 loadLocalParts(); 00305 00306 // Core::getInstance()->doEmitProjectOpened(); 00307 00308 // shall we try to load a session file from network?? Probably not. 00309 if (m_info->m_projectURL.isLocalFile()) { 00310 const QDict<KDevPlugin>& globalParts = PluginController::getInstance()->globalParts(); 00311 QDict<KDevPlugin> allParts = m_info->m_localParts; 00312 QDictIterator<KDevPlugin> it(globalParts); 00313 for (; it.current(); ++it) { 00314 allParts.insert(it.currentKey(), it.current()); 00315 } 00316 // first restore the project session stored in a .kdevses file 00317 if (!m_pProjectSession->restoreFromFile(m_info->sessionFile(), allParts)) { 00318 kdWarning() << i18n("error during restoring of the KDevelop session !") << endl; 00319 } 00320 } 00321 00322 m_openRecentProjectAction->addURL(projectFile()); 00323 00324 m_closeProjectAction->setEnabled(true); 00325 m_projectOptionsAction->setEnabled(true); 00326 00327 Core::getInstance()->doEmitProjectOpened(); 00328 00329 return true; 00330 } 00331 00332 bool ProjectManager::closeProject() 00333 { 00334 if( !projectLoaded() ) 00335 return false; 00336 00337 Q_ASSERT( API::getInstance()->project() ); 00338 00339 // save the session if it is a local file 00340 if (m_info->m_projectURL.isLocalFile()) { 00341 const QDict<KDevPlugin>& globalParts = PluginController::getInstance()->globalParts(); 00342 QDict<KDevPlugin> allParts = m_info->m_localParts; 00343 QDictIterator<KDevPlugin> it(globalParts); 00344 for (; it.current(); ++it) { 00345 allParts.insert(it.currentKey(), it.current()); 00346 } 00347 m_pProjectSession->saveToFile(m_info->sessionFile(), allParts); 00348 } 00349 if ( !PartController::getInstance()->closeAllWindows() ) 00350 return false; 00351 00352 Core::getInstance()->doEmitProjectClosed(); 00353 00354 TopLevel::getInstance()->prepareToCloseViews(); 00355 00356 unloadLocalParts(); 00357 unloadCreateFileSupport(); 00358 unloadLanguageSupport(); 00359 unloadProjectPart(); 00360 00362 saveProjectFile(); 00363 00364 API::getInstance()->setProjectDom(0); 00365 API::getInstance()->codeModel()->wipeout(); 00366 00367 delete m_info; 00368 m_info = 0; 00369 00370 m_closeProjectAction->setEnabled(false); 00371 m_projectOptionsAction->setEnabled(false); 00372 m_activeLanguage->setEnabled(false); 00373 00374 PartController::getInstance()->slotCloseAllWindows(); 00375 00376 return true; 00377 } 00378 00379 bool ProjectManager::loadProjectFile() 00380 { 00381 QString path; 00382 if (!KIO::NetAccess::download(m_info->m_projectURL, path)) { 00383 KMessageBox::sorry(TopLevel::getInstance()->main(), 00384 i18n("Could not read project file: %1").arg(m_info->m_projectURL.prettyURL())); 00385 return false; 00386 } 00387 00388 QFile fin(path); 00389 if (!fin.open(IO_ReadOnly)) 00390 { 00391 KMessageBox::sorry(TopLevel::getInstance()->main(), 00392 i18n("Could not read project file: %1").arg(m_info->m_projectURL.prettyURL())); 00393 return false; 00394 } 00395 00396 int errorLine, errorCol; 00397 QString errorMsg; 00398 if (!m_info->m_document.setContent(&fin, &errorMsg, &errorLine, &errorCol)) 00399 { 00400 KMessageBox::sorry(TopLevel::getInstance()->main(), 00401 i18n("This is not a valid project file.\n" 00402 "XML error in line %1, column %2:\n%3") 00403 .arg(errorLine).arg(errorCol).arg(errorMsg)); 00404 fin.close(); 00405 KIO::NetAccess::removeTempFile(path); 00406 return false; 00407 } 00408 if (m_info->m_document.documentElement().nodeName() != "kdevelop") 00409 { 00410 KMessageBox::sorry(TopLevel::getInstance()->main(), 00411 i18n("This is not a valid project file.")); 00412 fin.close(); 00413 KIO::NetAccess::removeTempFile(path); 00414 return false; 00415 } 00416 00417 fin.close(); 00418 KIO::NetAccess::removeTempFile(path); 00419 00420 API::getInstance()->setProjectDom(&m_info->m_document); 00421 00422 return true; 00423 } 00424 00425 bool ProjectManager::saveProjectFile() 00426 { 00427 Q_ASSERT( API::getInstance()->projectDom() ); 00428 00429 if (m_info->m_projectURL.isLocalFile()) { 00430 QFile fout(m_info->m_projectURL.path()); 00431 if( !fout.open(IO_WriteOnly) ) { 00432 KMessageBox::sorry(TopLevel::getInstance()->main(), i18n("Could not write the project file.")); 00433 return false; 00434 } 00435 00436 QTextStream stream(&fout); 00437 API::getInstance()->projectDom()->save(stream, 2); 00438 fout.close(); 00439 } else { 00440 KTempFile fout(QString::fromLatin1("kdevelop3")); 00441 fout.setAutoDelete(true); 00442 if (fout.status() != 0) { 00443 KMessageBox::sorry(TopLevel::getInstance()->main(), i18n("Could not write the project file.")); 00444 return false; 00445 } 00446 API::getInstance()->projectDom()->save(*(fout.textStream()), 2); 00447 fout.close(); 00448 KIO::NetAccess::upload(fout.name(), m_info->m_projectURL); 00449 } 00450 00451 return true; 00452 } 00453 00454 static QString getAttribute(QDomElement elem, QString attr) 00455 { 00456 QDomElement el = elem.namedItem(attr).toElement(); 00457 return el.firstChild().toText().data(); 00458 } 00459 00460 static void getAttributeList(QDomElement elem, QString attr, QString tag, QStringList &list) 00461 { 00462 list.clear(); 00463 00464 QDomElement el = elem.namedItem(attr).toElement(); 00465 QDomElement item = el.firstChild().toElement(); 00466 while (!item.isNull()) 00467 { 00468 if (item.tagName() == tag) 00469 list << item.firstChild().toText().data(); 00470 item = item.nextSibling().toElement(); 00471 } 00472 } 00473 00474 void ProjectManager::getGeneralInfo() 00475 { 00476 QDomElement docEl = m_info->m_document.documentElement(); 00477 QDomElement generalEl = docEl.namedItem("general").toElement(); 00478 00479 m_info->m_projectPlugin = getAttribute(generalEl, "projectmanagement"); 00480 m_info->m_language = getAttribute(generalEl, "primarylanguage"); 00481 00482 getAttributeList(generalEl, "ignoreparts", "part", m_info->m_ignoreParts); 00483 getAttributeList(generalEl, "keywords", "keyword", m_info->m_keywords); 00484 getAttributeList(generalEl, "secondaryLanguages", "language", m_info->m_secondaryLanguages); 00485 } 00486 00487 bool ProjectManager::loadProjectPart() 00488 { 00489 KService::Ptr projectService = KService::serviceByDesktopName(m_info->m_projectPlugin); 00490 if (!projectService) { 00491 // this is for backwards compatibility with pre-alpha6 projects 00492 projectService = KService::serviceByDesktopName(m_info->m_projectPlugin.lower()); 00493 } 00494 if (!projectService) { 00495 KMessageBox::sorry(TopLevel::getInstance()->main(), 00496 i18n("No project management plugin %1 found.") 00497 .arg(m_info->m_projectPlugin)); 00498 return false; 00499 } 00500 00501 KDevProject *projectPart = KParts::ComponentFactory 00502 ::createInstanceFromService< KDevProject >( projectService, API::getInstance(), 0, 00503 PluginController::argumentsFromService( projectService ) ); 00504 if ( !projectPart ) { 00505 KMessageBox::sorry(TopLevel::getInstance()->main(), 00506 i18n("Could not create project management plugin %1.") 00507 .arg(m_info->m_projectPlugin)); 00508 return false; 00509 } 00510 00511 API::getInstance()->setProject( projectPart ); 00512 00513 QDomDocument& dom = *API::getInstance()->projectDom(); 00514 QString path = DomUtil::readEntry(dom,"/general/projectdirectory", "."); 00515 bool absolute = DomUtil::readBoolEntry(dom,"/general/absoluteprojectpath",false); 00516 QString projectDir = projectDirectory( path, absolute ); 00517 kdDebug(9000) << "projectDir: " << projectDir << " projectName: " << m_info->m_projectURL.fileName() << endl; 00518 00519 projectPart->openProject(projectDir, m_info->m_projectURL.fileName()); 00520 00521 PluginController::getInstance()->integratePart( projectPart ); 00522 00523 return true; 00524 } 00525 00526 void ProjectManager::unloadProjectPart() 00527 { 00528 KDevProject *projectPart = API::getInstance()->project(); 00529 if( !projectPart ) return; 00530 PluginController::getInstance()->removePart( projectPart ); 00531 projectPart->closeProject(); 00532 delete projectPart; 00533 API::getInstance()->setProject(0); 00534 } 00535 00536 bool ProjectManager::loadLanguageSupport(const QString& lang) 00537 { 00538 kdDebug(9000) << "Looking for language support for " << lang << endl; 00539 00540 if (lang == m_info->m_activeLanguage) 00541 // language already loaded... 00542 return true; 00543 00544 KTrader::OfferList languageSupportOffers = 00545 KTrader::self()->query(QString::fromLatin1("KDevelop/LanguageSupport"), 00546 QString::fromLatin1("[X-KDevelop-Language] == '%1' and [X-KDevelop-Version] == %2").arg(m_info->m_language).arg(KDEVELOP_PLUGIN_VERSION)); 00547 00548 if (languageSupportOffers.isEmpty()) { 00549 KMessageBox::sorry(TopLevel::getInstance()->main(), 00550 i18n("No language plugin for %1 found.") 00551 .arg(lang)); 00552 return false; 00553 } 00554 00555 KService::Ptr languageSupportService = *languageSupportOffers.begin(); 00556 KDevLanguageSupport *langSupport = KParts::ComponentFactory 00557 ::createInstanceFromService<KDevLanguageSupport>( languageSupportService, 00558 API::getInstance(), 00559 0, 00560 PluginController::argumentsFromService( languageSupportService ) ); 00561 00562 if ( !langSupport ) { 00563 KMessageBox::sorry(TopLevel::getInstance()->main(), 00564 i18n("Could not create language plugin for %1.") 00565 .arg(m_info->m_language)); 00566 return false; 00567 } 00568 00569 API::getInstance()->setLanguageSupport( langSupport ); 00570 PluginController::getInstance()->integratePart( langSupport ); 00571 m_info->m_activeLanguage = lang; 00572 m_activeLanguage->setCurrentItem(m_activeLanguage->items().findIndex(lang)); 00573 00574 return true; 00575 } 00576 00577 void ProjectManager::unloadLanguageSupport() 00578 { 00579 KDevLanguageSupport *langSupport = API::getInstance()->languageSupport(); 00580 if( !langSupport ) return; 00581 PluginController::getInstance()->removePart( langSupport ); 00582 delete langSupport; 00583 API::getInstance()->setLanguageSupport(0); 00584 } 00585 00586 bool ProjectManager::loadCreateFileSupport() { 00587 kdDebug(9000) << "Looing for CreateFile support" << endl; 00588 KTrader::OfferList createFileOffers = 00589 KTrader::self()->query(QString::fromLatin1("KDevelop/CreateFile"), QString::fromLatin1("[X-KDevelop-Version] == %1").arg(KDEVELOP_PLUGIN_VERSION)); 00590 00591 if (createFileOffers.isEmpty()) { 00592 kdDebug(9000) << "No offers found" << endl; 00593 API::getInstance()->setCreateFile(0); 00594 return false; 00595 } 00596 00597 KService::Ptr createFileService = *createFileOffers.begin(); 00598 KDevCreateFile *crfileSupport = 00599 KParts::ComponentFactory::createInstanceFromService<KDevCreateFile>(createFileService, 00600 API::getInstance(), 00601 0, 00602 PluginController::argumentsFromService(createFileService) ); 00603 API::getInstance()->setCreateFile(crfileSupport); 00604 if (!crfileSupport) { 00605 kdDebug(9000) << "Could not load CreateFile plugin" << endl; 00606 return false; 00607 } 00608 PluginController::getInstance()->integratePart( crfileSupport ); 00609 kdDebug(9000) << "CreateFile support loaded OK" << endl; 00610 return true; 00611 00612 00613 } 00614 00615 void ProjectManager::unloadCreateFileSupport() { 00616 KDevCreateFile *crfileSupport = API::getInstance()->createFile(); 00617 if (!crfileSupport) return; 00618 PluginController::getInstance()->removePart(crfileSupport); 00619 delete crfileSupport; 00620 API::getInstance()->setCreateFile(0); 00621 } 00622 00623 void ProjectManager::loadLocalParts() 00624 { 00625 // Make sure to refresh load/ignore lists 00626 getGeneralInfo(); 00627 00628 KTrader::OfferList localOffers = PluginController::pluginServices( "Project" ); 00629 for (KTrader::OfferList::ConstIterator it = localOffers.begin(); it != localOffers.end(); ++it) 00630 { 00631 QString name = (*it)->name(); 00632 kdDebug(9000) << "-----------------------------> load part " << name << endl; 00633 00634 // Unload it if it is marked as ignored and loaded 00635 if (m_info->m_ignoreParts.contains(name)) { 00636 KDevPlugin* part = m_info->m_localParts[name]; 00637 if( part ) { 00638 PluginController::getInstance()->removePart( part ); 00639 m_info->m_localParts.remove( name ); 00640 part->deleteLater(); 00641 } 00642 continue; 00643 } 00644 00645 // Check if it is already loaded 00646 if( m_info->m_localParts[ name ] != 0 ) 00647 continue; 00648 00649 if( m_info->m_loadParts.contains( name ) || 00650 checkNewService( *it ) ) 00651 { 00652 KDevPlugin *part = PluginController::loadPlugin( *it ); 00653 if ( !part ) continue; 00654 00655 PluginController::getInstance()->integratePart( part ); 00656 m_info->m_localParts.insert( name, part ); 00657 } 00658 // do NOT do processEvents() here, it will delete the unloading plugins before they're ready! 00659 // kapp->processEvents(); 00660 } 00661 } 00662 00663 void ProjectManager::unloadLocalParts() 00664 { 00665 for( QDictIterator<KDevPlugin> it( m_info->m_localParts ); !it.isEmpty(); ) 00666 { 00667 KDevPlugin* part = it.current(); 00668 PluginController::getInstance()->removePart( part ); 00669 m_info->m_localParts.remove( it.currentKey() ); 00670 delete part; 00671 } 00672 } 00673 00674 bool ProjectManager::checkNewService(const KService::Ptr &service) 00675 { 00676 QVariant var = service->property("X-KDevelop-ProgrammingLanguages"); 00677 QStringList langlist = var.asStringList(); 00678 00679 // empty means it supports all languages 00680 if( !langlist.isEmpty() && !langlist.contains(m_info->m_activeLanguage) ) { 00681 m_info->m_ignoreParts << service->name(); 00682 return false; 00683 } 00684 00685 // the language is ok, now check if the keywords match 00686 QStringList serviceKeywords = service->keywords(); 00687 for ( QStringList::Iterator is = serviceKeywords.begin(); 00688 is != serviceKeywords.end(); ++is ) 00689 { 00690 if ( !m_info->m_keywords.contains(*is) ) { 00691 // no match 00692 kdDebug(9000) << "ignoreParts because Keyword doesn't match: " << service->name() << endl; 00693 m_info->m_ignoreParts << service->name(); 00694 return false; 00695 } 00696 } 00697 00698 m_info->m_loadParts << service->name(); 00699 return true; 00700 } 00701 00702 KURL ProjectManager::projectFile() const 00703 { 00704 if (!m_info) 00705 return QString::null; 00706 return m_info->m_projectURL; 00707 } 00708 00709 bool ProjectManager::projectLoaded() const 00710 { 00711 return m_info != 0; 00712 } 00713 00714 ProjectSession* ProjectManager::projectSession() const 00715 { 00716 return m_pProjectSession; 00717 } 00718 00719 bool ProjectManager::loadKDevelop2Project( const KURL & url ) 00720 { 00721 if( url.isMalformed() || !url.isLocalFile() ){ 00722 KMessageBox::sorry(0, i18n("Invalid URL.")); 00723 return false; 00724 } 00725 00726 QString cmd = KGlobal::dirs()->findExe( "kdevprj2kdevelop" ); 00727 if (cmd.isEmpty()) { 00728 KMessageBox::sorry(0, i18n("You don't have 'kdevprj2kdevelop' installed.")); 00729 return false; 00730 } 00731 00732 QFileInfo fileInfo( url.path() ); 00733 00734 KShellProcess proc( "/bin/sh" ); 00735 proc.setWorkingDirectory( fileInfo.dirPath(true) ); 00736 proc << "perl" << cmd << KShellProcess::quote( url.path() ); 00737 proc.start( KProcess::Block ); 00738 00739 QString projectFile = fileInfo.dirPath( true ) + "/" + fileInfo.baseName() + ".kdevelop"; 00740 return loadProject( KURL(projectFile) ); 00741 } 00742 00743 #include "projectmanager.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Oct 19 08:01:53 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003