From 7bcd03a5470250eac5fe3b91ab3163a91ce552da Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Wed, 28 Apr 2010 13:42:41 +0200
Subject: [PATCH] QmlDesigner.propertyEditor: unifying error messages for
 invalid nodes

The Navigator and the Property Editor now show the same error
message for invalid nodes

See: BAUHAUS-611
---
 .../navigator/navigatortreemodel.cpp          | 11 +++-----
 .../propertyeditor/propertyeditor.cpp         |  9 +++----
 .../core/exceptions/invalididexception.cpp    | 25 +++++++++++++++++--
 .../core/include/invalididexception.h         | 12 ++++++++-
 .../qmldesigner/core/model/modelnode.cpp      |  4 +--
 5 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index 81c4d2c3a14..25908d605c1 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -272,14 +272,9 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item)
     ItemRow itemRow = itemRowForNode(node);
     if (item == itemRow.idItem) {
         try {
-            if (ModelNode::isValidId(item->text()))
-                node.setId(item->text());
-            else {
-                QMessageBox::warning(0,"Invalid Id",tr("Invalid id.\nOnly alphanumeric characters and underscore allowed.\nIds must begin with a lowercase letter."));
-                item->setText(node.id());
-            }
-        } catch (InvalidIdException &) {
-            QMessageBox::warning(0,"Invalid Id",tr("Item id must be unique."));
+            node.setId(item->text());
+        } catch (InvalidIdException &e) {
+            QMessageBox::warning(0, tr("Invalid Id"), e.description());
             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 e5b72e4858f..e0e0e4c21a5 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
@@ -166,7 +166,6 @@ void PropertyEditor::NodeType::setValue(const QmlObjectNode & fxObjectNode, cons
 void PropertyEditor::NodeType::setup(const QmlObjectNode &fxObjectNode, const QString &stateName, const QUrl &qmlSpecificsFile, PropertyEditor *propertyEditor)
 {
     if (!fxObjectNode.isValid()) {
-        qWarning() << "invalid node for setup";
         return;
     }
 
@@ -354,12 +353,10 @@ void PropertyEditor::changeValue(const QString &propertyName)
         const QString newId = value->value().toString();
 
         try {
-            if (ModelNode::isValidId(newId))
-                m_selectedNode.setId(newId);
-            else
-                value->setValue(m_selectedNode.id());
-        } catch (InvalidIdException &) {
+            m_selectedNode.setId(newId);
+        } catch (InvalidIdException &e) {
             value->setValue(m_selectedNode.id());
+            QMessageBox::warning(0, tr("Invalid Id"), e.description());
         }
 
         return;
diff --git a/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp b/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp
index aec0ded7b18..467c4720eda 100644
--- a/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp
+++ b/src/plugins/qmldesigner/core/exceptions/invalididexception.cpp
@@ -33,8 +33,10 @@ namespace QmlDesigner {
 
 InvalidIdException::InvalidIdException(int line,
                                        const QString &function,
-                                       const QString &file):
-    InvalidArgumentException(line, function, file, "id")
+                                       const QString &file,
+                                       const QString &id,
+                                       bool duplicate) :
+    InvalidArgumentException(line, function, file, "id"), m_id(id), m_duplicate(duplicate)
 {
 }
 
@@ -42,4 +44,23 @@ QString InvalidIdException::type() const
 {
     return "InvalidIdException";
 }
+
+QString InvalidIdException::description() const
+{
+    if (m_duplicate)
+        return duplicateErrorMessage(m_id);
+
+    return invalidErrorMessage(m_id);
+}
+
+QString InvalidIdException::duplicateErrorMessage(const QString &id)
+{
+     return QObject::tr("Ids have to be unique: ") + id;
+}
+
+QString InvalidIdException::invalidErrorMessage(const QString &id)
+{
+    return QObject::tr("Invalid Id: ") + id + QObject::tr("\nOnly alphanumeric characters and underscore allowed.\nIds must begin with a lowercase letter.");
+}
+
 }
diff --git a/src/plugins/qmldesigner/core/include/invalididexception.h b/src/plugins/qmldesigner/core/include/invalididexception.h
index 8bb7761ec2c..f9e367692ff 100644
--- a/src/plugins/qmldesigner/core/include/invalididexception.h
+++ b/src/plugins/qmldesigner/core/include/invalididexception.h
@@ -39,9 +39,19 @@ class CORESHARED_EXPORT InvalidIdException : public InvalidArgumentException
 public:
     InvalidIdException(int line,
                        const QString &function,
-                       const QString &file);
+                       const QString &file,
+                       const QString &id,
+                       bool duplicate = false);
 
     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;
 
 };
 
diff --git a/src/plugins/qmldesigner/core/model/modelnode.cpp b/src/plugins/qmldesigner/core/model/modelnode.cpp
index 16e1a7f82fd..ec8c6e36515 100644
--- a/src/plugins/qmldesigner/core/model/modelnode.cpp
+++ b/src/plugins/qmldesigner/core/model/modelnode.cpp
@@ -180,13 +180,13 @@ void ModelNode::setId(const QString& id)
     }
 
     if (!isValidId(id))
-        throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__);
+        throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id);
 
     if (id == ModelNode::id())
         return;
 
     if (view()->hasId(id))
-        throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__);
+        throw InvalidIdException(__LINE__, __FUNCTION__, __FILE__, id, true);
 
     m_model.data()->m_d->changeNodeId(internalNode(), id);
 }
-- 
GitLab