File indexing completed on 2024-12-01 04:19:03

0001 /* This file is part of the KDE project
0002    Copyright (C) 2006-2016 Jarosław Staniek <staniek@kde.org>
0003 
0004    Based on KIntValidator code by Glen Parker <glenebob@nwlink.com>
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU Library General Public
0008    License as published by the Free Software Foundation; either
0009    version 2 of the License, or (at your option) any later version.
0010 
0011    This program is distributed in the hope that it will be useful,
0012    but WITHOUT ANY WARRANTY; without even the implied warranty of
0013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014    Library General Public License for more details.
0015 
0016    You should have received a copy of the GNU Library General Public License
0017    along with this program; see the file COPYING.  If not, write to
0018    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0019  * Boston, MA 02110-1301, USA.
0020 */
0021 
0022 #include "KDbLongLongValidator.h"
0023 
0024 #include <QWidget>
0025 
0026 class Q_DECL_HIDDEN KDbLongLongValidator::Private
0027 {
0028 public:
0029     Private()
0030         : min(0)
0031         , max(0)
0032     {
0033     }
0034     qint64 base;
0035     qint64 min;
0036     qint64 max;
0037 };
0038 
0039 KDbLongLongValidator::KDbLongLongValidator(QWidget * parent, int base)
0040         : QValidator(parent)
0041         , d(new Private)
0042 {
0043     setBase(base);
0044 }
0045 
0046 KDbLongLongValidator::KDbLongLongValidator(qint64 bottom, qint64 top,
0047                                            QWidget * parent, int base)
0048         : QValidator(parent)
0049         , d(new Private)
0050 {
0051     setBase(base);
0052     setRange(bottom, top);
0053 }
0054 
0055 KDbLongLongValidator::~KDbLongLongValidator()
0056 {
0057     delete d;
0058 }
0059 
0060 QValidator::State KDbLongLongValidator::validate(QString &str, int &) const
0061 {
0062     bool ok;
0063     qint64 val = 0;
0064     QString newStr;
0065 
0066     newStr = str.trimmed();
0067     if (d->base > 10)
0068         newStr = newStr.toUpper();
0069 
0070     if (newStr == QString::fromLatin1("-")) {// a special case
0071         if ((d->min || d->max) && d->min >= 0)
0072             ok = false;
0073         else
0074             return QValidator::Intermediate;
0075     } else if (!newStr.isEmpty())
0076         val = newStr.toLongLong(&ok, d->base);
0077     else {
0078         val = 0;
0079         ok = true;
0080     }
0081 
0082     if (! ok)
0083         return QValidator::Invalid;
0084 
0085     if ((! d->min && ! d->max) || (val >= d->min && val <= d->max))
0086         return QValidator::Acceptable;
0087 
0088     if (d->max && d->min >= 0 && val < 0)
0089         return QValidator::Invalid;
0090 
0091     return QValidator::Intermediate;
0092 }
0093 
0094 void KDbLongLongValidator::fixup(QString &str) const
0095 {
0096     int dummy;
0097     qint64 val;
0098     QValidator::State state;
0099 
0100     state = validate(str, dummy);
0101 
0102     if (state == QValidator::Invalid || state == QValidator::Acceptable)
0103         return;
0104 
0105     if (! d->min && ! d->max)
0106         return;
0107 
0108     val = str.toLongLong(nullptr, d->base);
0109 
0110     if (val < d->min)
0111         val = d->min;
0112     if (val > d->max)
0113         val = d->max;
0114 
0115     str.setNum(val, d->base);
0116 }
0117 
0118 void KDbLongLongValidator::setRange(qint64 bottom, qint64 top)
0119 {
0120     d->min = bottom;
0121     d->max = top;
0122 
0123     if (d->max < d->min)
0124         d->max = d->min;
0125 }
0126 
0127 void KDbLongLongValidator::setBase(int base)
0128 {
0129     d->base = base;
0130     if (d->base < 2)
0131         d->base = 2;
0132     if (d->base > 36)
0133         d->base = 36;
0134 }
0135 
0136 qint64 KDbLongLongValidator::bottom() const
0137 {
0138     return d->min;
0139 }
0140 
0141 qint64 KDbLongLongValidator::top() const
0142 {
0143     return d->max;
0144 }
0145 
0146 int KDbLongLongValidator::base() const
0147 {
0148     return d->base;
0149 }