diff options
Diffstat (limited to 'libk3b/tools/k3bintvalidator.cpp')
-rw-r--r-- | libk3b/tools/k3bintvalidator.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/libk3b/tools/k3bintvalidator.cpp b/libk3b/tools/k3bintvalidator.cpp new file mode 100644 index 0000000..dabf719 --- /dev/null +++ b/libk3b/tools/k3bintvalidator.cpp @@ -0,0 +1,137 @@ +/* + * + * $Id: k3bintvalidator.cpp 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2004 Sebastian Trueg <[email protected]> + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * See the file "COPYING" for the exact licensing terms. + */ + + +#include <qwidget.h> +#include <qstring.h> + +#include "k3bintvalidator.h" + +#include <klocale.h> +#include <kglobal.h> +#include <kdebug.h> + + +K3bIntValidator::K3bIntValidator ( QWidget * parent, const char * name ) + : QValidator(parent, name) +{ + m_min = m_max = 0; +} + + +K3bIntValidator::K3bIntValidator ( int bottom, int top, QWidget * parent, const char * name ) + : QValidator(parent, name) +{ + m_min = bottom; + m_max = top; +} + + +K3bIntValidator::~K3bIntValidator () +{ +} + + +QValidator::State K3bIntValidator::validate ( QString &str, int & ) const +{ + bool ok; + int val = 0; + QString newStr; + + newStr = str.stripWhiteSpace(); + newStr = newStr.upper(); + + if( newStr.length() ) { + // check for < 0 + bool minus = newStr.startsWith( "-" ); + if( minus ) + newStr.remove( 0, 1 ); + + // check for hex + bool hex = newStr.startsWith( "0X" ); + + if( hex ) + newStr.remove( 0, 2 ); + + // a special case + if( newStr.isEmpty() ) { + if( minus && m_min && m_min >= 0) + ok = false; + else + return QValidator::Acceptable; + } + + val = newStr.toInt( &ok, hex ? 16 : 10 ); + if( minus ) + val *= -1; + } + else { + val = 0; + ok = true; + } + + if( !ok ) + return QValidator::Invalid; + + if( m_min && val > 0 && val < m_min ) + return QValidator::Acceptable; + + if( m_max && val < 0 && val > m_max ) + return QValidator::Acceptable; + + if( (m_max && val > m_max) || (m_min && val < m_min) ) + return QValidator::Invalid; + + return QValidator::Valid; +} + + +void K3bIntValidator::fixup ( QString& ) const +{ + // TODO: remove preceding zeros +} + + +void K3bIntValidator::setRange ( int bottom, int top ) +{ + m_min = bottom; + m_max = top; + + if( m_max < m_min ) + m_max = m_min; +} + + +int K3bIntValidator::bottom () const +{ + return m_min; +} + + +int K3bIntValidator::top () const +{ + return m_max; +} + + +int K3bIntValidator::toInt( const QString& s, bool* ok ) +{ + if( s.lower().startsWith( "0x" ) ) + return s.right( s.length()-2 ).toInt( ok, 16 ); + else if( s.lower().startsWith( "-0x" ) ) + return -1 * s.right( s.length()-3 ).toInt( ok, 16 ); + else + return s.toInt( ok, 10 ); +} |