diff options
author | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2010-09-30 14:25:20 +0200 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@nokia.com> | 2010-09-30 17:43:19 +0200 |
commit | 4c185a9ac4477686f01af42534c7d6f28f8598df (patch) | |
tree | 4995d5a86fffde737c6f4845387126aeab32288d | |
parent | 2d5049645c502b20c2a8c4c2ce800319d067cbd2 (diff) | |
download | qt-creator-4c185a9ac4477686f01af42534c7d6f28f8598df.tar.gz |
QmlDesigner.model: rename id is now a proper refactoring operation
I an id is now changed in the navaigator or property editor,
we now use the qmljseditor to properly refactor.
Also I changed dynamic_cast to qobject_cast
Reviewed-by: Erik Verbruggen
14 files changed, 70 insertions, 20 deletions
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index df08b21bda..d58e9cbc2c 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -36,6 +36,7 @@ #include <propertymetainfo.h> #include <qgraphicswidget.h> #include <abstractview.h> +#include <rewriterview.h> #include <invalididexception.h> #include <rewritingexception.h> @@ -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 d368c5950c..061a1174c5 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -43,6 +43,7 @@ #include <bindingproperty.h> #include <nodeabstractproperty.h> +#include <rewriterview.h> #include "propertyeditorvalue.h" #include "basiclayouts.h" @@ -354,13 +355,13 @@ void PropertyEditor::changeValue(const QString &propertyName) PropertyEditorValue *value = qobject_cast<PropertyEditorValue*>(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 435ad6d7e9..6ff913eb73 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 118ae560ac..09016ea663 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 7c0f05de4c..cf2f540581 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 4188007a6d..f60219acfd 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 2d64599c15..e2e28c1a97 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 3b40ba0fcb..c53764c419 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<RewriterView::Error> &errors); diff --git a/src/plugins/qmldesigner/designercore/include/textmodifier.h b/src/plugins/qmldesigner/designercore/include/textmodifier.h index affbaa4b29..241f0890c8 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 99707bb651..2c8a58bb49 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<ModelNode> 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 3127be6ead..113ee3b471 100644 --- a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp @@ -32,6 +32,7 @@ #include <extensionsystem/pluginmanager.h> #include <qmljs/qmljsdocument.h> #include <qmljs/qmljsmodelmanagerinterface.h> +#include <qmljseditor/qmljseditor.h> #include <texteditor/tabsettings.h> 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<TextEditor::BaseTextEditor*>(plainTextEdit())) { + if (TextEditor::BaseTextEditor *bte = qobject_cast<TextEditor::BaseTextEditor*>(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<TextEditor::BaseTextEditor*>(plainTextEdit())) { + if (TextEditor::BaseTextEditor *bte = qobject_cast<TextEditor::BaseTextEditor*>(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<QmlJSEditor::Internal::QmlJSTextEditor*>(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 f610f3f6b3..741e05884c 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 44f7976580..651586ee43 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 d3db0e39db..6f5930d741 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(); |