diff --git a/src/plugins/designer/workbenchintegration.cpp b/src/plugins/designer/workbenchintegration.cpp index 590ff14cf6e5acce558c8ffb5d7ac107cebf086b..80f727a95ffbade53c9966b1e1d491c4f4aa47e7 100644 --- a/src/plugins/designer/workbenchintegration.cpp +++ b/src/plugins/designer/workbenchintegration.cpp @@ -53,14 +53,28 @@ #include <QtDesigner/QDesignerFormWindowInterface> -#include <QtCore/QFileInfo> +#include <QtGui/QMessageBox> +#include <QtCore/QFileInfo> #include <QtCore/QDebug> +enum { debugSlotNavigation = 0 }; + using namespace Designer::Internal; using namespace CPlusPlus; using namespace TextEditor; +static QString msgClassNotFound(const QString &uiClassName, const QList<Document::Ptr> &docList) +{ + QString files; + foreach (const Document::Ptr &doc, docList) { + if (!files.isEmpty()) + files += QLatin1String(", "); + files += doc->fileName(); + } + return WorkbenchIntegration::tr("The class definition of '%1' could not be found in %2.").arg(uiClassName, files); +} + WorkbenchIntegration::WorkbenchIntegration(QDesignerFormEditorInterface *core, FormEditorW *parent) : qdesigner_internal::QDesignerIntegration(core, ::qobject_cast<QObject*>(parent)), m_few(parent) @@ -443,8 +457,20 @@ static QString addParameterNames(const QString &functionSignature, const QString return functionName; } + void WorkbenchIntegration::slotNavigateToSlot(const QString &objectName, const QString &signalSignature, const QStringList ¶meterNames) +{ + QString errorMessage; + if (!navigateToSlot(objectName, signalSignature, parameterNames, &errorMessage) && !errorMessage.isEmpty()) { + QMessageBox::critical(m_few->designerEditor()->topLevel(), tr("Error finding source file"), errorMessage); + } +} + +bool WorkbenchIntegration::navigateToSlot(const QString &objectName, + const QString &signalSignature, + const QStringList ¶meterNames, + QString *errorMessage) { const QString currentUiFile = m_few->activeFormWindow()->file()->fileName(); @@ -457,14 +483,22 @@ void WorkbenchIntegration::slotNavigateToSlot(const QString &objectName, const Q const QString uicedName = QLatin1String("ui_") + fi.baseName() + QLatin1String(".h"); QList<Document::Ptr> docList = findDocumentsIncluding(uicedName, true); // change to false when we know the absolute path to generated ui_<>.h file - if (docList.isEmpty()) - return; + + if (debugSlotNavigation) + qDebug() << objectName << signalSignature << "Looking for " << uicedName << " returned " << docList.size(); + if (docList.isEmpty()) { + *errorMessage = tr("No documents matching %1 could be found.").arg(uicedName); + return false; + } QDesignerFormWindowInterface *fwi = m_few->activeFormWindow()->formWindow(); const QString uiClassName = fwi->mainContainer()->objectName(); - foreach (Document::Ptr doc, docList) { + if (debugSlotNavigation) + qDebug() << "Checking docs for " << uiClassName; + + foreach (const Document::Ptr &doc, docList) { QString namespaceName; // namespace of the class found Class *cl = findClass(doc->globalNamespace(), uiClassName, &namespaceName); if (cl) { @@ -493,8 +527,10 @@ void WorkbenchIntegration::slotNavigateToSlot(const QString &objectName, const Q // jump to function definition TextEditor::BaseTextEditor::openEditorAt(sourceDoc->fileName(), line); } - return; + return true; } } + *errorMessage = msgClassNotFound(uiClassName, docList); + return false; } diff --git a/src/plugins/designer/workbenchintegration.h b/src/plugins/designer/workbenchintegration.h index ef8d946adbb8c98675f62b124422b2eb9f2c5e79..30d88fb7bfdbc810ec468f2176177b3a06592212 100644 --- a/src/plugins/designer/workbenchintegration.h +++ b/src/plugins/designer/workbenchintegration.h @@ -57,6 +57,10 @@ public slots: private slots: void slotNavigateToSlot(const QString &objectName, const QString &signalSignature, const QStringList ¶meterNames); private: + bool navigateToSlot(const QString &objectName, + const QString &signalSignature, + const QStringList ¶meterNames, + QString *errorMessage); FormEditorW *m_few; };