kdeui Library API Documentation

ktabwidget.cpp

00001 /* This file is part of the KDE libraries
00002     Copyright (C) 2003 Stephan Binner <binner@kde.org>
00003     Copyright (C) 2003 Zack Rusin <zack@kde.org>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, USA.
00019 */
00020 
00021 #include <kiconloader.h>
00022 
00023 #include "ktabwidget.h"
00024 #include "ktabbar.h"
00025 
00026 KTabWidget::KTabWidget( QWidget *parent, const char *name, WFlags f )
00027     : QTabWidget( parent, name, f )
00028 {
00029     setTabBar( new KTabBar(this, "tabbar") );
00030     setAcceptDrops( true );
00031 
00032     connect(tabBar(), SIGNAL(contextMenu( int, const QPoint & )), SLOT(contextMenu( int, const QPoint & )));
00033     connect(tabBar(), SIGNAL(mouseDoubleClick( int )), SLOT(mouseDoubleClick( int )));
00034     connect(tabBar(), SIGNAL(mouseMiddleClick( int )), SLOT(mouseMiddleClick( int )));
00035     connect(tabBar(), SIGNAL(initiateDrag( int )), SLOT(initiateDrag( int )));
00036     connect(tabBar(), SIGNAL(testCanDecode(const QDragMoveEvent *, bool & )), SIGNAL(testCanDecode(const QDragMoveEvent *, bool & )));
00037     connect(tabBar(), SIGNAL(receivedDropEvent( int, QDropEvent * )), SLOT(receivedDropEvent( int, QDropEvent * )));
00038     connect(tabBar(), SIGNAL(moveTab( int, int )), SLOT(moveTab( int, int )));
00039     connect(tabBar(), SIGNAL(closeRequest( int )), SLOT(closeRequest( int )));
00040 #ifndef QT_NO_WHEELEVENT
00041     connect(tabBar(), SIGNAL(wheelDelta( int )), SLOT(wheelDelta( int )));
00042 #endif
00043 }
00044 
00045 KTabWidget::~KTabWidget()
00046 {
00047     //for the futur.
00048     //delete d;
00049 }
00050 
00051 void KTabWidget::setTabColor( QWidget *w, const QColor& color )
00052 {
00053     QTab *t = tabBar()->tabAt( indexOf( w ) );
00054     if (t) {
00055         static_cast<KTabBar*>(tabBar())->setTabColor( t->identifier(), color );
00056     }
00057 }
00058 
00059 QColor KTabWidget::tabColor( QWidget *w ) const
00060 {
00061     QTab *t = tabBar()->tabAt( indexOf( w ) );
00062     if (t) {
00063         return static_cast<KTabBar*>(tabBar())->tabColor( t->identifier() );
00064     } else {
00065         return QColor();
00066     }
00067 }
00068 
00069 void KTabWidget::setTabReorderingEnabled( bool on)
00070 {
00071     static_cast<KTabBar*>(tabBar())->setTabReorderingEnabled( on );
00072 }
00073 
00074 bool KTabWidget::isTabReorderingEnabled() const
00075 {
00076     return static_cast<KTabBar*>(tabBar())->isTabReorderingEnabled();
00077 }
00078 
00079 void KTabWidget::setTabCloseActivatePrevious( bool previous)
00080 {
00081     static_cast<KTabBar*>(tabBar())->setTabCloseActivatePrevious( previous );
00082 }
00083 
00084 bool KTabWidget::tabCloseActivatePrevious() const
00085 {
00086     return static_cast<KTabBar*>(tabBar())->tabCloseActivatePrevious();
00087 }
00088 
00089 void KTabWidget::dragMoveEvent( QDragMoveEvent *e )
00090 {
00091     if ( isEmptyTabbarSpace( e->pos() ) ) {
00092         bool accept = false;
00093         // The receivers of the testCanDecode() signal has to adjust
00094         // 'accept' accordingly.
00095         emit testCanDecode( e, accept);
00096         e->accept( accept );
00097         return;
00098     }
00099     e->accept( false );
00100     QTabWidget::dragMoveEvent( e );
00101 }
00102 
00103 void KTabWidget::dropEvent( QDropEvent *e )
00104 {
00105     if ( isEmptyTabbarSpace( e->pos() ) ) {
00106         emit ( receivedDropEvent( e ) );
00107         return;
00108     }
00109     QTabWidget::dropEvent( e );
00110 }
00111 
00112 #ifndef QT_NO_WHEELEVENT
00113 void KTabWidget::wheelEvent( QWheelEvent *e )
00114 {
00115     if ( e->orientation() == Horizontal )
00116         return;
00117 
00118     if ( isEmptyTabbarSpace( e->pos() ) )
00119         wheelDelta( e->delta() );
00120     else
00121         e->ignore();
00122 }
00123 
00124 void KTabWidget::wheelDelta( int delta )
00125 {
00126    if ( count() < 2 )
00127        return;
00128 
00129    int page = currentPageIndex();
00130    if ( delta < 0 )
00131        page = (page + 1) % count();
00132    else {
00133        page--;
00134        if ( page < 0 )
00135            page = count() - 1;
00136    }
00137    setCurrentPage( page );
00138 }
00139 #endif
00140 
00141 void KTabWidget::mouseDoubleClickEvent( QMouseEvent *e )
00142 {
00143     if ( isEmptyTabbarSpace( e->pos() ) ) {
00144         emit( mouseDoubleClick() );
00145         return;
00146     }
00147     QTabWidget::mouseDoubleClickEvent( e );
00148 }
00149 
00150 void KTabWidget::mousePressEvent( QMouseEvent *e )
00151 {
00152     if ( e->button() == RightButton ) {
00153         if ( isEmptyTabbarSpace( e->pos() ) ) {
00154             emit( contextMenu( mapToGlobal( e->pos() ) ) );
00155             return;
00156         }
00157     } else if ( e->button() == MidButton ) {
00158         if ( isEmptyTabbarSpace( e->pos() ) ) {
00159             emit( mouseMiddleClick() );
00160             return;
00161         }
00162     }
00163     QTabWidget::mousePressEvent( e );
00164 }
00165 
00166 void KTabWidget::receivedDropEvent( int index, QDropEvent *e )
00167 {
00168     emit( receivedDropEvent( page( index ), e ) );
00169 }
00170 
00171 void KTabWidget::initiateDrag( int index )
00172 {
00173     emit( initiateDrag( page( index ) ) );
00174 }
00175 
00176 void KTabWidget::contextMenu( int index, const QPoint &p )
00177 {
00178     emit( contextMenu( page( index ), p ) );
00179 }
00180 
00181 void KTabWidget::mouseDoubleClick( int index )
00182 {
00183     emit( mouseDoubleClick( page( index ) ) );
00184 }
00185 
00186 void KTabWidget::mouseMiddleClick( int index )
00187 {
00188     emit( mouseMiddleClick( page( index ) ) );
00189 }
00190 
00191 void KTabWidget::moveTab( int from, int to )
00192 {
00193     QString tablabel = label( from );
00194     QWidget *w = page( from );
00195     QColor color = tabColor( w );
00196     QIconSet tabiconset = tabIconSet( w );
00197     QString tabtooltip = tabToolTip( w );
00198     bool current = ( w == currentPage() );
00199     bool enabled = isTabEnabled( w );
00200     blockSignals(true);
00201     removePage( w );
00202 
00203     // Work-around kmdi brain damage which calls showPage() in insertTab()
00204     QTab * t = new QTab();
00205     t->setText(tablabel);
00206     QTabWidget::insertTab( w, t, to );
00207     
00208     w = page( to );
00209     changeTab( w, tabiconset, tablabel );
00210     setTabToolTip( w, tabtooltip );
00211     setTabColor( w, color );
00212     if ( current )
00213         showPage( w );
00214     setTabEnabled( w, enabled );
00215     blockSignals(false);
00216 
00217     emit ( movedTab( from, to ) );
00218 }
00219 
00220 bool KTabWidget::isEmptyTabbarSpace( const QPoint &p ) const
00221 {
00222     QPoint point( p );
00223     QSize size( tabBar()->sizeHint() );
00224     if ( ( tabPosition()==Top && point.y()< size.height() ) || ( tabPosition()==Bottom && point.y()>(height()-size.height() ) ) ) {
00225         // QTabWidget::cornerWidget isn't const even it doesn't write any data ;(
00226         KTabWidget *that = const_cast<KTabWidget*>(this);
00227         QWidget *rightcorner = that->cornerWidget( TopRight );
00228         if ( rightcorner ) {
00229             if ( point.x()>=width()-rightcorner->width() )
00230                 return false;
00231         }
00232         QWidget *leftcorner = that->cornerWidget( TopLeft );
00233         if ( leftcorner ) {
00234             if ( point.x()<=leftcorner->width() )
00235                 return false;
00236             point.setX( point.x()-size.height() );
00237         }
00238         if ( tabPosition()==Bottom )
00239             point.setY( point.y()-( height()-size.height() ) );
00240         QTab *tab = tabBar()->selectTab( point);
00241         if( tab== 0L )
00242             return true;
00243     }
00244     return false;
00245 }
00246 
00247 void KTabWidget::setHoverCloseButton( bool button )
00248 {
00249     static_cast<KTabBar*>(tabBar())->setHoverCloseButton( button );
00250 }
00251 
00252 bool KTabWidget::hoverCloseButton() const
00253 {
00254     return static_cast<KTabBar*>(tabBar())->hoverCloseButton();
00255 }
00256 
00257 void KTabWidget::setHoverCloseButtonDelayed( bool delayed )
00258 {
00259     static_cast<KTabBar*>(tabBar())->setHoverCloseButtonDelayed( delayed );
00260 }
00261 
00262 bool KTabWidget::hoverCloseButtonDelayed() const
00263 {
00264     return static_cast<KTabBar*>(tabBar())->hoverCloseButtonDelayed();
00265 }
00266 
00267 void KTabWidget::closeRequest( int index )
00268 {
00269     emit( closeRequest( page( index ) ) );
00270 }
00271 
00272 #include "ktabwidget.moc"
KDE Logo
This file is part of the documentation for kdeui Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Nov 27 13:43:15 2004 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003