• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • KDevelop Generic Shell
 

KDevelop Generic Shell

  • src
projectmanager.cpp
1#include <tqfile.h>
2#include <tqfileinfo.h>
3#include <tqdir.h>
4#include <tqdom.h>
5#include <tqstringlist.h>
6#include <tqptrlist.h>
7#include <tqvbox.h>
8#include <tqsize.h>
9#include <tqtimer.h>
10
11class TQDomDocument;
12
13#include <tdemessagebox.h>
14#include <kdebug.h>
15#include <tdelocale.h>
16#include <kservice.h>
17#include <ktrader.h>
18#include <tdefiledialog.h>
19#include <tdemainwindow.h>
20#include <tdeparts/componentfactory.h>
21#include <tdeaction.h>
22#include <tdeapplication.h>
23#include <tdecmdlineargs.h>
24#include <kprocess.h>
25#include <tdeglobal.h>
26#include <kstandarddirs.h>
27#include <tdeio/netaccess.h>
28#include <tdetempfile.h>
29#include <tdemenubar.h>
30#include <kstatusbar.h>
31#include <kiconloader.h>
32
33#include "kdevproject.h"
34#include "kdevlanguagesupport.h"
35#include "kdevplugin.h"
36#include "kdevcreatefile.h"
37#include "kdevversioncontrol.h"
38
39
40#include "toplevel.h"
41#include "core.h"
42#include "api.h"
43#include "plugincontroller.h"
44#include "partcontroller.h"
45#include "codemodel.h"
46// #include "partselectwidget.h"
47#include "languageselectwidget.h"
48#include "generalinfowidget.h"
49#include "projectsession.h"
50#include "domutil.h"
51#include "settings.h"
52
53#include "projectmanager.h"
54
55TQString ProjectInfo::sessionFile() const
56{
57 TQString sf = m_projectURL.path(-1);
58 sf.truncate(sf.length() - 8); // without ".kdevelop"
59 sf += "kdevses"; // suffix for a TDevelop session file
60 return sf;
61}
62
63TQString ProjectManager::projectDirectory( const TQString& path, bool absolute ) {
64 if(absolute)
65 return path;
66 KURL url(ProjectManager::getInstance()->projectFile(), path);
67 url.cleanPath();
68 return url.path(-1);
69}
70
71ProjectManager *ProjectManager::s_instance = 0;
72
73ProjectManager::ProjectManager()
74: m_info(0L)
75 ,m_pProjectSession(new ProjectSession)
76{
77}
78
79ProjectManager::~ProjectManager()
80{
81 delete m_pProjectSession;
82 delete m_info;
83}
84
85ProjectManager *ProjectManager::getInstance()
86{
87 if (!s_instance)
88 s_instance = new ProjectManager;
89 return s_instance;
90}
91
92void ProjectManager::createActions( TDEActionCollection* ac )
93{
94 TDEAction *action;
95
96 action = new TDEAction(i18n("&Open Project..."), "project_open", 0,
97 this, TQ_SLOT(slotOpenProject()),
98 ac, "project_open");
99 action->setToolTip( i18n("Open project"));
100 action->setWhatsThis(i18n("<b>Open project</b><p>Opens a KDevelop3 or KDevelop2 project."));
101
102 m_openRecentProjectAction =
103 new TDERecentFilesAction(i18n("Open &Recent Project"), 0,
104 this, TQ_SLOT(loadProject(const KURL &)),
105 ac, "project_open_recent");
106 m_openRecentProjectAction->setToolTip(i18n("Open recent project"));
107 m_openRecentProjectAction->setWhatsThis(i18n("<b>Open recent project</b><p>Opens recently opened project."));
108 m_openRecentProjectAction->loadEntries(kapp->config(), "RecentProjects");
109
110 m_closeProjectAction =
111 new TDEAction(i18n("C&lose Project"), "window-close",0,
112 this, TQ_SLOT(closeProject()),
113 ac, "project_close");
114 m_closeProjectAction->setEnabled(false);
115 m_closeProjectAction->setToolTip(i18n("Close project"));
116 m_closeProjectAction->setWhatsThis(i18n("<b>Close project</b><p>Closes the current project."));
117
118 m_projectOptionsAction = new TDEAction(i18n("Project &Options"), "configure", 0,
119 this, TQ_SLOT(slotProjectOptions()),
120 ac, "project_options" );
121 m_projectOptionsAction->setToolTip(i18n("Project options"));
122 m_projectOptionsAction->setWhatsThis(i18n("<b>Project options</b><p>Lets you customize project options."));
123 m_projectOptionsAction->setEnabled(false);
124}
125
126void ProjectManager::slotOpenProject()
127{
128 TDEConfig *config = kapp->config();
129 config->setGroup("General Options");
130 TQString defaultProjectsDir = config->readPathEntry("DefaultProjectsDir", TQDir::homeDirPath()+"/");
131
132 KURL url = KFileDialog::getOpenURL(defaultProjectsDir,
133 i18n("*.kdevelop|KDevelop 3 Project Files\n"
134 "*.kdevprj|KDevelop 2 Project Files"),
135 TopLevel::getInstance()->main(), i18n("Open Project") );
136
137 if( url.isEmpty() )
138 return;
139
140 if (url.path().endsWith("kdevprj"))
141 loadKDevelop2Project( url );
142 else
143 loadProject( url );
144}
145
146void ProjectManager::slotProjectOptions()
147{
148 KDialogBase dlg(KDialogBase::IconList, i18n("Project Options"),
149 KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, TopLevel::getInstance()->main(),
150 "project options dialog");
151
152 TQVBox *box = dlg.addVBoxPage( i18n("General"), i18n("General"), BarIcon( "tdevelop", TDEIcon::SizeMedium ) );
153 GeneralInfoWidget *g = new GeneralInfoWidget(*API::getInstance()->projectDom(), box, "general informations widget");
154 connect (&dlg, TQ_SIGNAL(okClicked()), g, TQ_SLOT(accept()));
155
156 TDEConfig *config = kapp->config();
157 config->setGroup("Project Settings Dialog");
158 int height = config->readNumEntry( "Height", 600 );
159 int width = config->readNumEntry( "Width", 800 );
160
161 dlg.resize( width, height );
162
163 Core::getInstance()->doEmitProjectConfigWidget(&dlg);
164 dlg.exec();
165
166 saveProjectFile();
167
168 config->setGroup("Project Settings Dialog");
169 config->writeEntry( "Height", dlg.size().height() );
170 config->writeEntry( "Width", dlg.size().width() );
171}
172
173void ProjectManager::loadSettings()
174{
175}
176
177void ProjectManager::saveSettings()
178{
179 TDEConfig *config = kapp->config();
180
181 if (projectLoaded())
182 {
183 config->setGroup("General Options");
184 config->writePathEntry("Last Project", ProjectManager::getInstance()->projectFile().url());
185 }
186
187 m_openRecentProjectAction->saveEntries(config, "RecentProjects");
188}
189
190void ProjectManager::loadDefaultProject()
191{
192 TDEConfig *config = kapp->config();
193 config->setGroup("General Options");
194 TQString project = config->readPathEntry("Last Project");
195 bool readProject = config->readBoolEntry("Read Last Project On Startup", true);
196 if (!project.isEmpty() && readProject)
197 {
198 loadProject(KURL(project));
199 }
200}
201
202bool ProjectManager::loadProject(const KURL &projectURL)
203{
204 KURL url = projectURL;
205
206 if (!url.isValid())
207 return false;
208
209 if (url.isLocalFile())
210 {
211 TQDir dir(url.path());
212 TQString can_path = dir.canonicalPath();
213 //if the directory doesn't exist, the returned string is null which confuses the user later on. so better short-cut here
214 if(can_path.isNull())
215 return false;
216 else
217 url.setPath(can_path);
218 }
219
220 // reopen the already opened project?
221 if( projectLoaded() && url.path() == projectFile().path() )
222 {
223 if (KMessageBox::questionYesNo(TopLevel::getInstance()->main(),
224 i18n("Are you sure you want to reopen the current project?"), TQString(), i18n("Reopen"), i18n("Do Not Reopen")) == KMessageBox::No)
225 return false;
226 }
227
228 TopLevel::getInstance()->main()->menuBar()->setEnabled( false );
229 kapp->setOverrideCursor( waitCursor );
230
231 if( projectLoaded() && !closeProject() )
232 {
233 m_openRecentProjectAction->setCurrentItem( -1 );
234 TopLevel::getInstance()->main()->menuBar()->setEnabled( true );
235 kapp->restoreOverrideCursor();
236 return false;
237 }
238
239 m_info = new ProjectInfo;
240 m_info->m_projectURL = url;
241
242 TQTimer::singleShot( 0, this, TQ_SLOT(slotLoadProject()) );
243
244 // no one cares about this value
245 return true;
246}
247
248void ProjectManager::slotLoadProject( )
249{
250 if( !loadProjectFile() )
251 {
252 m_openRecentProjectAction->removeURL(m_info->m_projectURL);
253 delete m_info; m_info = 0;
254 saveSettings();
255 TopLevel::getInstance()->main()->menuBar()->setEnabled( true );
256 kapp->restoreOverrideCursor();
257 return;
258 }
259
260 getGeneralInfo();
261
262 if( !loadLanguageSupport(m_info->m_language) ) {
263 delete m_info; m_info = 0;
264 TopLevel::getInstance()->main()->menuBar()->setEnabled( true );
265 kapp->restoreOverrideCursor();
266 return;
267 }
268
269 if( !loadProjectPart() ) {
270 unloadLanguageSupport();
271 delete m_info; m_info = 0;
272 API::getInstance()->setProjectDom( 0 );
273 TopLevel::getInstance()->main()->menuBar()->setEnabled( true );
274 kapp->restoreOverrideCursor();
275 return;
276 }
277
278 TopLevel::getInstance()->statusBar()->message( i18n("Changing plugin profile...") );
279 m_oldProfileName = PluginController::getInstance()->changeProfile(m_info->m_profileName);
280
281 TopLevel::getInstance()->statusBar()->message( i18n("Loading project plugins...") );
282 loadLocalParts();
283
284 // shall we try to load a session file from network?? Probably not.
285 if (m_info->m_projectURL.isLocalFile())
286 {
287 // first restore the project session stored in a .kdevses file
288 if (!m_pProjectSession->restoreFromFile(m_info->sessionFile(), PluginController::getInstance()->loadedPlugins() ))
289 {
290 kdWarning() << i18n("error during restoring of the TDevelop session !") << endl;
291 }
292 }
293#if KDE_IS_VERSION(3,5,0)
294 m_openRecentProjectAction->addURL(projectFile(), projectName()); // KDE >= 3.5.x
295#else
296 m_openRecentProjectAction->addURL(projectFile()); // KDE 3.4.x
297#endif
298 m_closeProjectAction->setEnabled(true);
299 m_projectOptionsAction->setEnabled(true);
300
301 Core::getInstance()->doEmitProjectOpened();
302
303 TopLevel::getInstance()->main()->menuBar()->setEnabled( true );
304 kapp->restoreOverrideCursor();
305
306 TopLevel::getInstance()->statusBar()->message( i18n("Project loaded."), 3000 );
307
308 return;
309}
310
311
312bool ProjectManager::closeProject( bool exiting )
313{
314 if( !projectLoaded() )
315 return true;
316
317 // save the session if it is a local file
318 if (m_info->m_projectURL.isLocalFile())
319 {
320 m_pProjectSession->saveToFile(m_info->sessionFile(), PluginController::getInstance()->loadedPlugins() );
321 }
322
323 if ( !PartController::getInstance()->querySaveFiles() )
324 return false;
325
326 Core::getInstance()->doEmitProjectClosed();
327
328 PluginController::getInstance()->unloadProjectPlugins();
329 PluginController::getInstance()->changeProfile(m_oldProfileName);
330 unloadLanguageSupport();
331 unloadProjectPart();
332
334 saveProjectFile();
335
336 API::getInstance()->setProjectDom(0);
337 API::getInstance()->codeModel()->wipeout();
338
339 delete m_info;
340 m_info = 0;
341
342 m_closeProjectAction->setEnabled(false);
343 m_projectOptionsAction->setEnabled(false);
344
345 if ( !exiting )
346 {
347 PartController::getInstance()->slotCloseAllWindows();
348 }
349
350 return true;
351}
352
353bool ProjectManager::loadProjectFile()
354{
355 TQString path;
356 if (!TDEIO::NetAccess::download(m_info->m_projectURL, path, 0)) {
357 KMessageBox::sorry(TopLevel::getInstance()->main(),
358 i18n("Could not read project file: %1").arg(m_info->m_projectURL.prettyURL()));
359 return false;
360 }
361
362 TQFile fin(path);
363 if (!fin.open(IO_ReadOnly))
364 {
365 KMessageBox::sorry(TopLevel::getInstance()->main(),
366 i18n("Could not read project file: %1").arg(m_info->m_projectURL.prettyURL()));
367 return false;
368 }
369
370 int errorLine, errorCol;
371 TQString errorMsg;
372 if (!m_info->m_document.setContent(&fin, &errorMsg, &errorLine, &errorCol))
373 {
374 KMessageBox::sorry(TopLevel::getInstance()->main(),
375 i18n("This is not a valid project file.\n"
376 "XML error in line %1, column %2:\n%3")
377 .arg(errorLine).arg(errorCol).arg(errorMsg));
378 fin.close();
379 TDEIO::NetAccess::removeTempFile(path);
380 return false;
381 }
382 if (m_info->m_document.documentElement().nodeName() != "kdevelop")
383 {
384 KMessageBox::sorry(TopLevel::getInstance()->main(),
385 i18n("This is not a valid project file."));
386 fin.close();
387 TDEIO::NetAccess::removeTempFile(path);
388 return false;
389 }
390
391 fin.close();
392 TDEIO::NetAccess::removeTempFile(path);
393
394 API::getInstance()->setProjectDom(&m_info->m_document);
395
396 return true;
397}
398
399bool ProjectManager::saveProjectFile()
400{
401 Q_ASSERT( API::getInstance()->projectDom() );
402
403 if (m_info->m_projectURL.isLocalFile()) {
404 TQFile fout(m_info->m_projectURL.path());
405 if( !fout.open(IO_WriteOnly) ) {
406 KMessageBox::sorry(TopLevel::getInstance()->main(), i18n("Could not write the project file."));
407 return false;
408 }
409
410 TQTextStream stream(&fout);
411 API::getInstance()->projectDom()->save(stream, 2);
412 fout.close();
413 } else {
414 KTempFile fout(TQString::fromLatin1("kdevelop3"));
415 fout.setAutoDelete(true);
416 if (fout.status() != 0) {
417 KMessageBox::sorry(TopLevel::getInstance()->main(), i18n("Could not write the project file."));
418 return false;
419 }
420 API::getInstance()->projectDom()->save(*(fout.textStream()), 2);
421 fout.close();
422 TDEIO::NetAccess::upload(fout.name(), m_info->m_projectURL, 0);
423 }
424
425 return true;
426}
427
428static TQString getAttribute(TQDomElement elem, TQString attr)
429{
430 TQDomElement el = elem.namedItem(attr).toElement();
431 return el.firstChild().toText().data();
432}
433
434static void getAttributeList(TQDomElement elem, TQString attr, TQString tag, TQStringList &list)
435{
436 list.clear();
437
438 TQDomElement el = elem.namedItem(attr).toElement();
439 TQDomElement item = el.firstChild().toElement();
440 while (!item.isNull())
441 {
442 if (item.tagName() == tag)
443 list << item.firstChild().toText().data();
444 item = item.nextSibling().toElement();
445 }
446}
447
448void ProjectManager::getGeneralInfo()
449{
450 TQDomElement docEl = m_info->m_document.documentElement();
451 TQDomElement generalEl = docEl.namedItem("general").toElement();
452
453 m_info->m_projectPlugin = getAttribute(generalEl, "projectmanagement");
454 m_info->m_vcsPlugin = getAttribute(generalEl, "versioncontrol");
455 m_info->m_language = getAttribute(generalEl, "primarylanguage");
456 m_info->m_projectName = getAttribute(generalEl, "projectname");
457 if( m_info->m_projectName.isEmpty() )
458 {
459 m_info->m_projectName = m_info->m_projectURL.filename();
460 m_info->m_projectName = m_info->m_projectName.left(m_info->m_projectName.length()-TQString(".kdevelop").length());
461 TQDomElement prjname = m_info->m_document.createElement("projectname");
462 prjname.appendChild( m_info->m_document.createTextNode( m_info->m_projectName) );
463 generalEl.appendChild( prjname );
464 }
465
466 getAttributeList(generalEl, "ignoreparts", "part", m_info->m_ignoreParts);
467 getAttributeList(generalEl, "keywords", "keyword", m_info->m_keywords);
468
469 //FIXME: adymo: workaround for those project templates without "profile" element
470// m_info->m_profileName = getAttribute(generalEl, "profile");
471 TQDomElement el = generalEl.namedItem("profile").toElement();
472 if (el.isNull())
473// m_info->m_profileName = profileByAttributes(m_info->m_language, m_info->m_keywords);
474 m_info->m_profileName = Settings::profileByAttributes(m_info->m_language, m_info->m_keywords);
475 else
476 m_info->m_profileName = el.firstChild().toText().data();
477}
478
479bool ProjectManager::loadProjectPart()
480{
481 KService::Ptr projectService = KService::serviceByDesktopName(m_info->m_projectPlugin);
482 if (!projectService) {
483 // this is for backwards compatibility with pre-alpha6 projects
484 projectService = KService::serviceByDesktopName(m_info->m_projectPlugin.lower());
485 }
486 if (!projectService) {
487 KMessageBox::sorry(TopLevel::getInstance()->main(),
488 i18n("No project management plugin %1 found.")
489 .arg(m_info->m_projectPlugin));
490 return false;
491 }
492
493 KDevProject *projectPart = KParts::ComponentFactory
494 ::createInstanceFromService< KDevProject >( projectService, API::getInstance(), 0,
495 PluginController::argumentsFromService( projectService ) );
496 if ( !projectPart ) {
497 KMessageBox::sorry(TopLevel::getInstance()->main(),
498 i18n("Could not create project management plugin %1.")
499 .arg(m_info->m_projectPlugin));
500 return false;
501 }
502
503 API::getInstance()->setProject( projectPart );
504
505 TQDomDocument& dom = *API::getInstance()->projectDom();
506 TQString path = DomUtil::readEntry(dom,"/general/projectdirectory", ".");
507 bool absolute = DomUtil::readBoolEntry(dom,"/general/absoluteprojectpath",false);
508 TQString projectDir = projectDirectory( path, absolute );
509 kdDebug(9000) << "projectDir: " << projectDir << " projectName: " << m_info->m_projectName << endl;
510
511 projectPart->openProject(projectDir, m_info->m_projectName);
512
513 PluginController::getInstance()->integratePart( projectPart );
514
515 return true;
516}
517
518void ProjectManager::unloadProjectPart()
519{
520 KDevProject *projectPart = API::getInstance()->project();
521 if( !projectPart ) return;
522 PluginController::getInstance()->removePart( projectPart );
523 projectPart->closeProject();
524 delete projectPart;
525 API::getInstance()->setProject(0);
526}
527
528bool ProjectManager::loadLanguageSupport(const TQString& lang)
529{
530 kdDebug(9000) << "Looking for language support for " << lang << endl;
531
532 if (lang == m_info->m_activeLanguage)
533 {
534 kdDebug(9000) << "Language support already loaded" << endl;
535 return true;
536 }
537
538 TDETrader::OfferList languageSupportOffers =
539 TDETrader::self()->query(TQString::fromLatin1("TDevelop/LanguageSupport"),
540 TQString::fromLatin1("[X-TDevelop-Language] == '%1' and [X-TDevelop-Version] == %2").arg(lang).arg(TDEVELOP_PLUGIN_VERSION));
541
542 if (languageSupportOffers.isEmpty()) {
543 KMessageBox::sorry(TopLevel::getInstance()->main(),
544 i18n("No language plugin for %1 found.")
545 .arg(lang));
546 return false;
547 }
548
549 KService::Ptr languageSupportService = *languageSupportOffers.begin();
550 KDevLanguageSupport *langSupport = KParts::ComponentFactory
551 ::createInstanceFromService<KDevLanguageSupport>( languageSupportService,
552 API::getInstance(),
553 0,
554 PluginController::argumentsFromService( languageSupportService ) );
555
556 if ( !langSupport ) {
557 KMessageBox::sorry(TopLevel::getInstance()->main(),
558 i18n("Could not create language plugin for %1.")
559 .arg(lang));
560 return false;
561 }
562
563 API::getInstance()->setLanguageSupport( langSupport );
564 PluginController::getInstance()->integratePart( langSupport );
565 m_info->m_activeLanguage = lang;
566 kdDebug(9000) << "Language support for " << lang << " successfully loaded." << endl;
567 return true;
568}
569
570void ProjectManager::unloadLanguageSupport()
571{
572 KDevLanguageSupport *langSupport = API::getInstance()->languageSupport();
573 if( !langSupport ) return;
574 kdDebug(9000) << "Language support for " << langSupport->name() << " unloading..." << endl;
575 PluginController::getInstance()->removePart( langSupport );
576 delete langSupport;
577 API::getInstance()->setLanguageSupport(0);
578}
579
580void ProjectManager::loadLocalParts()
581{
582 // Make sure to refresh load/ignore lists
583 getGeneralInfo();
584
585 PluginController::getInstance()->unloadPlugins( m_info->m_ignoreParts );
586 PluginController::getInstance()->loadProjectPlugins( m_info->m_ignoreParts );
587 PluginController::getInstance()->loadGlobalPlugins( m_info->m_ignoreParts );
588}
589
590KURL ProjectManager::projectFile() const
591{
592 if (!m_info)
593 return KURL();
594 return m_info->m_projectURL;
595}
596
597TQString ProjectManager::projectName() const
598{
599 if (!m_info) return TQString();
600
601 return m_info->m_projectName;
602}
603
604bool ProjectManager::projectLoaded() const
605{
606 return m_info != 0;
607}
608
609ProjectSession* ProjectManager::projectSession() const
610{
611 return m_pProjectSession;
612}
613
614bool ProjectManager::loadKDevelop2Project( const KURL & url )
615{
616 if( !url.isValid() || !url.isLocalFile() ){
617 KMessageBox::sorry(0, i18n("Invalid URL."));
618 return false;
619 }
620
621 TQString cmd = TDEGlobal::dirs()->findExe( "kdevprj2kdevelop" );
622 if (cmd.isEmpty()) {
623 KMessageBox::sorry(0, i18n("You do not have 'kdevprj2kdevelop' installed."));
624 return false;
625 }
626
627 TQFileInfo fileInfo( url.path() );
628
629 KShellProcess proc( "/bin/sh" );
630 proc.setWorkingDirectory( fileInfo.dirPath(true) );
631 proc << "perl" << cmd << KShellProcess::quote( url.path() );
632 proc.start( TDEProcess::Block );
633
634 TQString projectFile = fileInfo.dirPath( true ) + "/" + fileInfo.baseName() + ".kdevelop";
635 return loadProject( KURL(projectFile) );
636}
637
638// TQString ProjectManager::profileByAttributes(const TQString &language, const TQStringList &keywords)
639// {
640// TDEConfig config(locate("data", "tdevelop/profiles/projectprofiles"));
641// config.setGroup(language);
642//
643// TQStringList profileKeywords = TQStringList::split("/", "Empty");
644// if (config.hasKey("Keywords"))
645// profileKeywords = config.readListEntry("Keywords");
646//
647// int idx = 0;
648// for (TQStringList::const_iterator it = profileKeywords.constBegin();
649// it != profileKeywords.constEnd(); ++it)
650// {
651// if (keywords.contains(*it))
652// {
653// idx = profileKeywords.findIndex(*it);
654// break;
655// }
656// }
657//
658// TQStringList profiles;
659// if (config.hasKey("Profiles"))
660// {
661// profiles = config.readListEntry("Profiles");
662// kdDebug() << "IDX: " << idx << " PROFILE: " << profiles[idx] << endl;
663// return profiles[idx];
664// }
665// return "TDevelop";
666// }
667
668#include "projectmanager.moc"
GeneralInfoWidget
General project information widget.
Definition generalinfowidget.h:24
ProjectManager
Project manager.
Definition projectmanager.h:41
ProjectManager::closeProject
bool closeProject(bool exiting=false)
Definition projectmanager.cpp:312
ProjectSession
This class stores and restores the last situation before the certain project was closed.
Definition projectsession.h:36
ProjectSession::restoreFromFile
bool restoreFromFile(const TQString &fileName, const TQValueList< KDevPlugin * > plugins)
Opens the .kdevses file and loads the project session from it.
Definition projectsession.cpp:71
ProjectSession::saveToFile
bool saveToFile(const TQString &fileName, const TQValueList< KDevPlugin * > plugins)
Opens the .kdevses file and saves the project session in XML format to it.
Definition projectsession.cpp:233
TopLevel::getInstance
static KDevMainWindow * getInstance()
Get a pointer to the single KDevTopLevel object.
Definition toplevel.cpp:18

KDevelop Generic Shell

Skip menu "KDevelop Generic Shell"
  • Main Page
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

KDevelop Generic Shell

Skip menu "KDevelop Generic Shell"
  • buildtools
  •   lib
  •     base
  •     parsers
  •       autotools
  •       qmake
  •     widgets
  •   api
  • languages
  •   lib
  •     debugger
  •     designer_integration
  •     interfaces
  • lib
  •   catalog
  •   interfaces
  •     extensions
  •     external
  •     extras
  •   util
  •   widgets
  •     propeditor
  • parts
  •   documentation
  •     interfaces
  • src
  •   profileengine
  •     lib
Generated for KDevelop Generic Shell by doxygen 1.9.8
This website is maintained by Timothy Pearson.