diff --git a/src/libs/utils/filenamevalidatinglineedit.cpp b/src/libs/utils/filenamevalidatinglineedit.cpp index 9a428eaf0e1..a3e83a0594d 100644 --- a/src/libs/utils/filenamevalidatinglineedit.cpp +++ b/src/libs/utils/filenamevalidatinglineedit.cpp @@ -68,8 +68,7 @@ static const QRegExp &windowsDeviceSubDirPattern() // ----------- FileNameValidatingLineEdit FileNameValidatingLineEdit::FileNameValidatingLineEdit(QWidget *parent) : BaseValidatingLineEdit(parent), - m_allowDirectories(false), - m_unused(0) + m_allowDirectories(false) { } @@ -143,7 +142,46 @@ bool FileNameValidatingLineEdit::validateFileName(const QString &name, bool FileNameValidatingLineEdit::validate(const QString &value, QString *errorMessage) const { - return validateFileName(value, m_allowDirectories, errorMessage); + return validateFileNameExtension(value, requiredExtensions(), errorMessage) + && validateFileName(value, allowDirectories(), errorMessage); +} + + +bool FileNameValidatingLineEdit::validateFileNameExtension(const QString &fileName, + const QStringList &requiredExtensions, + QString *errorMessage) +{ + // file extension + if (!requiredExtensions.isEmpty()) { + foreach (const QString &requiredExtension, requiredExtensions) { + QString extension = QLatin1String(".") + requiredExtension; + if (fileName.endsWith(extension, Qt::CaseSensitive) && extension.count() < fileName.count()) { + return true; + } + } + + if (errorMessage) { + if (requiredExtensions.count() == 1) { + *errorMessage = tr("File extension %1 is required:").arg(requiredExtensions.first()); + } else { + *errorMessage = tr("File extensions %1 are required:").arg(requiredExtensions.join(", ")); + } + } + + return false; + } + + return true; +} + +QStringList FileNameValidatingLineEdit::requiredExtensions() const +{ + return m_requiredExtensionList; +} + +void FileNameValidatingLineEdit::setRequiredExtensions(const QStringList &extensions) +{ + m_requiredExtensionList = extensions; } } // namespace Utils diff --git a/src/libs/utils/filenamevalidatinglineedit.h b/src/libs/utils/filenamevalidatinglineedit.h index 75f04ff7080..4e84af07df8 100644 --- a/src/libs/utils/filenamevalidatinglineedit.h +++ b/src/libs/utils/filenamevalidatinglineedit.h @@ -41,6 +41,7 @@ class QTCREATOR_UTILS_EXPORT FileNameValidatingLineEdit : public BaseValidatingL { Q_OBJECT Q_PROPERTY(bool allowDirectories READ allowDirectories WRITE setAllowDirectories) + Q_PROPERTY(QStringList requiredExtensions READ requiredExtensions WRITE setRequiredExtensions) public: explicit FileNameValidatingLineEdit(QWidget *parent = 0); @@ -49,6 +50,10 @@ public: bool allowDirectories = false, QString *errorMessage = 0); + static bool validateFileNameExtension(const QString &name, + const QStringList &requiredExtensions = QStringList(), + QString *errorMessage = 0); + /** * Sets whether entering directories is allowed. This will enable the user * to enter slashes in the filename. Default is off. @@ -56,12 +61,19 @@ public: bool allowDirectories() const; void setAllowDirectories(bool v); + /** + * Sets a requred extension. If the extension is empty no extension is required. + * Default is empty. + */ + QStringList requiredExtensions() const; + void setRequiredExtensions(const QStringList &extensionList); + protected: virtual bool validate(const QString &value, QString *errorMessage) const; private: bool m_allowDirectories; - void *m_unused; + QStringList m_requiredExtensionList; }; } // namespace Utils