kutils Library API Documentation

kmultitabbar.cpp

00001 /***************************************************************************
00002                           kmultitabbar.cpp -  description
00003                              -------------------
00004     begin                :  2001
00005     copyright            : (C) 2001,2002,2003 by Joseph Wenninger <jowenn@kde.org>
00006  ***************************************************************************/
00007 
00008 /***************************************************************************
00009     This library is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU Library General Public
00011     License as published by the Free Software Foundation; either
00012     version 2 of the License, or (at your option) any later version.
00013 
00014     This library is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017     Library General Public License for more details.
00018 
00019     You should have received a copy of the GNU Library General Public License
00020     along with this library; see the file COPYING.LIB.  If not, write to
00021     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00022     Boston, MA 02111-1307, USA.
00023  ***************************************************************************/
00024 
00025 #include "kmultitabbar.h"
00026 #include "kmultitabbar.moc"
00027 #include "kmultitabbar_p.h"
00028 #include "kmultitabbar_p.moc"
00029 #include <qbutton.h>
00030 #include <qpopupmenu.h>
00031 #include <qlayout.h>
00032 #include <qpainter.h>
00033 #include <qtooltip.h>
00034 #include <qfontmetrics.h>
00035 #include <qstyle.h>
00036 
00037 #include <kiconloader.h>
00038 #include <kdebug.h>
00039 
00040 
00041 class KMultiTabBarTabPrivate {
00042 public:
00043     QPixmap pix;
00044 };
00045 
00046 
00047 KMultiTabBarInternal::KMultiTabBarInternal(QWidget *parent, KMultiTabBar::KMultiTabBarMode bm):QScrollView(parent)
00048 {
00049     m_expandedTabSize=-1;
00050     m_showActiveTabTexts=false;
00051     m_tabs.setAutoDelete(true);
00052     setHScrollBarMode(AlwaysOff);
00053     setVScrollBarMode(AlwaysOff);
00054     if (bm==KMultiTabBar::Vertical)
00055     {
00056         box=new QWidget(viewport());
00057         mainLayout=new QVBoxLayout(box);
00058         mainLayout->setAutoAdd(true);
00059         box->setFixedWidth(24);
00060         setFixedWidth(24);
00061     }
00062     else
00063     {
00064         box=new QWidget(viewport());
00065         mainLayout=new QHBoxLayout(box);
00066         mainLayout->setAutoAdd(true);
00067         box->setFixedHeight(24);
00068         setFixedHeight(24);
00069     }
00070     addChild(box);
00071     setFrameStyle(NoFrame);
00072     viewport()->setBackgroundMode(Qt::PaletteBackground);
00073 }
00074 
00075 void KMultiTabBarInternal::setStyle(enum KMultiTabBar::KMultiTabBarStyle style)
00076 {
00077     m_style=style;
00078         for (uint i=0;i<m_tabs.count();i++)
00079                 m_tabs.at(i)->setStyle(m_style);
00080 
00081     if  ( (m_style==KMultiTabBar::KDEV3) ||
00082         (m_style==KMultiTabBar::KDEV3ICON ) ) {
00083         resizeEvent(0);
00084     }
00085         viewport()->repaint();
00086 }
00087 
00088 void KMultiTabBarInternal::drawContents ( QPainter * paint, int clipx, int clipy, int clipw, int cliph )
00089 {
00090     QScrollView::drawContents (paint , clipx, clipy, clipw, cliph );
00091 
00092     if (m_position==KMultiTabBar::Right)
00093     {
00094 
00095                 paint->setPen(colorGroup().shadow());
00096                 paint->drawLine(0,0,0,viewport()->height());
00097                 paint->setPen(colorGroup().background().dark(120));
00098                 paint->drawLine(1,0,1,viewport()->height());
00099 
00100 
00101     }
00102     else
00103     if (m_position==KMultiTabBar::Left)
00104     {
00105                 paint->setPen(colorGroup().light());
00106         paint->drawLine(23,0,23,viewport()->height());
00107                 paint->drawLine(22,0,22,viewport()->height());
00108 
00109                 paint->setPen(colorGroup().shadow());
00110                 paint->drawLine(0,0,0,viewport()->height());
00111     }
00112     else
00113     if (m_position==KMultiTabBar::Bottom)
00114     {
00115         paint->setPen(colorGroup().shadow());
00116         paint->drawLine(0,0,viewport()->width(),0);
00117                 paint->setPen(colorGroup().background().dark(120));
00118                 paint->drawLine(0,1,viewport()->width(),1);
00119     }
00120     else
00121     {
00122             paint->setPen(colorGroup().light());
00123         paint->drawLine(0,23,viewport()->width(),23);
00124                 paint->drawLine(0,22,viewport()->width(),22);
00125 
00126 /*                paint->setPen(colorGroup().shadow());
00127                 paint->drawLine(0,0,0,viewport()->height());*/
00128 
00129     }
00130 
00131 
00132 }
00133 
00134 void KMultiTabBarInternal::contentsMousePressEvent(QMouseEvent *ev)
00135 {
00136     ev->ignore();
00137 }
00138 
00139 void KMultiTabBarInternal::mousePressEvent(QMouseEvent *ev)
00140 {
00141     ev->ignore();
00142 }
00143 
00144 void KMultiTabBarInternal::resizeEvent(QResizeEvent *ev) {
00145     kdDebug()<<"KMultiTabBarInternal::resizeEvent"<<endl;
00146     if ( (m_style==KMultiTabBar::KDEV3) ||
00147         (m_style==KMultiTabBar::KDEV3ICON) ){
00148         box->setGeometry(0,0,width(),height());
00149         int lines=1;
00150         int space;
00151         int tmp=0;
00152         if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
00153             space=width();
00154         else
00155             space=height();
00156 
00157         int cnt=0;
00158 //CALCULATE LINES
00159             for (uint i=0;i<m_tabs.count();i++) {
00160             cnt++;
00161             tmp+=m_tabs.at(i)->neededSize();
00162             if (tmp>space) {
00163                 if (cnt>1)i--;
00164                 cnt=0;
00165                 tmp=0;
00166                 lines++;
00167             }
00168         }
00169 //SET SIZE & PLACE
00170         if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top)) {
00171             setFixedHeight(lines*24);
00172             box->setFixedHeight(lines*24);
00173             tmp=0;
00174             cnt=0;
00175             m_lines=lines;
00176             lines=0;
00177                 for (uint i=0;i<m_tabs.count();i++) {
00178                 cnt++;
00179                 tmp+=m_tabs.at(i)->neededSize();
00180                 if (tmp>space) {
00181                     if (cnt>1) i--;
00182                     else
00183                         m_tabs.at(i)->move(tmp-m_tabs.at(i)->neededSize(),lines*24);
00184                     cnt=0;
00185                     tmp=0;
00186                     lines++;
00187                 } else  m_tabs.at(i)->move(tmp-m_tabs.at(i)->neededSize(),lines*24);
00188             }
00189         }
00190         else {
00191             setFixedWidth(lines*24);
00192             box->setFixedWidth(lines*24);
00193             tmp=0;
00194             cnt=0;
00195             m_lines=lines;
00196             lines=0;
00197                 for (uint i=0;i<m_tabs.count();i++) {
00198                 cnt++;
00199                 tmp+=m_tabs.at(i)->neededSize();
00200                 if (tmp>space) {
00201                     if (cnt>1) i--;
00202                     else
00203                         m_tabs.at(i)->move(lines*24,tmp-m_tabs.at(i)->neededSize());
00204                     cnt=0;
00205                     tmp=0;
00206                     lines++;
00207                 } else  m_tabs.at(i)->move(lines*24,tmp-m_tabs.at(i)->neededSize());
00208             }
00209         }
00210 
00211 
00212         kdDebug()<<"needed lines:"<<m_lines<<endl;
00213     }
00214     if (ev) QScrollView::resizeEvent(ev);
00215 }
00216 
00217 
00218 void KMultiTabBarInternal::showActiveTabTexts(bool show)
00219 {
00220     m_showActiveTabTexts=show;
00221 }
00222 
00223 
00224 KMultiTabBarTab* KMultiTabBarInternal::tab(int id) const
00225 {
00226     for (QPtrListIterator<KMultiTabBarTab> it(m_tabs);it.current();++it){
00227         if (it.current()->id()==id) return it.current();
00228     }
00229         return 0;
00230 }
00231 
00232 
00233 int KMultiTabBarInternal::appendTab(const QPixmap &pic ,int id,const QString& text)
00234 {
00235     KMultiTabBarTab  *tab;
00236     m_tabs.append(tab= new KMultiTabBarTab(pic,text,id,box,m_position,m_style));
00237     tab->showActiveTabText(m_showActiveTabTexts);
00238 
00239     if (m_style==KMultiTabBar::KONQSBC)
00240     {
00241         if (m_expandedTabSize<tab->neededSize()) {
00242             m_expandedTabSize=tab->neededSize();
00243             for (uint i=0;i<m_tabs.count();i++)
00244                 m_tabs.at(i)->setSize(m_expandedTabSize);
00245 
00246         } else tab->setSize(m_expandedTabSize);
00247     } else tab->updateState();
00248     tab->show();
00249     return 0;
00250 }
00251 
00252 void KMultiTabBarInternal::removeTab(int id)
00253 {
00254     for (uint pos=0;pos<m_tabs.count();pos++)
00255     {
00256         if (m_tabs.at(pos)->id()==id)
00257         {
00258             m_tabs.remove(pos);
00259             resizeEvent(0);
00260             break;
00261         }
00262     }
00263 }
00264 
00265 void KMultiTabBarInternal::setPosition(enum KMultiTabBar::KMultiTabBarPosition pos)
00266 {
00267     m_position=pos;
00268     for (uint i=0;i<m_tabs.count();i++)
00269         m_tabs.at(i)->setTabsPosition(m_position);
00270     viewport()->repaint();
00271 }
00272 
00273 
00274 KMultiTabBarButton::KMultiTabBarButton(const QPixmap& pic,const QString& text, QPopupMenu *popup,
00275         int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style)
00276     :QPushButton(QIconSet(),text,parent),m_style(style)
00277 {
00278     setIconSet(pic);
00279     setText(text);
00280     m_position=pos;
00281     if (popup) setPopup(popup);
00282     setFlat(true);
00283     setFixedHeight(24);
00284     setFixedWidth(24);
00285     m_id=id;
00286     QToolTip::add(this,text);
00287     connect(this,SIGNAL(clicked()),this,SLOT(slotClicked()));
00288 }
00289 
00290 KMultiTabBarButton::KMultiTabBarButton(const QString& text, QPopupMenu *popup,
00291         int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style)
00292     :QPushButton(QIconSet(),text,parent),m_style(style)
00293 {
00294     setText(text);
00295     m_position=pos;
00296     if (popup) setPopup(popup);
00297     setFlat(true);
00298     setFixedHeight(24);
00299     setFixedWidth(24);
00300     m_id=id;
00301     QToolTip::add(this,text);
00302     connect(this,SIGNAL(clicked()),this,SLOT(slotClicked()));
00303 }
00304 
00305 KMultiTabBarButton::~KMultiTabBarButton() {
00306 }
00307 
00308 int KMultiTabBarButton::id() const{
00309     return m_id;
00310 }
00311 
00312 void KMultiTabBarButton::setText(const QString& text)
00313 {
00314     QPushButton::setText(text);
00315     m_text=text;
00316     QToolTip::add(this,text);
00317 }
00318 
00319 void KMultiTabBarButton::slotClicked()
00320 {
00321     emit clicked(m_id);
00322 }
00323 
00324 void KMultiTabBarButton::setPosition(KMultiTabBar::KMultiTabBarPosition pos)
00325 {
00326     m_position=pos;
00327     repaint();
00328 }
00329 
00330 void KMultiTabBarButton::setStyle(KMultiTabBar::KMultiTabBarStyle style)
00331 {
00332     m_style=style;
00333     repaint();
00334 }
00335 
00336 void KMultiTabBarButton::hideEvent( QHideEvent* he) {
00337     QPushButton::hideEvent(he);
00338     KMultiTabBar *tb=dynamic_cast<KMultiTabBar*>(parentWidget());
00339     if (tb) tb->updateSeparator();
00340 }
00341 
00342 void KMultiTabBarButton::showEvent( QShowEvent* he) {
00343     QPushButton::showEvent(he);
00344     KMultiTabBar *tb=dynamic_cast<KMultiTabBar*>(parentWidget());
00345     if (tb) tb->updateSeparator();
00346 }
00347 
00348 
00349 QSize KMultiTabBarButton::sizeHint() const
00350 {
00351     constPolish();
00352 
00353     int w = 0, h = 0;
00354 
00355     // calculate contents size...
00356 #ifndef QT_NO_ICONSET
00357     if ( iconSet() && !iconSet()->isNull() ) {
00358         int iw = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 4;
00359         int ih = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
00360         w += iw;
00361         h = QMAX( h, ih );
00362     }
00363 #endif
00364     if ( isMenuButton() )
00365         w += style().pixelMetric(QStyle::PM_MenuButtonIndicator, this);
00366 
00367     if ( pixmap() ) {
00368         QPixmap *pm = (QPixmap *)pixmap();
00369         w += pm->width();
00370         h += pm->height();
00371     } else {
00372         QString s( text() );
00373         bool empty = s.isEmpty();
00374         if ( empty )
00375             s = QString::fromLatin1("XXXX");
00376         QFontMetrics fm = fontMetrics();
00377         QSize sz = fm.size( ShowPrefix, s );
00378         if(!empty || !w)
00379             w += sz.width();
00380         if(!empty || !h)
00381             h = QMAX(h, sz.height());
00382     }
00383 
00384     return (style().sizeFromContents(QStyle::CT_ToolButton, this, QSize(w, h)).
00385             expandedTo(QApplication::globalStrut()));
00386 }
00387 
00388 
00389 KMultiTabBarTab::KMultiTabBarTab(const QPixmap& pic, const QString& text,
00390         int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,
00391         KMultiTabBar::KMultiTabBarStyle style)
00392     :KMultiTabBarButton(text,0,id,parent,pos,style),
00393     m_showActiveTabText(false)
00394 {
00395     d=new KMultiTabBarTabPrivate();
00396     setIcon(pic);
00397     m_expandedSize=24;
00398     setToggleButton(true);
00399 }
00400 
00401 KMultiTabBarTab::~KMultiTabBarTab() {
00402     delete d;
00403 }
00404 
00405 
00406 void KMultiTabBarTab::setTabsPosition(KMultiTabBar::KMultiTabBarPosition pos)
00407 {
00408     if ((pos!=m_position) && ((pos==KMultiTabBar::Left) || (pos==KMultiTabBar::Right))) {
00409         if (!d->pix.isNull()) {
00410             QWMatrix temp;// (1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F);
00411             temp.rotate(180);
00412             d->pix=d->pix.xForm(temp);
00413             setIconSet(d->pix);
00414         }
00415     }
00416 
00417     setPosition(pos);
00418 //  repaint();
00419 }
00420 
00421 void KMultiTabBarTab::setIcon(const QString& icon)
00422 {
00423     QPixmap pic=SmallIcon(icon);
00424     setIcon(pic);
00425 }
00426 
00427 void KMultiTabBarTab::setIcon(const QPixmap& icon)
00428 {
00429 
00430     if (m_style!=KMultiTabBar::KDEV3) {
00431         if ((m_position==KMultiTabBar::Left) || (m_position==KMultiTabBar::Right)) {
00432                 QWMatrix rotateMatrix;
00433             if (m_position==KMultiTabBar::Left)
00434                     rotateMatrix.rotate(90);
00435             else
00436                 rotateMatrix.rotate(-90);
00437             QPixmap pic=icon.xForm(rotateMatrix);
00438             d->pix=pic;
00439                 setIconSet(pic);
00440         } else setIconSet(icon);
00441     }
00442 }
00443 
00444 void KMultiTabBarTab::slotClicked()
00445 {
00446     updateState();
00447     KMultiTabBarButton::slotClicked();
00448 }
00449 
00450 void KMultiTabBarTab::setState(bool b)
00451 {
00452     setOn(b);
00453     updateState();
00454 }
00455 
00456 void KMultiTabBarTab::updateState()
00457 {
00458 
00459     if (m_style!=KMultiTabBar::KONQSBC) {
00460         if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (isOn())) {
00461             QPushButton::setText(m_text);
00462         } else {
00463             kdDebug()<<"KMultiTabBarTab::updateState(): setting text to an empty QString***************"<<endl;
00464             QPushButton::setText(QString::null);
00465         }
00466 
00467         if ((m_position==KMultiTabBar::Right || m_position==KMultiTabBar::Left)) {
00468             setFixedWidth(24);
00469             if ((m_style==KMultiTabBar::KDEV3)  || (m_style==KMultiTabBar::KDEV3ICON) || (isOn())) {
00470                 setFixedHeight(KMultiTabBarButton::sizeHint().width());
00471             } else setFixedHeight(36);
00472         } else {
00473             setFixedHeight(24);
00474             if ((m_style==KMultiTabBar::KDEV3)  || (m_style==KMultiTabBar::KDEV3ICON) || (isOn())) {
00475                 setFixedWidth(KMultiTabBarButton::sizeHint().width());
00476             } else setFixedWidth(36);
00477         }
00478     } else {
00479                 if ((!isOn()) || (!m_showActiveTabText))
00480                 {
00481                     setFixedWidth(24);
00482                     setFixedHeight(24);
00483                         return;
00484                 }
00485                 if ((m_position==KMultiTabBar::Right || m_position==KMultiTabBar::Left))
00486                         setFixedHeight(m_expandedSize);
00487                 else
00488                         setFixedWidth(m_expandedSize);
00489     }
00490 
00491 }
00492 
00493 int KMultiTabBarTab::neededSize()
00494 {
00495     return (((m_style!=KMultiTabBar::KDEV3)?24:0)+QFontMetrics(QFont()).width(m_text)+6);
00496 }
00497 
00498 void KMultiTabBarTab::setSize(int size)
00499 {
00500     m_expandedSize=size;
00501     updateState();
00502 }
00503 
00504 void KMultiTabBarTab::showActiveTabText(bool show)
00505 {
00506     m_showActiveTabText=show;
00507 }
00508 
00509 void KMultiTabBarTab::drawButtonLabel(QPainter *p) {
00510     drawButton(p);
00511 }
00512 void KMultiTabBarTab::drawButton(QPainter *paint)
00513 {
00514     if (m_style!=KMultiTabBar::KONQSBC) drawButtonStyled(paint);
00515     else  drawButtonClassic(paint);
00516 }
00517 
00518 void KMultiTabBarTab::drawButtonStyled(QPainter *paint) {
00519 
00520     QSize sh;
00521     const int width = 36; // rotated
00522     const int height = 24;
00523     if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (isOn()))
00524          sh=KMultiTabBarButton::sizeHint();
00525     else
00526         sh=QSize(width,height);
00527 
00528     QPixmap pixmap( sh.width(),height); 
00529     pixmap.fill(eraseColor());
00530     QPainter painter(&pixmap);
00531 
00532 
00533     QStyle::SFlags st=QStyle::Style_Default;
00534 
00535     st|=QStyle::Style_Enabled;
00536 
00537     if (isOn()) st|=QStyle::Style_On;
00538 
00539     style().drawControl(QStyle::CE_PushButton,&painter,this, QRect(0,0,pixmap.width(),pixmap.height()), colorGroup(),st);
00540     style().drawControl(QStyle::CE_PushButtonLabel,&painter,this, QRect(0,0,pixmap.width(),pixmap.height()), colorGroup(),st);
00541 
00542     switch (m_position) {
00543         case KMultiTabBar::Left:
00544             paint->rotate(-90);
00545             paint->drawPixmap(1-pixmap.width(),0,pixmap);
00546             break;
00547         case KMultiTabBar::Right:
00548             paint->rotate(90);
00549             paint->drawPixmap(0,1-pixmap.height(),pixmap);
00550             break;
00551 
00552         default:
00553             paint->drawPixmap(0,0,pixmap);
00554             break;
00555     }
00556 //  style().drawControl(QStyle::CE_PushButtonLabel,painter,this, QRect(0,0,pixmap.width(),pixmap.height()),
00557 //      colorGroup(),QStyle::Style_Enabled);
00558 
00559 
00560 }
00561 
00562 void KMultiTabBarTab::drawButtonClassic(QPainter *paint)
00563 {
00564         QPixmap pixmap;
00565     if ( iconSet())
00566             pixmap = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal );
00567     paint->fillRect(0, 0, 24, 24, colorGroup().background());
00568 
00569     if (!isOn())
00570     {
00571 
00572         if (m_position==KMultiTabBar::Right)
00573         {
00574             paint->fillRect(0,0,21,21,QBrush(colorGroup().background()));
00575 
00576             paint->setPen(colorGroup().background().dark(150));
00577             paint->drawLine(0,22,23,22);
00578 
00579             paint->drawPixmap(12-pixmap.width()/2,12-pixmap.height()/2,pixmap);
00580 
00581             paint->setPen(colorGroup().shadow());
00582             paint->drawLine(0,0,0,23);
00583             paint->setPen(colorGroup().background().dark(120));
00584             paint->drawLine(1,0,1,23);
00585 
00586         }
00587         else
00588         if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
00589         {
00590                         paint->fillRect(0,1,23,22,QBrush(colorGroup().background()));
00591 
00592                         paint->drawPixmap(12-pixmap.width()/2,12-pixmap.height()/2,pixmap);
00593 
00594                         paint->setPen(colorGroup().background().dark(120));
00595                         paint->drawLine(23,0,23,23);
00596 
00597 
00598                         paint->setPen(colorGroup().light());
00599                         paint->drawLine(0,22,23,22);
00600                         paint->drawLine(0,23,23,23);
00601                     paint->setPen(colorGroup().shadow());
00602                     paint->drawLine(0,0,23,0);
00603                         paint->setPen(colorGroup().background().dark(120));
00604                         paint->drawLine(0,1,23,1);
00605 
00606         }
00607         else
00608         {
00609             paint->setPen(colorGroup().background().dark(120));
00610             paint->drawLine(0,23,23,23);
00611             paint->fillRect(0,0,23,21,QBrush(colorGroup().background()));
00612             paint->drawPixmap(12-pixmap.width()/2,12-pixmap.height()/2,pixmap);
00613 
00614             paint->setPen(colorGroup().light());
00615             paint->drawLine(23,0,23,23);
00616             paint->drawLine(22,0,22,23);
00617 
00618             paint->setPen(colorGroup().shadow());
00619             paint->drawLine(0,0,0,23);
00620 
00621         }
00622 
00623 
00624     }
00625     else
00626     {
00627         if (m_position==KMultiTabBar::Right)
00628         {
00629             paint->setPen(colorGroup().shadow());
00630             paint->drawLine(0,height()-1,23,height()-1);
00631             paint->drawLine(0,height()-2,23,height()-2);
00632             paint->drawLine(23,0,23,height()-1);
00633             paint->drawLine(22,0,22,height()-1);
00634             paint->fillRect(0,0,21,height()-3,QBrush(colorGroup().light()));
00635             paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
00636 
00637             if (m_showActiveTabText)
00638             {
00639                 if (height()<25+4) return;
00640 
00641                 QPixmap tpixmap(height()-25-3, width()-2);
00642                 QPainter painter(&tpixmap);
00643 
00644                 painter.fillRect(0,0,tpixmap.width(),tpixmap.height(),QBrush(colorGroup().light()));
00645 
00646                 painter.setPen(colorGroup().text());
00647                 painter.drawText(0,+width()/2+QFontMetrics(QFont()).height()/2,m_text);
00648 
00649                 paint->rotate(90);
00650                 kdDebug()<<"tpixmap.width:"<<tpixmap.width()<<endl;
00651                 paint->drawPixmap(25,-tpixmap.height()+1,tpixmap);
00652             }
00653 
00654         }
00655         else
00656         if (m_position==KMultiTabBar::Top)
00657         {
00658             paint->fillRect(0,0,width()-1,23,QBrush(colorGroup().light()));
00659             paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
00660             if (m_showActiveTabText)
00661             {
00662                 paint->setPen(colorGroup().text());
00663                 paint->drawText(25,height()/2+QFontMetrics(QFont()).height()/2,m_text);
00664             }
00665         }
00666         else
00667         if (m_position==KMultiTabBar::Bottom)
00668         {
00669             paint->setPen(colorGroup().shadow());
00670             paint->drawLine(0,23,width()-1,23);
00671             paint->drawLine(0,22,width()-1,22);
00672             paint->fillRect(0,0,width()-1,21,QBrush(colorGroup().light()));
00673             paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
00674             if (m_showActiveTabText)
00675             {
00676                 paint->setPen(colorGroup().text());
00677                 paint->drawText(25,height()/2+QFontMetrics(QFont()).height()/2,m_text);
00678             }
00679 
00680         }
00681         else
00682         {
00683 
00684 
00685             paint->setPen(colorGroup().shadow());
00686             paint->drawLine(0,height()-1,23,height()-1);
00687             paint->drawLine(0,height()-2,23,height()-2);
00688             paint->fillRect(0,0,23,height()-3,QBrush(colorGroup().light()));
00689             paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
00690             if (m_showActiveTabText)
00691             {
00692 
00693                     if (height()<25+4) return;
00694 
00695                                 QPixmap tpixmap(height()-25-3, width()-2);
00696                                 QPainter painter(&tpixmap);
00697 
00698                                 painter.fillRect(0,0,tpixmap.width(),tpixmap.height(),QBrush(colorGroup().light()));
00699 
00700                                 painter.setPen(colorGroup().text());
00701                                 painter.drawText(tpixmap.width()-QFontMetrics(QFont()).width(m_text),+width()/2+QFontMetrics(QFont()).height()/2,m_text);
00702 
00703                                 paint->rotate(-90);
00704                                 kdDebug()<<"tpixmap.width:"<<tpixmap.width()<<endl;
00705 
00706                 paint->drawPixmap(-24-tpixmap.width(),2,tpixmap);
00707 
00708             }
00709 
00710         }
00711 
00712     }
00713 }
00714 
00715 
00716 
00717 
00718 
00719 
00720 
00721 KMultiTabBar::KMultiTabBar(KMultiTabBarMode bm, QWidget *parent,const char *name):QWidget(parent,name)
00722 {
00723     m_buttons.setAutoDelete(false);
00724     if (bm==Vertical)
00725     {
00726         m_l=new QVBoxLayout(this);
00727         setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding, true);
00728 //      setFixedWidth(24);
00729     }
00730     else
00731     {
00732         m_l=new QHBoxLayout(this);
00733         setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed, true);
00734 //      setFixedHeight(24);
00735     }
00736     m_l->setMargin(0);
00737     m_l->setAutoAdd(false);
00738 
00739     m_internal=new KMultiTabBarInternal(this,bm);
00740     setPosition((bm==KMultiTabBar::Vertical)?KMultiTabBar::Right:KMultiTabBar::Bottom);
00741     setStyle(VSNET);
00742     //  setStyle(KDEV3);
00743     //setStyle(KONQSBC);
00744     m_l->insertWidget(0,m_internal);
00745     m_l->insertWidget(0,m_btnTabSep=new QFrame(this));
00746     m_btnTabSep->setFixedHeight(4);
00747     m_btnTabSep->setFrameStyle(QFrame::Panel | QFrame::Sunken);
00748     m_btnTabSep->setLineWidth(2);
00749     m_btnTabSep->hide();
00750 
00751     updateGeometry();
00752 }
00753 
00754 KMultiTabBar::~KMultiTabBar() {
00755 }
00756 
00757 /*int KMultiTabBar::insertButton(QPixmap pic,int id ,const QString&)
00758 {
00759   (new KToolbarButton(pic,id,m_internal))->show();
00760   return 0;
00761 }*/
00762 
00763 int KMultiTabBar::appendButton(const QPixmap &pic ,int id,QPopupMenu *popup,const QString&)
00764 {
00765     KMultiTabBarButton  *btn;
00766     m_buttons.append(btn= new KMultiTabBarButton(pic,QString::null,
00767             popup,id,this,m_position,m_internal->m_style));
00768     m_l->insertWidget(0,btn);
00769     btn->show();
00770     m_btnTabSep->show();
00771     return 0;
00772 }
00773 
00774 void KMultiTabBar::updateSeparator() {
00775     bool hideSep=true;
00776     for (QPtrListIterator<KMultiTabBarButton> it(m_buttons);it.current();++it){
00777         if (it.current()->isVisibleTo(this)) {
00778             hideSep=false;
00779             break;
00780         }
00781     }
00782     if (hideSep) m_btnTabSep->hide(); 
00783         else m_btnTabSep->show();
00784 
00785 }
00786 
00787 int KMultiTabBar::appendTab(const QPixmap &pic ,int id ,const QString& text)
00788 {
00789  m_internal->appendTab(pic,id,text);
00790  return 0;
00791 }
00792 
00793 KMultiTabBarButton* KMultiTabBar::button(int id) const
00794 {
00795     for (QPtrListIterator<KMultiTabBarButton> it(m_buttons);it.current();++it){
00796         if (it.current()->id()==id) return it.current();
00797     }
00798         return 0;
00799 }
00800 
00801 KMultiTabBarTab* KMultiTabBar::tab(int id) const
00802 {
00803     return m_internal->tab(id);
00804 }
00805 
00806 
00807 
00808 void KMultiTabBar::removeButton(int id)
00809 {
00810     for (uint pos=0;pos<m_buttons.count();pos++)
00811     {
00812         if (m_buttons.at(pos)->id()==id)
00813         {
00814             m_buttons.take(pos)->deleteLater();
00815             break;
00816         }
00817     }
00818     if (m_buttons.count()==0) m_btnTabSep->hide();
00819 }
00820 
00821 void KMultiTabBar::removeTab(int id)
00822 {
00823     m_internal->removeTab(id);
00824 }
00825 
00826 void KMultiTabBar::setTab(int id,bool state)
00827 {
00828     KMultiTabBarTab *ttab=tab(id);
00829     if (ttab)
00830     {
00831         ttab->setState(state);
00832     }
00833 }
00834 
00835 bool KMultiTabBar::isTabRaised(int id) const
00836 {
00837     KMultiTabBarTab *ttab=tab(id);
00838     if (ttab)
00839     {
00840         return ttab->isOn();
00841     }
00842 
00843     return false;
00844 }
00845 
00846 
00847 void KMultiTabBar::showActiveTabTexts(bool show)
00848 {
00849     m_internal->showActiveTabTexts(show);
00850 }
00851 
00852 void KMultiTabBar::setStyle(KMultiTabBarStyle style)
00853 {
00854     m_internal->setStyle(style);
00855 }
00856 
00857 void KMultiTabBar::setPosition(KMultiTabBarPosition pos)
00858 {
00859     m_position=pos;
00860     m_internal->setPosition(pos);
00861     for (uint i=0;i<m_buttons.count();i++)
00862         m_buttons.at(i)->setPosition(pos);
00863 }
00864 void KMultiTabBar::fontChange(const QFont& /* oldFont */)
00865 {
00866     for (uint i=0;i<tabs()->count();i++)
00867         tabs()->at(i)->resize();
00868     repaint();
00869 }
00870 
00871 QPtrList<KMultiTabBarTab>* KMultiTabBar::tabs() {return m_internal->tabs();}
00872 QPtrList<KMultiTabBarButton>* KMultiTabBar::buttons() {return &m_buttons;}
00873 
KDE Logo
This file is part of the documentation for kutils Library Version 3.3.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jan 22 16:48:52 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003