diff --git a/src/plugins/qmldesigner/designercore/exceptions/invalididexception.cpp b/src/plugins/qmldesigner/designercore/exceptions/invalididexception.cpp index b56c2f0dc39d2b75afe89dfc77beaf1edceed528..39b7c983520458cedac1dbf6a37f4ccab8aca860 100644 --- a/src/plugins/qmldesigner/designercore/exceptions/invalididexception.cpp +++ b/src/plugins/qmldesigner/designercore/exceptions/invalididexception.cpp @@ -36,34 +36,36 @@ InvalidIdException::InvalidIdException(int line, const QString &function, const QString &file, const QString &id, - bool duplicate) : - InvalidArgumentException(line, function, file, "id"), m_id(id), m_duplicate(duplicate) + Reason reason) : + InvalidArgumentException(line, function, file, "id"), + m_id(id) { + if (reason == InvalidCharacters) { + m_description = QCoreApplication::translate("InvalidIdException", "Only alphanumeric characters and underscore allowed.\nIds must begin with a lowercase letter."); + } else { + m_description = QCoreApplication::translate("InvalidIdException", "Ids have to be unique."); + } } -QString InvalidIdException::type() const -{ - return "InvalidIdException"; -} - -QString InvalidIdException::description() const +InvalidIdException::InvalidIdException(int line, + const QString &function, + const QString &file, + const QString &id, + const QString &description) : + InvalidArgumentException(line, function, file, "id"), + m_id(id), + m_description(description) { - if (m_duplicate) - return duplicateErrorMessage(m_id); - - return invalidErrorMessage(m_id); } -QString InvalidIdException::duplicateErrorMessage(const QString &id) +QString InvalidIdException::type() const { - return QCoreApplication::translate("InvalidIdException", "Ids have to be unique: ") + id; + return "InvalidIdException"; } -QString InvalidIdException::invalidErrorMessage(const QString &id) +QString InvalidIdException::description() const { - return QCoreApplication::translate("InvalidIdException", "Invalid Id: ") + - id + QCoreApplication::translate("InvalidIdException", - "\nOnly alphanumeric characters and underscore allowed.\nIds must begin with a lowercase letter."); + return QCoreApplication::translate("InvalidIdException", "Invalid Id: %1\n%2").arg(m_id, m_description); } } diff --git a/src/plugins/qmldesigner/designercore/include/invalididexception.h b/src/plugins/qmldesigner/designercore/include/invalididexception.h index f9e367692ffeb61333c29ca7720c0f5179ca38a8..2431710e07c275f4e2a13b7add48e3ec80d2d999 100644 --- a/src/plugins/qmldesigner/designercore/include/invalididexception.h +++ b/src/plugins/qmldesigner/designercore/include/invalididexception.h @@ -37,22 +37,26 @@ namespace QmlDesigner { class CORESHARED_EXPORT InvalidIdException : public InvalidArgumentException { public: + enum Reason { InvalidCharacters, DuplicateId }; + + InvalidIdException(int line, + const QString &function, + const QString &file, + const QString &id, + Reason reason); + InvalidIdException(int line, const QString &function, const QString &file, const QString &id, - bool duplicate = false); + const QString &description); QString type() const; QString description() const; - static QString duplicateErrorMessage(const QString &id); - static QString invalidErrorMessage(const QString &id); - private: QString m_id; - bool m_duplicate; - + QString m_description; }; } diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 7c0bc1d90f2f656b0c55db5d4f55b53ed013b622..dc66a9c97055a0030ef534eeeefaa16aa83642fb 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -65,6 +65,7 @@ #include "rewritertransaction.h" #include "rewriterview.h" #include "rewritingexception.h" +#include "invalididexception.h" /*! \defgroup CoreModel @@ -259,7 +260,12 @@ void ModelPrivate::changeNodeId(const InternalNode::Pointer& internalNodePointer m_idNodeHash.remove(oldId); if (!id.isEmpty()) m_idNodeHash.insert(id, internalNodePointer); - notifyNodeIdChanged(internalNodePointer, id, oldId); + + try { + notifyNodeIdChanged(internalNodePointer, id, oldId); + } catch (RewritingException &e) { + throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id, e.description()); + } } void ModelPrivate::checkPropertyName(const QString &propertyName) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 722f93777f38dcef1124199f1efcde75dbfe5606..042049b4f9ee1d8fccbab4a01a068b45f28dc89a 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -180,13 +180,13 @@ void ModelNode::setId(const QString& id) } if (!isValidId(id)) - throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id); + throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id, InvalidIdException::InvalidCharacters); if (id == ModelNode::id()) return; if (view()->hasId(id)) - throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id, true); + throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id, InvalidIdException::DuplicateId); m_model.data()->m_d->changeNodeId(internalNode(), id); }