diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 6cfec71e0f619521a3b8cd62dd7877965cd4c12d..3acd76af8fdb4c13ac97c026160b29c77c19342a 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -75,7 +75,7 @@ Q_DECLARE_METATYPE(Core::IEditor*) using namespace Core; using namespace Core::Internal; -enum { debugEditorManager=0 }; +enum { debugEditorManager=1 }; static inline ExtensionSystem::PluginManager *pluginManager() { diff --git a/src/plugins/genericprojectmanager/GenericProject.mimetypes.xml b/src/plugins/genericprojectmanager/GenericProject.mimetypes.xml index d3ff62dbea5890eda0c26f48aa8b11a417ed83d6..c45a828b20015181526ad3eacc354bcd067424c8 100644 --- a/src/plugins/genericprojectmanager/GenericProject.mimetypes.xml +++ b/src/plugins/genericprojectmanager/GenericProject.mimetypes.xml @@ -1,8 +1,28 @@ <?xml version="1.0"?> + <mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'> <mime-type type="text/x-generic-project"> <sub-class-of type="text/plain"/> <comment>Generic Qt Creator Project file</comment> <glob pattern="*.creator"/> </mime-type> + + <mime-type type="application/vnd.nokia.qt.generic.files"> + <sub-class-of type="text/plain"/> + <comment>Generic Project Files</comment> + <glob pattern="*.files"/> + </mime-type> + + <mime-type type="application/vnd.nokia.qt.generic.includes"> + <sub-class-of type="text/plain"/> + <comment>Generic Project Include Paths</comment> + <glob pattern="*.includes"/> + </mime-type> + + <mime-type type="application/vnd.nokia.qt.generic.config"> + <sub-class-of type="text/plain"/> + <comment>Generic Project Configuration File</comment> + <glob pattern="*.config"/> + </mime-type> + </mime-info> diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 551900778994598ebf07bebc81ff144fd1c72c99..9e1c52efb681aeb9f87be7926ed3db4491838ca3 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -113,32 +113,72 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName) _file = new GenericProjectFile(this, fileName); _rootNode = new GenericProjectNode(this, _file); + + _manager->registerProject(this); } GenericProject::~GenericProject() { qDebug() << Q_FUNC_INFO; + _manager->unregisterProject(this); + delete _rootNode; delete _toolChain; } +QStringList GenericProject::readLines(const QString &absoluteFileName) const +{ + QStringList lines; + + QFile file(absoluteFileName); + if (file.open(QFile::ReadOnly)) { + QTextStream stream(&file); + + forever { + QString line = stream.readLine(); + if (line.isNull()) + break; + + line = line.trimmed(); + if (line.isEmpty()) + continue; + + lines.append(line); + } + } + + return lines; +} + + void GenericProject::parseProject() { + const QFileInfo projectFileInfo(_fileName); + const QDir projectDir = projectFileInfo.dir(); + const QString projectName = projectFileInfo.baseName(); + const QFileInfo projectFiles(projectDir, projectName + QLatin1String(".files")); + const QFileInfo projectIncludes(projectDir, projectName + QLatin1String(".includes")); + const QFileInfo projectConfig(projectDir, projectName + QLatin1String(".config")); + QSettings projectInfo(_fileName, QSettings::IniFormat); - _files = convertToAbsoluteFiles(projectInfo.value(QLatin1String("files")).toStringList()); + _files = convertToAbsoluteFiles(readLines(projectFiles.absoluteFilePath())); + _projectIncludePaths = readLines(projectIncludes.absoluteFilePath()); + _generated = convertToAbsoluteFiles(projectInfo.value(QLatin1String("generated")).toStringList()); _defines = projectInfo.value(QLatin1String("defines")).toStringList(); _projectIncludePaths = projectInfo.value(QLatin1String("includePaths")).toStringList(); - - qDebug() << "project include paths:" << _projectIncludePaths; + + emit fileListChanged(); } void GenericProject::refresh() { qDebug() << Q_FUNC_INFO; + parseProject(); + _rootNode->refresh(); CppTools::CppModelManagerInterface *modelManager = diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index 5ed588d7f09be819a1fbca7022cd1a09e3f1ac37..c5cb8bcf8a019362d762b2280ff9bafd855727d2 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -106,6 +106,8 @@ protected: private: void parseProject(); + QStringList readLines(const QString &absoluteFileName) const; + Manager *_manager; QString _fileName; GenericProjectFile *_file; diff --git a/src/plugins/genericprojectmanager/genericprojectconstants.h b/src/plugins/genericprojectmanager/genericprojectconstants.h index 7a47effaff40fd730bf9e7835ab334e1e6eb4bfd..d05c922b5e036f1c7ec63ba538ae5907e31ec14a 100644 --- a/src/plugins/genericprojectmanager/genericprojectconstants.h +++ b/src/plugins/genericprojectmanager/genericprojectconstants.h @@ -33,10 +33,24 @@ namespace GenericProjectManager { namespace Constants { -const char *const PROJECTCONTEXT = "GenericProject.ProjectContext"; -const char *const GENERICMIMETYPE = "text/x-generic-project"; -const char *const MAKESTEP = "GenericProjectManager.MakeStep"; +const char *const PROJECTCONTEXT = "GenericProject.ProjectContext"; +const char *const GENERICMIMETYPE = "text/x-generic-project"; // ### FIXME +const char *const MAKESTEP = "GenericProjectManager.MakeStep"; +// contexts +const char *const C_FILESEDITOR = ".files Editor"; + +// kinds +const char *const PROJECT_KIND = "Generic"; + +const char *const FILES_EDITOR = ".files Editor"; +const char *const FILES_MIMETYPE = "application/vnd.nokia.qt.generic.files"; + +const char *const INCLUDES_EDITOR = ".includes Editor"; +const char *const INCLUDES_MIMETYPE = "application/vnd.nokia.qt.generic.includes"; + +const char *const CONFIG_EDITOR = ".includes Editor"; +const char *const CONFIG_MIMETYPE = "application/vnd.nokia.qt.generic.config"; } // namespace Constants } // namespace GenericProjectManager diff --git a/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp b/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c072d641f9507020eea9a9500ea112b5221c503e --- /dev/null +++ b/src/plugins/genericprojectmanager/genericprojectfileseditor.cpp @@ -0,0 +1,136 @@ +#include "genericprojectfileseditor.h" +#include "genericprojectmanager.h" +#include "genericprojectconstants.h" + +#include <coreplugin/uniqueidmanager.h> +#include <coreplugin/editormanager/editormanager.h> + +#include <QtDebug> + +using namespace GenericProjectManager; +using namespace GenericProjectManager::Internal; + + +//////////////////////////////////////////////////////////////////////////////////////// +// ProjectFilesEditable +//////////////////////////////////////////////////////////////////////////////////////// +ProjectFilesFactory::ProjectFilesFactory(Manager *manager, + TextEditor::TextEditorActionHandler *handler) + : Core::IEditorFactory(manager), + _manager(manager), + _actionHandler(handler) +{ + _mimeTypes.append(QLatin1String(Constants::FILES_MIMETYPE)); + _mimeTypes.append(QLatin1String(Constants::INCLUDES_MIMETYPE)); +} + +ProjectFilesFactory::~ProjectFilesFactory() +{ } + +Manager *ProjectFilesFactory::manager() const +{ return _manager; } + +Core::IEditor *ProjectFilesFactory::createEditor(QWidget *parent) +{ + ProjectFilesEditor *ed = new ProjectFilesEditor(parent, this, _actionHandler); + // ### initialize + return ed->editableInterface(); +} + +QStringList ProjectFilesFactory::mimeTypes() const +{ return _mimeTypes; } + +QString ProjectFilesFactory::kind() const +{ return QLatin1String(Constants::FILES_EDITOR); } + +Core::IFile *ProjectFilesFactory::open(const QString &fileName) +{ + qDebug() << Q_FUNC_INFO << fileName; + + Core::EditorManager *editorManager = Core::EditorManager::instance(); + + if (Core::IEditor *editor = editorManager->openEditor(fileName, kind())) + return editor->file(); + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// ProjectFilesEditable +//////////////////////////////////////////////////////////////////////////////////////// +ProjectFilesEditable::ProjectFilesEditable(ProjectFilesEditor *editor) + : TextEditor::BaseTextEditorEditable(editor) +{ + Core::UniqueIDManager *uidm = Core::UniqueIDManager::instance(); + _context << uidm->uniqueIdentifier(Constants::C_FILESEDITOR); +} + +ProjectFilesEditable::~ProjectFilesEditable() +{ } + +QList<int> ProjectFilesEditable::context() const +{ return _context; } + +const char *ProjectFilesEditable::kind() const +{ return Constants::FILES_EDITOR; } + +bool ProjectFilesEditable::duplicateSupported() const +{ return true; } + +Core::IEditor *ProjectFilesEditable::duplicate(QWidget *parent) +{ + ProjectFilesEditor *parentEditor = qobject_cast<ProjectFilesEditor *>(editor()); + ProjectFilesEditor *editor = new ProjectFilesEditor(parent, + parentEditor->factory(), + parentEditor->actionHandler()); + return editor->editableInterface(); + + +} + +//////////////////////////////////////////////////////////////////////////////////////// +// ProjectFilesEditor +//////////////////////////////////////////////////////////////////////////////////////// +ProjectFilesEditor::ProjectFilesEditor(QWidget *parent, ProjectFilesFactory *factory, + TextEditor::TextEditorActionHandler *handler) + : TextEditor::BaseTextEditor(parent), + _factory(factory), + _actionHandler(handler) +{ + Manager *manager = factory->manager(); + ProjectFilesDocument *doc = new ProjectFilesDocument(manager); + setBaseTextDocument(doc); +} + +ProjectFilesEditor::~ProjectFilesEditor() +{ } + +ProjectFilesFactory *ProjectFilesEditor::factory() const +{ return _factory; } + +TextEditor::TextEditorActionHandler *ProjectFilesEditor::actionHandler() const +{ return _actionHandler; } + +TextEditor::BaseTextEditorEditable *ProjectFilesEditor::createEditableInterface() +{ return new ProjectFilesEditable(this); } + +//////////////////////////////////////////////////////////////////////////////////////// +// ProjectFilesDocument +//////////////////////////////////////////////////////////////////////////////////////// +ProjectFilesDocument::ProjectFilesDocument(Manager *manager) + : _manager(manager) +{ + setMimeType(QLatin1String(Constants::FILES_MIMETYPE)); +} + +ProjectFilesDocument::~ProjectFilesDocument() +{ } + +bool ProjectFilesDocument::save(const QString &name) +{ + if (! BaseTextDocument::save(name)) + return false; + + _manager->notifyChanged(name); + return true; +} diff --git a/src/plugins/genericprojectmanager/genericprojectfileseditor.h b/src/plugins/genericprojectmanager/genericprojectfileseditor.h new file mode 100644 index 0000000000000000000000000000000000000000..14077aca5b738c244e5c9384c109ab5fa84751cb --- /dev/null +++ b/src/plugins/genericprojectmanager/genericprojectfileseditor.h @@ -0,0 +1,94 @@ +#ifndef GENERICPROJECTFILESEDITOR_H +#define GENERICPROJECTFILESEDITOR_H + +#include <texteditor/basetexteditor.h> +#include <texteditor/basetextdocument.h> + +#include <coreplugin/editormanager/ieditorfactory.h> + +namespace GenericProjectManager { +namespace Internal { + +class Manager; +class ProjectFilesEditable; +class ProjectFilesEditor; +class ProjectFilesDocument; +class ProjectFilesFactory; + +class ProjectFilesFactory: public Core::IEditorFactory +{ + Q_OBJECT + +public: + ProjectFilesFactory(Manager *manager, TextEditor::TextEditorActionHandler *handler); + virtual ~ProjectFilesFactory(); + + Manager *manager() const; + + virtual Core::IEditor *createEditor(QWidget *parent); + + virtual QStringList mimeTypes() const; + virtual QString kind() const; + virtual Core::IFile *open(const QString &fileName); + +private: + Manager *_manager; + TextEditor::TextEditorActionHandler *_actionHandler; + QStringList _mimeTypes; +}; + +class ProjectFilesEditable: public TextEditor::BaseTextEditorEditable +{ + Q_OBJECT + +public: + ProjectFilesEditable(ProjectFilesEditor *editor); + virtual ~ProjectFilesEditable(); + + virtual QList<int> context() const; + virtual const char *kind() const; + + virtual bool duplicateSupported() const; + virtual Core::IEditor *duplicate(QWidget *parent); + +private: + QList<int> _context; +}; + +class ProjectFilesEditor: public TextEditor::BaseTextEditor +{ + Q_OBJECT + +public: + ProjectFilesEditor(QWidget *parent, ProjectFilesFactory *factory, + TextEditor::TextEditorActionHandler *handler); + virtual ~ProjectFilesEditor(); + + ProjectFilesFactory *factory() const; + TextEditor::TextEditorActionHandler *actionHandler() const; + + virtual TextEditor::BaseTextEditorEditable *createEditableInterface(); + +private: + ProjectFilesFactory *_factory; + TextEditor::TextEditorActionHandler *_actionHandler; +}; + +class ProjectFilesDocument: public TextEditor::BaseTextDocument +{ + Q_OBJECT + +public: + ProjectFilesDocument(Manager *manager); + virtual ~ProjectFilesDocument(); + + virtual bool save(const QString &name); + +private: + Manager *_manager; +}; + +} // end of namespace Internal +} // end of namespace GenericProjectManager + +#endif // GENERICPROJECTFILESEDITOR_H diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.cpp b/src/plugins/genericprojectmanager/genericprojectmanager.cpp index 28a629b011db685d7a2a04e25fbe60a3ed50d646..61fba763c9749913b074f650aba5181acc253caf 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.cpp +++ b/src/plugins/genericprojectmanager/genericprojectmanager.cpp @@ -35,6 +35,8 @@ #include <coreplugin/uniqueidmanager.h> #include <projectexplorer/projectexplorerconstants.h> +#include <QtDebug> + using namespace GenericProjectManager::Internal; Manager::Manager() @@ -60,9 +62,24 @@ ProjectExplorer::Project *Manager::openProject(const QString &fileName) { QFileInfo fileInfo(fileName); - if (fileInfo.isFile()) - return new GenericProject(this, fileName); + if (fileInfo.isFile()) { + GenericProject *project = new GenericProject(this, fileName); + return project; + } return 0; } +void Manager::registerProject(GenericProject *project) +{ _projects.append(project); } + +void Manager::unregisterProject(GenericProject *project) +{ _projects.removeAll(project); } + +void Manager::notifyChanged(const QString &fileName) +{ + foreach (GenericProject *project, _projects) { + project->refresh(); + } +} + diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.h b/src/plugins/genericprojectmanager/genericprojectmanager.h index 56da98651902b9046492d89faa6053c0417725fe..608313e13f028f513caaed7b6c3e4a975644211e 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.h +++ b/src/plugins/genericprojectmanager/genericprojectmanager.h @@ -35,6 +35,8 @@ namespace GenericProjectManager { namespace Internal { +class GenericProject; + class Manager: public ProjectExplorer::IProjectManager { Q_OBJECT @@ -49,9 +51,15 @@ public: virtual QString mimeType() const; virtual ProjectExplorer::Project *openProject(const QString &fileName); + void notifyChanged(const QString &fileName); + + void registerProject(GenericProject *project); + void unregisterProject(GenericProject *project); + private: int _projectContext; int _projectLanguage; + QList<GenericProject *> _projects; }; } // namespace Internal diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.pro b/src/plugins/genericprojectmanager/genericprojectmanager.pro index 57a849d161be64b4159566f0cea93d0ee992a4d8..fa8bb3a987e1ad85cfbe402d9e79a8b3baf8feb3 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.pro +++ b/src/plugins/genericprojectmanager/genericprojectmanager.pro @@ -8,6 +8,7 @@ HEADERS = genericproject.h \ genericprojectconstants.h \ genericprojectnodes.h \ genericprojectwizard.h \ + genericprojectfileseditor.h \ pkgconfigtool.h \ makestep.h SOURCES = genericproject.cpp \ @@ -15,6 +16,7 @@ SOURCES = genericproject.cpp \ genericprojectmanager.cpp \ genericprojectnodes.cpp \ genericprojectwizard.cpp \ + genericprojectfileseditor.cpp \ pkgconfigtool.cpp \ makestep.cpp RESOURCES += genericproject.qrc diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index 75d70955a6e66aa07b9e0b7ad73b7d800d3871bc..2fe1e713910079d402a5ace5f4f4da6c99cbf14d 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -30,21 +30,30 @@ #include "genericprojectplugin.h" #include "genericprojectmanager.h" #include "genericprojectwizard.h" +#include "genericprojectconstants.h" +#include "genericprojectfileseditor.h" #include "makestep.h" #include <coreplugin/icore.h> #include <coreplugin/mimedatabase.h> +#include <texteditor/texteditoractionhandler.h> + #include <QtCore/QtPlugin> #include <QtCore/QDebug> +using namespace GenericProjectManager; using namespace GenericProjectManager::Internal; GenericProjectPlugin::GenericProjectPlugin() + : _projectFilesEditorFactory(0) { } GenericProjectPlugin::~GenericProjectPlugin() -{ } +{ + removeObject(_projectFilesEditorFactory); + delete _projectFilesEditorFactory; +} bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage) { @@ -58,7 +67,15 @@ bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage if (! mimeDB->addMimeTypes(mimetypesXml, errorMessage)) return false; - addAutoReleasedObject(new Manager); + Manager *manager = new Manager; + + TextEditor::TextEditorActionHandler *actionHandler = + new TextEditor::TextEditorActionHandler(Constants::C_FILESEDITOR); + + _projectFilesEditorFactory = new ProjectFilesFactory(manager, actionHandler); + addObject(_projectFilesEditorFactory); + + addAutoReleasedObject(manager); addAutoReleasedObject(new MakeBuildStepFactory); addAutoReleasedObject(new GenericProjectWizard); diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.h b/src/plugins/genericprojectmanager/genericprojectplugin.h index 287ef500ff1364ff93ff5b2d25564e3b4dcd97be..e78d975e21f62db0be487aef6b9bedfd516415cf 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.h +++ b/src/plugins/genericprojectmanager/genericprojectplugin.h @@ -37,6 +37,8 @@ namespace GenericProjectManager { namespace Internal { +class ProjectFilesFactory; + class GenericProjectPlugin: public ExtensionSystem::IPlugin { Q_OBJECT @@ -47,6 +49,9 @@ public: virtual bool initialize(const QStringList &arguments, QString *errorString); virtual void extensionsInitialized(); + +private: + ProjectFilesFactory *_projectFilesEditorFactory; }; } // namespace Internal