diff options
Diffstat (limited to 'experimental/tqtinterface/qt4/src/widgets/tqspinbox.cpp')
-rw-r--r-- | experimental/tqtinterface/qt4/src/widgets/tqspinbox.cpp | 1116 |
1 files changed, 1116 insertions, 0 deletions
diff --git a/experimental/tqtinterface/qt4/src/widgets/tqspinbox.cpp b/experimental/tqtinterface/qt4/src/widgets/tqspinbox.cpp new file mode 100644 index 000000000..579d93b57 --- /dev/null +++ b/experimental/tqtinterface/qt4/src/widgets/tqspinbox.cpp @@ -0,0 +1,1116 @@ +/**************************************************************************** +** +** Implementation of TQSpinBox widget class +** +** Created : 970101 +** +** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. +** +** This file is part of the widgets module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "tqspinbox.h" +#ifndef TQT_NO_SPINBOX + +#include "tqcursor.h" +#include "tqpushbutton.h" +#include "tqpainter.h" +#include "tqbitmap.h" +#include "tqlineedit.h" +#include "tqvalidator.h" +#include "tqpixmapcache.h" +#include "tqapplication.h" +#include "tqstyle.h" +#if defined(TQT_ACCESSIBILITY_SUPPORT) +#include "tqaccessible.h" +#endif + +static bool sumOutOfRange(int current, int add) +{ + if (add > 0 && INT_MAX - add < current) { + return true; + } + if (add < 0 && INT_MIN - add > current) { + return true; + } + return false; +} + +class TQSpinBoxPrivate +{ +public: + TQSpinBoxPrivate() {} + TQSpinWidget* controls; + uint selreq : 1; +}; + +class TQSpinBoxValidator : public TQIntValidator +{ +public: + TQSpinBoxValidator( TQSpinBox *sb, const char *name ) + : TQIntValidator( TQT_TQOBJECT(sb), name ), spinBox( sb ) { } + + virtual State validate( TQString& str, int& pos ) const; + +private: + TQSpinBox *spinBox; +}; + +TQValidator::State TQSpinBoxValidator::validate( TQString& str, int& pos ) const +{ + TQString pref = spinBox->prefix(); + TQString suff = spinBox->suffix(); + TQString suffStriped = suff.stripWhiteSpace(); + uint overhead = pref.length() + suff.length(); + State state = Invalid; + + ((TQIntValidator *) this)->setRange( spinBox->minValue(), + spinBox->maxValue() ); + if ( overhead == 0 ) { + state = TQIntValidator::validate( str, pos ); + } else { + bool stripedVersion = FALSE; + if ( str.length() >= overhead && str.startsWith(pref) + && (str.endsWith(suff) + || (stripedVersion = str.endsWith(suffStriped))) ) { + if ( stripedVersion ) + overhead = pref.length() + suffStriped.length(); + TQString core = str.mid( pref.length(), str.length() - overhead ); + int corePos = pos - pref.length(); + state = TQIntValidator::validate( core, corePos ); + pos = corePos + pref.length(); + str.tqreplace( pref.length(), str.length() - overhead, core ); + } else { + state = TQIntValidator::validate( str, pos ); + if ( state == Invalid ) { + // stripWhiteSpace(), cf. TQSpinBox::interpretText() + TQString special = spinBox->specialValueText().stripWhiteSpace(); + TQString candidate = str.stripWhiteSpace(); + + if ( special.startsWith(candidate) ) { + if ( candidate.length() == special.length() ) { + state = Acceptable; + } else { + state = Intermediate; + } + } + } + } + } + return state; +} + +/*! + \class TQSpinBox + \brief The TQSpinBox class provides a spin box widget (spin button). + + \ingroup basic + \mainclass + + TQSpinBox allows the user to choose a value either by clicking the + up/down buttons to increase/decrease the value currently displayed + or by typing the value directly into the spin box. If the value is + entered directly into the spin box, Enter (or Return) must be + pressed to apply the new value. The value is usually an integer. + + Every time the value changes TQSpinBox emits the valueChanged() + signal. The current value can be fetched with value() and set + with setValue(). + + The spin box keeps the value within a numeric range, and to + multiples of the lineStep() size (see TQRangeControl for details). + Clicking the up/down buttons or using the keyboard accelerator's + up and down arrows will increase or decrease the current value in + steps of size lineStep(). The minimum and maximum value and the + step size can be set using one of the constructors, and can be + changed later with setMinValue(), setMaxValue() and setLineStep(). + + Most spin boxes are directional, but TQSpinBox can also operate as + a circular spin box, i.e. if the range is 0-99 and the current + value is 99, clicking "up" will give 0. Use setWrapping() if you + want circular behavior. + + The displayed value can be prepended and appended with arbitrary + strings indicating, for example, currency or the unit of + measurement. See setPrefix() and setSuffix(). The text in the spin + box is retrieved with text() (which includes any prefix() and + suffix()), or with cleanText() (which has no prefix(), no suffix() + and no leading or trailing whitespace). currentValueText() returns + the spin box's current value as text. + + Normally the spin box displays up and down arrows in the buttons. + You can use setButtonSymbols() to change the display to show + <b>+</b> and <b>-</b> symbols if you prefer. In either case the up + and down arrow keys work as expected. + + It is often desirable to give the user a special (often default) + choice in addition to the range of numeric values. See + setSpecialValueText() for how to do this with TQSpinBox. + + The default \l TQWidget::focusPolicy() is StrongFocus. + + If using prefix(), suffix() and specialValueText() don't provide + enough control, you can ignore them and subclass TQSpinBox instead. + + TQSpinBox can easily be subclassed to allow the user to input + things other than an integer value as long as the allowed input + can be mapped to a range of integers. This can be done by + overriding the virtual functions mapValueToText() and + mapTextToValue(), and setting another suitable validator using + setValidator(). + + For example, these functions could be changed so that the user + provided values from 0.0 to 10.0, or -1 to signify 'Auto', while + the range of integers used inside the program would be -1 to 100: + + \code + class MySpinBox : public TQSpinBox + { + TQ_OBJECT + public: + ... + + TQString mapValueToText( int value ) + { + if ( value == -1 ) // special case + return TQString( "Auto" ); + + return TQString( "%1.%2" ) // 0.0 to 10.0 + .arg( value / 10 ).arg( value % 10 ); + } + + int mapTextToValue( bool *ok ) + { + if ( text() == "Auto" ) // special case + return -1; + + return (int) ( 10 * text().toFloat() ); // 0 to 100 + } + }; + \endcode + + <img src=qspinbox-m.png> <img src=qspinbox-w.png> + + \sa TQScrollBar TQSlider + \link guibooks.html#fowler GUI Design Handbook: Spin Box \endlink +*/ + + +/*! + Constructs a spin box with the default TQRangeControl range and + step values. It is called \a name and has tqparent \a tqparent. + + \sa minValue(), maxValue(), setRange(), lineStep(), setSteps() +*/ + +TQSpinBox::TQSpinBox( TQWidget * tqparent , const char *name ) + : TQWidget( tqparent, name, TQt::WNoAutoErase ), + TQRangeControl() +{ + initSpinBox(); +} + + +/*! + Constructs a spin box that allows values from \a minValue to \a + maxValue inclusive, with step amount \a step. The value is + initially set to \a minValue. + + The spin box is called \a name and has tqparent \a tqparent. + + \sa minValue(), maxValue(), setRange(), lineStep(), setSteps() +*/ + +TQSpinBox::TQSpinBox( int minValue, int maxValue, int step, TQWidget* tqparent, + const char* name ) + : TQWidget( tqparent, name, TQt::WNoAutoErase ), + TQRangeControl( minValue, maxValue, step, step, minValue ) +{ + initSpinBox(); +} + +/* + \internal Initialization. +*/ + +void TQSpinBox::initSpinBox() +{ + d = new TQSpinBoxPrivate; + + d->controls = new TQSpinWidget( this, "controls" ); + connect( d->controls, TQT_SIGNAL( stepUpPressed() ), TQT_SLOT( stepUp() ) ); + connect( d->controls, TQT_SIGNAL( stepDownPressed() ), TQT_SLOT( stepDown() ) ); + + wrap = FALSE; + edited = FALSE; + d->selreq = FALSE; + + validate = new TQSpinBoxValidator( this, "validator" ); + vi = new TQLineEdit( this, "qt_spinbox_edit" ); + d->controls->setEditWidget( vi ); + vi->setValidator( validate ); + vi->installEventFilter( this ); + vi->setFrame( FALSE ); + setFocusProxy( vi ); + + tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Fixed ) ); + setBackgroundMode( TQt::PaletteBackground, TQt::PaletteBase ); + + updateDisplay(); + + connect( vi, TQT_SIGNAL(textChanged(const TQString&)), TQT_SLOT(textChanged()) ); +} + +/*! + Destroys the spin box, freeing all memory and other resources. +*/ + +TQSpinBox::~TQSpinBox() +{ + delete d; +} + + +/*! + \property TQSpinBox::text + \brief the spin box's text, including any prefix() and suffix() + + There is no default text. + + \sa value() +*/ + +TQString TQSpinBox::text() const +{ + return vi->text(); +} + + + +/*! + \property TQSpinBox::cleanText + \brief the spin box's text with no prefix(), suffix() or leading + or trailing whitespace. + + \sa text, prefix, suffix +*/ + +TQString TQSpinBox::cleanText() const +{ + TQString s = TQString(text()).stripWhiteSpace(); + if ( !prefix().isEmpty() ) { + TQString px = TQString(prefix()).stripWhiteSpace(); + int len = px.length(); + if ( len && s.left(len) == px ) // Remove _only_ if it is the prefix + s.remove( (uint)0, len ); + } + if ( !suffix().isEmpty() ) { + TQString sx = TQString(suffix()).stripWhiteSpace(); + int len = sx.length(); + if ( len && s.right(len) == sx ) // Remove _only_ if it is the suffix + s.truncate( s.length() - len ); + } + return s.stripWhiteSpace(); +} + + +/*! + \property TQSpinBox::specialValueText + \brief the special-value text + + If set, the spin box will display this text instead of a numeric + value whenever the current value is equal to minVal(). Typical use + is to indicate that this choice has a special (default) meaning. + + For example, if your spin box allows the user to choose the margin + width in a print dialog and your application is able to + automatically choose a good margin width, you can set up the spin + box like this: + \code + TQSpinBox marginBox( -1, 20, 1, tqparent, "marginBox" ); + marginBox->setSuffix( " mm" ); + marginBox->setSpecialValueText( "Auto" ); + \endcode + The user will then be able to choose a margin width from 0-20 + millimeters or select "Auto" to leave it to the application to + choose. Your code must then interpret the spin box value of -1 as + the user requesting automatic margin width. + + All values are displayed with the prefix() and suffix() (if set), + \e except for the special value, which only shows the special + value text. + + To turn off the special-value text display, call this function + with an empty string. The default is no special-value text, i.e. + the numeric value is shown as usual. + + If no special-value text is set, specialValueText() returns + TQString::null. +*/ + +void TQSpinBox::setSpecialValueText( const TQString &text ) +{ + specText = text; + updateDisplay(); +} + + +TQString TQSpinBox::specialValueText() const +{ + if ( specText.isEmpty() ) + return TQString::null; + else + return specText; +} + + +/*! + \property TQSpinBox::prefix + \brief the spin box's prefix + + The prefix is prepended to the start of the displayed value. + Typical use is to display a unit of measurement or a currency + symbol. For example: + + \code + sb->setPrefix( "$" ); + \endcode + + To turn off the prefix display, set this property to an empty + string. The default is no prefix. The prefix is not displayed for + the minValue() if specialValueText() is not empty. + + If no prefix is set, prefix() returns TQString::null. + + \sa suffix() +*/ + +void TQSpinBox::setPrefix( const TQString &text ) +{ + pfix = text; + updateDisplay(); +} + + +TQString TQSpinBox::prefix() const +{ + if ( pfix.isEmpty() ) + return TQString::null; + else + return pfix; +} + + +/*! + \property TQSpinBox::suffix + \brief the suffix of the spin box + + The suffix is appended to the end of the displayed value. Typical + use is to display a unit of measurement or a currency symbol. For + example: + + \code + sb->setSuffix( " km" ); + \endcode + + To turn off the suffix display, set this property to an empty + string. The default is no suffix. The suffix is not displayed for + the minValue() if specialValueText() is not empty. + + If no suffix is set, suffix() returns a TQString::null. + + \sa prefix() +*/ + +void TQSpinBox::setSuffix( const TQString &text ) +{ + sfix = text; + updateDisplay(); +} + +TQString TQSpinBox::suffix() const +{ + if ( sfix.isEmpty() ) + return TQString::null; + else + return sfix; +} + + +/*! + \property TQSpinBox::wrapping + \brief whether it is possible to step the value from the highest + value to the lowest value and vice versa + + By default, wrapping is turned off. + + If you have a range of 0..100 and wrapping is off when the user + reaches 100 and presses the Up Arrow nothing will happen; but if + wrapping is on the value will change from 100 to 0, then to 1, + etc. When wrapping is on, navigating past the highest value takes + you to the lowest and vice versa. + + \sa minValue, maxValue, setRange() +*/ + +void TQSpinBox::setWrapping( bool on ) +{ + wrap = on; + updateDisplay(); +} + +bool TQSpinBox::wrapping() const +{ + return wrap; +} + +/*! + \reimp +*/ +TQSize TQSpinBox::tqsizeHint() const +{ + constPolish(); + TQSize sz = vi->tqsizeHint(); + int h = sz.height(); + TQFontMetrics fm( font() ); + int w = 35; + int wx = fm.width( ' ' )*2; + TQString s; + s = prefix() + ( (TQSpinBox*)this )->mapValueToText( minValue() ) + suffix(); + w = TQMAX( w, fm.width( s ) + wx); + s = prefix() + ( (TQSpinBox*)this )->mapValueToText( maxValue() ) + suffix(); + w = TQMAX(w, fm.width( s ) + wx ); + if ( !specialValueText().isEmpty() ) { + s = specialValueText(); + w = TQMAX( w, fm.width( s ) + wx ); + } + return tqstyle().tqsizeFromContents(TQStyle::CT_SpinBox, this, + TQSize( w + d->controls->downRect().width(), + h + tqstyle().tqpixelMetric( TQStyle::PM_DefaultFrameWidth ) * 2). + expandedTo( TQApplication::globalStrut() )); +} + + +/*! + \reimp +*/ +TQSize TQSpinBox::tqminimumSizeHint() const +{ + int w = vi->tqminimumSizeHint().width() + d->controls->downRect().width(); + int h = TQMAX( vi->tqminimumSizeHint().height(), d->controls->tqminimumSizeHint().height() ); + return TQSize( w, h ); +} + +// Does the tqlayout of the lineedit and the buttons + +void TQSpinBox::arrangeWidgets() +{ + d->controls->arrange(); +} + +/*! + \property TQSpinBox::value + \brief the value of the spin box + + \sa TQRangeControl::setValue() +*/ + +void TQSpinBox::setValue( int value ) +{ + edited = FALSE; // we ignore anything entered and not yet interpreted + TQRangeControl::setValue( value ); + updateDisplay(); +} + +int TQSpinBox::value() const +{ + TQSpinBox * that = (TQSpinBox *) this; + if ( edited ) { + that->edited = FALSE; // avoid recursion + that->interpretText(); + } + return TQRangeControl::value(); +} + + +/*! + Increases the spin box's value by one lineStep(), wrapping as + necessary if wrapping() is TRUE. This is the same as clicking on + the pointing-up button and can be used for keyboard accelerators, + for example. + + \sa stepDown(), addLine(), lineStep(), setSteps(), setValue(), value() +*/ + +void TQSpinBox::stepUp() +{ + if ( edited ) + interpretText(); + if ( wrapping() && ( value()+lineStep() > maxValue() || sumOutOfRange(value(), lineStep() ) ) ) { + setValue( minValue() ); + } else { + addLine(); + } +} + + +/*! + Decreases the spin box's value one lineStep(), wrapping as + necessary if wrapping() is TRUE. This is the same as clicking on + the pointing-down button and can be used for keyboard + accelerators, for example. + + \sa stepUp(), subtractLine(), lineStep(), setSteps(), setValue(), value() +*/ + +void TQSpinBox::stepDown() +{ + if ( edited ) + interpretText(); + if ( wrapping() && ( value()-lineStep() < minValue() || sumOutOfRange(value(), -lineStep() ) ) ) { + setValue( maxValue() ); + } else { + subtractLine(); + } +} + + +/*! + \fn void TQSpinBox::valueChanged( int value ) + + This signal is emitted every time the value of the spin box + changes; the new value is passed in \a value. This signal will be + emitted as a result of a call to setValue(), or because the user + changed the value by using a keyboard accelerator or mouse click, + etc. + + Note that the valueChanged() signal is emitted \e every time, not + just for the "last" step; i.e. if the user clicks "up" three + times, this signal is emitted three times. + + \sa value() +*/ + + +/*! + \fn void TQSpinBox::valueChanged( const TQString& valueText ) + + \overload + + This signal is emitted whenever the valueChanged( int ) signal is + emitted, i.e. every time the value of the spin box changes + (whatever the cause, e.g. by setValue(), by a keyboard + accelerator, by mouse clicks, etc.). + + The \a valueText parameter is the same string that is displayed in + the edit field of the spin box. + + \sa value() prefix() suffix() specialValueText() +*/ + + + +/*! + Intercepts and handles the events coming to the embedded TQLineEdit + that have special meaning for the TQSpinBox. The object is passed + as \a o and the event is passed as \a ev. +*/ + +bool TQSpinBox::eventFilter( TQObject* o, TQEvent* ev ) +{ + if (o != TQT_TQOBJECT(vi)) + return TQWidget::eventFilter(o,ev); + + if ( ev->type() == TQEvent::KeyPress ) { + TQKeyEvent* k = (TQKeyEvent*)ev; + + bool retval = FALSE; // workaround for MSVC++ optimization bug + if( (k->key() == Qt::Key_Tab) || (k->key() == TQt::Key_BackTab) ){ + if ( k->state() & ControlButton ) + return FALSE; + if ( edited ) + interpretText(); + tqApp->sendEvent( this, ev ); + retval = TRUE; + } if ( k->key() == Qt::Key_Up ) { + stepUp(); + retval = TRUE; + } else if ( k->key() == Qt::Key_Down ) { + stepDown(); + retval = TRUE; + } else if ( k->key() == Qt::Key_Enter || k->key() == Qt::Key_Return ) { + interpretText(); + return FALSE; + } + if ( retval ) + return retval; + } else if ( ev->type() == TQEvent::FocusOut || ev->type() == TQEvent::Hide ) { + if ( edited ) { + interpretText(); + } + return FALSE; + } + return FALSE; +} + +/*! + \reimp + */ +void TQSpinBox::setEnabled( bool enabled ) +{ + TQWidget::setEnabled( enabled ); + updateDisplay(); +} + +/*! + \reimp +*/ +void TQSpinBox::leaveEvent( TQEvent* ) +{ +} + + +/*! + \reimp +*/ +void TQSpinBox::resizeEvent( TQResizeEvent* ) +{ + d->controls->resize( width(), height() ); +} + +/*! + \reimp +*/ +#ifndef TQT_NO_WHEELEVENT +void TQSpinBox::wheelEvent( TQWheelEvent * e ) +{ + e->accept(); + static float offset = 0; + static TQSpinBox* offset_owner = 0; + if (offset_owner != this) { + offset_owner = this; + offset = 0; + } + offset += -e->delta()/120; + if (TQABS(offset) < 1) + return; + int ioff = int(offset); + int i; + for (i=0; i<TQABS(ioff); i++) + offset > 0 ? stepDown() : stepUp(); + offset -= ioff; +} +#endif + +/*! + This virtual function is called by TQRangeControl whenever the + value has changed. The TQSpinBox reimplementation updates the + display and emits the valueChanged() Q_SIGNALS; if you need + additional processing, either reimplement this or connect to one + of the valueChanged() Q_SIGNALS. +*/ + +void TQSpinBox::valueChange() +{ + d->selreq = hasFocus(); + updateDisplay(); + d->selreq = FALSE; + emit valueChanged( value() ); + emit valueChanged( currentValueText() ); +#if defined(TQT_ACCESSIBILITY_SUPPORT) + TQAccessible::updateAccessibility( this, 0, TQAccessible::ValueChanged ); +#endif +} + + +/*! + This virtual function is called by TQRangeControl whenever the + range has changed. It adjusts the default validator and updates + the display; if you need additional processing, you can + reimplement this function. +*/ + +void TQSpinBox::rangeChange() +{ + updateDisplay(); +} + + +/*! + Sets the validator to \a v. The validator controls what keyboard + input is accepted when the user is editing in the value field. The + default is to use a suitable TQIntValidator. + + Use setValidator(0) to turn off input validation (entered input + will still be kept within the spin box's range). +*/ + +void TQSpinBox::setValidator( const TQValidator* v ) +{ + if ( vi ) + vi->setValidator( v ); +} + + +/*! + Returns the validator that constrains editing for this spin box if + there is any; otherwise returns 0. + + \sa setValidator() TQValidator +*/ + +const TQValidator * TQSpinBox::validator() const +{ + return vi ? vi->validator() : 0; +} + +/*! + Updates the contents of the embedded TQLineEdit to reflect the + current value using mapValueToText(). Also enables/disables the + up/down push buttons accordingly. + + \sa mapValueToText() +*/ +void TQSpinBox::updateDisplay() +{ + vi->setUpdatesEnabled( FALSE ); + vi->setText( currentValueText() ); + if ( d->selreq && isVisible() && ( hasFocus() || vi->hasFocus() ) ) { + selectAll(); + } else { + if ( !suffix().isEmpty() && vi->text().endsWith(suffix()) ) + vi->setCursorPosition( vi->text().length() - suffix().length() ); + } + vi->setUpdatesEnabled( TRUE ); + vi->tqrepaint( FALSE ); // immediate tqrepaint needed for some reason + edited = FALSE; + + bool upEnabled = isEnabled() && ( wrapping() || value() < maxValue() ); + bool downEnabled = isEnabled() && ( wrapping() || value() > minValue() ); + + d->controls->setUpEnabled( upEnabled ); + d->controls->setDownEnabled( downEnabled ); + vi->setEnabled( isEnabled() ); + tqrepaint( FALSE ); +} + + +/*! + TQSpinBox calls this after the user has manually edited the + contents of the spin box (i.e. by typing in the embedded + TQLineEdit, rather than using the up/down buttons/keys). + + The default implementation of this function interprets the new + text using mapTextToValue(). If mapTextToValue() is successful, it + changes the spin box's value; if not, the value is left unchanged. + + \sa editor() +*/ + +void TQSpinBox::interpretText() +{ + bool ok = TRUE; + bool done = FALSE; + int newVal = 0; + if ( !specialValueText().isEmpty() ) { + TQString s = text().stripWhiteSpace(); + TQString t = specialValueText().stripWhiteSpace(); + if ( s == t ) { + newVal = minValue(); + done = TRUE; + } + } + if ( !done ) + newVal = mapTextToValue( &ok ); + if ( ok ) + setValue( newVal ); + updateDisplay(); // sometimes redundant +} + + +/*! + Returns the tqgeometry of the "up" button. +*/ + +TQRect TQSpinBox::upRect() const +{ + return d->controls->upRect(); +} + + +/*! + Returns the tqgeometry of the "down" button. +*/ + +TQRect TQSpinBox::downRect() const +{ + return d->controls->downRect(); +} + + +/*! + Returns a pointer to the embedded TQLineEdit. +*/ + +TQLineEdit* TQSpinBox::editor() const +{ + return vi; +} + + +/*! + This slot is called whenever the user edits the spin box's text. +*/ + +void TQSpinBox::textChanged() +{ + edited = TRUE; // this flag is cleared in updateDisplay() +} + + +/*! + This virtual function is used by the spin box whenever it needs to + display value \a v. The default implementation returns a string + containing \a v printed in the standard way. Reimplementations may + return anything. (See the example in the detailed description.) + + Note that TQt does not call this function for specialValueText() + and that neither prefix() nor suffix() are included in the return + value. + + If you reimplement this, you may also need to reimplement + mapTextToValue(). + + \sa updateDisplay(), mapTextToValue() +*/ + +TQString TQSpinBox::mapValueToText( int v ) +{ + TQString s; + s.setNum( v ); + return s; +} + + +/*! + This virtual function is used by the spin box whenever it needs to + interpret text entered by the user as a value. The text is + available as text() and as cleanText(), and this function must + parse it if possible. If \a ok is not 0: if it parses the text + successfully, \a *ok is set to TRUE; otherwise \a *ok is set to + FALSE. + + Subclasses that need to display spin box values in a non-numeric + way need to reimplement this function. + + Note that TQt handles specialValueText() separately; this function + is only concerned with the other values. + + The default implementation tries to interpret the text() as an + integer in the standard way and returns the integer value. + + \sa interpretText(), mapValueToText() +*/ + +int TQSpinBox::mapTextToValue( bool* ok ) +{ + TQString s = text(); + int newVal = s.toInt( ok ); + if ( !(*ok) && !( !prefix() && !suffix() ) ) {// Try removing any pre/suffix + s = cleanText(); + newVal = s.toInt( ok ); + } + return newVal; +} + + +/*! + Returns the full text calculated from the current value, including + any prefix and suffix. If there is special value text and the + value is minValue() the specialValueText() is returned. +*/ + +TQString TQSpinBox::currentValueText() +{ + TQString s; + if ( (value() == minValue()) && !specialValueText().isEmpty() ) { + s = specialValueText(); + } else { + s = prefix(); + s.append( mapValueToText( value() ) ); + s.append( suffix() ); + } + return s; +} + +/*! + \reimp +*/ + +void TQSpinBox::styleChange( TQStyle& old ) +{ + arrangeWidgets(); + TQWidget::styleChange( old ); +} + + +/*! + \enum TQSpinBox::ButtonSymbols + + This enum type determines what the buttons in a spin box show. + + \value UpDownArrows the buttons show little arrows in the classic + style. + + \value PlusMinus the buttons show <b>+</b> and <b>-</b> symbols. + + \sa TQSpinBox::buttonSymbols +*/ + +/*! + \property TQSpinBox::buttonSymbols + + \brief the current button symbol mode + + The possible values can be either \c UpDownArrows or \c PlusMinus. + The default is \c UpDownArrows. + + \sa ButtonSymbols +*/ + +void TQSpinBox::setButtonSymbols( ButtonSymbols newSymbols ) +{ + if ( buttonSymbols() == newSymbols ) + return; + + switch ( newSymbols ) { + case UpDownArrows: + d->controls->setButtonSymbols( TQSpinWidget::UpDownArrows ); + break; + case PlusMinus: + d->controls->setButtonSymbols( TQSpinWidget::PlusMinus ); + break; + } + // tqrepaint( FALSE ); +} + +TQSpinBox::ButtonSymbols TQSpinBox::buttonSymbols() const +{ + switch( d->controls->buttonSymbols() ) { + case TQSpinWidget::UpDownArrows: + return UpDownArrows; + case TQSpinWidget::PlusMinus: + return PlusMinus; + } + return UpDownArrows; +} + +/*! + \property TQSpinBox::minValue + + \brief the minimum value of the spin box + + When setting this property, \l TQSpinBox::maxValue is adjusted, if + necessary, to ensure that the range remains valid. + + \sa setRange() setSpecialValueText() +*/ + +int TQSpinBox::minValue() const +{ + return TQRangeControl::minValue(); +} + +void TQSpinBox::setMinValue( int minVal ) +{ + TQRangeControl::setMinValue( minVal ); +} + +/*! + \property TQSpinBox::maxValue + \brief the maximum value of the spin box + + When setting this property, \l TQSpinBox::minValue is adjusted, if + necessary, to ensure that the range remains valid. + + \sa setRange() setSpecialValueText() +*/ + +int TQSpinBox::maxValue() const +{ + return TQRangeControl::maxValue(); +} + +void TQSpinBox::setMaxValue( int maxVal ) +{ + TQRangeControl::setMaxValue( maxVal ); +} + +/*! + \property TQSpinBox::lineStep + \brief the line step + + When the user uses the arrows to change the spin box's value the + value will be incremented/decremented by the amount of the line + step. + + The setLineStep() function calls the virtual stepChange() function + if the new line step is different from the previous setting. + + \sa TQRangeControl::setSteps() setRange() +*/ + +int TQSpinBox::lineStep() const +{ + return TQRangeControl::lineStep(); +} + +void TQSpinBox::setLineStep( int i ) +{ + setSteps( i, pageStep() ); +} + +/*! + Selects all the text in the spin box's editor. +*/ + +void TQSpinBox::selectAll() +{ + int overhead = prefix().length() + suffix().length(); + if ( !overhead || currentValueText() == specialValueText() ) { + vi->selectAll(); + } else { + vi->setSelection( prefix().length(), vi->text().length() - overhead ); + } +} + +#endif |