diff options
author | dt <[email protected]> | 2010-09-24 13:17:43 +0200 |
---|---|---|
committer | dt <[email protected]> | 2010-10-04 15:09:59 +0200 |
commit | 61b4cb7ffa1fc73421c6f5f452457cbd6249db89 (patch) | |
tree | eed7261245cc03367cacc5e7e9847f0ec5e20813 /src/plugins/cmakeprojectmanager/cmakeproject.cpp | |
parent | a2809fdfebff8eb4f213a554c00f7bac0c6738e3 (diff) |
CMakeProjectManager: Add Ui completion
That is get code completion without saving the file or building.
Task-Nr: QTCREATORBUG-1657
Diffstat (limited to 'src/plugins/cmakeprojectmanager/cmakeproject.cpp')
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakeproject.cpp | 180 |
1 files changed, 179 insertions, 1 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 14c65d6eb34..a6c62ef9fcc 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -35,14 +35,19 @@ #include "makestep.h" #include "cmakeopenprojectwizard.h" #include "cmakebuildconfiguration.h" +#include "cmakeuicodemodelsupport.h" #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/projectexplorer.h> #include <projectexplorer/buildenvironmentwidget.h> #include <projectexplorer/buildsteplist.h> +#include <projectexplorer/buildmanager.h> #include <cpptools/cppmodelmanagerinterface.h> #include <extensionsystem/pluginmanager.h> +#include <designer/formwindoweditor.h> #include <utils/qtcassert.h> #include <coreplugin/icore.h> +#include <coreplugin/editormanager/editormanager.h> #include <QtCore/QMap> #include <QtCore/QDebug> @@ -74,7 +79,8 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) m_fileName(fileName), m_rootNode(new CMakeProjectNode(m_fileName)), m_insideFileChanged(false), - m_targetFactory(new CMakeTargetFactory(this)) + m_targetFactory(new CMakeTargetFactory(this)), + m_lastEditor(0) { m_file = new CMakeFile(this, fileName); @@ -84,6 +90,17 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) CMakeProject::~CMakeProject() { + // Remove CodeModel support + CppTools::CppModelManagerInterface *modelManager + = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>(); + QMap<QString, CMakeUiCodeModelSupport *>::const_iterator it, end; + it = m_uiCodeModelSupport.constBegin(); + end = m_uiCodeModelSupport.constEnd(); + for (; it!=end; ++it) { + modelManager->removeEditorSupport(it.value()); + delete it.value(); + } + m_codeModelFuture.cancel(); delete m_rootNode; } @@ -229,7 +246,24 @@ bool CMakeProject::parseCMakeLists() // qDebug()<<""; // } + + // TOOD this code ain't very pretty ... + m_uicCommand.clear(); + QFile cmakeCache(activeBC->buildDirectory() + "/CMakeCache.txt"); + cmakeCache.open(QIODevice::ReadOnly); + while (!cmakeCache.atEnd()) { + QString line = cmakeCache.readLine(); + if (line.startsWith("QT_UIC_EXECUTABLE")) { + if (int pos = line.indexOf('=')) { + m_uicCommand = line.mid(pos + 1).trimmed(); + } + break; + } + } + cmakeCache.close(); + //qDebug()<<"Updating CodeModel"; + createUiCodeModelSupport(); QStringList allIncludePaths; QStringList allFrameworkPaths; @@ -533,6 +567,16 @@ bool CMakeProject::fromMap(const QVariantMap &map) connect(t, SIGNAL(environmentChanged()), this, SLOT(changeEnvironment())); } + + connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)), + this, SLOT(editorAboutToClose(Core::IEditor*))); + + connect(Core::EditorManager::instance(), SIGNAL(currentEditorChanged(Core::IEditor*)), + this, SLOT(editorChanged(Core::IEditor*))); + + connect(ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager(), SIGNAL(buildStateChanged(ProjectExplorer::Project*)), + this, SLOT(buildStateChanged(ProjectExplorer::Project*))); + return true; } @@ -544,6 +588,140 @@ CMakeBuildTarget CMakeProject::buildTargetForTitle(const QString &title) return CMakeBuildTarget(); } +QString CMakeProject::uicCommand() const +{ + return m_uicCommand; +} + +QString CMakeProject::uiHeaderFile(const QString &uiFile) +{ + QDir srcDirRoot = QDir(projectDirectory()); + QString relativePath = srcDirRoot.relativeFilePath(uiFile); + QDir buildDir = QDir(activeTarget()->activeBuildConfiguration()->buildDirectory()); + QString uiHeaderFilePath = buildDir.absoluteFilePath(relativePath); + + QFileInfo fi(uiHeaderFilePath); + uiHeaderFilePath = fi.absolutePath(); + uiHeaderFilePath += QLatin1String("/ui_"); + uiHeaderFilePath += fi.completeBaseName(); + uiHeaderFilePath += QLatin1String(".h"); + return QDir::cleanPath(uiHeaderFilePath); +} + +void CMakeProject::createUiCodeModelSupport() +{ +// qDebug()<<"creatUiCodeModelSupport()"; + CppTools::CppModelManagerInterface *modelManager + = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>(); + + // First move all to + QMap<QString, CMakeUiCodeModelSupport *> oldCodeModelSupport; + oldCodeModelSupport = m_uiCodeModelSupport; + m_uiCodeModelSupport.clear(); + + // Find all ui files + foreach (const QString &uiFile, m_files) { + if (uiFile.endsWith(".ui")) { + // UI file, not convert to + QString uiHeaderFilePath = uiHeaderFile(uiFile); + QMap<QString, CMakeUiCodeModelSupport *>::iterator it + = oldCodeModelSupport.find(uiFile); + if (it != oldCodeModelSupport.end()) { + // qDebug()<<"updated old codemodelsupport"; + CMakeUiCodeModelSupport *cms = it.value(); + cms->setFileName(uiHeaderFilePath); + m_uiCodeModelSupport.insert(it.key(), cms); + oldCodeModelSupport.erase(it); + } else { + // qDebug()<<"adding new codemodelsupport"; + CMakeUiCodeModelSupport *cms = new CMakeUiCodeModelSupport(modelManager, this, uiFile, uiHeaderFilePath); + m_uiCodeModelSupport.insert(uiFile, cms); + modelManager->addEditorSupport(cms); + } + } + } + + // Remove old + QMap<QString, CMakeUiCodeModelSupport *>::const_iterator it, end; + end = oldCodeModelSupport.constEnd(); + for (it = oldCodeModelSupport.constBegin(); it!=end; ++it) { + modelManager->removeEditorSupport(it.value()); + delete it.value(); + } +} + +void CMakeProject::updateCodeModelSupportFromEditor(const QString &uiFileName, + const QString &contents) +{ + const QMap<QString, CMakeUiCodeModelSupport *>::const_iterator it = + m_uiCodeModelSupport.constFind(uiFileName); + if (it != m_uiCodeModelSupport.constEnd()) + it.value()->updateFromEditor(contents); +} + +void CMakeProject::editorChanged(Core::IEditor *editor) +{ + // Handle old editor + Designer::FormWindowEditor *lastFormEditor = qobject_cast<Designer::FormWindowEditor *>(m_lastEditor); + if (lastFormEditor) { + disconnect(lastFormEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged())); + + if (m_dirtyUic) { + const QString contents = lastFormEditor->contents(); + updateCodeModelSupportFromEditor(lastFormEditor->file()->fileName(), contents); + m_dirtyUic = false; + } + } + + m_lastEditor = editor; + + // Handle new editor + if (Designer::FormWindowEditor *fw = qobject_cast<Designer::FormWindowEditor *>(editor)) + connect(fw, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged())); +} + +void CMakeProject::editorAboutToClose(Core::IEditor *editor) +{ + if (m_lastEditor == editor) { + // Oh no our editor is going to be closed + // get the content first + Designer::FormWindowEditor *lastEditor = qobject_cast<Designer::FormWindowEditor *>(m_lastEditor); + if (lastEditor) { + disconnect(lastEditor, SIGNAL(changed()), this, SLOT(uiEditorContentsChanged())); + if (m_dirtyUic) { + const QString contents = lastEditor->contents(); + updateCodeModelSupportFromEditor(lastEditor->file()->fileName(), contents); + m_dirtyUic = false; + } + } + m_lastEditor = 0; + } +} + +void CMakeProject::uiEditorContentsChanged() +{ + // cast sender, get filename + if (m_dirtyUic) + return; + Designer::FormWindowEditor *fw = qobject_cast<Designer::FormWindowEditor *>(sender()); + if (!fw) + return; + m_dirtyUic = true; +} + +void CMakeProject::buildStateChanged(ProjectExplorer::Project *project) +{ + if (project == this) { + if (!ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager()->isBuilding(this)) { + QMap<QString, CMakeUiCodeModelSupport *>::const_iterator it, end; + end = m_uiCodeModelSupport.constEnd(); + for (it = m_uiCodeModelSupport.constBegin(); it != end; ++it) { + it.value()->updateFromBuild(); + } + } + } +} + // CMakeFile CMakeFile::CMakeFile(CMakeProject *parent, QString fileName) |