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