00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifdef None
00030 #undef None
00031 #endif
00032
00033 #include "tdemditaskbar.h"
00034 #include "tdemditaskbar.moc"
00035
00036 #include "tdemdimainfrm.h"
00037 #include "tdemdichildview.h"
00038 #include "tdemdidefines.h"
00039
00040 #include <tqtooltip.h>
00041 #include <tqlabel.h>
00042 #include <tqwidget.h>
00043 #include <tqstyle.h>
00044
00045 #include <tqnamespace.h>
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 KMdiTaskBarButton::KMdiTaskBarButton( KMdiTaskBar *pTaskBar, KMdiChildView *win_ptr )
00063 : TQPushButton( pTaskBar ),
00064 m_actualText( "" )
00065 {
00066 setToggleButton( true );
00067 m_pWindow = win_ptr;
00068 TQToolTip::add
00069 ( this, win_ptr->caption() );
00070 setFocusPolicy( TQ_NoFocus );
00071 }
00072
00073 KMdiTaskBarButton::~KMdiTaskBarButton()
00074 {}
00075
00076 void KMdiTaskBarButton::mousePressEvent( TQMouseEvent* e )
00077 {
00078 switch ( e->button() )
00079 {
00080 case Qt::LeftButton:
00081 emit leftMouseButtonClicked( m_pWindow );
00082 break;
00083 case Qt::RightButton:
00084 emit rightMouseButtonClicked( m_pWindow );
00085 break;
00086 default:
00087 break;
00088 }
00089 emit clicked( m_pWindow );
00090 }
00091
00093 void KMdiTaskBarButton::setNewText( const TQString& s )
00094 {
00095 setText( s );
00096 emit buttonTextChanged( 0 );
00097 }
00098
00099 void KMdiTaskBarButton::setText( const TQString& s )
00100 {
00101 m_actualText = s;
00102 TQButton::setText( s );
00103 }
00104
00105 void KMdiTaskBarButton::fitText( const TQString& origStr, int newWidth )
00106 {
00107 TQButton::setText( m_actualText );
00108
00109 int actualWidth = sizeHint().width();
00110 int realLetterCount = origStr.length();
00111 int newLetterCount = ( newWidth * realLetterCount ) / actualWidth;
00112 int w = newWidth + 1;
00113 TQString s = origStr;
00114 while ( ( w > newWidth ) && ( newLetterCount >= 1 ) )
00115 {
00116 if ( newLetterCount < realLetterCount )
00117 {
00118 if ( newLetterCount > 3 )
00119 s = origStr.left( newLetterCount / 2 ) + "..." + origStr.right( newLetterCount / 2 );
00120 else
00121 {
00122 if ( newLetterCount > 1 )
00123 s = origStr.left( newLetterCount ) + "..";
00124 else
00125 s = origStr.left( 1 );
00126 }
00127 }
00128 TQFontMetrics fm = fontMetrics();
00129 w = fm.width( s );
00130 newLetterCount--;
00131 }
00132
00133 TQButton::setText( s );
00134 }
00135
00136 TQString KMdiTaskBarButton::actualText() const
00137 {
00138 return m_actualText;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147 KMdiTaskBar::KMdiTaskBar( KMdiMainFrm *parent, TQMainWindow::ToolBarDock dock )
00148 : TDEToolBar( parent, "KMdiTaskBar", false, true )
00149 , m_pCurrentFocusedWindow( 0 )
00150 , m_pStretchSpace( 0 )
00151 , m_layoutIsPending( false )
00152 , m_bSwitchedOn( false )
00153 {
00154 m_pFrm = parent;
00155 m_pButtonList = new TQPtrList<KMdiTaskBarButton>;
00156 m_pButtonList->setAutoDelete( true );
00157
00158 setMinimumWidth( 1 );
00159 setFocusPolicy( TQ_NoFocus );
00160 parent->moveToolBar( this, dock );
00161 }
00162
00163 KMdiTaskBar::~KMdiTaskBar()
00164 {
00165 delete m_pButtonList;
00166 }
00167
00168 KMdiTaskBarButton * KMdiTaskBar::addWinButton( KMdiChildView *win_ptr )
00169 {
00170 if ( m_pStretchSpace )
00171 {
00172 delete m_pStretchSpace;
00173 m_pStretchSpace = 0L;
00174 setStretchableWidget( 0L );
00175 }
00176
00177 KMdiTaskBarButton *b = new KMdiTaskBarButton( this, win_ptr );
00178 TQObject::connect( b, TQT_SIGNAL( clicked() ), win_ptr, TQT_SLOT( setFocus() ) );
00179 TQObject::connect( b, TQT_SIGNAL( clicked( KMdiChildView* ) ), this, TQT_SLOT( setActiveButton( KMdiChildView* ) ) );
00180 TQObject::connect( b, TQT_SIGNAL( leftMouseButtonClicked( KMdiChildView* ) ), m_pFrm, TQT_SLOT( activateView( KMdiChildView* ) ) );
00181 TQObject::connect( b, TQT_SIGNAL( rightMouseButtonClicked( KMdiChildView* ) ), m_pFrm, TQT_SLOT( taskbarButtonRightClicked( KMdiChildView* ) ) );
00182 TQObject::connect( b, TQT_SIGNAL( buttonTextChanged( int ) ), this, TQT_SLOT( layoutTaskBar( int ) ) );
00183 m_pButtonList->append( b );
00184 b->setToggleButton( true );
00185 b->setText( win_ptr->tabCaption() );
00186
00187 layoutTaskBar();
00188
00189 m_pStretchSpace = new TQLabel( this, "empty" );
00190 m_pStretchSpace->setText( "" );
00191 setStretchableWidget( m_pStretchSpace );
00192 m_pStretchSpace->show();
00193
00194 if ( m_bSwitchedOn )
00195 {
00196 b->show();
00197 show();
00198 }
00199 return b;
00200 }
00201
00202 void KMdiTaskBar::removeWinButton( KMdiChildView *win_ptr, bool haveToLayoutTaskBar )
00203 {
00204 KMdiTaskBarButton * b = getButton( win_ptr );
00205 if ( b )
00206 {
00207 m_pButtonList->removeRef( b );
00208 if ( haveToLayoutTaskBar )
00209 layoutTaskBar();
00210 }
00211 if ( m_pButtonList->count() == 0 )
00212 {
00213 if ( m_pStretchSpace != 0L )
00214 {
00215 delete m_pStretchSpace;
00216 m_pStretchSpace = 0L;
00217 hide();
00218 }
00219 }
00220 }
00221
00222 void KMdiTaskBar::switchOn( bool bOn )
00223 {
00224 m_bSwitchedOn = bOn;
00225 if ( !bOn )
00226 {
00227 hide();
00228 }
00229 else
00230 {
00231 if ( m_pButtonList->count() > 0 )
00232 {
00233 show();
00234 }
00235 else
00236 {
00237 hide();
00238 }
00239 }
00240 }
00241
00242 KMdiTaskBarButton * KMdiTaskBar::getButton( KMdiChildView *win_ptr )
00243 {
00244 for ( KMdiTaskBarButton * b = m_pButtonList->first();b;b = m_pButtonList->next() )
00245 {
00246 if ( b->m_pWindow == win_ptr )
00247 return b;
00248 }
00249 return 0;
00250 }
00251
00252 KMdiTaskBarButton * KMdiTaskBar::getNextWindowButton( bool bRight, KMdiChildView *win_ptr )
00253 {
00254 if ( bRight )
00255 {
00256 for ( KMdiTaskBarButton * b = m_pButtonList->first();b;b = m_pButtonList->next() )
00257 {
00258 if ( b->m_pWindow == win_ptr )
00259 {
00260 b = m_pButtonList->next();
00261 if ( !b )
00262 b = m_pButtonList->first();
00263 if ( win_ptr != b->m_pWindow )
00264 return b;
00265 else
00266 return 0;
00267 }
00268 }
00269 }
00270 else
00271 {
00272 for ( KMdiTaskBarButton * b = m_pButtonList->first();b;b = m_pButtonList->next() )
00273 {
00274 if ( b->m_pWindow == win_ptr )
00275 {
00276 b = m_pButtonList->prev();
00277 if ( !b )
00278 b = m_pButtonList->last();
00279 if ( win_ptr != b->m_pWindow )
00280 return b;
00281 else
00282 return 0;
00283 }
00284 }
00285 }
00286 return 0;
00287 }
00288
00289 void KMdiTaskBar::setActiveButton( KMdiChildView *win_ptr )
00290 {
00291 KMdiTaskBarButton * newPressedButton = 0L;
00292 KMdiTaskBarButton* oldPressedButton = 0L;
00293 for ( KMdiTaskBarButton * b = m_pButtonList->first();b;b = m_pButtonList->next() )
00294 {
00295 if ( b->m_pWindow == win_ptr )
00296 newPressedButton = b;
00297 if ( b->m_pWindow == m_pCurrentFocusedWindow )
00298 oldPressedButton = b;
00299 }
00300
00301 if ( newPressedButton != 0L && newPressedButton != oldPressedButton )
00302 {
00303 if ( oldPressedButton != 0L )
00304 oldPressedButton->toggle();
00305 newPressedButton->toggle();
00306 m_pCurrentFocusedWindow = win_ptr;
00307 }
00308 }
00309
00310 void KMdiTaskBar::layoutTaskBar( int taskBarWidth )
00311 {
00312 if ( m_layoutIsPending )
00313 return ;
00314 m_layoutIsPending = true;
00315
00316 if ( !taskBarWidth )
00317
00318 taskBarWidth = width();
00319
00320
00321 int allButtonsWidth = 0;
00322 KMdiTaskBarButton *b = 0;
00323 for ( b = m_pButtonList->first();b;b = m_pButtonList->next() )
00324 {
00325 allButtonsWidth += b->width();
00326 }
00327
00328
00329 int allButtonsWidthHint = 0;
00330 for ( b = m_pButtonList->first();b;b = m_pButtonList->next() )
00331 {
00332 TQFontMetrics fm = b->fontMetrics();
00333 TQString s = b->actualText();
00334 TQSize sz = fm.size( ShowPrefix, s );
00335 int w = sz.width() + 6;
00336 int h = sz.height() + sz.height() / 8 + 10;
00337 w += h;
00338 allButtonsWidthHint += w;
00339 }
00340
00341
00342 int buttonCount = m_pButtonList->count();
00343 int tbHandlePixel;
00344 tbHandlePixel = style().pixelMetric( TQStyle::PM_DockWindowHandleExtent, this );
00345 int buttonAreaWidth = taskBarWidth - tbHandlePixel - style().pixelMetric( TQStyle::PM_DefaultFrameWidth, this ) - 5;
00346 if ( ( ( allButtonsWidthHint ) <= buttonAreaWidth ) || ( width() < parentWidget() ->width() ) )
00347 {
00348 for ( b = m_pButtonList->first();b;b = m_pButtonList->next() )
00349 {
00350 b->setText( b->actualText() );
00351 if ( b->width() != b->sizeHint().width() )
00352 {
00353 b->setFixedWidth( b->sizeHint().width() );
00354 b->show();
00355 }
00356 }
00357 }
00358 else
00359 {
00360
00361 int newButtonWidth;
00362 if ( buttonCount != 0 )
00363 newButtonWidth = buttonAreaWidth / buttonCount;
00364 else
00365 newButtonWidth = 0;
00366 if ( orientation() == Qt::Vertical )
00367 newButtonWidth = 80;
00368 if ( newButtonWidth > 0 )
00369 for ( b = m_pButtonList->first();b;b = m_pButtonList->next() )
00370 {
00371 b->fitText( b->actualText(), newButtonWidth );
00372 if ( b->width() != newButtonWidth )
00373 {
00374 b->setFixedWidth( newButtonWidth );
00375 b->show();
00376 }
00377 }
00378 }
00379 m_layoutIsPending = false;
00380 }
00381
00382 void KMdiTaskBar::resizeEvent( TQResizeEvent* rse )
00383 {
00384 if ( !m_layoutIsPending )
00385 {
00386 if ( m_pButtonList->count() != 0 )
00387 {
00388 layoutTaskBar( rse->size().width() );
00389 }
00390 }
00391 TDEToolBar::resizeEvent( rse );
00392 }
00393
00394