/**********************************************************************
**
** Implementation of TQGroupBox widget class
**
** Created : 950203
**
** 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 "tqgroupbox.h"
#ifndef TQT_NO_GROUPBOX
#include "tqlayout.h"
#include "tqpainter.h"
#include "tqbitmap.h"
#include "tqaccel.h"
#include "tqradiobutton.h"
#include "tqfocusdata.h"
#include "tqobjectlist.h"
#include "tqdrawutil.h"
#include "tqapplication.h"
#include "tqstyle.h"
#include "tqcheckbox.h"
#include "tqbuttongroup.h"
#if defined(TQT_ACCESSIBILITY_SUPPORT)
#include "tqaccessible.h"
#endif
/*!
\class TQGroupBox tqgroupbox.h
\brief The TQGroupBox widget provides a group box frame with a title.
\ingroup organizers
\ingroup geomanagement
\ingroup appearance
\mainclass
A group box provides a frame, a title and a keyboard shortcut, and
displays various other widgets inside itself. The title is on top,
the keyboard shortcut moves keyboard focus to one of the group
box's child widgets, and the child widgets are usually laid out
horizontally (or vertically) inside the frame.
The simplest way to use it is to create a group box with the
desired number of columns (or rows) and orientation, and then just
create widgets with the group box as tqparent.
It is also possible to change the orientation() and number of
columns() after construction, or to ignore all the automatic
tqlayout support and manage the tqlayout yourself. You can add 'empty'
spaces to the group box with addSpace().
TQGroupBox also lets you set the title() (normally set in the
constructor) and the title's tqalignment().
You can change the spacing used by the group box with
setInsideMargin() and setInsideSpacing(). To minimize space
consumption, you can remove the right, left and bottom edges of
the frame with setFlat().
\sa TQButtonGroup
*/
class TQCheckBox;
class TQGroupBoxPrivate
{
public:
TQGroupBoxPrivate():
spacer( 0 ),
checkbox( 0 ) {}
TQSpacerItem *spacer;
TQCheckBox *checkbox;
};
/*!
Constructs a group box widget with no title.
The \a tqparent and \a name arguments are passed to the TQWidget
constructor.
This constructor does not do automatic tqlayout.
*/
TQGroupBox::TQGroupBox( TQWidget *tqparent, const char *name )
: TQFrame( tqparent, name )
{
init();
}
/*!
Constructs a group box with the title \a title.
The \a tqparent and \a name arguments are passed to the TQWidget
constructor.
This constructor does not do automatic tqlayout.
*/
TQGroupBox::TQGroupBox( const TQString &title, TQWidget *tqparent, const char *name )
: TQFrame( tqparent, name )
{
init();
setTitle( title );
}
/*!
Constructs a group box with no title. Child widgets will be
arranged in \a strips rows or columns (depending on \a
orientation).
The \a tqparent and \a name arguments are passed to the TQWidget
constructor.
*/
TQGroupBox::TQGroupBox( int strips, Qt::Orientation orientation,
TQWidget *tqparent, const char *name )
: TQFrame( tqparent, name )
{
init();
setColumnLayout( strips, orientation );
}
/*!
Constructs a group box titled \a title. Child widgets will be
arranged in \a strips rows or columns (depending on \a
orientation).
The \a tqparent and \a name arguments are passed to the TQWidget
constructor.
*/
TQGroupBox::TQGroupBox( int strips, Qt::Orientation orientation,
const TQString &title, TQWidget *tqparent,
const char *name )
: TQFrame( tqparent, name )
{
init();
setTitle( title );
setColumnLayout( strips, orientation );
}
/*!
Destroys the group box.
*/
TQGroupBox::~TQGroupBox()
{
delete d;
}
void TQGroupBox::init()
{
align = TQt::AlignAuto;
setFrameStyle( TQFrame::GroupBoxPanel | TQFrame::Sunken );
#ifndef TQT_NO_ACCEL
accel = 0;
#endif
vbox = 0;
grid = 0;
d = new TQGroupBoxPrivate();
lenvisible = 0;
nCols = nRows = 0;
dir = Qt::Horizontal;
marg = 11;
spac = 5;
bFlat = FALSE;
}
void TQGroupBox::setTextSpacer()
{
if ( !d->spacer )
return;
int h = 0;
int w = 0;
if ( isCheckable() || lenvisible ) {
TQFontMetrics fm = fontMetrics();
int fh = fm.height();
if ( isCheckable() ) {
#ifndef TQT_NO_CHECKBOX
fh = d->checkbox->tqsizeHint().height() + 2;
w = d->checkbox->tqsizeHint().width() + 2*fm.width( "xx" );
#endif
} else {
fh = fm.height();
w = fm.width( str, lenvisible ) + 2*fm.width( "xx" );
}
h = frameRect().y();
if ( tqlayout() ) {
int m = tqlayout()->margin();
int sp = tqlayout()->spacing();
// do we have a child tqlayout?
for ( TQLayoutIterator it = tqlayout()->iterator(); it.current(); ++it ) {
if ( it.current()->tqlayout() ) {
m += it.current()->tqlayout()->margin();
sp = TQMAX( sp, it.current()->tqlayout()->spacing() );
break;
}
}
h = TQMAX( fh-m, h );
h += TQMAX( sp - (h+m - fh), 0 );
}
}
d->spacer->changeSize( w, h, TQSizePolicy::Minimum, TQSizePolicy::Fixed );
}
void TQGroupBox::setTitle( const TQString &title )
{
if ( str == title ) // no change
return;
str = title;
#ifndef TQT_NO_ACCEL
if ( accel )
delete accel;
accel = 0;
int s = TQAccel::shortcutKey( title );
if ( s ) {
accel = new TQAccel( this, "automatic focus-change accelerator" );
accel->connectItem( accel->insertItem( s, 0 ),
TQT_TQOBJECT(this), TQT_SLOT(fixFocus()) );
}
#endif
#ifndef TQT_NO_CHECKBOX
if ( d->checkbox ) {
d->checkbox->setText( str );
updateCheckBoxGeometry();
}
#endif
calculateFrame();
setTextSpacer();
update();
updateGeometry();
#if defined(TQT_ACCESSIBILITY_SUPPORT)
TQAccessible::updateAccessibility( this, 0, TQAccessible::NameChanged );
#endif
}
/*!
\property TQGroupBox::title
\brief the group box title text.
The group box title text will have a focus-change keyboard
accelerator if the title tqcontains \&, followed by a letter.
\code
g->setTitle( "&User information" );
\endcode
This produces "User information"; Alt+U moves the keyboard
focus to the group box.
There is no default title text.
*/
/*!
\property TQGroupBox::tqalignment
\brief the tqalignment of the group box title.
The title is always placed on the upper frame line. The horizontal
tqalignment can be specified by the tqalignment parameter.
The tqalignment is one of the following flags:
\list
\i \c AlignAuto aligns the title according to the language,
usually to the left.
\i \c AlignLeft aligns the title text to the left.
\i \c AlignRight aligns the title text to the right.
\i \c AlignHCenter aligns the title text centered.
\endlist
The default tqalignment is \c AlignAuto.
\sa TQt::AlignmentFlags
*/
void TQGroupBox::tqsetAlignment( int tqalignment )
{
align = tqalignment;
#ifndef TQT_NO_CHECKBOX
updateCheckBoxGeometry();
#endif
update();
}
/*! \reimp
*/
void TQGroupBox::resizeEvent( TQResizeEvent *e )
{
TQFrame::resizeEvent(e);
#ifndef TQT_NO_CHECKBOX
if ( align & TQt::AlignRight || align & TQt::AlignCenter ||
( TQApplication::reverseLayout() && !(align & TQt::AlignLeft) ) )
updateCheckBoxGeometry();
#endif
calculateFrame();
}
/*! \reimp
\internal
overrides TQFrame::paintEvent
*/
void TQGroupBox::paintEvent( TQPaintEvent *event )
{
TQPainter paint( this );
if ( lenvisible && !isCheckable() ) { // draw title
TQFontMetrics fm = paint.fontMetrics();
int h = fm.height();
int tw = fm.width( str, lenvisible ) + fm.width(TQChar(' '));
int x;
int marg = bFlat ? 0 : 8;
if ( align & TQt::AlignHCenter ) // center tqalignment
x = frameRect().width()/2 - tw/2;
else if ( align & TQt::AlignRight ) // right tqalignment
x = frameRect().width() - tw - marg;
else if ( align & TQt::AlignLeft ) // left tqalignment
x = marg;
else { // auto align
if( TQApplication::reverseLayout() )
x = frameRect().width() - tw - marg;
else
x = marg;
}
TQRect r( x, 0, tw, h );
int va = tqstyle().tqstyleHint(TQStyle::SH_GroupBox_TextLabelVerticalAlignment, this);
if(va & TQt::AlignTop)
r.moveBy(0, fm.descent());
TQColor pen( (TQRgb) tqstyle().tqstyleHint(TQStyle::SH_GroupBox_TextLabelColor, this ) );
if (!tqstyle().tqstyleHint(TQStyle::SH_UnderlineAccelerator, this))
va |= TQt::NoAccel;
tqstyle().drawItem( &paint, r, TQt::ShowPrefix | TQt::AlignHCenter | va, tqcolorGroup(),
isEnabled(), 0, str, -1, ownPalette() ? 0 : &pen );
paint.setClipRegion( event->region().subtract( r ) ); // clip everything but title
#ifndef TQT_NO_CHECKBOX
} else if ( d->checkbox ) {
TQRect cbClip = d->checkbox->tqgeometry();
TQFontMetrics fm = paint.fontMetrics();
cbClip.setX( cbClip.x() - fm.width(TQChar(' ')) );
cbClip.setWidth( cbClip.width() + fm.width(TQChar(' ')) );
paint.setClipRegion( event->region().subtract( cbClip ) );
#endif
}
if ( bFlat ) {
TQRect fr = frameRect();
TQPoint p1( fr.x(), fr.y() + 1 );
TQPoint p2( fr.x() + fr.width(), p1.y() );
// ### This should probably be a style primitive.
qDrawShadeLine( &paint, p1, p2, tqcolorGroup(), TRUE,
lineWidth(), midLineWidth() );
} else {
drawFrame(&paint);
}
drawContents( &paint ); // draw the contents
}
/*!
Adds an empty cell at the next free position. If \a size is
greater than 0, the empty cell takes \a size to be its fixed width
(if orientation() is \c Qt::Horizontal) or height (if orientation() is
\c Qt::Vertical).
Use this method to separate the widgets in the group box or to
skip the next free cell. For performance reasons, call this method
after calling setColumnLayout() or by changing the \l
TQGroupBox::columns or \l TQGroupBox::orientation properties. It is
generally a good idea to call these methods first (if needed at
all), and insert the widgets and spaces afterwards.
*/
void TQGroupBox::addSpace( int size )
{
TQApplication::sendPostedEvents( this, TQEvent::ChildInserted );
if ( nCols <= 0 || nRows <= 0 )
return;
if ( row >= nRows || col >= nCols )
grid->expand( row+1, col+1 );
if ( size > 0 ) {
TQSpacerItem *spacer
= new TQSpacerItem( ( dir == Qt::Horizontal ) ? 0 : size,
( dir == Qt::Vertical ) ? 0 : size,
TQSizePolicy::Fixed, TQSizePolicy::Fixed );
grid->addItem( spacer, row, col );
}
skip();
}
/*!
\property TQGroupBox::columns
\brief the number of columns or rows (depending on \l TQGroupBox::orientation) in the group box
Usually it is not a good idea to set this property because it is
slow (it does a complete tqlayout). It is best to set the number
of columns directly in the constructor.
*/
int TQGroupBox::columns() const
{
if ( dir == Qt::Horizontal )
return nCols;
return nRows;
}
void TQGroupBox::setColumns( int c )
{
setColumnLayout( c, dir );
}
/*!
Returns the width of the empty space between the items in the
group and the frame of the group.
Only applies if the group box has a defined orientation.
The default is usually 11, by may vary depending on the platform
and style.
\sa setInsideMargin(), orientation
*/
int TQGroupBox::insideMargin() const
{
return marg;
}
/*!
Returns the width of the empty space between each of the items
in the group.
Only applies if the group box has a defined orientation.
The default is usually 5, by may vary depending on the platform
and style.
\sa setInsideSpacing(), orientation
*/
int TQGroupBox::insideSpacing() const
{
return spac;
}
/*!
Sets the the width of the inside margin to \a m pixels.
\sa insideMargin()
*/
void TQGroupBox::setInsideMargin( int m )
{
marg = m;
setColumnLayout( columns(), dir );
}
/*!
Sets the width of the empty space between each of the items in
the group to \a s pixels.
\sa insideSpacing()
*/
void TQGroupBox::setInsideSpacing( int s )
{
spac = s;
setColumnLayout( columns(), dir );
}
/*!
\property TQGroupBox::orientation
\brief the group box's orientation
A horizontal group box arranges it's tqchildren in columns, while a
vertical group box arranges them in rows.
Usually it is not a good idea to set this property because it is
slow (it does a complete tqlayout). It is better to set the
orientation directly in the constructor.
*/
void TQGroupBox::setOrientation( Orientation o )
{
setColumnLayout( columns(), o );
}
/*!
Changes the tqlayout of the group box. This function is only useful
in combination with the default constructor that does not take any
tqlayout information. This function will put all existing tqchildren
in the new tqlayout. It is not good TQt programming style to call
this function after tqchildren have been inserted. Sets the number
of columns or rows to be \a strips, depending on \a direction.
\sa orientation columns
*/
void TQGroupBox::setColumnLayout(int strips, Qt::Orientation direction)
{
if ( tqlayout() )
delete tqlayout();
vbox = 0;
grid = 0;
if ( strips < 0 ) // if 0, we create the vbox but not the grid. See below.
return;
vbox = new TQVBoxLayout( this, marg, 0 );
d->spacer = new TQSpacerItem( 0, 0, TQSizePolicy::Minimum,
TQSizePolicy::Fixed );
setTextSpacer();
vbox->addItem( TQT_TQLAYOUTITEM(d->spacer) );
nCols = 0;
nRows = 0;
dir = direction;
// Send all child events and ignore them. Otherwise we will end up
// with doubled insertion. This won't do anything because nCols ==
// nRows == 0.
TQApplication::sendPostedEvents( this, TQEvent::ChildInserted );
// if 0 or smaller , create a vbox-tqlayout but no grid. This allows
// the designer to handle its own grid tqlayout in a group box.
if ( strips <= 0 )
return;
dir = direction;
if ( dir == Qt::Horizontal ) {
nCols = strips;
nRows = 1;
} else {
nCols = 1;
nRows = strips;
}
grid = new TQGridLayout( nRows, nCols, spac );
row = col = 0;
grid->tqsetAlignment( TQt::AlignTop );
vbox->addLayout( TQT_TQLAYOUT(grid) );
// Add all tqchildren
if ( !childrenListObject().isEmpty() ) {
TQObjectListIt it( childrenListObject() );
TQWidget *w;
while( (w=(TQWidget *)it.current()) != 0 ) {
++it;
if ( w->isWidgetType()
#ifndef TQT_NO_CHECKBOX
&& w != d->checkbox
#endif
)
insertWid( w );
}
}
}
/*! \reimp */
bool TQGroupBox::event( TQEvent * e )
{
if ( e->type() == TQEvent::LayoutHint && tqlayout() )
setTextSpacer();
return TQFrame::event( e );
}
/*!\reimp */
void TQGroupBox::childEvent( TQChildEvent *c )
{
if ( !c->inserted() || !c->child()->isWidgetType() )
return;
TQWidget *w = (TQWidget*)c->child();
#ifndef TQT_NO_CHECKBOX
if ( d->checkbox ) {
if ( w == d->checkbox )
return;
if ( d->checkbox->isChecked() ) {
if ( !w->testWState( TQt::WState_ForceDisabled ) )
w->setEnabled( TRUE );
} else {
if ( w->isEnabled() ) {
w->setEnabled( FALSE );
((TQGroupBox*)w)->clearWState( TQt::WState_ForceDisabled );
}
}
}
#endif
if ( !grid )
return;
insertWid( w );
}
void TQGroupBox::insertWid( TQWidget* w )
{
if ( row >= nRows || col >= nCols )
grid->expand( row+1, col+1 );
grid->addWidget( w, row, col );
skip();
TQApplication::postEvent( this, new TQEvent( TQEvent::LayoutHint ) );
}
void TQGroupBox::skip()
{
// Same as TQGrid::skip()
if ( dir == Qt::Horizontal ) {
if ( col+1 < nCols ) {
col++;
} else {
col = 0;
row++;
}
} else { //Vertical
if ( row+1 < nRows ) {
row++;
} else {
row = 0;
col++;
}
}
}
/*!
\internal
This private slot tqfinds a widget in this group box that can accept
focus, and gives the focus to that widget.
*/
void TQGroupBox::fixFocus()
{
TQFocusData * fd = focusData();
TQWidget * orig = fd->home();
TQWidget * best = 0;
TQWidget * candidate = 0;
TQWidget * w = orig;
do {
TQWidget * p = w;
while( p && p != this && !p->isTopLevel() )
p = p->parentWidget();
if ( p == this && ( w->focusPolicy() & Qt::TabFocus ) == Qt::TabFocus
&& w->isVisibleTo(this) ) {
if ( w->hasFocus()
#ifndef TQT_NO_RADIOBUTTON
|| ( !best && ::tqqt_cast(w)
&& ((TQRadioButton*)w)->isChecked() )
#endif
)
// we prefer a checked radio button or a widget that
// already has focus, if there is one
best = w;
else if ( !candidate )
// but we'll accept anything that takes focus
candidate = w;
}
w = fd->next();
} while( w != orig );
if ( best )
best->setFocus();
else if ( candidate )
candidate->setFocus();
}
/*
Sets the right frame rect depending on the title. Also calculates
the visible part of the title.
*/
void TQGroupBox::calculateFrame()
{
lenvisible = str.length();
if ( lenvisible && !isCheckable() ) { // do we have a label?
TQFontMetrics fm = fontMetrics();
while ( lenvisible ) {
int tw = fm.width( str, lenvisible ) + 4*fm.width(TQChar(' '));
if ( tw < width() )
break;
lenvisible--;
}
if ( lenvisible ) { // but do we also have a visible label?
TQRect r = rect();
int va = tqstyle().tqstyleHint(TQStyle::SH_GroupBox_TextLabelVerticalAlignment, this);
if(va & TQt::AlignVCenter)
r.setTop( fm.height()/2 ); // frame rect should be
else if(va & TQt::AlignTop)
r.setTop(fm.ascent());
setFrameRect( r ); // smaller than client rect
return;
}
} else if ( isCheckable() ) {
#ifndef TQT_NO_CHECKBOX
TQRect r = rect();
int va = tqstyle().tqstyleHint(TQStyle::SH_GroupBox_TextLabelVerticalAlignment, this);
if( va & TQt::AlignVCenter )
r.setTop( d->checkbox->rect().height()/2 );
else if( va & TQt::AlignTop )
r.setTop( fontMetrics().ascent() );
setFrameRect( r );
return;
#endif
}
// no visible label
setFrameRect( TQRect(0,0,0,0) ); // then use client rect
}
/*! \reimp
*/
void TQGroupBox::focusInEvent( TQFocusEvent * )
{ // note no call to super
fixFocus();
}
/*!\reimp
*/
void TQGroupBox::fontChange( const TQFont & oldFont )
{
TQWidget::fontChange( oldFont );
#ifndef TQT_NO_CHECKBOX
updateCheckBoxGeometry();
#endif
calculateFrame();
setTextSpacer();
}
/*!
\reimp
*/
TQSize TQGroupBox::tqsizeHint() const
{
TQFontMetrics fm( font() );
int tw, th;
if ( isCheckable() ) {
#ifndef TQT_NO_CHECKBOX
tw = d->checkbox->tqsizeHint().width() + 2*fm.width( "xx" );
th = d->checkbox->tqsizeHint().height() + fm.width( TQChar(' ') );
#endif
} else {
tw = fm.width( title() ) + 2 * fm.width( "xx" );
th = fm.height() + fm.width( TQChar(' ') );
}
TQSize s;
if ( tqlayout() ) {
s = TQFrame::tqsizeHint();
return s.expandedTo( TQSize( tw, 0 ) );
} else {
TQRect r = tqchildrenRect();
TQSize s( 100, 50 );
s = s.expandedTo( TQSize( tw, th ) );
if ( r.isNull() )
return s;
return s.expandedTo( TQSize( r.width() + 2 * r.x(), r.height()+ 2 * r.y() ) );
}
}
/*!
\property TQGroupBox::flat
\brief whether the group box is painted flat or has a frame
By default a group box has a surrounding frame, with the title
being placed on the upper frame line. In flat mode the right, left
and bottom frame lines are omitted, and only the thin line at the
top is drawn.
\sa title
*/
bool TQGroupBox::isFlat() const
{
return bFlat;
}
void TQGroupBox::setFlat( bool b )
{
if ( (bool)bFlat == b )
return;
bFlat = b;
update();
}
/*!
\property TQGroupBox::checkable
\brief Whether the group box has a checkbox in its title.
If this property is TRUE, the group box has a checkbox. If the
checkbox is checked (which is the default), the group box's
tqchildren are enabled.
setCheckable() controls whether or not the group box has a
checkbox, and isCheckable() controls whether the checkbox is
checked or not.
*/
#ifndef TQT_NO_CHECKBOX
void TQGroupBox::setCheckable( bool b )
{
if ( (d->checkbox != 0) == b )
return;
if ( b ) {
if ( !d->checkbox ) {
d->checkbox = new TQCheckBox( title(), this, "qt_groupbox_checkbox" );
if (TQButtonGroup *meAsButtonGroup = ::tqqt_cast(this))
meAsButtonGroup->remove(d->checkbox);
setChecked( TRUE );
setChildrenEnabled( TRUE );
connect( d->checkbox, TQT_SIGNAL( toggled(bool) ),
this, TQT_SLOT( setChildrenEnabled(bool) ) );
connect( d->checkbox, TQT_SIGNAL( toggled(bool) ),
this, TQT_SIGNAL( toggled(bool) ) );
updateCheckBoxGeometry();
}
d->checkbox->show();
} else {
setChildrenEnabled( TRUE );
delete d->checkbox;
d->checkbox = 0;
}
calculateFrame();
setTextSpacer();
update();
}
#endif //TQT_NO_CHECKBOX
bool TQGroupBox::isCheckable() const
{
#ifndef TQT_NO_CHECKBOX
return ( d->checkbox != 0 );
#else
return FALSE;
#endif
}
bool TQGroupBox::isChecked() const
{
#ifndef TQT_NO_CHECKBOX
return d->checkbox && d->checkbox->isChecked();
#else
return FALSE;
#endif
}
/*!
\fn void TQGroupBox::toggled( bool on )
If the group box has a check box (see \l isCheckable()) this signal
is emitted when the check box is toggled. \a on is TRUE if the check
box is checked; otherwise it is FALSE.
*/
/*!
\property TQGroupBox::checked
\brief Whether the group box's checkbox is checked.
If the group box has a check box (see \l isCheckable()), and the
check box is checked (see \l isChecked()), the group box's tqchildren
are enabled. If the checkbox is unchecked the tqchildren are
disabled.
*/
#ifndef TQT_NO_CHECKBOX
void TQGroupBox::setChecked( bool b )
{
if ( d->checkbox )
d->checkbox->setChecked( b );
}
#endif
/*
sets all tqchildren of the group box except the qt_groupbox_checkbox
to either disabled/enabled
*/
void TQGroupBox::setChildrenEnabled( bool b )
{
if ( childrenListObject().isEmpty() )
return;
TQObjectListIt it( childrenListObject() );
TQObject *o;
while( (o = it.current()) ) {
++it;
if ( o->isWidgetType()
#ifndef TQT_NO_CHECKBOX
&& o != TQT_TQOBJECT(d->checkbox)
#endif
) {
TQWidget *w = (TQWidget*)o;
if ( b ) {
if ( !w->testWState( TQt::WState_ForceDisabled ) )
w->setEnabled( TRUE );
} else {
if ( w->isEnabled() ) {
w->setEnabled( FALSE );
((TQGroupBox*)w)->clearWState( TQt::WState_ForceDisabled );
}
}
}
}
}
/*! \reimp */
void TQGroupBox::setEnabled(bool on)
{
TQFrame::setEnabled(on);
if ( !d->checkbox || !on )
return;
#ifndef TQT_NO_CHECKBOX
// we are being enabled - disable tqchildren
if ( !d->checkbox->isChecked() )
setChildrenEnabled( FALSE );
#endif
}
/*
recalculates and sets the checkbox setGeometry
*/
#ifndef TQT_NO_CHECKBOX
void TQGroupBox::updateCheckBoxGeometry()
{
if ( d->checkbox ) {
TQSize cbSize = d->checkbox->tqsizeHint();
TQRect cbRect( 0, 0, cbSize.width(), cbSize.height() );
int marg = bFlat ? 2 : 8;
marg += fontMetrics().width( TQChar(' ') );
if ( align & TQt::AlignHCenter ) {
cbRect.moveCenter( frameRect().center() );
cbRect.moveTop( 0 );
} else if ( align & TQt::AlignRight ) {
cbRect.moveRight( frameRect().right() - marg );
} else if ( align & TQt::AlignLeft ) {
cbRect.moveLeft( frameRect().left() + marg );
} else { // auto align
if( TQApplication::reverseLayout() )
cbRect.moveRight( frameRect().right() - marg );
else
cbRect.moveLeft( frameRect().left() + marg );
}
d->checkbox->setGeometry( cbRect );
}
}
#endif //TQT_NO_CHECKBOX
#endif //TQT_NO_GROUPBOX