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