• 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 
11 class 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 
55 TQString 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 
63 TQString 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 
71 ProjectManager *ProjectManager::s_instance = 0;
72 
73 ProjectManager::ProjectManager()
74 : m_info(0L)
75  ,m_pProjectSession(new ProjectSession)
76 {
77 }
78 
79 ProjectManager::~ProjectManager()
80 {
81  delete m_pProjectSession;
82  delete m_info;
83 }
84 
85 ProjectManager *ProjectManager::getInstance()
86 {
87  if (!s_instance)
88  s_instance = new ProjectManager;
89  return s_instance;
90 }
91 
92 void ProjectManager::createActions( TDEActionCollection* ac )
93 {
94  TDEAction *action;
95 
96  action = new TDEAction(i18n("&Open Project..."), "project_open", 0,
97  this, TQT_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, TQT_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, TQT_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, TQT_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 
126 void 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 
146 void 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, TQT_SIGNAL(okClicked()), g, TQT_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 
173 void ProjectManager::loadSettings()
174 {
175 }
176 
177 void 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 
190 void 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 
202 bool 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, TQT_SLOT(slotLoadProject()) );
243 
244  // no one cares about this value
245  return true;
246 }
247 
248 void 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 
312 bool 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 
353 bool 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 
399 bool 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 
428 static TQString getAttribute(TQDomElement elem, TQString attr)
429 {
430  TQDomElement el = elem.namedItem(attr).toElement();
431  return el.firstChild().toText().data();
432 }
433 
434 static 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 
448 void 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 
479 bool 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 
518 void 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 
528 bool 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 
570 void 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 
580 void 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 
590 KURL ProjectManager::projectFile() const
591 {
592  if (!m_info)
593  return KURL();
594  return m_info->m_projectURL;
595 }
596 
597 TQString ProjectManager::projectName() const
598 {
599  if (!m_info) return TQString();
600 
601  return m_info->m_projectName;
602 }
603 
604 bool ProjectManager::projectLoaded() const
605 {
606  return m_info != 0;
607 }
608 
609 ProjectSession* ProjectManager::projectSession() const
610 {
611  return m_pProjectSession;
612 }
613 
614 bool 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"
ProjectManager
Project manager.
Definition: projectmanager.h:40
ProjectManager::closeProject
bool closeProject(bool exiting=false)
Definition: projectmanager.cpp:312
GeneralInfoWidget
General project information widget.
Definition: generalinfowidget.h:24
ProjectSession
This class stores and restores the last situation before the certain project was closed.
Definition: projectsession.h:35
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.8.13
This website is maintained by Timothy Pearson.