summaryrefslogtreecommitdiffstats
path: root/src/widgets/tqcheckbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/tqcheckbox.cpp')
-rw-r--r--src/widgets/tqcheckbox.cpp364
1 files changed, 364 insertions, 0 deletions
diff --git a/src/widgets/tqcheckbox.cpp b/src/widgets/tqcheckbox.cpp
new file mode 100644
index 000000000..a9cf27d0d
--- /dev/null
+++ b/src/widgets/tqcheckbox.cpp
@@ -0,0 +1,364 @@
+/****************************************************************************
+**
+** Implementation of TQCheckBox class
+**
+** Created : 940222
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** 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 [email protected].
+**
+** 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 "tqcheckbox.h"
+#ifndef TQT_NO_CHECKBOX
+#include "tqpainter.h"
+#include "ntqdrawutil.h"
+#include "tqpixmap.h"
+#include "tqpixmapcache.h"
+#include "tqbitmap.h"
+#include "tqtextstream.h"
+#include "ntqapplication.h"
+#include "tqstyle.h"
+
+/*!
+ \class TQCheckBox tqcheckbox.h
+ \brief The TQCheckBox widget provides a checkbox with a text label.
+
+ \ingroup basic
+ \mainclass
+
+ TQCheckBox and TQRadioButton are both option buttons. That is, they
+ can be switched on (checked) or off (unchecked). The classes
+ differ in how the choices for the user are restricted. Radio
+ buttons define a "one of many" choice, whereas checkboxes provide
+ "many of many" choices.
+
+ A TQButtonGroup can be used to group check buttons visually.
+
+ Whenever a checkbox is checked or cleared it emits the signal
+ toggled(). Connect to this signal if you want to trigger an action
+ each time the checkbox changes state. You can use isChecked() to
+ query whether or not a checkbox is checked.
+
+ \warning The toggled() signal can not be trusted for tristate
+ checkboxes.
+
+ In addition to the usual checked and unchecked states, TQCheckBox
+ optionally provides a third state to indicate "no change". This
+ is useful whenever you need to give the user the option of neither
+ checking nor unchecking a checkbox. If you need this third state,
+ enable it with setTristate() and use state() to query the current
+ toggle state. When a tristate checkbox changes state, it emits the
+ stateChanged() signal.
+
+ Just like TQPushButton, a checkbox can display text or a pixmap.
+ The text can be set in the constructor or with setText(); the
+ pixmap is set with setPixmap().
+
+ \important text(), setText(), text(), pixmap(), setPixmap(),
+ accel(), setAccel(), isToggleButton(), setDown(), isDown(),
+ isOn(), state(), autoRepeat(), isExclusiveToggle(), group(),
+ setAutoRepeat(), toggle(), pressed(), released(), clicked(),
+ toggled(), state() stateChanged()
+
+ <img src=qchkbox-m.png> <img src=qchkbox-w.png>
+
+ \sa TQButton TQRadioButton
+ \link guibooks.html#fowler Fowler: Check Box \endlink
+*/
+
+/*!
+ \property TQCheckBox::checked
+ \brief whether the checkbox is checked
+
+ The default is unchecked, i.e. FALSE.
+*/
+
+/*!
+ \property TQCheckBox::autoMask
+ \brief whether the checkbox is automatically masked
+
+ \sa TQWidget::setAutoMask()
+*/
+
+/*!
+ \property TQCheckBox::tristate
+ \brief whether the checkbox is a tri-state checkbox
+
+ The default is two-state, i.e. tri-state is FALSE.
+*/
+
+/*!
+ Constructs a checkbox with no text.
+
+ The \a parent and \a name arguments are sent to the TQWidget
+ constructor.
+*/
+
+TQCheckBox::TQCheckBox( TQWidget *parent, const char *name )
+ : TQButton( parent, name, WNoAutoErase | WMouseNoMask )
+{
+ setToggleButton( TRUE );
+ setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Fixed ) );
+}
+
+/*!
+ Constructs a checkbox with text \a text.
+
+ The \a parent and \a name arguments are sent to the TQWidget
+ constructor.
+*/
+
+TQCheckBox::TQCheckBox( const TQString &text, TQWidget *parent, const char *name )
+ : TQButton( parent, name, WNoAutoErase | WMouseNoMask )
+{
+ setText( text );
+ setToggleButton( TRUE );
+ setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Fixed ) );
+}
+
+/*!
+ Sets the checkbox to the "no change" state.
+
+ \sa setTristate()
+*/
+void TQCheckBox::setNoChange()
+{
+ setTristate(TRUE);
+ setState( NoChange );
+}
+
+void TQCheckBox::setTristate(bool y)
+{
+ setToggleType( y ? Tristate : Toggle );
+}
+
+bool TQCheckBox::isTristate() const
+{
+ return toggleType() == Tristate;
+}
+
+
+/*!\reimp
+*/
+TQSize TQCheckBox::sizeHint() const
+{
+ // NB: TQRadioButton::sizeHint() is similar
+ constPolish();
+
+ TQPainter p(this);
+ TQSize sz = style().itemRect(&p, TQRect(0, 0, 1, 1), ShowPrefix, FALSE,
+ pixmap(), text()).size();
+
+ return (style().sizeFromContents(TQStyle::CT_CheckBox, this, sz).
+ expandedTo(TQApplication::globalStrut()));
+}
+
+
+/*!\reimp
+*/
+
+void TQCheckBox::drawButton( TQPainter *paint )
+{
+ TQPainter *p = paint;
+ TQRect irect = TQStyle::visualRect( style().subRect(TQStyle::SR_CheckBoxIndicator, this), this );
+ const TQColorGroup &cg = colorGroup();
+
+#if !defined( TQT_NO_TEXTSTREAM ) && !defined( TQ_WS_MACX )
+# define SAVE_CHECKBOX_PIXMAPS
+#endif
+#if defined(SAVE_CHECKBOX_PIXMAPS)
+ TQString pmkey; // pixmap key
+ int kf = 0;
+ if ( isDown() )
+ kf |= 1;
+ if ( isEnabled() )
+ kf |= 2;
+ if ( hasFocus() )
+ kf |= 4; // active vs. normal colorgroup
+ if( isActiveWindow() )
+ kf |= 8;
+ if ( hasMouse() )
+ kf |= 16;
+
+ kf |= state() << 5;
+ TQTextOStream os(&pmkey);
+ os << "$qt_check_" << style().className() << "_"
+ << palette().serialNumber() << "_" << irect.width() << "x" << irect.height() << "_" << kf;
+ TQPixmap *pm = TQPixmapCache::find( pmkey );
+ if ( pm ) { // pixmap exists
+ p->drawPixmap( irect.topLeft(), *pm );
+ drawButtonLabel( p );
+ return;
+ }
+ bool use_pm = TRUE;
+ TQPainter pmpaint;
+ int wx = 0, wy = 0;
+ if ( use_pm ) {
+ pm = new TQPixmap( irect.size() ); // create new pixmap
+ TQ_CHECK_PTR( pm );
+ pm->fill( cg.background() );
+ TQPainter::redirect(this, pm);
+ pmpaint.begin(this);
+ p = &pmpaint; // draw in pixmap
+ wx = irect.x(); // save x,y coords
+ wy = irect.y();
+ irect.moveTopLeft(TQPoint(0, 0));
+ p->setBackgroundColor( cg.background() );
+ }
+#endif
+
+ TQStyle::SFlags flags = TQStyle::Style_Default;
+ if ( isEnabled() )
+ flags |= TQStyle::Style_Enabled;
+ if ( hasFocus() )
+ flags |= TQStyle::Style_HasFocus;
+ if ( isDown() )
+ flags |= TQStyle::Style_Down;
+ if ( hasMouse() )
+ flags |= TQStyle::Style_MouseOver;
+ if ( state() == TQButton::On )
+ flags |= TQStyle::Style_On;
+ else if ( state() == TQButton::Off )
+ flags |= TQStyle::Style_Off;
+ else if ( state() == TQButton::NoChange )
+ flags |= TQStyle::Style_NoChange;
+
+ style().drawControl(TQStyle::CE_CheckBox, p, this, irect, cg, flags);
+
+#if defined(SAVE_CHECKBOX_PIXMAPS)
+ if ( use_pm ) {
+ pmpaint.end();
+ TQPainter::redirect( this, 0 );
+ if ( backgroundPixmap() || backgroundMode() == X11ParentRelative ) {
+ TQBitmap bm( pm->size() );
+ bm.fill( color0 );
+ pmpaint.begin( &bm );
+ style().drawControlMask(TQStyle::CE_CheckBox, &pmpaint, this, irect);
+ pmpaint.end();
+ pm->setMask( bm );
+ }
+ p = paint; // draw in default device
+ p->drawPixmap( wx, wy, *pm );
+ if (!TQPixmapCache::insert(pmkey, pm) ) // save in cache
+ delete pm;
+ }
+#endif
+
+ drawButtonLabel( paint );
+}
+
+
+/*!\reimp
+*/
+void TQCheckBox::drawButtonLabel( TQPainter *p )
+{
+ TQRect r =
+ TQStyle::visualRect( style().subRect(TQStyle::SR_CheckBoxContents, this), this );
+
+ TQStyle::SFlags flags = TQStyle::Style_Default;
+ if (isEnabled())
+ flags |= TQStyle::Style_Enabled;
+ if (hasFocus())
+ flags |= TQStyle::Style_HasFocus;
+ if (isDown())
+ flags |= TQStyle::Style_Down;
+ if (state() == TQButton::On)
+ flags |= TQStyle::Style_On;
+ else if (state() == TQButton::Off)
+ flags |= TQStyle::Style_Off;
+ else if (state() == TQButton::NoChange)
+ flags |= TQStyle::Style_NoChange;
+
+ style().drawControl(TQStyle::CE_CheckBoxLabel, p, this, r, colorGroup(), flags);
+}
+
+/*!
+ \reimp
+*/
+void TQCheckBox::resizeEvent( TQResizeEvent *e )
+{
+ TQButton::resizeEvent(e);
+ if ( isVisible() ) {
+ TQPainter p(this);
+ TQSize isz = style().itemRect(&p, TQRect(0, 0, 1, 1), ShowPrefix, FALSE,
+ pixmap(), text()).size();
+ TQSize wsz = (style().sizeFromContents(TQStyle::CT_CheckBox, this, isz).
+ expandedTo(TQApplication::globalStrut()));
+
+ update(wsz.width(), isz.width(), 0, wsz.height());
+ }
+ if (autoMask())
+ updateMask();
+}
+
+/*!
+ \reimp
+*/
+void TQCheckBox::updateMask()
+{
+ TQRect irect =
+ TQStyle::visualRect( style().subRect(TQStyle::SR_CheckBoxIndicator, this), this );
+
+ TQBitmap bm(width(), height());
+ bm.fill(color0);
+
+ TQPainter p( &bm, this );
+ style().drawControlMask(TQStyle::CE_CheckBox, &p, this, irect);
+ if ( ! text().isNull() || ( pixmap() && ! pixmap()->isNull() ) ) {
+ TQRect crect =
+ TQStyle::visualRect( style().subRect( TQStyle::SR_CheckBoxContents,
+ this ), this );
+ TQRect frect =
+ TQStyle::visualRect( style().subRect( TQStyle::SR_CheckBoxFocusRect,
+ this ), this );
+ TQRect label(crect.unite(frect));
+ p.fillRect(label, color1);
+ }
+ p.end();
+
+ setMask(bm);
+}
+
+/*!\reimp*/
+bool TQCheckBox::hitButton( const TQPoint &pos ) const
+{
+ TQRect r = TQStyle::visualRect( style().subRect( TQStyle::SR_CheckBoxFocusRect, this ), this );
+ if ( tqApp->reverseLayout() ) {
+ r.setRight( width() );
+ } else {
+ r.setLeft( 0 );
+ }
+ return r.contains( pos );
+}
+
+#endif