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