File indexing completed on 2024-04-21 15:30:06

0001 /* This file is part of the KDE project
0002    Copyright (C) 2004, 2006 Jarosław Staniek <staniek@kde.org>
0003 
0004    This program is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU Library General Public
0006    License as published by the Free Software Foundation; either
0007    version 2 of the License, or (at your option) any later version.
0008 
0009    This program is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012    Library General Public License for more details.
0013 
0014    You should have received a copy of the GNU Library General Public License
0015    along with this program; see the file COPYING.  If not, write to
0016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017  * Boston, MA 02110-1301, USA.
0018 */
0019 
0020 #include "KDbValidator.h"
0021 
0022 class Q_DECL_HIDDEN KDbValidator::Private
0023 {
0024 public:
0025     Private()
0026             : acceptsEmptyValue(false) {
0027     }
0028     bool acceptsEmptyValue;
0029 };
0030 
0031 //-----------------------------------------------------------
0032 
0033 class Q_DECL_HIDDEN KDbMultiValidator::Private
0034 {
0035 public:
0036     Private() {
0037     }
0038     ~Private() {
0039         qDeleteAll(ownedSubValidators);
0040         ownedSubValidators.clear();
0041     }
0042 
0043     QList<QValidator*> ownedSubValidators;
0044     QList<QValidator*> subValidators;
0045 };
0046 
0047 //-----------------------------------------------------------
0048 
0049 KDbValidator::KDbValidator(QObject * parent)
0050         : QValidator(parent)
0051         , d(new Private)
0052 {
0053 }
0054 
0055 KDbValidator::~KDbValidator()
0056 {
0057     delete d;
0058 }
0059 
0060 KDbValidator::Result KDbValidator::check(const QString &valueName, const QVariant& v,
0061                                    QString *message, QString *details)
0062 {
0063     if (v.isNull() || (v.type() == QVariant::String && v.toString().isEmpty())) {
0064         if (!d->acceptsEmptyValue) {
0065             if (message) {
0066                 *message = KDbValidator::messageColumnNotEmpty().arg(valueName);
0067             }
0068             return Error;
0069         }
0070         return Ok;
0071     }
0072     return internalCheck(valueName, v, message, details);
0073 }
0074 
0075 KDbValidator::Result KDbValidator::internalCheck(const QString &valueName,
0076         const QVariant& value, QString *message, QString *details)
0077 {
0078     Q_UNUSED(valueName);
0079     Q_UNUSED(value);
0080     Q_UNUSED(message);
0081     Q_UNUSED(details);
0082     return Error;
0083 }
0084 
0085 QValidator::State KDbValidator::validate(QString & , int &) const
0086 {
0087     return QValidator::Acceptable;
0088 }
0089 
0090 void KDbValidator::setAcceptsEmptyValue(bool set)
0091 {
0092     d->acceptsEmptyValue = set;
0093 }
0094 
0095 bool KDbValidator::acceptsEmptyValue() const
0096 {
0097     return d->acceptsEmptyValue;
0098 }
0099 
0100 const QString KDbValidator::messageColumnNotEmpty()
0101 {
0102     return QLatin1String(QT_TR_NOOP("\"%1\" value has to be entered."));
0103 }
0104 
0105 //-----------------------------------------------------------
0106 
0107 KDbMultiValidator::KDbMultiValidator(QObject* parent)
0108         : KDbValidator(parent)
0109         , d(new Private)
0110 {
0111 }
0112 
0113 KDbMultiValidator::KDbMultiValidator(QValidator *validator, QObject * parent)
0114         : KDbValidator(parent)
0115         , d(new Private)
0116 {
0117     addSubvalidator(validator);
0118 }
0119 
0120 KDbMultiValidator::~KDbMultiValidator()
0121 {
0122     delete d;
0123 }
0124 
0125 void KDbMultiValidator::addSubvalidator(QValidator* validator, bool owned)
0126 {
0127     if (!validator)
0128         return;
0129     d->subValidators.append(validator);
0130     if (owned && !validator->parent())
0131         d->ownedSubValidators.append(validator);
0132 }
0133 
0134 QValidator::State KDbMultiValidator::validate(QString & input, int & pos) const
0135 {
0136     State s;
0137     foreach(QValidator* validator, d->subValidators) {
0138         s = validator->validate(input, pos);
0139         if (s == Intermediate || s == Invalid)
0140             return s;
0141     }
0142     return Acceptable;
0143 }
0144 
0145 void KDbMultiValidator::fixup(QString & input) const
0146 {
0147     foreach(QValidator* validator, d->subValidators) {
0148         validator->fixup(input);
0149     }
0150 }
0151 
0152 KDbValidator::Result KDbMultiValidator::internalCheck(
0153     const QString &valueName, const QVariant& value,
0154     QString *message, QString *details)
0155 {
0156     Result r;
0157     bool warning = false;
0158     foreach(QValidator* validator, d->subValidators) {
0159         if (dynamic_cast<KDbValidator*>(validator))
0160             r = dynamic_cast<KDbValidator*>(validator)->internalCheck(valueName, value, message, details);
0161         else
0162             r = Ok; //ignore
0163         if (r == Error)
0164             return Error;
0165         else if (r == Warning)
0166             warning = true;
0167     }
0168     return warning ? Warning : Ok;
0169 }
0170