File indexing completed on 2024-12-01 10:29:05

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 #ifndef KDB_TOOLS_VALIDATOR_H
0021 #define KDB_TOOLS_VALIDATOR_H
0022 
0023 #include "kdb_export.h"
0024 
0025 #include <QValidator>
0026 #include <QVariant>
0027 #include <QString>
0028 
0029 //! @short A validator extending QValidator with offline-checking for value's validity
0030 /*!
0031  The offline-checking for value's validity is provided by @ref KDbValidator::check() method.
0032  The validator groups two purposes into one container:
0033  - string validator for line editors (online checking, "on typing");
0034  - offline-checking for QVariant values, reimplementing validate().
0035 
0036  It also offers error and warning messages for check() method.
0037  You may need to reimplement:
0038  -  QValidator::State validate(QString& input, int& pos) const
0039  -  Result check(const QString &valueName, const QVariant &v, QString *message, QString *details)
0040  */
0041 class KDB_EXPORT KDbValidator : public QValidator
0042 {
0043     Q_OBJECT
0044 public:
0045     enum Result { Error = 0, Ok = 1, Warning = 2 };
0046 
0047     explicit KDbValidator(QObject *parent = nullptr);
0048 
0049     ~KDbValidator() override;
0050 
0051     /*! Sets accepting empty values on (true) or off (false).
0052      By default the validator does not accepts empty values. */
0053     void setAcceptsEmptyValue(bool set);
0054 
0055     /*! @return true if the validator accepts empty values
0056       @see setAcceptsEmptyValue() */
0057     bool acceptsEmptyValue() const;
0058 
0059     /*! Checks if value @a value is ok and returns one of @a Result value:
0060      - @a Error is returned on error;
0061      - @a Ok on success;
0062      - @a Warning if there is something to warn about.
0063      In any case except @a Ok, i18n'ed message will be set in @a message
0064      and (optionally) datails are set in @a details, e.g. for use in a message box.
0065      @a valueName can be used to contruct @a message as well, for example:
0066      "[valueName] is not a valid login name".
0067      Depending on acceptsEmptyValue(), immediately accepts empty values or not. */
0068     Result check(const QString &valueName, const QVariant& v, QString *message,
0069                  QString *details);
0070 
0071     /*! This implementation always returns value QValidator::Acceptable. */
0072     QValidator::State validate(QString &input, int &pos) const override;
0073 
0074     //! A generic error/warning message "... value has to be entered."
0075     static const QString messageColumnNotEmpty();
0076 
0077     //! Adds a child validator @a v
0078     void addChildValidator(KDbValidator* v);
0079 
0080 protected:
0081     /* Used by check(), for reimplementation, by default returns @a Error.*/
0082     virtual Result internalCheck(const QString &valueName, const QVariant& value,
0083                                  QString *message, QString *details);
0084 
0085     friend class KDbMultiValidator;
0086 
0087 private:
0088     class Private;
0089     Private* const d;
0090     Q_DISABLE_COPY(KDbValidator)
0091 };
0092 
0093 //! @short A validator groupping multiple QValidators
0094 /*! KDbMultiValidator behaves like normal KDbValidator,
0095  but it allows to add define more than one different validator.
0096  Given validation is successful if every subvalidator accepted given value.
0097 
0098  - acceptsEmptyValue() is used globally here
0099    (no matter what is defined in subvalidators).
0100 
0101  - result of calling check() depends on value of check() returned by subvalidators:
0102    - Error is returned if at least one subvalidator returned Error;
0103    - Warning is returned if at least one subvalidator returned Warning and
0104      no validator returned error;
0105    - Ok is returned only if exactly all subvalidators returned Ok.
0106    - If there is no subvalidators defined, Error is always returned.
0107    - If a given subvalidator is not of class KDbValidator but ust QValidator,
0108      it's assumed it's check() method returned Ok.
0109 
0110  - result of calling validate() (a method implemented for QValidator)
0111    depends on value of validate() returned by subvalidators:
0112    - Invalid is returned if at least one subvalidator returned Invalid
0113    - Intermediate is returned if at least one subvalidator returned Intermediate
0114    - Acceptable is returned if exactly all subvalidators returned Acceptable.
0115    - If there is no subvalidators defined, Invalid is always returned.
0116 
0117  If there are no subvalidators, the multi validator always accepts the input.
0118 */
0119 class KDB_EXPORT KDbMultiValidator : public KDbValidator
0120 {
0121     Q_OBJECT
0122 public:
0123     /*! Constructs multivalidator with no subvalidators defined.
0124      You can add more validators with addSubvalidator(). */
0125     explicit KDbMultiValidator(QObject *parent = nullptr);
0126 
0127     /*! Constructs multivalidator with one validator @a validator.
0128      It will be owned if has no parent defined.
0129      You can add more validators with addSubvalidator(). */
0130     explicit KDbMultiValidator(QValidator *validator, QObject *parent = nullptr);
0131 
0132     ~KDbMultiValidator() override;
0133 
0134     /*! Adds validator @a validator as another subvalidator.
0135      Subvalidator will be owned by this multivalidator if @a owned is true
0136      and its parent is @c nullptr. */
0137     void addSubvalidator(QValidator* validator, bool owned = true);
0138 
0139     /*! Reimplemented to call validate() on subvalidators. */
0140     QValidator::State validate(QString &input, int &pos) const override;
0141 
0142     /*! Calls QValidator::fixup() on every subvalidator.
0143      This may be senseless to use this methog in certain cases
0144      (can return weir results), so think twice before.. */
0145     void fixup(QString &input) const override;
0146 
0147 protected:
0148     KDbValidator::Result internalCheck(const QString &valueName, const QVariant &value,
0149                                        QString *message, QString *details) override;
0150 
0151 private:
0152     class Private;
0153     Private* const d;
0154     Q_DISABLE_COPY(KDbMultiValidator)
0155 };
0156 
0157 #endif