diff options
| author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:17:53 -0500 | 
|---|---|---|
| committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2011-07-10 15:17:53 -0500 | 
| commit | dda8474928bd7276e1fad8fb7a601e7c83ff2bc2 (patch) | |
| tree | 7f83910598b33b12730035f086df20b5a53ab99c /tqtinterface/qt4/src/widgets/tqgroupbox.cpp | |
| parent | 6260b6178868c03aab1644bf93b0ef043654bdb0 (diff) | |
| download | experimental-dda8474928bd7276e1fad8fb7a601e7c83ff2bc2.tar.gz experimental-dda8474928bd7276e1fad8fb7a601e7c83ff2bc2.zip | |
Added TQt4 HEAD
Diffstat (limited to 'tqtinterface/qt4/src/widgets/tqgroupbox.cpp')
| -rw-r--r-- | tqtinterface/qt4/src/widgets/tqgroupbox.cpp | 989 | 
1 files changed, 989 insertions, 0 deletions
| diff --git a/tqtinterface/qt4/src/widgets/tqgroupbox.cpp b/tqtinterface/qt4/src/widgets/tqgroupbox.cpp new file mode 100644 index 0000000..f9c341e --- /dev/null +++ b/tqtinterface/qt4/src/widgets/tqgroupbox.cpp @@ -0,0 +1,989 @@ +/********************************************************************** +** +** 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(). + +    <img src=qgrpbox-w.png> + +    \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 "<u>U</u>ser 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<TQRadioButton*>(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<TQButtonGroup*>(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 | 
