--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) Qxt Foundation. Some rights reserved.
+**
+** This file is part of the QxtGui module of the Qt eXTension library
+**
+** This library is free software; you can redistribute it and/or modify it
+** under the terms of th Common Public License, version 1.0, as published by
+** IBM.
+**
+** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+** FITNESS FOR A PARTICULAR PURPOSE.
+**
+** You should have received a copy of the CPL along with this file.
+** See the LICENSE file and the cpl1.0.txt file included with the source
+** distribution for more information. If you did not receive a copy of the
+** license, contact the Qxt Foundation.
+**
+** <http://libqxt.sourceforge.net> <foundation@libqxt.org>
+**
+****************************************************************************/
+#include "qxtstringspinbox.h"
+
+class QxtStringSpinBoxPrivate : public QxtPrivate<QxtStringSpinBox>
+{
+public:
+ QXT_DECLARE_PUBLIC(QxtStringSpinBox);
+ int startsWith(const QString& start, QString& string) const;
+ QStringList strings;
+};
+
+int QxtStringSpinBoxPrivate::startsWith(const QString& start, QString& string) const
+{
+ const int size = strings.size();
+ for (int i = 0; i < size; ++i)
+ {
+ if (strings.at(i).startsWith(start, Qt::CaseInsensitive))
+ {
+ // found
+ string = strings.at(i);
+ return i;
+ }
+ }
+ // not found
+ return -1;
+}
+
+/*!
+ \class QxtStringSpinBox QxtStringSpinBox
+ \ingroup QxtGui
+ \brief A spin box with string items.
+
+ QxtStringSpinBox is spin box that takes strings. QxtStringSpinBox allows
+ the user to choose a value by clicking the up and down buttons or by
+ pressing Up or Down on the keyboard to increase or decrease the value
+ currently displayed. The user can also type the value in manually.
+
+ \image html qxtstringspinbox.png "QxtStringSpinBox in Cleanlooks style."
+ */
+
+/*!
+ Constructs a new QxtStringSpinBox with \a parent.
+ */
+QxtStringSpinBox::QxtStringSpinBox(QWidget* pParent) : QSpinBox(pParent)
+{
+ setRange(0, 0);
+}
+
+/*!
+ Destructs the spin box.
+ */
+QxtStringSpinBox::~QxtStringSpinBox()
+{}
+
+/*!
+ \property QxtStringSpinBox::strings
+ \brief This property holds the string items of the spin box.
+ */
+const QStringList& QxtStringSpinBox::strings() const
+{
+ return qxt_d().strings;
+}
+
+void QxtStringSpinBox::setStrings(const QStringList& strings)
+{
+ qxt_d().strings = strings;
+ setRange(0, strings.size() - 1);
+ if (!strings.isEmpty())
+ setValue(0);
+}
+
+void QxtStringSpinBox::fixup(QString& input) const
+{
+ // just attempt to change the input string to be valid according to the string list
+ // no need to result in a valid string, callers of this function are responsible to
+ // re-test the validity afterwards
+
+ // try finding a string from the list which starts with input
+ input = input.simplified();
+ if (!input.isEmpty())
+ {
+ qxt_d().startsWith(input, input);
+ }
+}
+
+QValidator::State QxtStringSpinBox::validate(QString& input, int& pos) const
+{
+ // Invalid: input is invalid according to the string list
+ // Intermediate: it is likely that a little more editing will make the input acceptable
+ // (e.g. the user types "A" and stringlist contains "ABC")
+ // Acceptable: the input is valid.
+ Q_UNUSED(pos);
+ QString temp;
+ QValidator::State state = QValidator::Invalid;
+ if (qxt_d().strings.contains(input))
+ {
+ // exact match
+ state = QValidator::Acceptable;
+ }
+ else if (input.isEmpty() || qxt_d().startsWith(input, temp) != -1)
+ {
+ // still empty or some string in the list starts with input
+ state = QValidator::Intermediate;
+ }
+ // else invalid
+ return state;
+}
+
+QString QxtStringSpinBox::textFromValue(int value) const
+{
+ Q_ASSERT(qxt_d().strings.isEmpty() || (value >= 0 && value < qxt_d().strings.size()));
+ return qxt_d().strings.isEmpty() ? QLatin1String("") : qxt_d().strings.at(value);
+}
+
+int QxtStringSpinBox::valueFromText(const QString& text) const
+{
+ return qxt_d().strings.indexOf(text);
+}