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);
00065 sf +=
"kdevses";
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 );
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
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
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
00307
00308
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
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
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
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
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
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
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
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
00659
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
00680
if( !langlist.isEmpty() && !langlist.contains(
m_info->
m_activeLanguage) ) {
00681
m_info->
m_ignoreParts << service->name();
00682
return false;
00683 }
00684
00685
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
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"