00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <qbitmap.h>
00022 #include <qgrid.h>
00023 #include <qhbox.h>
00024 #include <qheader.h>
00025 #include <qlabel.h>
00026 #include <qlayout.h>
00027 #include <qobjectlist.h>
00028 #include <qpixmap.h>
00029 #include <qsplitter.h>
00030 #include <qtabwidget.h>
00031 #include <qvbox.h>
00032 #include <qwidgetstack.h>
00033 #include <qpainter.h>
00034 #include <qstyle.h>
00035
00036 #include <kapplication.h>
00037 #include <kdialog.h>
00038 #include <klocale.h>
00039 #include <kglobal.h>
00040 #include <kglobalsettings.h>
00041 #include <kseparator.h>
00042 #include <kdebug.h>
00043 #include "kjanuswidget.h"
00044 #include <klistview.h>
00045 #include "kpushbutton.h"
00046 #include "kguiitem.h"
00047
00048 class KJanusWidget::IconListItem : public QListBoxItem
00049 {
00050 public:
00051 IconListItem( QListBox *listbox, const QPixmap &pixmap,
00052 const QString &text );
00053 virtual int height( const QListBox *lb ) const;
00054 virtual int width( const QListBox *lb ) const;
00055 int expandMinimumWidth( int width );
00056
00057 protected:
00058 const QPixmap &defaultPixmap();
00059 void paint( QPainter *painter );
00060
00061 private:
00062 QPixmap mPixmap;
00063 int mMinimumWidth;
00064 };
00065
00066 class KJanusWidget::KJanusWidgetPrivate
00067 {
00068 public:
00069 KJanusWidgetPrivate() : mNextPageIndex(0), mListFrame( 0 ) { }
00070
00071 int mNextPageIndex;
00072
00073
00074 QMap<int,QWidget*> mIntToPage;
00075
00076 QMap<QWidget*,int> mPageToInt;
00077
00078 QMap<int, QString> mIntToTitle;
00079
00080 QWidget * mListFrame;
00081 QSplitter * mSplitter;
00082 };
00083
00084 template class QPtrList<QListViewItem>;
00085
00086
00087 KJanusWidget::KJanusWidget( QWidget *parent, const char *name, int face )
00088 : QWidget( parent, name, 0 ),
00089 mValid(false), mPageList(0),
00090 mTitleList(0), mFace(face), mTitleLabel(0), mActivePageWidget(0),
00091 mShowIconsInTreeList(false), d(0)
00092 {
00093 QVBoxLayout *topLayout = new QVBoxLayout( this );
00094
00095 if( mFace == TreeList || mFace == IconList )
00096 {
00097 d = new KJanusWidgetPrivate;
00098 d->mSplitter = 0;
00099
00100 QFrame *page;
00101 if( mFace == TreeList )
00102 {
00103 d->mSplitter = new QSplitter( this );
00104 topLayout->addWidget( d->mSplitter, 10 );
00105 mTreeListResizeMode = QSplitter::KeepSize;
00106
00107 d->mListFrame = new QWidget( d->mSplitter );
00108 QVBoxLayout *dummy = new QVBoxLayout( d->mListFrame, 0, 0 );
00109 dummy->setAutoAdd( true );
00110 mTreeList = new KListView( d->mListFrame );
00111 mTreeList->addColumn( QString::null );
00112 mTreeList->header()->hide();
00113 mTreeList->setRootIsDecorated(true);
00114 mTreeList->setSorting( -1 );
00115 connect( mTreeList, SIGNAL(selectionChanged()), SLOT(slotShowPage()) );
00116 connect( mTreeList, SIGNAL(clicked(QListViewItem *)), SLOT(slotItemClicked(QListViewItem *)));
00117
00118
00119
00120
00121
00122 QFrame *p = new QFrame( d->mSplitter );
00123
00124 QHBoxLayout *hbox = new QHBoxLayout( p, 0, 0 );
00125 hbox->addSpacing( KDialog::marginHint() );
00126
00127 page = new QFrame( p );
00128 hbox->addWidget( page, 10 );
00129 }
00130 else
00131 {
00132 QHBoxLayout *hbox = new QHBoxLayout( topLayout );
00133 d->mListFrame = new QWidget( this );
00134 hbox->addWidget( d->mListFrame );
00135
00136 ( new QVBoxLayout( d->mListFrame, 0, 0 ) )->setAutoAdd( true );
00137 mIconList = new IconListBox( d->mListFrame );
00138
00139 QFont listFont( mIconList->font() );
00140 listFont.setBold( true );
00141 mIconList->setFont( listFont );
00142
00143 mIconList->verticalScrollBar()->installEventFilter( this );
00144 connect( mIconList, SIGNAL(selectionChanged()), SLOT(slotShowPage()));
00145 hbox->addSpacing( KDialog::marginHint() );
00146 page = new QFrame( this );
00147 hbox->addWidget( page, 10 );
00148 }
00149
00150
00151
00152
00153
00154
00155 QVBoxLayout *vbox = new QVBoxLayout( page, 0, KDialog::spacingHint() );
00156
00157 mTitleLabel = new QLabel( QString::fromLatin1("Empty Page"), page, "KJanusWidgetTitleLabel" );
00158 vbox->addWidget( mTitleLabel, 0, QApplication::reverseLayout() ? AlignRight : AlignLeft );
00159
00160 QFont titleFont( mTitleLabel->font() );
00161 titleFont.setBold( true );
00162 mTitleLabel->setFont( titleFont );
00163
00164 mTitleSep = new KSeparator( page );
00165 mTitleSep->setFrameStyle( QFrame::HLine|QFrame::Plain );
00166 vbox->addWidget( mTitleSep );
00167
00168 mPageStack = new QWidgetStack( page );
00169 connect(mPageStack, SIGNAL(aboutToShow(QWidget *)),
00170 SIGNAL(aboutToShowPage(QWidget *)));
00171 vbox->addWidget( mPageStack, 10 );
00172 }
00173 else if( mFace == Tabbed )
00174 {
00175 d = new KJanusWidgetPrivate;
00176
00177 mTabControl = new QTabWidget( this );
00178 mTabControl->setMargin (KDialog::marginHint());
00179 connect(mTabControl, SIGNAL(currentChanged(QWidget *)),
00180 SIGNAL(aboutToShowPage(QWidget *)));
00181 topLayout->addWidget( mTabControl, 10 );
00182 }
00183 else if( mFace == Swallow )
00184 {
00185 mSwallowPage = new QWidget( this );
00186 topLayout->addWidget( mSwallowPage, 10 );
00187 }
00188 else
00189 {
00190 mFace = Plain;
00191 mPlainPage = new QFrame( this );
00192 topLayout->addWidget( mPlainPage, 10 );
00193 }
00194
00195 if ( kapp )
00196 connect(kapp,SIGNAL(kdisplayFontChanged()),SLOT(slotFontChanged()));
00197 mValid = true;
00198
00199 setSwallowedWidget(0);
00200 }
00201
00202
00203 KJanusWidget::~KJanusWidget()
00204 {
00205 delete d;
00206 }
00207
00208
00209 bool KJanusWidget::isValid() const
00210 {
00211 return mValid;
00212 }
00213
00214
00215 QFrame *KJanusWidget::plainPage()
00216 {
00217 return mPlainPage;
00218 }
00219
00220
00221 int KJanusWidget::face() const
00222 {
00223 return mFace;
00224 }
00225
00226 QWidget *KJanusWidget::FindParent()
00227 {
00228 if( mFace == Tabbed ) {
00229 return mTabControl;
00230 }
00231 else {
00232 return this;
00233 }
00234 }
00235
00236 QFrame *KJanusWidget::addPage( const QStringList &items, const QString &header,
00237 const QPixmap &pixmap )
00238 {
00239 if( !mValid )
00240 {
00241 kdDebug() << "addPage: Invalid object" << endl;
00242 return 0;
00243 }
00244
00245 QFrame *page = new QFrame( FindParent(), "page" );
00246 addPageWidget( page, items, header, pixmap );
00247
00248 return page;
00249 }
00250
00251 void KJanusWidget::pageGone( QObject *obj )
00252 {
00253 removePage( static_cast<QWidget*>( obj ) );
00254 }
00255
00256 void KJanusWidget::slotReopen( QListViewItem * item )
00257 {
00258 if( item )
00259 item->setOpen( true );
00260 }
00261
00262 QFrame *KJanusWidget::addPage( const QString &itemName, const QString &header,
00263 const QPixmap &pixmap )
00264 {
00265 QStringList items;
00266 items << itemName;
00267 return addPage(items, header, pixmap);
00268 }
00269
00270
00271
00272 QVBox *KJanusWidget::addVBoxPage( const QStringList &items,
00273 const QString &header,
00274 const QPixmap &pixmap )
00275 {
00276 if( !mValid )
00277 {
00278 kdDebug() << "addPage: Invalid object" << endl;
00279 return 0;
00280 }
00281
00282 QVBox *page = new QVBox(FindParent() , "page" );
00283 page->setSpacing( KDialog::spacingHint() );
00284 addPageWidget( page, items, header, pixmap );
00285
00286 return page;
00287 }
00288
00289 QVBox *KJanusWidget::addVBoxPage( const QString &itemName,
00290 const QString &header,
00291 const QPixmap &pixmap )
00292 {
00293 QStringList items;
00294 items << itemName;
00295 return addVBoxPage(items, header, pixmap);
00296 }
00297
00298 QHBox *KJanusWidget::addHBoxPage( const QStringList &items,
00299 const QString &header,
00300 const QPixmap &pixmap )
00301 {
00302 if( !mValid ) {
00303 kdDebug() << "addPage: Invalid object" << endl;
00304 return 0;
00305 }
00306
00307 QHBox *page = new QHBox(FindParent(), "page");
00308 page->setSpacing( KDialog::spacingHint() );
00309 addPageWidget( page, items, header, pixmap );
00310
00311 return page;
00312 }
00313
00314 QHBox *KJanusWidget::addHBoxPage( const QString &itemName,
00315 const QString &header,
00316 const QPixmap &pixmap )
00317 {
00318 QStringList items;
00319 items << itemName;
00320 return addHBoxPage(items, header, pixmap);
00321 }
00322
00323 QGrid *KJanusWidget::addGridPage( int n, Orientation dir,
00324 const QStringList &items,
00325 const QString &header,
00326 const QPixmap &pixmap )
00327 {
00328 if( !mValid )
00329 {
00330 kdDebug() << "addPage: Invalid object" << endl;
00331 return 0;
00332 }
00333
00334 QGrid *page = new QGrid( n, dir, FindParent(), "page" );
00335 page->setSpacing( KDialog::spacingHint() );
00336 addPageWidget( page, items, header, pixmap );
00337
00338 return page;
00339 }
00340
00341
00342 QGrid *KJanusWidget::addGridPage( int n, Orientation dir,
00343 const QString &itemName,
00344 const QString &header,
00345 const QPixmap &pixmap )
00346 {
00347 QStringList items;
00348 items << itemName;
00349 return addGridPage(n, dir, items, header, pixmap);
00350 }
00351
00352 void KJanusWidget::InsertTreeListItem(const QStringList &items, const QPixmap &pixmap, QFrame *page)
00353 {
00354 bool isTop = true;
00355 QListViewItem *curTop = 0, *child, *last, *newChild;
00356 unsigned int index = 1;
00357 QStringList curPath;
00358
00359 for ( QStringList::ConstIterator it = items.begin(); it != items.end(); ++it, index++ ) {
00360 QString name = (*it);
00361 bool isPath = ( index != items.count() );
00362
00363
00364 if (isTop) {
00365 child = mTreeList->firstChild();
00366 }
00367 else {
00368 child = curTop->firstChild();
00369 }
00370
00371
00372
00373 for (last = 0; child && child->text(0) != name ; last = child, child = child->nextSibling());
00374
00375 if (!last && !child) {
00376
00377
00378 if (isTop)
00379 newChild = new QListViewItem(mTreeList, name);
00380 else
00381 newChild = new QListViewItem(curTop, name);
00382
00383 }
00384 else if (child) {
00385
00386 if (!isPath) {
00387 kdDebug() << "The element inserted was already in the TreeList box!" << endl;
00388 return;
00389 }
00390 else {
00391
00392 newChild = child;
00393 }
00394 }
00395 else {
00396
00397 if (isTop)
00398 newChild = new QListViewItem(mTreeList, last, name);
00399 else
00400 newChild = new QListViewItem(curTop, last, name);
00401 }
00402
00403
00404
00405 if (isPath) {
00406 newChild->setExpandable(true);
00407 curTop = newChild;
00408 isTop = false;
00409 curPath << name;
00410
00411 QString key = curPath.join("_/_");
00412 if (mFolderIconMap.contains(key)) {
00413 QPixmap p = mFolderIconMap[key];
00414 newChild->setPixmap(0,p);
00415 }
00416 }
00417 else {
00418 if (mShowIconsInTreeList) {
00419 newChild->setPixmap(0, pixmap);
00420 }
00421 mTreeListToPageStack.insert(newChild, page);
00422 }
00423 }
00424 }
00425
00426 void KJanusWidget::addPageWidget( QFrame *page, const QStringList &items,
00427 const QString &header,const QPixmap &pixmap )
00428 {
00429 connect(page, SIGNAL(destroyed(QObject*)), SLOT(pageGone(QObject*)));
00430
00431 if( mFace == Tabbed )
00432 {
00433 mTabControl->addTab (page, items.last());
00434 d->mIntToPage[d->mNextPageIndex] = static_cast<QWidget*>(page);
00435 d->mPageToInt[static_cast<QWidget*>(page)] = d->mNextPageIndex;
00436 d->mNextPageIndex++;
00437 }
00438 else if( mFace == TreeList || mFace == IconList )
00439 {
00440 d->mIntToPage[d->mNextPageIndex] = static_cast<QWidget*>(page);
00441 d->mPageToInt[static_cast<QWidget*>(page)] = d->mNextPageIndex;
00442 mPageStack->addWidget( page, 0 );
00443
00444 if (items.isEmpty()) {
00445 kdDebug() << "Invalid QStringList, with zero items" << endl;
00446 return;
00447 }
00448
00449 if( mFace == TreeList )
00450 {
00451 InsertTreeListItem(items, pixmap, page);
00452 }
00453 else
00454 {
00455 QString itemName = items.last();
00456 IconListItem *item = new IconListItem( mIconList, pixmap, itemName );
00457 mIconListToPageStack.insert(item, page);
00458 mIconList->invalidateHeight();
00459 mIconList->invalidateWidth();
00460
00461 if (mIconList->isVisible())
00462 mIconList->updateWidth();
00463 }
00464
00465
00466
00467
00468 QString lastName = items.last();
00469 const QString &title = (!header.isNull() ? header : lastName);
00470 QRect r = mTitleLabel->fontMetrics().boundingRect( title );
00471 if( mTitleLabel->minimumWidth() < r.width() )
00472 {
00473 mTitleLabel->setMinimumWidth( r.width() );
00474 }
00475 d->mIntToTitle[d->mNextPageIndex] = title;
00476 if( d->mIntToTitle.count() == 1 )
00477 {
00478 showPage(0);
00479 }
00480 d->mNextPageIndex++;
00481 }
00482 else
00483 {
00484 kdDebug() << "KJanusWidget::addPageWidget: can only add a page in Tabbed, TreeList or IconList modes" << endl;
00485 }
00486
00487 }
00488
00489 void KJanusWidget::setFolderIcon(const QStringList &path, const QPixmap &pixmap)
00490 {
00491 QString key = path.join("_/_");
00492 mFolderIconMap.insert(key,pixmap);
00493 }
00494
00495
00496
00497 bool KJanusWidget::setSwallowedWidget( QWidget *widget )
00498 {
00499 if( mFace != Swallow || !mValid )
00500 {
00501 return false;
00502 }
00503
00504
00505
00506
00507 delete mSwallowPage->layout();
00508
00509 QGridLayout *gbox = new QGridLayout( mSwallowPage, 1, 1, 0 );
00510
00511
00512
00513
00514 QObjectList *l = (QObjectList*)mSwallowPage->children();
00515 for( uint i=0; i < l->count(); i++ )
00516 {
00517 QObject *o = l->at(i);
00518 if( o->isWidgetType() )
00519 {
00520 ((QWidget*)o)->hide();
00521 }
00522 }
00523
00524
00525
00526
00527 if( !widget )
00528 {
00529 gbox->addRowSpacing(0,100);
00530 gbox->addColSpacing(0,100);
00531 mSwallowPage->setMinimumSize(100,100);
00532 }
00533 else
00534 {
00535 if( widget->parent() != mSwallowPage )
00536 {
00537 widget->reparent( mSwallowPage, 0, QPoint(0,0) );
00538 }
00539 gbox->addWidget(widget, 0, 0 );
00540 gbox->activate();
00541 mSwallowPage->setMinimumSize( widget->minimumSize() );
00542 }
00543
00544 return true;
00545 }
00546
00547 bool KJanusWidget::slotShowPage()
00548 {
00549 if( !mValid )
00550 {
00551 return false;
00552 }
00553
00554 if( mFace == TreeList )
00555 {
00556 QListViewItem *node = mTreeList->selectedItem();
00557 if( !node ) { return false; }
00558
00559 QWidget *stackItem = mTreeListToPageStack[node];
00560
00561 return showPage(d->mPageToInt[stackItem]);
00562 }
00563 else if( mFace == IconList )
00564 {
00565 QListBoxItem *node = mIconList->item( mIconList->currentItem() );
00566 if( !node ) { return false; }
00567 QWidget *stackItem = mIconListToPageStack[node];
00568
00569 return showPage(d->mPageToInt[stackItem]);
00570 }
00571
00572 return false;
00573 }
00574
00575
00576 bool KJanusWidget::showPage( int index )
00577 {
00578 if( !d || !mValid )
00579 {
00580 return false;
00581 }
00582 else
00583 {
00584 return showPage(d->mIntToPage[index]);
00585 }
00586 }
00587
00588
00589 bool KJanusWidget::showPage( QWidget *w )
00590 {
00591 if( !w || !mValid )
00592 {
00593 return false;
00594 }
00595
00596 if( mFace == TreeList || mFace == IconList )
00597 {
00598 mPageStack->raiseWidget( w );
00599 mActivePageWidget = w;
00600
00601 int index = d->mPageToInt[w];
00602 mTitleLabel->setText( d->mIntToTitle[index] );
00603 if( mFace == TreeList )
00604 {
00605 QMap<QListViewItem *, QWidget *>::Iterator it;
00606 for (it = mTreeListToPageStack.begin(); it != mTreeListToPageStack.end(); ++it){
00607 QListViewItem *key = it.key();
00608 QWidget *val = it.data();
00609 if (val == w) {
00610 mTreeList->setSelected(key, true );
00611 break;
00612 }
00613 }
00614 }
00615 else
00616 {
00617 QMap<QListBoxItem *, QWidget *>::Iterator it;
00618 for (it = mIconListToPageStack.begin(); it != mIconListToPageStack.end(); ++it){
00619 QListBoxItem *key = it.key();
00620 QWidget *val = it.data();
00621 if (val == w) {
00622 mIconList->setSelected( key, true );
00623 break;
00624 }
00625 }
00626 }
00627 }
00628 else if( mFace == Tabbed )
00629 {
00630 mTabControl->showPage(w);
00631 mActivePageWidget = w;
00632 }
00633 else
00634 {
00635 return false;
00636 }
00637
00638 return true;
00639 }
00640
00641
00642 int KJanusWidget::activePageIndex() const
00643 {
00644 if( mFace == TreeList) {
00645 QListViewItem *node = mTreeList->selectedItem();
00646 if( !node ) { return -1; }
00647 QWidget *stackItem = mTreeListToPageStack[node];
00648 return d->mPageToInt[stackItem];
00649 }
00650 else if (mFace == IconList) {
00651 QListBoxItem *node = mIconList->item( mIconList->currentItem() );
00652 if( !node ) { return false; }
00653 QWidget *stackItem = mIconListToPageStack[node];
00654 return d->mPageToInt[stackItem];
00655 }
00656 else if( mFace == Tabbed ) {
00657 QWidget *widget = mTabControl->currentPage();
00658 return ( !widget ? -1 : d->mPageToInt[widget] );
00659 }
00660 else {
00661 return -1;
00662 }
00663 }
00664
00665
00666 int KJanusWidget::pageIndex( QWidget *widget ) const
00667 {
00668 if( !widget )
00669 {
00670 return -1;
00671 }
00672 else if( mFace == TreeList || mFace == IconList )
00673 {
00674 return d->mPageToInt[widget];
00675 }
00676 else if( mFace == Tabbed )
00677 {
00678
00679
00680
00681
00682
00683 if( widget->isA("QFrame") )
00684 {
00685 return d->mPageToInt[widget->parentWidget()];
00686 }
00687 else
00688 {
00689 return d->mPageToInt[widget];
00690 }
00691 }
00692 else
00693 {
00694 return -1;
00695 }
00696 }
00697
00698 void KJanusWidget::slotFontChanged()
00699 {
00700 if( mTitleLabel )
00701 {
00702 mTitleLabel->setFont( KGlobalSettings::generalFont() );
00703 QFont titleFont( mTitleLabel->font() );
00704 titleFont.setBold( true );
00705 mTitleLabel->setFont( titleFont );
00706 }
00707
00708 if( mFace == IconList )
00709 {
00710 QFont listFont( mIconList->font() );
00711 listFont.setBold( true );
00712 mIconList->setFont( listFont );
00713 mIconList->invalidateHeight();
00714 mIconList->invalidateWidth();
00715 }
00716 }
00717
00718
00719 void KJanusWidget::slotItemClicked(QListViewItem *it)
00720 {
00721 if(it && (it->childCount()>0))
00722 it->setOpen(!it->isOpen());
00723 }
00724
00725 void KJanusWidget::setFocus()
00726 {
00727 if( !mValid ) { return; }
00728 if( mFace == TreeList )
00729 {
00730 mTreeList->setFocus();
00731 }
00732 if( mFace == IconList )
00733 {
00734 mIconList->setFocus();
00735 }
00736 else if( mFace == Tabbed )
00737 {
00738 mTabControl->setFocus();
00739 }
00740 else if( mFace == Swallow )
00741 {
00742 mSwallowPage->setFocus();
00743 }
00744 else if( mFace == Plain )
00745 {
00746 mPlainPage->setFocus();
00747 }
00748 }
00749
00750
00751 QSize KJanusWidget::minimumSizeHint() const
00752 {
00753 if( mFace == TreeList || mFace == IconList )
00754 {
00755 QSize s1( KDialog::spacingHint(), KDialog::spacingHint()*2 );
00756 QSize s2(0,0);
00757 QSize s3(0,0);
00758 QSize s4( mPageStack->sizeHint() );
00759
00760 if( mFace == TreeList )
00761 {
00762 s1.rwidth() += style().pixelMetric( QStyle::PM_SplitterWidth );
00763 s2 = mTreeList->minimumSize();
00764 }
00765 else
00766 {
00767 mIconList->updateMinimumHeight();
00768 mIconList->updateWidth();
00769 s2 = mIconList->minimumSize();
00770 }
00771
00772 if( mTitleLabel->isVisible() )
00773 {
00774 s3 += mTitleLabel->sizeHint();
00775 s3.rheight() += mTitleSep->minimumSize().height();
00776 }
00777
00778
00779
00780
00781 int h1 = s1.rheight() + s3.rheight() + s4.height();
00782 int h2 = QMAX( h1, s2.rheight() );
00783
00784 return QSize( s1.width()+s2.width()+QMAX(s3.width(),s4.width()), h2 );
00785 }
00786 else if( mFace == Tabbed )
00787 {
00788 return mTabControl->sizeHint();
00789 }
00790 else if( mFace == Swallow )
00791 {
00792 return mSwallowPage->minimumSize();
00793 }
00794 else if( mFace == Plain )
00795 {
00796 return mPlainPage->sizeHint();
00797 }
00798 else
00799 {
00800 return QSize( 100, 100 );
00801 }
00802
00803 }
00804
00805
00806 QSize KJanusWidget::sizeHint() const
00807 {
00808 return minimumSizeHint();
00809 }
00810
00811
00812 void KJanusWidget::setTreeListAutoResize( bool state )
00813 {
00814 if( mFace == TreeList )
00815 {
00816 mTreeListResizeMode = !state ?
00817 QSplitter::KeepSize : QSplitter::Stretch;
00818 if( d->mSplitter )
00819 d->mSplitter->setResizeMode( d->mListFrame, mTreeListResizeMode );
00820 }
00821 }
00822
00823
00824 void KJanusWidget::setIconListAllVisible( bool state )
00825 {
00826 if( mFace == IconList )
00827 {
00828 mIconList->setShowAll( state );
00829 }
00830 }
00831
00832 void KJanusWidget::setShowIconsInTreeList( bool state )
00833 {
00834 mShowIconsInTreeList = state;
00835 }
00836
00837 void KJanusWidget::setRootIsDecorated( bool state )
00838 {
00839 if( mFace == TreeList ) {
00840 mTreeList->setRootIsDecorated(state);
00841 }
00842 }
00843
00844 void KJanusWidget::unfoldTreeList( bool persist )
00845 {
00846 if( mFace == TreeList )
00847 {
00848 if( persist )
00849 connect( mTreeList, SIGNAL( collapsed( QListViewItem * ) ), this, SLOT( slotReopen( QListViewItem * ) ) );
00850 else
00851 disconnect( mTreeList, SIGNAL( collapsed( QListViewItem * ) ), this, SLOT( slotReopen( QListViewItem * ) ) );
00852
00853 for( QListViewItem * item = mTreeList->firstChild(); item; item = item->itemBelow() )
00854 item->setOpen( true );
00855 }
00856 }
00857
00858 void KJanusWidget::addWidgetBelowList( QWidget * widget )
00859 {
00860 if( ( mFace == TreeList || mFace == IconList ) && d->mListFrame )
00861 {
00862 widget->reparent( d->mListFrame, QPoint() );
00863 }
00864 }
00865
00866 void KJanusWidget::addButtonBelowList( const QString & text, QObject * recv, const char * slot )
00867 {
00868 if( ( mFace == TreeList || mFace == IconList ) && d->mListFrame )
00869 {
00870 QPushButton * button = new QPushButton( text, d->mListFrame );
00871 connect( button, SIGNAL( clicked() ), recv, slot );
00872 }
00873 }
00874
00875 void KJanusWidget::addButtonBelowList( const KGuiItem & item, QObject * recv, const char * slot )
00876 {
00877 if( ( mFace == TreeList || mFace == IconList ) && d->mListFrame )
00878 {
00879 KPushButton * button = new KPushButton( item, d->mListFrame );
00880 connect( button, SIGNAL( clicked() ), recv, slot );
00881 }
00882 }
00883
00884 void KJanusWidget::showEvent( QShowEvent * )
00885 {
00886 if( mFace == TreeList )
00887 {
00888 if( d->mSplitter )
00889 d->mSplitter->setResizeMode( d->mListFrame, mTreeListResizeMode );
00890 }
00891 }
00892
00893
00894
00895
00896
00897
00898
00899 bool KJanusWidget::eventFilter( QObject *o, QEvent *e )
00900 {
00901 if( e->type() == QEvent::Show )
00902 {
00903 IconListItem *item = (IconListItem*)mIconList->item(0);
00904 if( item )
00905 {
00906 int lw = item->width( mIconList );
00907 int sw = mIconList->verticalScrollBar()->sizeHint().width();
00908 mIconList->setFixedWidth( lw+sw+mIconList->frameWidth()*2 );
00909 }
00910 }
00911 else if( e->type() == QEvent::Hide )
00912 {
00913 IconListItem *item = (IconListItem*)mIconList->item(0);
00914 if( item )
00915 {
00916 int lw = item->width( mIconList );
00917 mIconList->setFixedWidth( lw+mIconList->frameWidth()*2 );
00918 }
00919 }
00920 return QWidget::eventFilter( o, e );
00921 }
00922
00923
00924
00925
00926
00927
00928
00929
00930 KJanusWidget::IconListBox::IconListBox( QWidget *parent, const char *name,
00931 WFlags f )
00932 :KListBox( parent, name, f ), mShowAll(false), mHeightValid(false),
00933 mWidthValid(false)
00934 {
00935 }
00936
00937
00938 void KJanusWidget::IconListBox::updateMinimumHeight()
00939 {
00940 if( mShowAll && !mHeightValid )
00941 {
00942 int h = frameWidth()*2;
00943 for( QListBoxItem *i = item(0); i; i = i->next() )
00944 {
00945 h += i->height( this );
00946 }
00947 setMinimumHeight( h );
00948 mHeightValid = true;
00949 }
00950 }
00951
00952
00953 void KJanusWidget::IconListBox::updateWidth()
00954 {
00955 if( !mWidthValid )
00956 {
00957 int maxWidth = 10;
00958 for( QListBoxItem *i = item(0); i; i = i->next() )
00959 {
00960 int w = ((IconListItem *)i)->width(this);
00961 maxWidth = QMAX( w, maxWidth );
00962 }
00963
00964 for( QListBoxItem *i = item(0); i; i = i->next() )
00965 {
00966 ((IconListItem *)i)->expandMinimumWidth( maxWidth );
00967 }
00968
00969 if( verticalScrollBar()->isVisible() )
00970 {
00971 maxWidth += verticalScrollBar()->sizeHint().width();
00972 }
00973
00974 setFixedWidth( maxWidth + frameWidth()*2 );
00975 mWidthValid = true;
00976 }
00977 }
00978
00979
00980 void KJanusWidget::IconListBox::invalidateHeight()
00981 {
00982 mHeightValid = false;
00983 }
00984
00985
00986 void KJanusWidget::IconListBox::invalidateWidth()
00987 {
00988 mWidthValid = false;
00989 }
00990
00991
00992 void KJanusWidget::IconListBox::setShowAll( bool showAll )
00993 {
00994 mShowAll = showAll;
00995 mHeightValid = false;
00996 }
00997
00998
00999
01000 KJanusWidget::IconListItem::IconListItem( QListBox *listbox, const QPixmap &pixmap,
01001 const QString &text )
01002 : QListBoxItem( listbox )
01003 {
01004 mPixmap = pixmap;
01005 if( mPixmap.isNull() )
01006 {
01007 mPixmap = defaultPixmap();
01008 }
01009 setText( text );
01010 mMinimumWidth = 0;
01011 }
01012
01013
01014 int KJanusWidget::IconListItem::expandMinimumWidth( int width )
01015 {
01016 mMinimumWidth = QMAX( mMinimumWidth, width );
01017 return mMinimumWidth;
01018 }
01019
01020
01021 const QPixmap &KJanusWidget::IconListItem::defaultPixmap()
01022 {
01023 static QPixmap *pix=0;
01024 if( !pix )
01025 {
01026 pix = new QPixmap( 32, 32 );
01027 QPainter p( pix );
01028 p.eraseRect( 0, 0, pix->width(), pix->height() );
01029 p.setPen( Qt::red );
01030 p.drawRect ( 0, 0, pix->width(), pix->height() );
01031 p.end();
01032
01033 QBitmap mask( pix->width(), pix->height(), true );
01034 mask.fill( Qt::black );
01035 p.begin( &mask );
01036 p.setPen( Qt::white );
01037 p.drawRect ( 0, 0, pix->width(), pix->height() );
01038 p.end();
01039
01040 pix->setMask( mask );
01041 }
01042 return *pix;
01043 }
01044
01045
01046 void KJanusWidget::IconListItem::paint( QPainter *painter )
01047 {
01048 QFontMetrics fm = painter->fontMetrics();
01049 int ht = fm.boundingRect( 0, 0, 0, 0, Qt::AlignCenter, text() ).height();
01050 int wp = mPixmap.width();
01051 int hp = mPixmap.height();
01052
01053 painter->drawPixmap( (mMinimumWidth-wp)/2, 5, mPixmap );
01054 if( !text().isEmpty() )
01055 {
01056 painter->drawText( 0, hp+7, mMinimumWidth, ht, Qt::AlignCenter, text() );
01057 }
01058 }
01059
01060 int KJanusWidget::IconListItem::height( const QListBox *lb ) const
01061 {
01062 if( text().isEmpty() )
01063 {
01064 return mPixmap.height();
01065 }
01066 else
01067 {
01068 int ht = lb->fontMetrics().boundingRect( 0, 0, 0, 0, Qt::AlignCenter, text() ).height();
01069 return (mPixmap.height() + ht + 10);
01070 }
01071 }
01072
01073
01074 int KJanusWidget::IconListItem::width( const QListBox *lb ) const
01075 {
01076 int wt = lb->fontMetrics().boundingRect( 0, 0, 0, 0, Qt::AlignCenter, text() ).width() + 10;
01077 int wp = mPixmap.width() + 10;
01078 int w = QMAX( wt, wp );
01079 return QMAX( w, mMinimumWidth );
01080 }
01081
01082
01083 void KJanusWidget::virtual_hook( int, void* )
01084 { }
01085
01086
01087
01088 void KJanusWidget::removePage( QWidget *page )
01089 {
01090 if (!d || !d->mPageToInt.contains(page))
01091 return;
01092
01093 int index = d->mPageToInt[page];
01094
01095 if ( mFace == TreeList )
01096 {
01097 QMap<QListViewItem*, QWidget *>::Iterator i;
01098 for( i = mTreeListToPageStack.begin(); i != mTreeListToPageStack.end(); ++i )
01099 if (i.data()==page)
01100 {
01101 delete i.key();
01102 mPageStack->removeWidget(page);
01103 mTreeListToPageStack.remove(i);
01104 d->mIntToTitle.remove(index);
01105 d->mPageToInt.remove(page);
01106 d->mIntToPage.remove(index);
01107 break;
01108 }
01109 }
01110 else if ( mFace == IconList )
01111 {
01112 QMap<QListBoxItem*, QWidget *>::Iterator i;
01113 for( i = mIconListToPageStack.begin(); i != mIconListToPageStack.end(); ++i )
01114 if (i.data()==page)
01115 {
01116 delete i.key();
01117 mPageStack->removeWidget(page);
01118 mIconListToPageStack.remove(i);
01119 d->mIntToTitle.remove(index);
01120 d->mPageToInt.remove(page);
01121 d->mIntToPage.remove(index);
01122 break;
01123 }
01124 }
01125 else
01126 {
01127 mTabControl->removePage(page);
01128 d->mPageToInt.remove(page);
01129 d->mIntToPage.remove(index);
01130 }
01131 }
01132
01133 QString KJanusWidget::pageTitle(int index) const
01134 {
01135 if (!d || !d->mIntToTitle.contains(index))
01136 return QString::null;
01137 else
01138 return d->mIntToTitle[index];
01139 }
01140
01141 QWidget *KJanusWidget::pageWidget(int index) const
01142 {
01143 if (!d || !d->mIntToPage.contains(index))
01144 return 0;
01145 else
01146 return d->mIntToPage[index];
01147 }
01148
01149 #include "kjanuswidget.moc"