diff options
author | Thomas Hartmann <Thomas.Hartmann@digia.com> | 2013-06-10 12:23:08 +0200 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@digia.com> | 2013-06-11 15:44:36 +0200 |
commit | 262f67a0abeecd2a02e91e69f16503f0558455c6 (patch) | |
tree | f4a505293237d52aba31ea1edb381e84dfe8409d /src | |
parent | c2061eaae9454e5856f520ad2beecf015afcd0d0 (diff) | |
download | qt-creator-262f67a0abeecd2a02e91e69f16503f0558455c6.tar.gz |
QmlDesigner.Model: removing unused files
Change-Id: I2ee68bff1100099769cb8a4413052c7f0b8f88aa
Reviewed-by: Marco Bubke <marco.bubke@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/modelrewriter.cpp | 505 | ||||
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/modelrewriter.h | 125 |
2 files changed, 0 insertions, 630 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp b/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp deleted file mode 100644 index a4ad2ff818..0000000000 --- a/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp +++ /dev/null @@ -1,505 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include "modelrewriter.h" -#include <QCoreApplication> - -#include "copyhelper.h" -#include "invalidmodelnodeexception.h" -#include "invalidpropertyexception.h" -#include "internalnode_p.h" -#include "modificationgroupexception.h" -#include "nodeproperty.h" -#include "paster.h" -#include "textmodifier.h" -#include "textlocation.h" - -/*! -\defgroup Rewriting -*/ -/*! -\class QmlDesigner::Internal::ModelRewriter -\ingroup Rewriting -\brief The ModelRewriter class is the facade interface to all rewriting classes for QML files. - -The rewriting consists of two phases. First, any changes are applied to the QML source, as held by the TextModifier. This is done by the -TextToModelMerger. After that, the QTextDocument of the TextModifier will fire a textChanged() signal, which triggers the second phase. In this -phase, the ModelRewriter will use the ModelToTextMerger to parse the QML (using QmlDocDocument) and change the Model according to the new input. - -The strategy of the Model is to first apply the changes to the datastructures itself, and then tell the ModelRewriter to apply the changes to the QML -source file. By doing it in this order, the second phase of the rewriting will usually not make any changes to the Model. - -However, as with any good rule, there are two exceptions. The most common one is that the QTextDocument of the TextModifier is also used by a text -editor. When the user changes anything in the QML source text using that editor, reparsing will be triggered too, and the Model will be changed to -reflect the user's changes. The second exception to the rule is that an error can occur while re-parsing the QML. (Note that this can also happen -due to a change by a text editor.) In this case, the TextToModelMerger will try to revert the model to the last known correct state. - -The ModelRewriter has one requirement to do the application of changes to the text correctly. It assumes that every change is coming in separately. -This means, when, for example, addNode for a rectangle is called, only "Rectangle {}" is added to the QML source text. If the node has properties set, -the rewriting will not magically decide that these need to be added. So to add a rectangle on a certain position with a certain size, the -appropriate calls to addProperty will have to be made too. If these changes need to be made in one "bigger" change to the QML source text, then a -modification group can be created. All the changes in the modification group are applied to the QML source text in such a way that the underlying -QTextDocument will see it as one single change. - -\see QmlDesigner::Model -*/ - -namespace QmlDesigner { -namespace Internal { - -ModelRewriter::ModelRewriter(Model* model, TextModifier* textModifier): - m_subcomponentManager(model->metaInfo()), - m_textModifier(textModifier), - m_modelToTextMerger(model), - m_textToModelMerger(model, &m_subcomponentManager), - m_lastRewriteFailed(false) -{ - Q_ASSERT(model); - Q_ASSERT(textModifier); - - connect(m_textModifier, SIGNAL(textChanged()), this, SLOT(mergeChanges())); -} - -/*! - Starting point for the second phase of the rewriting: this will parse the QML source text, and apply any changes to the Model. - - \param errors A pointer to a list which can hold the QmlError objects which describe errors while parsing the QML source text. Passing - <code>null</code> will leave all errors unreported. - */ -bool ModelRewriter::reloadAndMerge(QList<QmlError> *errors) -{ - if (QCoreApplication::arguments().contains("--no-resync")) - return false; - - QByteArray newData = m_textModifier->text().toUtf8(); - - if (m_textToModelMerger.reloadAndMerge(newData, errors)) { - m_lastCorrectData = newData; - return true; - } else { - m_textToModelMerger.reloadAndMerge(m_lastCorrectData, 0); - return false; - } -} - -/*! - Starting point for the second phase of the rewriting: this will parse the QML source text, and apply any changes to the Model. - - \param url The URL of the input data, used to load any sub-components, and used for reporting parser errors. - \param errors A pointer to a list which can hold the QmlError objects which describe errors while parsing the QML source text. Passing - <code>null</code> will leave all errors unreported. - */ -bool ModelRewriter::load(const QUrl &url, QList<QmlError> *errors) -{ - QByteArray newData = m_textModifier->text().toUtf8(); - - if (m_textToModelMerger.load(newData, url, errors)) { - m_lastCorrectData = newData; - return true; - } else { - return false; - } -} - -/*! - Sets the URL of the input file, which is used to report parser errors, and to load sub-components. - - \note Changing the file URL will force a re-load of all sub-components. - */ -void ModelRewriter::setFileUrl(const QUrl& url) -{ - m_textToModelMerger.setFileUrl(url); -} - -/** - Changes the value of a property in the given state in the QML source text. - - \param state The state for which the property is changed. - \param name The name of the property to change. - \param value The new value for the property. - - \note Changing a property value can only be done after the property has been added to that state. - \see {@link addProperty} - */ -void ModelRewriter::changePropertyValue(const InternalNodeState::Pointer& state, const QString& name, const QVariant& value) -{ - if (state->modelNode()->isReadOnly()) - return; //the rewriter ignores read only nodes - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !state->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.changePropertyValue(state, name, value); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -/** - Adds a property with the given value to the given state in the QML source text. - - \param state The state to which the property is added. - \param name The name of the property. - \param value The value for the new property. - - \see {@link changePropertyValue} - */ -void ModelRewriter::addProperty(const InternalNodeState::Pointer& state, const QString& name, const QVariant& value) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - -// qDebug() << "add property" << name << "in node" << state->modelNode()->id() << "for state" << state->modelState()->name(); - - m_modelToTextMerger.addProperty(state, name, value); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -/** - Removes a property from the given state in the QML source text. - - \param state The state from which to remove the property. - \param name The name of the property to remove. - */ -void ModelRewriter::removeProperty(const InternalNodeState::Pointer& state, const QString& name) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - -// qDebug() << "remove property" << name << "in node" << state->modelNode()->id() << "for state" << state->modelState()->name(); - - m_modelToTextMerger.removeProperty(state, name); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::changeNodeId(const InternalNodePointer& node, const QString& id) -{ - if (node.isNull() || !node->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.changeNodeId(node, id); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -/** - Move the node after the given afterNode. - - \param node the node to move - \param afterNode the node before which the node is put. Pass in InternalNodePointer() to move the node to the end. - */ -void ModelRewriter::moveNodeBefore(const InternalNodePointer& node, const InternalNodePointer& beforeNode) -{ - if (node.isNull() || !node->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !node->baseNodeState()->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!beforeNode.isNull() && beforeNode->isValid()) - if (!modificationGroupActive() && !beforeNode->baseNodeState()->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.moveNodeBefore(node, beforeNode); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::addModelState(const InternalModelState::Pointer &state) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.addModelState(state); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::removeModelState(const InternalModelState::Pointer &state) -{ - m_modelToTextMerger.removeModelState(state); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::setStateName(const InternalModelStatePointer &state, const QString &name) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !state->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.setStateName(state, name); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::setStateWhenCondition(const InternalModelStatePointer &state, const QString &whenCondition) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !state->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.setStateWhenCondition(state, whenCondition); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::setAnchor(const InternalNodeState::Pointer &state, const QString &propertyName, const QVariant &value) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (state->propertyLocation(propertyName).isValid()) - m_modelToTextMerger.changePropertyValue(state, propertyName, value); - else - m_modelToTextMerger.addProperty(state, propertyName, value); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::removeAnchor(const InternalNodeState::Pointer &state, const QString &propertyName) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.removeProperty(state, propertyName); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::setAnchorMargin(const InternalNodeState::Pointer &state, const QString &propertyName, const QVariant &value) -{ - if (state.isNull() || !state->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (state->propertyLocation(propertyName).isValid()) { - if (value.toDouble() == 0.0 && state->isBaseState()) - m_modelToTextMerger.removeProperty(state, propertyName); - else - m_modelToTextMerger.changePropertyValue(state, propertyName, value); - } else { - if (value.toDouble() == 0.0 && state->isBaseState()) { - // do nothing - } else { - m_modelToTextMerger.addProperty(state, propertyName, value); - } - } - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::addNode(const InternalNodePointer& newNode, const InternalNodePointer& parentNode) -{ - if (newNode.isNull() || !newNode->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !parentNode->baseNodeState()->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.addNode(newNode, parentNode); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::removeNode(const InternalNodePointer &node) -{ - if (node.isNull() || !node->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !node->baseNodeState()->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.removeNode(node); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -void ModelRewriter::reparentNode(const InternalNodePointer &child, const InternalNodePointer &newParent) -{ - if (child.isNull() || !child->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - if (newParent.isNull() || !newParent->isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - if (!modificationGroupActive() && !newParent->baseNodeState()->location().isValid()) - throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - - m_modelToTextMerger.reparentNode(child, newParent); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -ModificationGroupToken ModelRewriter::beginModificationGroup() -{ - ModificationGroupToken newToken(m_activeModificationGroups.size()); - m_activeModificationGroups.append(newToken); - - return newToken; -} - -void ModelRewriter::endModificationGroup(const ModificationGroupToken& token) -{ - if (m_activeModificationGroups.isEmpty()) - throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - - if (m_activeModificationGroups.last() != token) - throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - - if (!m_activeModificationGroups.removeAll(token)) - throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -bool ModelRewriter::lastRewriteFailed() const -{ - return m_lastRewriteFailed; -} - -QMimeData *ModelRewriter::copy(const QList<InternalNodeState::Pointer> &nodeStates) const -{ - if (modificationGroupActive()) - throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - - const QString sourceCode = m_textModifier->text(); - CopyHelper copyHelper(sourceCode); - return copyHelper.createMimeData(nodeStates); -} - -/*! - Inserts the copied data into the given node. - - \note The mime-type for the data must be <tt>"application/x-qt-bauhaus"</tt>, otherwise the paste will fail. - - \param transferData The clip-board contents to paste. - \param intoNode The node into which the clip-board contents are to be pasted. - \return true if successful, false otherwise. - */ -bool ModelRewriter::paste(QMimeData *transferData, const InternalNode::Pointer &intoNode) -{ - if (!transferData) - return false; - - if (intoNode.isNull() || !intoNode->isValid()) - throw InvalidModelNodeException(__LINE__, Q_FUNC_INFO, __FILE__); - - Paster paster(transferData, intoNode); - if (paster.doPaste(m_modelToTextMerger)) { - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); - return true; - } else { - m_modelToTextMerger.clear(); - return false; - } -} - -/*! - Adds the given import to the QML file, if it doesn't already exist. - - \param import The import to add. - */ -void ModelRewriter::addImport(const Import &import) -{ - m_modelToTextMerger.addImport(import); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -/*! - Removes the given import from the QML file. - - \param import The import to remove. - */ -void ModelRewriter::removeImport(const Import &import) -{ - m_modelToTextMerger.removeImport(import); - - if (!modificationGroupActive()) - m_modelToTextMerger.applyChanges(*m_textModifier); -} - -/*! - Slot connected to the textChanged() signal of the underlying QTextDocument. This slot will start the second part of the rewriting phase, being - the part where the QML document is parsed and any changes being merged into the Model. - - Any errors that occur during this phase will be reported by emitting the errorDuringRewrite() signal. - */ -void ModelRewriter::mergeChanges() -{ -// qDebug() << "*** Running rewrite..."; - - m_lastRewriteFailed = false; - - QList<QmlError> errors; - if (reloadAndMerge(&errors)) { -// qDebug() << "===> Roundtrip done"; - } else { - qDebug() << "===> Error doing round-trip"; - qDebug() << "new data:" << m_textModifier->text().toUtf8(); - qDebug() << "old data:" << m_lastCorrectData; - m_lastRewriteFailed = true; - emit errorDuringRewrite(errors); - } -} - -/*! - \fn void ModelRewriter::errorDuringRewrite(const QList<QmlError> &errors) - Emitted when an error when reading or merging changes back after the underlying text (-document) changed. - - \note This signal can be emitted after a modification by from within the application, or by a change done by a text editor which uses the same - QTextDocument. - */ - -} -} diff --git a/src/plugins/qmldesigner/designercore/model/modelrewriter.h b/src/plugins/qmldesigner/designercore/model/modelrewriter.h deleted file mode 100644 index c377c7125d..0000000000 --- a/src/plugins/qmldesigner/designercore/model/modelrewriter.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef MODELREWRITER_H -#define MODELREWRITER_H - -#include <QByteArray> -#include <QMimeData> -#include <QObject> -#include <QUrl> - -#include "anchorline.h" -#include "import.h" -#include "modeltotextmerger.h" -#include "model.h" -#include "modelnode.h" -#include "modificationgrouptoken.h" -#include "subcomponentmanager.h" -#include "texttomodelmerger.h" - -namespace QmlDesigner { -class TextModifier; - -namespace Internal { - -class ModelPrivate; - -class ModelRewriter: public QObject -{ - Q_OBJECT - -public: - ModelRewriter(Model* model, TextModifier* textModifier); - - TextModifier *textModifier() const { return m_textModifier; } - - bool load(const QUrl &url, QList<QmlError> *errors = 0); - bool reloadAndMerge(QList<QmlError> *errors = 0); - void setFileUrl(const QUrl& url); - - ModificationGroupToken beginModificationGroup(); - void endModificationGroup(const ModificationGroupToken& token); - - // Property change actions: - void addProperty(const InternalNodeState::Pointer& state, const QString& name, const QVariant& value); - void changePropertyValue(const InternalNodeState::Pointer& state, const QString& name, const QVariant& value); - void removeProperty(const InternalNodeState::Pointer& state, const QString& name); - - // Node change actions: - void addNode(const InternalNodePointer& newNode, const InternalNodePointer& parentNode); - void reparentNode(const InternalNodePointer &child, const InternalNodePointer &newParent); - void removeNode(const InternalNodePointer &node); - void changeNodeId(const InternalNodePointer& node, const QString& id); - void moveNodeBefore(const InternalNodePointer& node, const InternalNodePointer& beforeNode); - - // State change actions: - void addModelState(const InternalModelState::Pointer &state); - void removeModelState(const InternalModelState::Pointer &state); - void setStateName(const InternalModelStatePointer &state, const QString &name); - void setStateWhenCondition(const InternalModelStatePointer &state, const QString &whenCondition); - - // Anchors: - void setAnchor(const InternalNodeState::Pointer &state, const QString &propertyName, const QVariant &value); - void removeAnchor(const InternalNodeState::Pointer &state, const QString &propertyName); - void setAnchorMargin(const InternalNodeState::Pointer &state, const QString &propertyName, const QVariant &value); - - bool lastRewriteFailed() const; - - // Copy & Paste: - QMimeData* copy(const QList<InternalNodeState::Pointer> &nodeStates) const; - bool paste(QMimeData *transferData, const InternalNode::Pointer &intoNode); - - // Imports: - void addImport(const Import &import); - void removeImport(const Import &import); - -public slots: - void mergeChanges(); - -signals: - void errorDuringRewrite(const QList<QmlError> &errors); - -private: - bool modificationGroupActive() const { return !m_activeModificationGroups.isEmpty(); } - -private: - SubComponentManager m_subcomponentManager; - QByteArray m_lastCorrectData; - QList<ModificationGroupToken> m_activeModificationGroups; - TextModifier* m_textModifier; - ModelToTextMerger m_modelToTextMerger; - TextToModelMerger m_textToModelMerger; - bool m_lastRewriteFailed; -}; - -} -} - -#endif //MODELREWRITER_H |