mirror of
https://bitbucket.org/smil3y/kdelibs.git
synced 2025-02-24 10:52:49 +00:00

by using QLocale in KLocale and separating the date, time and numbers
conversion from translation KLocale actually gets extended locale
support from QLocale (which uses CLDR data v43 currently). translation
remains unaffected. for comparison here is the result of two function
calls the result of which should explain the whole change:
KLocale::allLanguagesList().size() = 669
KLocale::installedLanguages().size() = 68
the first number is locales Katie supports, the second being the
number of languages Katana is translated into
KSwitchLanguageDialog needs a rewrite but that is on the TODO
also copyrighting KCatalog to me because I rewrote it, for reference:
881b47b8ea
KCalendarSystem gets the middle finger - batteries not included for date
and time. extra calendar systems can, but are unlikely to be, supported
in the future
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
271 lines
6.3 KiB
C++
271 lines
6.3 KiB
C++
/**********************************************************************
|
|
**
|
|
**
|
|
** KIntValidator:
|
|
** Copyright (C) 1999 Glen Parker <glenebob@nwlink.com>
|
|
** KDoubleValidator:
|
|
** Copyright (c) 2002 Marc Mutz <mutz@kde.org>
|
|
**
|
|
** This library is free software; you can redistribute it and/or
|
|
** modify it under the terms of the GNU Library General Public
|
|
** License as published by the Free Software Foundation; either
|
|
** version 2 of the License, or (at your option) any later version.
|
|
**
|
|
** This library is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
** Library General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU Library General Public
|
|
** License along with this library; if not, write to the Free
|
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
**
|
|
*****************************************************************************/
|
|
|
|
#include "knumvalidator.h"
|
|
|
|
#include <QWidget>
|
|
#include <QString>
|
|
|
|
#include <klocale.h>
|
|
#include <kglobal.h>
|
|
#include <kdebug.h>
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Implementation of KIntValidator
|
|
//
|
|
class KIntValidator::KIntValidatorPrivate
|
|
{
|
|
public:
|
|
KIntValidatorPrivate()
|
|
: _base(0), _min(0), _max(0)
|
|
{
|
|
}
|
|
|
|
int _base;
|
|
int _min;
|
|
int _max;
|
|
};
|
|
|
|
KIntValidator::KIntValidator ( QWidget *parent, int base)
|
|
: QValidator(parent),
|
|
d(new KIntValidatorPrivate())
|
|
{
|
|
setBase(base);
|
|
}
|
|
|
|
KIntValidator::KIntValidator(int bottom, int top, QWidget *parent, int base)
|
|
: QValidator(parent),
|
|
d(new KIntValidatorPrivate())
|
|
{
|
|
setBase(base);
|
|
setRange(bottom, top);
|
|
}
|
|
|
|
KIntValidator::~KIntValidator()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
QValidator::State KIntValidator::validate(QString &str, int &) const
|
|
{
|
|
bool ok = false;
|
|
int val = 0;
|
|
QString newStr;
|
|
|
|
newStr = str.trimmed();
|
|
if (d->_base > 10) {
|
|
newStr = newStr.toUpper();
|
|
}
|
|
|
|
if (newStr == QLatin1String("-")) {
|
|
// a special case
|
|
if ((d->_min || d->_max) && d->_min >= 0) {
|
|
ok = false;
|
|
} else {
|
|
return QValidator::Acceptable;
|
|
}
|
|
} else if (!newStr.isEmpty()) {
|
|
val = newStr.toInt(&ok, d->_base);
|
|
} else {
|
|
val = 0;
|
|
ok = true;
|
|
}
|
|
|
|
if (!ok) {
|
|
return QValidator::Invalid;
|
|
}
|
|
|
|
if ((!d->_min && ! d->_max) || (val >= d->_min && val <= d->_max)) {
|
|
return QValidator::Acceptable;
|
|
}
|
|
|
|
if (d->_max && d->_min >= 0 && val < 0) {
|
|
return QValidator::Invalid;
|
|
}
|
|
|
|
return QValidator::Intermediate;
|
|
}
|
|
|
|
void KIntValidator::fixup(QString &str) const
|
|
{
|
|
int dummy = 0;
|
|
int val = 0;
|
|
QValidator::State state;
|
|
|
|
state = validate(str, dummy);
|
|
|
|
if (state == QValidator::Invalid || state == QValidator::Acceptable) {
|
|
return;
|
|
}
|
|
|
|
if (!d->_min && !d->_max) {
|
|
return;
|
|
}
|
|
|
|
val = str.toInt(0, d->_base);
|
|
|
|
if (val < d->_min) {
|
|
val = d->_min;
|
|
}
|
|
if (val > d->_max) {
|
|
val = d->_max;
|
|
}
|
|
|
|
str.setNum(val, d->_base);
|
|
}
|
|
|
|
void KIntValidator::setRange(int bottom, int top)
|
|
{
|
|
d->_min = bottom;
|
|
d->_max = top;
|
|
|
|
if (d->_max < d->_min) {
|
|
d->_max = d->_min;
|
|
}
|
|
}
|
|
|
|
void KIntValidator::setBase(int base)
|
|
{
|
|
d->_base = base;
|
|
if (d->_base < 2) {
|
|
d->_base = 2;
|
|
}
|
|
if (d->_base > 36) {
|
|
d->_base = 36;
|
|
}
|
|
}
|
|
|
|
int KIntValidator::bottom() const
|
|
{
|
|
return d->_min;
|
|
}
|
|
|
|
int KIntValidator::top() const
|
|
{
|
|
return d->_max;
|
|
}
|
|
|
|
int KIntValidator::base() const
|
|
{
|
|
return d->_base;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Implementation of KDoubleValidator
|
|
//
|
|
|
|
class KDoubleValidator::KDoubleValidatorPrivate
|
|
{
|
|
public:
|
|
KDoubleValidatorPrivate(bool accept = true)
|
|
: acceptLocalizedNumbers(accept)
|
|
{
|
|
}
|
|
|
|
bool acceptLocalizedNumbers;
|
|
};
|
|
|
|
KDoubleValidator::KDoubleValidator(QObject *parent)
|
|
: QDoubleValidator(parent),
|
|
d(new KDoubleValidatorPrivate())
|
|
{
|
|
}
|
|
|
|
KDoubleValidator::KDoubleValidator(double bottom, double top, int decimals, QObject *parent)
|
|
: QDoubleValidator(bottom, top, decimals, parent),
|
|
d(new KDoubleValidatorPrivate())
|
|
{
|
|
}
|
|
|
|
KDoubleValidator::~KDoubleValidator()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
bool KDoubleValidator::acceptLocalizedNumbers() const
|
|
{
|
|
return d->acceptLocalizedNumbers;
|
|
}
|
|
|
|
void KDoubleValidator::setAcceptLocalizedNumbers(bool accept)
|
|
{
|
|
d->acceptLocalizedNumbers = accept;
|
|
}
|
|
|
|
QValidator::State KDoubleValidator::validate(QString &input, int &p) const
|
|
{
|
|
QString s = input;
|
|
if (acceptLocalizedNumbers()) {
|
|
KLocale* l = KGlobal::locale();
|
|
const QLocale ll = l->toLocale();
|
|
// ok, we have to re-format the number to have:
|
|
// 1. decimalPoint == '.'
|
|
// 2. negativeSign == '-'
|
|
// 3. positiveSign == <empty>
|
|
// 4. groupSeparator() == <empty> (we don't check that there
|
|
// are exactly three decimals between each separator):
|
|
QString d = ll.decimalPoint();
|
|
QString n = ll.negativeSign();
|
|
QString p = ll.positiveSign();
|
|
QString t = ll.groupSeparator();
|
|
// first, delete p's and t's:
|
|
if (!p.isEmpty()) {
|
|
for (int idx = s.indexOf(p); idx >= 0; idx = s.indexOf(p, idx)) {
|
|
s.remove(idx, p.length());
|
|
}
|
|
}
|
|
|
|
|
|
if (!t.isEmpty()) {
|
|
for (int idx = s.indexOf(t); idx >= 0; idx = s.indexOf(t, idx)) {
|
|
s.remove(idx, t.length());
|
|
}
|
|
}
|
|
|
|
// then, replace the d's and n's
|
|
if ((!n.isEmpty() && n.indexOf('.') != -1) || (!d.isEmpty() && d.indexOf('-') != -1)) {
|
|
// make sure we don't replace something twice:
|
|
kWarning() << "KDoubleValidator: decimal symbol contains '-' or "
|
|
"negative sign contains '.' -> improve algorithm";
|
|
return QValidator::Invalid;
|
|
}
|
|
|
|
if (!d.isEmpty() && d != ".") {
|
|
for (int idx = s.indexOf(d); idx >= 0; idx = s.indexOf(d, idx + 1)) {
|
|
s.replace(idx, d.length(), '.');
|
|
}
|
|
}
|
|
|
|
if (!n.isEmpty() && n != "-") {
|
|
for (int idx = s.indexOf(n); idx >= 0; idx = s.indexOf(n, idx + 1)) {
|
|
s.replace(idx, n.length(), '-');
|
|
}
|
|
}
|
|
}
|
|
|
|
return base::validate(s, p);
|
|
}
|
|
|
|
#include "moc_knumvalidator.cpp"
|