diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index df08b21bda8..d58e9cbc2cf 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -297,10 +298,11 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item) ItemRow itemRow = itemRowForNode(node); if (item == itemRow.idItem) { - try { - node.setId(item->text()); - } catch (InvalidIdException &e) { - QMessageBox::warning(0, tr("Invalid Id"), e.description()); + if (node.isValidId(item->text())) { + if (node.view()->rewriterView()) + node.view()->rewriterView()->renameId(node.id(), item->text()); + } else { + QMessageBox::warning(0, tr("Invalid Id"), item->text() + tr(" is an invalid id")); item->setText(node.id()); } } else if (item == itemRow.visibilityItem) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index d368c5950c8..061a1174c59 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -43,6 +43,7 @@ #include #include +#include #include "propertyeditorvalue.h" #include "basiclayouts.h" @@ -354,13 +355,13 @@ void PropertyEditor::changeValue(const QString &propertyName) PropertyEditorValue *value = qobject_cast(QDeclarativeMetaType::toQObject(m_currentType->m_backendValuesPropertyMap.value(propertyName))); const QString newId = value->value().toString(); - try { - m_selectedNode.setId(newId); - } catch (InvalidIdException &e) { + if (m_selectedNode.isValidId(newId)) { + if (rewriterView()) + rewriterView()->renameId(m_selectedNode.id(), newId); + } else { value->setValue(m_selectedNode.id()); - QMessageBox::warning(0, tr("Invalid Id"), e.description()); + QMessageBox::warning(0, tr("Invalid Id"), newId + tr(" is an invalid id")); } - return; } diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h index 435ad6d7e92..6ff913eb73a 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrewriter.h @@ -77,7 +77,7 @@ protected: { return m_textModifier; } bool includeSurroundingWhitespace(int &start, int &end) const; - void includeLeadingEmptyLine(int &start) const; + void includeLeadingEmptyLine(int &start) const; static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QStringList &propertyOrder); static QmlJS::AST::UiObjectMemberList *searchMemberToInsertAfter(QmlJS::AST::UiObjectMemberList *members, const QString &propertyName, const QStringList &propertyOrder); diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 118ae560ac9..09016ea663c 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -55,6 +55,7 @@ namespace QmlDesigner { class QmlModelView; class NodeInstanceView; +class RewriterView; class CORESHARED_EXPORT AbstractView : public QObject { @@ -141,6 +142,7 @@ public: void changeRootNodeType(const QString &type, int majorVersion, int minorVersion); NodeInstanceView *nodeInstanceView() const; + RewriterView *rewriterView() const; protected: void setModel(Model * model); diff --git a/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h b/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h index 7c0f05de4c5..cf2f540581d 100644 --- a/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/basetexteditmodifier.h @@ -53,6 +53,8 @@ public: virtual int indentDepth() const; + virtual bool renameId(const QString &oldId, const QString &newId); + virtual QmlJS::Snapshot getSnapshot() const; virtual QStringList importPaths() const; }; diff --git a/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h b/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h index 4188007a6d6..f60219acfd1 100644 --- a/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h @@ -61,6 +61,8 @@ public: virtual QmlJS::Snapshot getSnapshot() const; virtual QStringList importPaths() const; + virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } + public slots: void contentsChange(int position, int charsRemoved, int charsAdded); diff --git a/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h b/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h index 2d64599c151..e2e28c1a971 100644 --- a/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h @@ -78,6 +78,8 @@ public: virtual QmlJS::Snapshot getSnapshot() const = 0; virtual QStringList importPaths() const = 0; + virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } + protected: QPlainTextEdit *plainTextEdit() const { return m_textEdit; } diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 3b40ba0fcb9..c53764c4193 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -159,6 +159,8 @@ public: int firstDefinitionInsideLength(const ModelNode &node) const; bool modificationGroupActive(); + bool renameId(const QString& oldId, const QString& newId); + signals: void errorsChanged(const QList &errors); diff --git a/src/plugins/qmldesigner/designercore/include/textmodifier.h b/src/plugins/qmldesigner/designercore/include/textmodifier.h index affbaa4b298..241f0890c8f 100644 --- a/src/plugins/qmldesigner/designercore/include/textmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/textmodifier.h @@ -87,6 +87,8 @@ public: virtual QmlJS::Snapshot getSnapshot() const = 0; virtual QStringList importPaths() const = 0; + virtual bool renameId(const QString &oldId, const QString &newId) = 0; + signals: void textChanged(); diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 99707bb651e..2c8a58bb49d 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -348,6 +348,15 @@ NodeInstanceView *AbstractView::nodeInstanceView() const } } +RewriterView *AbstractView::rewriterView() const +{ + if (model()) { + return model()->m_d->rewriterView(); + } else { + return 0; + } +} + QList AbstractView::allModelNodes() { return toModelNodeList(model()->m_d->allNodes()); diff --git a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp index 3127be6ead8..113ee3b471e 100644 --- a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include using namespace QmlDesigner; @@ -46,7 +47,7 @@ void BaseTextEditModifier::indent(int offset, int length) if (length == 0 || offset < 0 || offset + length >= text().length()) return; - if (TextEditor::BaseTextEditor *bte = dynamic_cast(plainTextEdit())) { + if (TextEditor::BaseTextEditor *bte = qobject_cast(plainTextEdit())) { // find the applicable block: QTextDocument *doc = bte->document(); QTextCursor tc(doc); @@ -60,13 +61,23 @@ void BaseTextEditModifier::indent(int offset, int length) int BaseTextEditModifier::indentDepth() const { - if (TextEditor::BaseTextEditor *bte = dynamic_cast(plainTextEdit())) { + if (TextEditor::BaseTextEditor *bte = qobject_cast(plainTextEdit())) { return bte->tabSettings().m_indentSize; } else { return 0; } } +bool BaseTextEditModifier::renameId(const QString &oldId, const QString &newId) +{ + if (QmlJSEditor::Internal::QmlJSTextEditor *qmljse = qobject_cast(plainTextEdit())) { + qmljse->renameId(oldId, newId); + return true; + } else { + return false; + } +} + namespace { static inline QmlJS::ModelManagerInterface *getModelManager() { diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index f610f3f6b30..741e05884c0 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -539,6 +539,14 @@ bool RewriterView::modificationGroupActive() return m_modificationGroupActive; } +bool RewriterView::renameId(const QString& oldId, const QString& newId) +{ + if (textModifier()) + return textModifier()->renameId(oldId, newId); + + return false; +} + void RewriterView::qmlTextChanged() { if (inErrorState()) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 44f79765804..651586ee43f 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -1045,6 +1045,18 @@ void QmlJSTextEditor::setUpdateSelectedElements(bool value) m_updateSelectedElements = value; } +void QmlJSTextEditor::renameId(const QString &oldId, const QString &newId) +{ + Utils::ChangeSet changeSet; + + foreach (const AST::SourceLocation &loc, m_semanticInfo.idLocations.value(oldId)) { + changeSet.replace(loc.begin(), loc.end(), newId); + } + + QTextCursor tc = textCursor(); + changeSet.apply(&tc); +} + void QmlJSTextEditor::updateUsesNow() { if (document()->revision() != m_semanticInfo.revision()) { @@ -1242,14 +1254,7 @@ void QmlJSTextEditor::renameIdUnderCursor() QLineEdit::Normal, id, &ok); if (ok) { - Utils::ChangeSet changeSet; - - foreach (const AST::SourceLocation &loc, m_semanticInfo.idLocations.value(id)) { - changeSet.replace(loc.begin(), loc.end(), newId); - } - - QTextCursor tc = textCursor(); - changeSet.apply(&tc); + renameId(id, newId); } } diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index d3db0e39dbd..6f5930d7410 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -243,6 +243,8 @@ public: bool updateSelectedElements() const; void setUpdateSelectedElements(bool value); + void renameId(const QString &oldId, const QString &newId); + public slots: void followSymbolUnderCursor(); void findUsages();