Commit 5c16f706 authored by Kai Koehne's avatar Kai Koehne
Browse files

Replace .qmlproject default editor with the .qml one

Extend logic for mimetype matching in QmlJsEditor: Also
handle sub-mimetypes like x-application-qmlproject, which
extends x-application-qml.
parent 10dc30fa
......@@ -170,10 +170,11 @@ void QmlModelManager::parse(QFutureInterface<void> &future,
doc->setSource(contents);
const QFileInfo fileInfo(fileName);
Core::MimeType fileMimeTy = db->findByFile(fileInfo);
if (jsSourceTy.matchesFile(fileInfo))
if (matchesMimeType(fileMimeTy, jsSourceTy))
doc->parseJavaScript();
else if (qmlSourceTy.matchesFile(fileInfo))
else if (matchesMimeType(fileMimeTy, qmlSourceTy))
doc->parseQml();
else
qWarning() << "Don't know how to treat" << fileName;
......@@ -183,3 +184,23 @@ void QmlModelManager::parse(QFutureInterface<void> &future,
future.setProgressValue(files.size());
}
// Check whether fileMimeType is the same or extends knownMimeType
bool QmlModelManager::matchesMimeType(const Core::MimeType &fileMimeType, const Core::MimeType &knownMimeType)
{
Core::MimeDatabase *db = Core::ICore::instance()->mimeDatabase();
const QStringList knownTypeNames = QStringList(knownMimeType.type()) + knownMimeType.aliases();
foreach (const QString knownTypeName, knownTypeNames)
if (fileMimeType.matchesType(knownTypeName))
return true;
// recursion to parent types of fileMimeType
foreach (const QString &parentMimeType, fileMimeType.subClassesOf()) {
if (matchesMimeType(db->findByType(parentMimeType), knownMimeType))
return true;
}
return false;
}
......@@ -40,6 +40,7 @@
namespace Core {
class ICore;
class MimeType;
}
namespace QmlJSEditor {
......@@ -82,6 +83,8 @@ protected:
QmlModelManager *modelManager);
private:
static bool matchesMimeType(const Core::MimeType &fileMimeType, const Core::MimeType &knownMimeType);
mutable QMutex m_mutex;
Core::ICore *m_core;
QmlJS::Snapshot _snapshot;
......
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="text/x-qml-project">
<sub-class-of type="text/plain"/>
<mime-type type="application/x-qmlproject">
<sub-class-of type="application/x-qml"/>
<comment>Qml Project file</comment>
<glob pattern="*.qmlproject"/>
</mime-type>
......
......@@ -35,7 +35,7 @@ namespace Constants {
const char *const PROJECTCONTEXT = "QmlProject.ProjectContext";
const char *const LANG_QML = "QML";
const char *const QMLMIMETYPE = "text/x-qml-project"; // ### FIXME
const char *const QMLMIMETYPE = "application/x-qmlproject";
const char *const QMLRUNCONFIGURATION = "QmlProject.QmlLocalApplicationRunConfiguration";
const char *const MAKESTEP = "QmlProject.QmlMakeStep";
......
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#include "qmlprojectfileseditor.h"
#include "qmlprojectmanager.h"
#include "qmlprojectconstants.h"
#include <coreplugin/uniqueidmanager.h>
#include <coreplugin/editormanager/editormanager.h>
#include <texteditor/fontsettings.h>
#include <texteditor/texteditoractionhandler.h>
#include <texteditor/texteditorsettings.h>
using namespace QmlProjectManager;
using namespace QmlProjectManager::Internal;
////////////////////////////////////////////////////////////////////////////////////////
// ProjectFilesFactory
////////////////////////////////////////////////////////////////////////////////////////
ProjectFilesFactory::ProjectFilesFactory(Manager *manager,
TextEditor::TextEditorActionHandler *handler)
: Core::IEditorFactory(manager),
m_manager(manager),
m_actionHandler(handler)
{
m_mimeTypes.append(QLatin1String(Constants::FILES_MIMETYPE));
}
ProjectFilesFactory::~ProjectFilesFactory()
{
}
Manager *ProjectFilesFactory::manager() const
{
return m_manager;
}
Core::IEditor *ProjectFilesFactory::createEditor(QWidget *parent)
{
ProjectFilesEditor *ed = new ProjectFilesEditor(parent, this, m_actionHandler);
TextEditor::TextEditorSettings::instance()->initializeEditor(ed);
return ed->editableInterface();
}
QStringList ProjectFilesFactory::mimeTypes() const
{
return m_mimeTypes;
}
QString ProjectFilesFactory::id() const
{
return QLatin1String(Constants::FILES_EDITOR_ID);
}
QString ProjectFilesFactory::displayName() const
{
return tr(Constants::FILES_EDITOR_DISPLAY_NAME);
}
Core::IFile *ProjectFilesFactory::open(const QString &fileName)
{
Core::EditorManager *editorManager = Core::EditorManager::instance();
if (Core::IEditor *editor = editorManager->openEditor(fileName, id()))
return editor->file();
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// ProjectFilesEditable
////////////////////////////////////////////////////////////////////////////////////////
ProjectFilesEditable::ProjectFilesEditable(ProjectFilesEditor *editor)
: TextEditor::BaseTextEditorEditable(editor)
{
Core::UniqueIDManager *uidm = Core::UniqueIDManager::instance();
m_context << uidm->uniqueIdentifier(Constants::C_FILESEDITOR);
}
ProjectFilesEditable::~ProjectFilesEditable()
{ }
QList<int> ProjectFilesEditable::context() const
{
return m_context;
}
QString ProjectFilesEditable::id() const
{
return Constants::FILES_EDITOR_ID;
}
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());
TextEditor::TextEditorSettings::instance()->initializeEditor(editor);
return editor->editableInterface();
}
////////////////////////////////////////////////////////////////////////////////////////
// ProjectFilesEditor
////////////////////////////////////////////////////////////////////////////////////////
ProjectFilesEditor::ProjectFilesEditor(QWidget *parent, ProjectFilesFactory *factory,
TextEditor::TextEditorActionHandler *handler)
: TextEditor::BaseTextEditor(parent),
m_factory(factory),
m_actionHandler(handler)
{
Manager *manager = factory->manager();
ProjectFilesDocument *doc = new ProjectFilesDocument(manager);
setBaseTextDocument(doc);
handler->setupActions(this);
}
ProjectFilesEditor::~ProjectFilesEditor()
{ }
ProjectFilesFactory *ProjectFilesEditor::factory() const
{
return m_factory;
}
TextEditor::TextEditorActionHandler *ProjectFilesEditor::actionHandler() const
{
return m_actionHandler;
}
TextEditor::BaseTextEditorEditable *ProjectFilesEditor::createEditableInterface()
{
return new ProjectFilesEditable(this);
}
////////////////////////////////////////////////////////////////////////////////////////
// ProjectFilesDocument
////////////////////////////////////////////////////////////////////////////////////////
ProjectFilesDocument::ProjectFilesDocument(Manager *manager)
: m_manager(manager)
{
setMimeType(QLatin1String(Constants::FILES_MIMETYPE));
}
ProjectFilesDocument::~ProjectFilesDocument()
{ }
bool ProjectFilesDocument::save(const QString &name)
{
if (! BaseTextDocument::save(name))
return false;
m_manager->notifyChanged(name);
return true;
}
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at http://qt.nokia.com/contact.
**
**************************************************************************/
#ifndef QMLPROJECTFILESEDITOR_H
#define QMLPROJECTFILESEDITOR_H
#include <texteditor/basetexteditor.h>
#include <texteditor/basetextdocument.h>
#include <coreplugin/editormanager/ieditorfactory.h>
namespace QmlProjectManager {
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 id() const;
virtual QString displayName() const;
virtual Core::IFile *open(const QString &fileName);
private:
Manager *m_manager;
TextEditor::TextEditorActionHandler *m_actionHandler;
QStringList m_mimeTypes;
};
class ProjectFilesEditable: public TextEditor::BaseTextEditorEditable
{
Q_OBJECT
public:
ProjectFilesEditable(ProjectFilesEditor *editor);
virtual ~ProjectFilesEditable();
virtual QList<int> context() const;
virtual QString id() const;
virtual bool duplicateSupported() const;
virtual Core::IEditor *duplicate(QWidget *parent);
virtual bool isTemporary() const { return false; }
private:
QList<int> m_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 *m_factory;
TextEditor::TextEditorActionHandler *m_actionHandler;
};
class ProjectFilesDocument: public TextEditor::BaseTextDocument
{
Q_OBJECT
public:
ProjectFilesDocument(Manager *manager);
virtual ~ProjectFilesDocument();
virtual bool save(const QString &name);
private:
Manager *m_manager;
};
} // end of namespace Internal
} // end of namespace QmlProjectManager
#endif // QMLPROJECTFILESEDITOR_H
......@@ -16,7 +16,6 @@ HEADERS += qmlproject.h \
qmlprojectwizard.h \
qmlnewprojectwizard.h \
qmltaskmanager.h \
qmlprojectfileseditor.h \
qmlprojectmanager_global.h
SOURCES += qmlproject.cpp \
qmlprojectplugin.cpp \
......@@ -24,8 +23,7 @@ SOURCES += qmlproject.cpp \
qmlprojectnodes.cpp \
qmlprojectwizard.cpp \
qmlnewprojectwizard.cpp \
qmltaskmanager.cpp \
qmlprojectfileseditor.cpp
qmltaskmanager.cpp
RESOURCES += qmlproject.qrc
OTHER_FILES += QmlProjectManager.pluginspec
......@@ -32,7 +32,6 @@
#include "qmlprojectwizard.h"
#include "qmlnewprojectwizard.h"
#include "qmlprojectconstants.h"
#include "qmlprojectfileseditor.h"
#include "qmlproject.h"
#include "qmltaskmanager.h"
......@@ -52,14 +51,11 @@ using namespace QmlProjectManager;
using namespace QmlProjectManager::Internal;
QmlProjectPlugin::QmlProjectPlugin() :
m_projectFilesEditorFactory(0),
m_qmlTaskManager(0)
{ }
QmlProjectPlugin::~QmlProjectPlugin()
{
removeObject(m_projectFilesEditorFactory);
delete m_projectFilesEditorFactory;
}
bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
......@@ -76,12 +72,6 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
Manager *manager = new Manager;
TextEditor::TextEditorActionHandler *actionHandler =
new TextEditor::TextEditorActionHandler(Constants::C_FILESEDITOR);
m_projectFilesEditorFactory = new ProjectFilesFactory(manager, actionHandler);
addObject(m_projectFilesEditorFactory);
m_qmlTaskManager = new QmlTaskManager(this);
addAutoReleasedObject(manager);
......
......@@ -52,7 +52,6 @@ public:
virtual void extensionsInitialized();
private:
ProjectFilesFactory *m_projectFilesEditorFactory;
QmlTaskManager *m_qmlTaskManager;
};
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment