summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/src/widgets/tqtabbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/src/widgets/tqtabbar.cpp')
-rw-r--r--tqtinterface/qt4/src/widgets/tqtabbar.cpp1368
1 files changed, 0 insertions, 1368 deletions
diff --git a/tqtinterface/qt4/src/widgets/tqtabbar.cpp b/tqtinterface/qt4/src/widgets/tqtabbar.cpp
deleted file mode 100644
index bcbd41a..0000000
--- a/tqtinterface/qt4/src/widgets/tqtabbar.cpp
+++ /dev/null
@@ -1,1368 +0,0 @@
-/****************************************************************************
-**
-** Implementation of TQTab and TQTabBar classes
-**
-** 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 "tqtabbar.h"
-#ifndef TQT_NO_TABBAR
-#include "tqaccel.h"
-#include "tqbitmap.h"
-#include "tqtoolbutton.h"
-#include "tqtooltip.h"
-#include "tqapplication.h"
-#include "tqstyle.h"
-#include "tqpainter.h"
-#include "tqiconset.h"
-#include "tqcursor.h"
-#include "../kernel/tqinternal_p.h"
-#if defined(TQT_ACCESSIBILITY_SUPPORT)
-#include "tqaccessible.h"
-#endif
-
-#ifdef TQ_WS_MACX
-#include <tqmacstyle_mac.h>
-#endif
-
-
-/*!
- \class TQTab tqtabbar.h
- \brief The TQTab class provides the structures in a TQTabBar.
-
- \ingroup advanced
-
- This class is used for custom TQTabBar tab headings.
-
- \sa TQTabBar
-*/
-
-
-/*!
- Constructs an empty tab. All fields are set to empty.
-*/
-
-TQTab::TQTab()
- : enabled( TRUE ),
- id ( 0 ),
- iconset( 0 ),
- tb( 0 )
-{
-}
-
-/*!
- Constructs a tab with the text \a text.
-*/
-
-TQTab::TQTab( const TQString &text )
- : label( text ),
- enabled( TRUE ),
- id( 0 ),
- iconset( 0 ),
- tb( 0 )
-{
-}
-
-/*!
- Constructs a tab with an \a icon and the text, \a text.
-*/
-
-TQTab::TQTab( const TQIconSet& icon, const TQString& text )
- : label( text ),
- enabled( TRUE ),
- id( 0 ),
- iconset( new TQIconSet(icon) ),
- tb( 0 )
-{
-}
-
-/*!
- \fn TQString TQTab::text() const
-
- Returns the text of the TQTab label.
-*/
-
-/*!
- \fn TQIconSet TQTab::iconSet() const
-
- Return the TQIconSet of the TQTab.
-*/
-
-/*!
- \fn void TQTab::setRect( const TQRect &rect )
-
- Set the TQTab TQRect to \a rect.
-*/
-
-/*!
- \fn TQRect TQTab::rect() const
-
- Return the TQRect for the TQTab.
-*/
-
-/*!
- \fn void TQTab::setEnabled( bool enable )
-
- If \a enable is TRUE enable the TQTab, otherwise disable it.
-*/
-
-/*!
- \fn bool TQTab::isEnabled() const
-
- Returns TRUE if the TQTab is enabled; otherwise returns FALSE.
-*/
-
-/*!
- \fn void TQTab::setIdentifier( int i )
-
- Set the identifier for the TQTab to \a i. Each TQTab's identifier
- within a TQTabBar must be unique.
-*/
-
-/*!
- \fn int TQTab::identifier() const
-
- Return the TQTab's identifier.
-*/
-
-
-
-/*!
- Destroys the tab and frees up all allocated resources.
-*/
-
-TQTab::~TQTab()
-{
- delete iconset;
- tb = 0;
-}
-
-/*!
- \class TQTabBar tqtabbar.h
- \brief The TQTabBar class provides a tab bar, e.g. for use in tabbed dialogs.
-
- \ingroup advanced
-
- TQTabBar is straightforward to use; it draws the tabs using one of
- the predefined \link TQTabBar::Shape tqshapes\endlink, and emits a
- signal when a tab is selected. It can be subclassed to tailor the
- look and feel. TQt also provides a ready-made \l{TQTabWidget} and a
- \l{TQTabDialog}.
-
- The choice of tab tqshape is a matter of taste, although tab dialogs
- (for preferences and similar) invariably use \c RoundedAbove;
- nobody uses \c TriangularAbove. Tab controls in windows other than
- dialogs almost always use either \c RoundedBelow or \c
- TriangularBelow. Many spreadsheets and other tab controls in which
- all the pages are essentially similar use \c TriangularBelow,
- whereas \c RoundedBelow is used mostly when the pages are
- different (e.g. a multi-page tool palette).
-
- The most important part of TQTabBar's API is the selected() signal.
- This is emitted whenever the selected page changes (even at
- startup, when the selected page changes from 'none'). There is
- also a slot, setCurrentTab(), which can be used to select a page
- programmatically.
-
- TQTabBar creates automatic accelerator keys in the manner of
- TQButton; e.g. if a tab's label is "\&Graphics", Alt+G becomes an
- accelerator key for switching to that tab.
-
- The following virtual functions may need to be reimplemented:
- \list
- \i paint() paints a single tab. paintEvent() calls paint() for
- each tab so that any overlap will look right.
- \i addTab() creates a new tab and adds it to the bar.
- \i selectTab() decides which tab, if any, the user selects with the mouse.
- \endlist
-
- The index of the current tab is returned by currentTab(). The tab
- with a particular index is returned by tabAt(), the tab with a
- particular id is returned by tab(). The index of a tab is returned
- by indexOf(). The current tab can be set by index or tab pointer
- using one of the setCurrentTab() functions.
-
- <img src=qtabbar-m.png> <img src=qtabbar-w.png>
-*/
-
-/*!
- \enum TQTabBar::Shape
-
- This enum type lists the built-in tqshapes supported by TQTabBar:
-
- \value RoundedAbove the normal rounded look above the pages
-
- \value RoundedBelow the normal rounded look below the pages
-
- \value TriangularAbove triangular tabs above the pages (very
- unusual; included for completeness)
-
- \value TriangularBelow triangular tabs similar to those used in
- the Excel spreadsheet, for example
-*/
-
-class TQTabBarToolTip;
-
-struct TQTabPrivate {
- int id;
- int focus;
-#ifndef TQT_NO_ACCEL
- TQAccel * a;
-#endif
- TQTab *pressed;
- TQTabBar::Shape s;
- TQToolButton* rightB;
- TQToolButton* leftB;
- int btnWidth;
- bool scrolls;
- TQTabBarToolTip * toolTips;
-};
-
-#ifndef TQT_NO_TOOLTIP
-/* \internal
-*/
-class TQTabBarToolTip : public TQToolTip
-{
-public:
- TQTabBarToolTip( TQWidget * parent )
- : TQToolTip( parent ) {}
- virtual ~TQTabBarToolTip() {}
-
- void add( TQTab * tab, const TQString & tip )
- {
- tabTips.replace( tab, tip );
- }
-
- void remove( TQTab * tab )
- {
- tabTips.erase( tab );
- }
-
- TQString tipForTab( TQTab * tab ) const
- {
- TQMapConstIterator<TQTab *, TQString> it;
- it = tabTips.find( tab );
- if ( it != tabTips.end() )
- return it.data();
- else
- return TQString();
- }
-
-protected:
- void maybeTip( const TQPoint & p )
- {
- TQTabBar * tb = (TQTabBar *) parentWidget();
- if ( !tb )
- return;
-
- // check if the scroll buttons in the tab bar are visible -
- // don't display any tips if the pointer is over one of them
- TQRect rectL, rectR;
- rectL.setRect( tb->d->leftB->x(), tb->d->leftB->y(),
- tb->d->leftB->width(), tb->d->leftB->height() );
- rectR.setRect( tb->d->rightB->x(), tb->d->rightB->y(),
- tb->d->rightB->width(), tb->d->rightB->height() );
- if ( tb->d->scrolls && (rectL.contains( p ) || rectR.contains( p )) )
- return;
-
-#ifndef TQT_NO_TOOLTIP
- // find and show the tool tip for the tab under the point p
- TQMapIterator<TQTab *, TQString> it;
- for ( it = tabTips.begin(); it != tabTips.end(); ++it ) {
- if ( it.key()->rect().contains( p ) )
- tip( it.key()->rect(), it.data() );
- }
-#endif
- }
-
-private:
- TQMap<TQTab *, TQString> tabTips;
-};
-#endif
-
-/*!
- \fn void TQTabBar::selected( int id )
-
- TQTabBar emits this signal whenever any tab is selected, whether by
- the program or by the user. The argument \a id is the id of the
- tab as returned by addTab().
-
- show() is guaranteed to emit this signal; you can display your
- page in a slot connected to this signal.
-*/
-
-/*!
- \fn void TQTabBar::layoutChanged()
-
- TQTabBar emits the signal whenever the tqlayout of the tab bar has
- been recalculated, for example when the contents of a tab change.
-*/
-
-/*!
- Constructs a new, empty tab bar; the \a parent and \a name
- arguments are passed on to the TQWidget constructor.
-*/
-
-TQTabBar::TQTabBar( TQWidget * parent, const char *name )
- : TQWidget( parent, name, (WFlags)(TQt::WNoAutoErase | TQt::WNoMousePropagation) )
-{
- d = new TQTabPrivate;
- d->pressed = 0;
- d->id = 0;
- d->focus = 0;
- d->toolTips = 0;
-#ifndef TQT_NO_ACCEL
- d->a = new TQAccel( this, "tab accelerators" );
- connect( d->a, TQT_SIGNAL(activated(int)), this, TQT_SLOT(setCurrentTab(int)) );
- connect( d->a, TQT_SIGNAL(activatedAmbiguously(int)), this, TQT_SLOT(setCurrentTab(int)) );
-#endif
- d->s = RoundedAbove;
- d->scrolls = FALSE;
- d->leftB = new TQToolButton( TQt::LeftArrow, this, "qt_left_btn" );
- connect( d->leftB, TQT_SIGNAL( clicked() ), this, TQT_SLOT( scrollTabs() ) );
- d->leftB->hide();
- d->rightB = new TQToolButton( TQt::RightArrow, this, "qt_right_btn" );
- connect( d->rightB, TQT_SIGNAL( clicked() ), this, TQT_SLOT( scrollTabs() ) );
- d->rightB->hide();
- d->btnWidth = tqstyle().tqpixelMetric(TQStyle::PM_TabBarScrollButtonWidth, this);
- l = new TQPtrList<TQTab>;
- lstatic = new TQPtrList<TQTab>;
- lstatic->setAutoDelete( TRUE );
- setFocusPolicy( Qt::TabFocus );
- tqsetSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Fixed ) );
-}
-
-
-/*!
- Destroys the tab control, freeing memory used.
-*/
-
-TQTabBar::~TQTabBar()
-{
-#ifndef TQT_NO_TOOLTIP
- if ( d->toolTips )
- delete d->toolTips;
-#endif
- delete d;
- d = 0;
- delete l;
- l = 0;
- delete lstatic;
- lstatic = 0;
-}
-
-
-/*!
- Adds the tab, \a newTab, to the tab control.
-
- Sets \a newTab's id to a new id and places the tab just to the
- right of the existing tabs. If the tab's label contains an
- ampersand, the letter following the ampersand is used as an
- accelerator for the tab, e.g. if the label is "Bro\&wse" then
- Alt+W becomes an accelerator which will move the focus to this
- tab. Returns the id.
-
- \sa insertTab()
-*/
-
-int TQTabBar::addTab( TQTab * newTab )
-{
- return insertTab( newTab );
-}
-
-
-/*!
- Inserts the tab, \a newTab, into the tab control.
-
- If \a index is not specified, the tab is simply appended.
- Otherwise it's inserted at the specified position.
-
- Sets \a newTab's id to a new id. If the tab's label contains an
- ampersand, the letter following the ampersand is used as an
- accelerator for the tab, e.g. if the label is "Bro\&wse" then
- Alt+W becomes an accelerator which will move the focus to this
- tab. Returns the id.
-
- \sa addTab()
-*/
-
-int TQTabBar::insertTab( TQTab * newTab, int index )
-{
- newTab->id = d->id++;
- if ( !tab( d->focus ) )
- d->focus = newTab->id;
-
- newTab->setTabBar( this );
- l->insert( 0, newTab );
- if ( index < 0 || index > int(lstatic->count()) )
- lstatic->append( newTab );
- else
- lstatic->insert( index, newTab );
-
- layoutTabs();
- updateArrowButtons();
- makeVisible( tab( currentTab() ) );
-
-#ifndef TQT_NO_ACCEL
- int p = TQAccel::shortcutKey( newTab->label );
- if ( p )
- d->a->insertItem( p, newTab->id );
-#endif
-
- return newTab->id;
-}
-
-
-/*!
- Removes tab \a t from the tab control, and deletes the tab.
-*/
-void TQTabBar::removeTab( TQTab * t )
-{
- //#### accelerator labels??
-#ifndef TQT_NO_TOOLTIP
- if ( d->toolTips )
- d->toolTips->remove( t );
-#endif
-#ifndef TQT_NO_ACCEL
- if ( d->a )
- d->a->removeItem( t->id );
-#endif
- bool updateFocus = t->id == d->focus;
- // remove the TabBar Reference
- if(d->pressed == t)
- d->pressed = 0;
- t->setTabBar( 0 );
- l->remove( t );
- lstatic->remove( t );
- layoutTabs();
- updateArrowButtons();
- makeVisible( tab( currentTab() ) );
- if ( updateFocus )
- d->focus = currentTab();
- update();
-}
-
-
-/*!
- Enables tab \a id if \a enabled is TRUE or disables it if \a
- enabled is FALSE. If \a id is currently selected,
- setTabEnabled(FALSE) makes another tab selected.
-
- setTabEnabled() updates the display if this causes a change in \a
- id's status.
-
- \sa update(), isTabEnabled()
-*/
-
-void TQTabBar::setTabEnabled( int id, bool enabled )
-{
- TQTab * t;
- for( t = l->first(); t; t = l->next() ) {
- if ( t && t->id == id ) {
- if ( t->enabled != enabled ) {
- t->enabled = enabled;
-#ifndef TQT_NO_ACCEL
- d->a->setItemEnabled( t->id, enabled );
-#endif
- TQRect r( t->r );
- if ( !enabled && id == currentTab() ) {
- TQPoint p1( t->r.center() ), p2;
- int m = 2147483647;
- int distance;
- // look for the closest enabled tab - measure the
- // distance between the centers of the two tabs
- for( TQTab * n = l->first(); n; n = l->next() ) {
- if ( n->enabled ) {
- p2 = n->r.center();
- distance = (p2.x() - p1.x())*(p2.x() - p1.x()) +
- (p2.y() - p1.y())*(p2.y() - p1.y());
- if ( distance < m ) {
- t = n;
- m = distance;
- }
- }
- }
- if ( t->enabled ) {
- r = r.unite( t->r );
- l->append( l->take( l->findRef( t ) ) );
- emit selected( t->id );
- }
- }
- tqrepaint( r, FALSE );
- }
- return;
- }
- }
-}
-
-
-/*!
- Returns TRUE if the tab with id \a id exists and is enabled;
- otherwise returns FALSE.
-
- \sa setTabEnabled()
-*/
-
-bool TQTabBar::isTabEnabled( int id ) const
-{
- TQTab * t = tab( id );
- if ( t )
- return t->enabled;
- return FALSE;
-}
-
-
-
-/*!
- \reimp
-*/
-TQSize TQTabBar::tqsizeHint() const
-{
- TQSize sz(0, 0);
- if ( TQTab * t = l->first() ) {
- TQRect r( t->r );
- while ( (t = l->next()) != 0 )
- r = r.unite( t->r );
- sz = r.size();
- }
- return sz.expandedTo(TQApplication::globalStrut());
-}
-
-/*!
- \reimp
-*/
-
-TQSize TQTabBar::tqminimumSizeHint() const
-{
- if(tqstyle().tqstyleHint( TQStyle::SH_TabBar_PreferNoArrows, this ))
- return tqsizeHint();
- return TQSize( d->rightB->tqsizeHint().width() * 2 + 75, tqsizeHint().height() );
-}
-
-/*!
- Paints the tab \a t using painter \a p. If and only if \a selected
- is TRUE, \a t is drawn currently selected.
-
- This virtual function may be reimplemented to change the look of
- TQTabBar. If you decide to reimplement it, you may also need to
- reimplement tqsizeHint().
-*/
-
-void TQTabBar::paint( TQPainter * p, TQTab * t, bool selected ) const
-{
- TQStyle::SFlags flags = TQStyle::Style_Default;
-
- if (isEnabled() && t->isEnabled())
- flags |= TQStyle::Style_Enabled;
- if (tqtopLevelWidget() == tqApp->activeWindow())
- flags |= TQStyle::Style_Active;
- if ( selected )
- flags |= TQStyle::Style_Selected;
- else if(t == d->pressed)
- flags |= TQStyle::Style_Sunken;
- //selection flags
- if(t->rect().contains(mapFromGlobal(TQCursor::pos())))
- flags |= TQStyle::Style_MouseOver;
- tqstyle().tqdrawControl( TQStyle::CE_TabBarTab, p, this, t->rect(),
- tqcolorGroup(), flags, TQStyleOption(t) );
-
- TQRect r( t->r );
- p->setFont( font() );
-
- int iw = 0;
- int ih = 0;
- if ( t->iconset != 0 ) {
- iw = t->iconset->pixmap( TQIconSet::Small, TQIconSet::Normal ).width() + 4;
- ih = t->iconset->pixmap( TQIconSet::Small, TQIconSet::Normal ).height();
- }
- TQFontMetrics fm = p->fontMetrics();
- int fw = fm.width( t->label );
- fw -= t->label.contains('&') * fm.width('&');
- fw += t->label.contains("&&") * fm.width('&');
- int w = iw + fw + 4;
- int h = TQMAX(fm.height() + 4, ih );
- int offset = 3;
-#ifdef TQ_WS_MAC
- if (::tqqt_cast<TQMacStyle *>(&tqstyle()))
- offset = 0;
-#endif
- paintLabel( p, TQRect( r.left() + (r.width()-w)/2 - offset,
- r.top() + (r.height()-h)/2,
- w, h ), t, t->id == keyboardFocusTab() );
-}
-
-/*!
- Paints the label of tab \a t centered in rectangle \a br using
- painter \a p. A focus indication is drawn if \a has_focus is TRUE.
-*/
-
-void TQTabBar::paintLabel( TQPainter* p, const TQRect& br,
- TQTab* t, bool has_focus ) const
-{
- TQRect r = br;
- bool selected = currentTab() == t->id;
- if ( t->iconset) {
- // the tab has an iconset, draw it in the right mode
- TQIconSet::Mode mode = (t->enabled && isEnabled())
- ? TQIconSet::Normal : TQIconSet::Disabled;
- if ( mode == TQIconSet::Normal && has_focus )
- mode = TQIconSet::Active;
- TQPixmap pixmap = t->iconset->pixmap( TQIconSet::Small, mode );
- int pixw = pixmap.width();
- int pixh = pixmap.height();
- r.setLeft( r.left() + pixw + 4 );
- r.setRight( r.right() + 2 );
-
- int xoff = 0, yoff = 0;
- if(!selected) {
- xoff = tqstyle().tqpixelMetric(TQStyle::PM_TabBarTabShiftHorizontal, this);
- yoff = tqstyle().tqpixelMetric(TQStyle::PM_TabBarTabShiftVertical, this);
- }
- p->drawPixmap( br.left() + 2 + xoff, br.center().y()-pixh/2 + yoff, pixmap );
- }
-
- TQStyle::SFlags flags = TQStyle::Style_Default;
-
- if (isEnabled() && t->isEnabled())
- flags |= TQStyle::Style_Enabled;
- if (has_focus)
- flags |= TQStyle::Style_HasFocus;
- if ( selected )
- flags |= TQStyle::Style_Selected;
- else if(t == d->pressed)
- flags |= TQStyle::Style_Sunken;
- if(t->rect().contains(mapFromGlobal(TQCursor::pos())))
- flags |= TQStyle::Style_MouseOver;
- tqstyle().tqdrawControl( TQStyle::CE_TabBarLabel, p, this, r,
- t->isEnabled() ? tqcolorGroup(): tqpalette().disabled(),
- flags, TQStyleOption(t) );
-}
-
-
-/*!
- Repaints the tab row. All the painting is done by paint();
- paintEvent() only decides which tabs need painting and in what
- order. The event is passed in \a e.
-
- \sa paint()
-*/
-
-void TQTabBar::paintEvent( TQPaintEvent * e )
-{
- if ( e->rect().isNull() )
- return;
-
- TQSharedDoubleBuffer buffer( this, e->rect() );
-
- TQTab * t;
- t = l->first();
- do {
- TQTab * n = l->next();
- if ( t && t->r.intersects( e->rect() ) )
- paint( buffer.painter(), t, n == 0 );
- t = n;
- } while ( t != 0 );
-
- if ( d->scrolls && lstatic->first()->r.left() < 0 ) {
- TQPointArray a;
- int h = height();
- if ( d->s == RoundedAbove ) {
- buffer.painter()->fillRect( 0, 3, 4, h-5,
- tqcolorGroup().brush( TQColorGroup::Background ) );
- a.setPoints( 5, 0,2, 3,h/4, 0,h/2, 3,3*h/4, 0,h );
- } else if ( d->s == RoundedBelow ) {
- buffer.painter()->fillRect( 0, 2, 4, h-5,
- tqcolorGroup().brush( TQColorGroup::Background ) );
- a.setPoints( 5, 0,0, 3,h/4, 0,h/2, 3,3*h/4, 0,h-3 );
- }
-
- if ( !a.isEmpty() ) {
- buffer.painter()->setPen( tqcolorGroup().light() );
- buffer.painter()->drawPolyline( a );
- a.translate( 1, 0 );
- buffer.painter()->setPen( tqcolorGroup().midlight() );
- buffer.painter()->drawPolyline( a );
- }
- }
-}
-
-
-/*!
- This virtual function is called by the mouse event handlers to
- determine which tab is pressed. The default implementation returns
- a pointer to the tab whose bounding rectangle contains \a p, if
- exactly one tab's bounding rectangle contains \a p. Otherwise it
- returns 0.
-
- \sa mousePressEvent() mouseReleaseEvent()
-*/
-
-TQTab * TQTabBar::selectTab( const TQPoint & p ) const
-{
- TQTab * selected = 0;
- bool moreThanOne = FALSE;
-
- TQPtrListIterator<TQTab> i( *l );
- while( i.current() ) {
- TQTab * t = i.current();
- ++i;
-
- if ( t && t->r.contains( p ) ) {
- if ( selected )
- moreThanOne = TRUE;
- else
- selected = t;
- }
- }
-
- return moreThanOne ? 0 : selected;
-}
-
-
-/*!
- \reimp
-*/
-void TQTabBar::mousePressEvent( TQMouseEvent * e )
-{
- if ( e->button() != Qt::LeftButton ) {
- e->ignore();
- return;
- }
- TQTab *t = selectTab( e->pos() );
- if ( t && t->enabled ) {
- d->pressed = t;
- if(e->type() == tqstyle().tqstyleHint( TQStyle::SH_TabBar_SelectMouseType, this ))
- setCurrentTab( t );
- else
- tqrepaint(t->rect(), FALSE);
- }
-}
-
-
-/*!
- \reimp
-*/
-
-void TQTabBar::mouseMoveEvent ( TQMouseEvent *e )
-{
- if ( e->state() != Qt::LeftButton ) {
- e->ignore();
- return;
- }
- if(tqstyle().tqstyleHint( TQStyle::SH_TabBar_SelectMouseType, this ) == TQEvent::MouseButtonRelease) {
- TQTab *t = selectTab( e->pos() );
- if(t != d->pressed) {
- if(d->pressed)
- tqrepaint(d->pressed->rect(), FALSE);
- if((d->pressed = t))
- tqrepaint(t->rect(), FALSE);
- }
- }
-}
-
-/*!
- \reimp
-*/
-
-void TQTabBar::mouseReleaseEvent( TQMouseEvent *e )
-{
- if ( e->button() != Qt::LeftButton )
- e->ignore();
- if(d->pressed) {
- TQTab *t = selectTab( e->pos() ) == d->pressed ? d->pressed : 0;
- d->pressed = 0;
- if(t && t->enabled && e->type() == tqstyle().tqstyleHint( TQStyle::SH_TabBar_SelectMouseType, this ))
- setCurrentTab( t );
- }
-}
-
-
-/*!
- \reimp
-*/
-void TQTabBar::show()
-{
- // ensures that one tab is selected.
- TQTab * t = l->last();
- TQWidget::show();
-
- if ( t )
- emit selected( t->id );
-}
-
-/*!
- \property TQTabBar::currentTab
- \brief the id of the tab bar's visible tab
-
- If no tab page is currently visible, the property's value is -1.
- Even if the property's value is not -1, you cannot assume that the
- user can see the relevant page, or that the tab is enabled. When
- you need to display something the value of this property
- represents the best page to display.
-
- When this property is set to \e id, it will raise the tab with the
- id \e id and emit the selected() signal.
-
- \sa selected() isTabEnabled()
-*/
-
-int TQTabBar::currentTab() const
-{
- const TQTab * t = l->getLast();
-
- return t ? t->id : -1;
-}
-
-void TQTabBar::setCurrentTab( int id )
-{
- setCurrentTab( tab( id ) );
-}
-
-
-/*!
- \overload
-
- Raises \a tab and emits the selected() signal unless the tab was
- already current.
-
- \sa currentTab() selected()
-*/
-
-void TQTabBar::setCurrentTab( TQTab * tab )
-{
- if ( tab && l ) {
- if ( l->last() == tab )
- return;
-
- TQRect r = l->last()->r;
- if ( l->findRef( tab ) >= 0 )
- l->append( l->take() );
-
- d->focus = tab->id;
-
- setMicroFocusHint( tab->rect().x(), tab->rect().y(), tab->rect().width(), tab->rect().height(), FALSE );
-
- if ( tab->r.intersects( r ) ) {
- tqrepaint( r.unite( tab->r ), FALSE );
- } else {
-#ifdef TQ_WS_MACX
- update();
-#else
- tqrepaint( r, FALSE );
- tqrepaint( tab->r, FALSE );
-#endif
- }
- makeVisible( tab );
- emit selected( tab->id );
-
-#ifdef TQT_ACCESSIBILITY_SUPPORT
- TQAccessible::updateAccessibility( this, indexOf(tab->id)+1, TQAccessible::Focus );
-#endif
- }
-}
-
-/*!
- \property TQTabBar::keyboardFocusTab
- \brief the id of the tab that has the keyboard focus
-
- This property contains the id of the tab that has the keyboard
- focus or -1 if the tab bar does not have the keyboard focus.
-*/
-
-int TQTabBar::keyboardFocusTab() const
-{
- return hasFocus() ? d->focus : -1;
-}
-
-
-/*!
- \reimp
-*/
-void TQTabBar::keyPressEvent( TQKeyEvent * e )
-{
- // The right and left arrow keys move a selector, the spacebar
- // makes the tab with the selector active. All other keys are
- // ignored.
-
- int old = d->focus;
-
- bool reverse = TQApplication::reverseLayout();
- if ( ( !reverse && e->key() == Qt::Key_Left ) || ( reverse && e->key() == Qt::Key_Right ) ) {
- // left - skip past any disabled ones
- if ( d->focus >= 0 ) {
- TQTab * t = lstatic->last();
- while ( t && t->id != d->focus )
- t = lstatic->prev();
- do {
- t = lstatic->prev();
- } while ( t && !t->enabled);
- if (t)
- d->focus = t->id;
- }
- if ( d->focus < 0 )
- d->focus = old;
- } else if ( ( !reverse && e->key() == Qt::Key_Right ) || ( reverse && e->key() == Qt::Key_Left ) ) {
- TQTab * t = lstatic->first();
- while ( t && t->id != d->focus )
- t = lstatic->next();
- do {
- t = lstatic->next();
- } while ( t && !t->enabled);
-
- if (t)
- d->focus = t->id;
- if ( d->focus >= d->id )
- d->focus = old;
- } else {
- // other keys - ignore
- e->ignore();
- return;
- }
-
- // if the focus moved, tqrepaint and signal
- if ( old != d->focus ) {
- setCurrentTab( d->focus );
- }
-}
-
-
-/*!
- Returns the tab with id \a id or 0 if there is no such tab.
-
- \sa count()
-*/
-
-TQTab * TQTabBar::tab( int id ) const
-{
- TQTab * t;
- for( t = l->first(); t; t = l->next() )
- if ( t && t->id == id )
- return t;
- return 0;
-}
-
-
-/*!
- Returns the tab at position \a index.
-
- \sa indexOf()
-*/
-
-TQTab * TQTabBar::tabAt( int index ) const
-{
- TQTab * t;
- t = lstatic->at( index );
- return t;
-}
-
-
-/*!
- Returns the position index of the tab with id \a id or -1 if no
- tab has this \a id.
-
- \sa tabAt()
-*/
-int TQTabBar::indexOf( int id ) const
-{
- TQTab * t;
- int idx = 0;
- for( t = lstatic->first(); t; t = lstatic->next() ) {
- if ( t && t->id == id )
- return idx;
- idx++;
- }
- return -1;
-}
-
-
-/*!
- \property TQTabBar::count
- \brief the number of tabs in the tab bar
-
- \sa tab()
-*/
-int TQTabBar::count() const
-{
- return l->count();
-}
-
-
-/*!
- The list of TQTab objects in the tab bar.
-
- This list is unlikely to be in the order that the TQTab elements
- appear visually. One way of iterating over the tabs is like this:
- \code
- for ( uint i = 0; i < myTabBar->count(); ++i ) {
- nextTab = myTabBar->tabAt( i );
- // do something with nextTab
- }
- \endcode
-*/
-TQPtrList<TQTab> * TQTabBar::tabList()
-{
- return l;
-}
-
-
-/*!
- \property TQTabBar::tqshape
- \brief the tqshape of the tabs in the tab bar
-
- The value of this property is one of the following: \c
- RoundedAbove (default), \c RoundedBelow, \c TriangularAbove or \c
- TriangularBelow.
-
- \sa Shape
-*/
-TQTabBar::Shape TQTabBar::tqshape() const
-{
- return d ? d->s : RoundedAbove;
-}
-
-void TQTabBar::setShape( Shape s )
-{
- if ( !d || d->s == s )
- return;
- //######### must recalculate heights
- d->s = s;
- update();
-}
-
-/*!
- Lays out all existing tabs according to their label and their
- iconset.
- */
-void TQTabBar::layoutTabs()
-{
- if ( lstatic->isEmpty() )
- return;
-
- TQSize oldSh(0, 0);
- if ( TQTab * t = l->first() ) {
- TQRect r( t->r );
- while ( (t = l->next()) != 0 )
- r = r.unite( t->r );
- oldSh = r.size();
- }
-
- d->btnWidth = tqstyle().tqpixelMetric(TQStyle::PM_TabBarScrollButtonWidth, this);
- int hframe, vframe, overlap;
- hframe = tqstyle().tqpixelMetric( TQStyle::PM_TabBarTabHSpace, this );
- vframe = tqstyle().tqpixelMetric( TQStyle::PM_TabBarTabVSpace, this );
- overlap = tqstyle().tqpixelMetric( TQStyle::PM_TabBarTabOverlap, this );
-
- TQFontMetrics fm = fontMetrics();
- TQRect r;
- TQTab *t;
- bool reverse = TQApplication::reverseLayout();
- if ( reverse )
- t = lstatic->last();
- else
- t = lstatic->first();
- int x = 0;
- int offset = (t && d->scrolls) ? t->r.x() : 0;
- while ( t ) {
- int lw = fm.width( t->label );
- lw -= t->label.contains('&') * fm.width('&');
- lw += t->label.contains("&&") * fm.width('&');
- int iw = 0;
- int ih = 0;
- if ( t->iconset != 0 ) {
- iw = t->iconset->pixmap( TQIconSet::Small, TQIconSet::Normal ).width() + 4;
- ih = t->iconset->pixmap( TQIconSet::Small, TQIconSet::Normal ).height();
- }
- int h = TQMAX( fm.height(), ih );
- h = TQMAX( h, TQApplication::globalStrut().height() );
-
- h += vframe;
- t->r = TQRect(TQPoint(x, 0), tqstyle().tqsizeFromContents(TQStyle::CT_TabBarTab, this,
- TQSize( TQMAX( lw + hframe + iw, TQApplication::globalStrut().width() ), h ),
- TQStyleOption(t) ));
- x += t->r.width() - overlap;
- r = r.unite( t->r );
- if ( reverse )
- t = lstatic->prev();
- else
- t = lstatic->next();
- }
- x += overlap;
- int w = (d->scrolls) ? d->leftB->x() : width();
- if (x + offset < w)
- offset = w - x;
- if (offset > 0)
- offset = 0;
-
- for ( t = lstatic->first(); t; t = lstatic->next() ) {
- t->r.moveBy( offset, 0 );
- t->r.setHeight( r.height() );
- }
-
- if ( tqsizeHint() != oldSh )
- updateGeometry();
-
- emit layoutChanged();
-}
-
-/*!
- \reimp
-*/
-
-bool TQTabBar::event( TQEvent *e )
-{
- if ( e->type() == TQEvent::LanguageChange ) {
- layoutTabs();
- updateArrowButtons();
- makeVisible( tab( currentTab() ));
- }
-
- return TQWidget::event( e );
-}
-
-/*!
- \reimp
-*/
-
-void TQTabBar::styleChange( TQStyle& old )
-{
- layoutTabs();
- updateArrowButtons();
- TQWidget::styleChange( old );
-}
-
-/*!
- \reimp
-*/
-void TQTabBar::focusInEvent( TQFocusEvent * )
-{
- TQTab *t = tab( d->focus );
- if ( t )
- tqrepaint( t->r, FALSE );
-}
-
-/*!
- \reimp
-*/
-void TQTabBar::focusOutEvent( TQFocusEvent * )
-{
- TQTab *t = tab( d->focus );
- if ( t )
- tqrepaint( t->r, FALSE );
-}
-
-/*!
- \reimp
-*/
-void TQTabBar::resizeEvent( TQResizeEvent * )
-{
- const int arrowWidth = TQMAX( d->btnWidth, TQApplication::globalStrut().width() );;
- d->rightB->setGeometry( width() - arrowWidth, 0, arrowWidth, height() );
- d->leftB->setGeometry( width() - 2*arrowWidth, 0, arrowWidth, height() );
- layoutTabs();
- updateArrowButtons();
- makeVisible( tab( currentTab() ));
-}
-
-void TQTabBar::scrollTabs()
-{
- TQTab* left = 0;
- TQTab* right = 0;
- for ( TQTab* t = lstatic->first(); t; t = lstatic->next() ) {
- if ( t->r.left() < 0 && t->r.right() > 0 )
- left = t;
- if ( t->r.left() < d->leftB->x()+2 )
- right = t;
- }
-
- if ( sender() == d->leftB )
- makeVisible( left );
- else if ( sender() == d->rightB )
- makeVisible( right );
-}
-
-void TQTabBar::makeVisible( TQTab* tab )
-{
- bool tooFarLeft = ( tab && tab->r.left() < 0 );
- bool tooFarRight = ( tab && tab->r.right() >= d->leftB->x() );
-
- if ( !d->scrolls || ( !tooFarLeft && ! tooFarRight ) )
- return;
-
- bool bs = tqsignalsBlocked();
- blockSignals(TRUE);
- layoutTabs();
- blockSignals(bs);
-
- int offset = 0;
-
- if ( tooFarLeft ) {
- offset = tab->r.left();
- if (tab != lstatic->first())
- offset -= 8;
- } else if ( tooFarRight ) {
- offset = tab->r.right() - d->leftB->x() + 1;
- }
-
- for ( TQTab* t = lstatic->first(); t; t = lstatic->next() )
- t->r.moveBy( -offset, 0 );
-
- d->leftB->setEnabled( lstatic->first()->r.left() < 0);
- d->rightB->setEnabled( lstatic->last()->r.right() >= d->leftB->x() );
-
- // Make sure disabled buttons pop up again
- if ( !d->leftB->isEnabled() && d->leftB->isDown() )
- d->leftB->setDown( FALSE );
- if ( !d->rightB->isEnabled() && d->rightB->isDown() )
- d->rightB->setDown( FALSE );
-
- update();
- emit layoutChanged();
-}
-
-void TQTabBar::updateArrowButtons()
-{
- if (lstatic->isEmpty()) {
- d->scrolls = FALSE;
- } else {
- d->scrolls = (lstatic->last()->r.right() - lstatic->first()->r.left() > width());
- }
- if ( d->scrolls ) {
- const int arrowWidth = TQMAX( d->btnWidth, TQApplication::globalStrut().width() );
- if ( TQApplication::reverseLayout() ) {
- d->rightB->setGeometry( arrowWidth, 0, arrowWidth, height() );
- d->leftB->setGeometry( 0, 0, arrowWidth, height() );
- } else {
- d->rightB->setGeometry( width() - arrowWidth, 0, arrowWidth, height() );
- d->leftB->setGeometry( width() - 2*arrowWidth, 0, arrowWidth, height() );
- }
-
- d->leftB->setEnabled( lstatic->first()->r.left() < 0);
- d->rightB->setEnabled( lstatic->last()->r.right() >= d->leftB->x() );
- d->leftB->show();
- d->rightB->show();
- } else {
- d->leftB->hide();
- d->rightB->hide();
- layoutTabs();
- }
-}
-
-/*!
- Removes the tool tip for the tab at index position \a index.
-*/
-void TQTabBar::removeToolTip( int index )
-{
-#ifndef TQT_NO_TOOLTIP
- TQTab * tab = tabAt( index );
- if ( !tab || !d->toolTips )
- return;
- d->toolTips->remove( tab );
-#endif
-}
-
-/*!
- Sets the tool tip for the tab at index position \a index to \a
- tip.
-*/
-void TQTabBar::setToolTip( int index, const TQString & tip )
-{
-#ifndef TQT_NO_TOOLTIP
- TQTab * tab = tabAt( index );
- if ( !tab )
- return;
- if ( d->toolTips == 0 )
- d->toolTips = new TQTabBarToolTip( this );
- d->toolTips->add( tab, tip );
-#endif
-}
-
-/*!
- Returns the tool tip for the tab at index position \a index.
-*/
-TQString TQTabBar::toolTip( int index ) const
-{
-#ifndef TQT_NO_TOOLTIP
- if ( d->toolTips )
- return d->toolTips->tipForTab( tabAt( index ) );
- else
-#endif
- return TQString();
-}
-
-/*!
- Sets the text of the tab to \a text.
-*/
-void TQTab::setText( const TQString& text )
-{
- label = text;
- if ( tb ) {
-#ifndef TQT_NO_ACCEL
- tb->d->a->removeItem( id );
- int p = TQAccel::shortcutKey( text );
- if ( p )
- tb->d->a->insertItem( p, id );
-#endif
- tb->layoutTabs();
- tb->tqrepaint(FALSE);
-
-#if defined(TQT_ACCESSIBILITY_SUPPORT)
- TQAccessible::updateAccessibility( tb, tb->indexOf(id)+1, TQAccessible::NameChanged );
-#endif
- }
-}
-
-/*!
- Sets the tab's iconset to \a icon
-*/
-void TQTab::setIconSet( const TQIconSet &icon )
-{
- iconset = new TQIconSet( icon );
-}
-
-// this allows us to handle accelerators that are in a TQTabBar.
-void TQTab::setTabBar( TQTabBar *newTb )
-{
- tb = newTb;
-}
-
-/*!
- \internal
-*/
-void TQTabBar::fontChange( const TQFont & oldFont )
-{
- layoutTabs();
- TQWidget::fontChange( oldFont );
-}
-
-#endif