lib Library API Documentation

kotooldockbase.cpp

00001 /*
00002  * This file is part of the KDE project
00003  * Copyright (C) 2000-2001 theKompany.com & Dave Marotti
00004  *
00005  * This program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * as published by the Free Software Foundation; either version 2
00008  * of the License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018  */
00019 #include <kdebug.h>
00020 
00021 #include <kdrawutil.h>
00022 #include <kconfig.h>
00023 #include <kapplication.h>
00024 
00025 #include <qbitmap.h>
00026 #include <qpainter.h>
00027 #include <qlayout.h>
00028 #include <qcursor.h>
00029 #include <qdrawutil.h>
00030 #include <qapplication.h>
00031 #include <qobjectlist.h>
00032 #include <qtabwidget.h>
00033 
00034 #include "kotooldockbase.h"
00035 #include "kotooldockmanager.h"
00036 #include "kotooldockmovemanager.h"
00037 
00038 /******************************************************************************/
00039 
00040 KoToolDockBaseBorder::KoToolDockBaseBorder( Position position, KoToolDockBase* parent, const char* name )
00041     : QWidget(parent,name)
00042 {
00043     connect(this,SIGNAL(resizeStart()),parent,SLOT(beginResize()));
00044     connect(this,SIGNAL(resizeStop()),parent,SLOT(stopResize()));
00045 
00046     pos = position;
00047     switch (pos) {
00048     case Left:
00049     case Right:
00050         setCursor(SizeHorCursor);
00051         setFixedWidth(3);
00052         break;
00053     case Top:
00054     case Bottom:
00055         setCursor(SizeVerCursor);
00056         setFixedHeight(3);
00057         break;
00058 
00059     case TopLeft:
00060     case BottomRight:
00061         setCursor(SizeFDiagCursor);
00062         setFixedSize(3,3);
00063         break;
00064     case TopRight:
00065     case BottomLeft:
00066         setCursor(SizeBDiagCursor);
00067         setFixedSize(3,3);
00068         break;
00069     }
00070 }
00071 
00072 void KoToolDockBaseBorder::paintEvent( QPaintEvent* /*ev*/ )
00073 {
00074     if (!parent() -> parent())
00075         return;
00076 
00077     QPainter p(this,this);
00078     int w = width()-1;
00079     int h = height()-1;
00080     switch (pos) {
00081     case Left:
00082         p.setPen(white);
00083         p.drawLine(0,0,0,h);
00084         break;
00085     case Right:
00086         p.setPen("gray30");
00087         p.drawLine(w,0,w,h);
00088         break;
00089     case Top:
00090         p.setPen(white);
00091         p.drawLine(0,0,w,0);
00092         break;
00093     case Bottom:
00094         p.setPen("gray30");
00095         p.drawLine(0,h,w,h);
00096         break;
00097 
00098     case TopLeft:
00099         p.setPen(white);
00100         p.drawLine(0,2,2,0);
00101         break;
00102     case BottomRight:
00103         p.setPen("gray30");
00104         p.drawLine(w,h-2,w-2,h);
00105         break;
00106     case TopRight:
00107         p.setPen("gray30");
00108         p.drawLine(w-2,0,w,2);
00109         break;
00110     case BottomLeft:
00111         p.setPen("gray30");
00112         p.drawLine(0,h-2,2,h);
00113         break;
00114     }
00115     p.end();
00116 }
00117 
00118 void KoToolDockBaseBorder::mousePressEvent( QMouseEvent* /*ev*/ )
00119 {
00120     ((KoToolDockBase*)parentWidget()) -> activate();
00121     emit resizeStart();
00122 }
00123 
00124 void KoToolDockBaseBorder::mouseReleaseEvent( QMouseEvent* /*ev*/ )
00125 {
00126     emit resizeStop();
00127 }
00128 
00129 KoToolDockBaseBorder::~KoToolDockBaseBorder()
00130 {
00131 }
00132 
00133 /******************************************************************************/
00134 
00135 KoToolDockBaseCaptionManager::KoToolDockBaseCaptionManager( KoToolDockBase* parent, const char* name )
00136     : QObject(parent,name)
00137 {
00138     m_pLeft = new KoToolDockBaseCaption(KoToolDockLeft,parent);
00139     m_pRight = new KoToolDockBaseCaption(KoToolDockRight,parent);
00140     m_pTop = new KoToolDockBaseCaption(KoToolDockTop,parent);
00141     m_pBottom = new KoToolDockBaseCaption(KoToolDockBottom,parent);
00142 
00143     connect(m_pLeft,SIGNAL(doClose()),SLOT(slotClose()));
00144     connect(m_pRight,SIGNAL(doClose()),SLOT(slotClose()));
00145     connect(m_pTop,SIGNAL(doClose()),SLOT(slotClose()));
00146     connect(m_pBottom,SIGNAL(doClose()),SLOT(slotClose()));
00147 
00148     connect(m_pLeft,SIGNAL(doStick(bool)),SLOT(slotStick(bool)));
00149     connect(m_pRight,SIGNAL(doStick(bool)),SLOT(slotStick(bool)));
00150     connect(m_pTop,SIGNAL(doStick(bool)),SLOT(slotStick(bool)));
00151     connect(m_pBottom,SIGNAL(doStick(bool)),SLOT(slotStick(bool)));
00152 
00153     connect(m_pLeft,SIGNAL(doLock(bool)),SLOT(slotLock(bool)));
00154     connect(m_pRight,SIGNAL(doLock(bool)),SLOT(slotLock(bool)));
00155     connect(m_pTop,SIGNAL(doLock(bool)),SLOT(slotLock(bool)));
00156     connect(m_pBottom,SIGNAL(doLock(bool)),SLOT(slotLock(bool)));
00157 
00158 
00159     m_pLeft -> hide();
00160     m_pRight -> hide();
00161     m_pTop -> hide();
00162     m_pBottom -> hide();
00163 }
00164 
00165 int KoToolDockBaseCaptionManager::captionHeight() const
00166 {
00167     return m_pTop -> height();
00168 }
00169 
00170 KoToolDockBaseCaptionManager::~KoToolDockBaseCaptionManager()
00171 {
00172 }
00173 
00174 void KoToolDockBaseCaptionManager::slotClose()
00175 {
00176     emit doClose();
00177 }
00178 
00179 void KoToolDockBaseCaptionManager::slotStick(bool f)
00180 {
00181     emit doStick(f);
00182     m_pLeft -> stick(f);
00183     m_pRight -> stick(f);
00184     m_pTop -> stick(f);
00185     m_pBottom -> stick(f);
00186 }
00187 
00188 void KoToolDockBaseCaptionManager::slotLock( bool f )
00189 {
00190     emit doLock( f );
00191     m_pLeft -> lock(f);
00192     m_pRight -> lock(f);
00193     m_pTop -> lock(f);
00194     m_pBottom -> lock(f);
00195 }
00196 
00197 KoToolDockBaseCaption* KoToolDockBaseCaptionManager::captionWidget( KoToolDockPosition pos )
00198 {
00199     switch (pos) {
00200     case KoToolDockLeft:
00201         return m_pLeft;
00202         break;
00203     case KoToolDockRight:
00204         return m_pRight;
00205         break;
00206     case KoToolDockTop:
00207         return m_pTop;
00208         break;
00209     case KoToolDockBottom:
00210         return m_pBottom;
00211         break;
00212     default:
00213         break;
00214     }
00215     return 0L;
00216 }
00217 
00218 void KoToolDockBaseCaptionManager::setView( KoToolDockPosition pos )
00219 {
00220     m_pLeft -> hide();
00221     m_pRight -> hide();
00222     m_pTop -> hide();
00223     m_pBottom -> hide();
00224 
00225     switch (pos) {
00226     case KoToolDockLeft:
00227         if(!kapp -> reverseLayout()) {
00228             m_pLeft -> show();
00229         } else {
00230             m_pRight -> show();
00231         }
00232         break;
00233     case KoToolDockRight:
00234         if(!kapp -> reverseLayout()) {
00235             m_pRight -> show();
00236         } else {
00237             m_pLeft -> show();
00238         }
00239         break;
00240     case KoToolDockTop:
00241         m_pTop -> show();
00242         break;
00243     case KoToolDockBottom:
00244         m_pBottom -> show();
00245         break;
00246     default:
00247         break;
00248     }
00249 }
00250 
00251 /******************************************************************************/
00252 
00253 KoToolDockBaseCaption::KoToolDockBaseCaption( KoToolDockPosition pos, KoToolDockBase* parent, const char* name )
00254     : QWidget(parent, name)
00255 {
00256     setCursor(ArrowCursor);
00257 
00258     QFont f(font());
00259     f.setPointSize(8);
00260     f.setBold(true);
00261     setFont(f);
00262 
00263     m_bPressed = false;
00264     m_bMove = false;
00265     position = pos;
00266 
00267     connect(this,SIGNAL(moveStart()),parent,SLOT(beginMove()));
00268     connect(this,SIGNAL(moveStop()),parent,SLOT(stopMove()));
00269 
00270     stickButton = new KoToolDockButton( this );
00271     closeButton = new KoToolDockButton( this );
00272 //     lockButton = new KoToolDockButton( this );
00273 
00274     connect( closeButton,SIGNAL(clicked()),SLOT(slotClose()));
00275     connect( stickButton,SIGNAL(toggled(bool)),SLOT(slotStick(bool)));
00276 //     connect( lockButton,  SIGNAL( toggled( bool ) ),  SLOT( slotLock( bool ) ) );
00277 
00278     stickButton -> setToggled(true);
00279 //     lockButton -> setToggled( true );
00280 
00281     const char* close_xpm[] = {
00282         "5 5 2 1",
00283         "# c black",
00284         ". c None",
00285         "#...#",
00286         ".#.#.",
00287         "..#..",
00288         ".#.#.",
00289         "#...#"};
00290 
00291     const char* stick_xpm[] = {
00292         "8 7 2 1",
00293         "# c black",
00294         ". c None",
00295         "...#....",
00296         "...##.##",
00297         "...#.#.#",
00298         "####...#",
00299         "...#.#.#",
00300         "...##.##",
00301         "...#...."};
00302 
00303     const char* lock_xmp[] = {
00304         "7 8 2 1",
00305         "# c black",
00306         ". c None",
00307         "..###..",
00308         "..#.#..",
00309         ".#####.",
00310         ".##.##.",
00311         ".#...#.",
00312         ".##.##.",
00313         ".#####.",
00314         "..###.."};
00315 
00316     stickButton -> setPixmap( stick_xpm );
00317     closeButton -> setPixmap( close_xpm );
00318 //     lockButton -> setPixmap( lock_xmp );
00319 
00320     if ( pos == KoToolDockTop || pos == KoToolDockBottom ) {
00321         setFixedHeight(14);
00322         setMinimumWidth(100);
00323         QHBoxLayout* layout = new QHBoxLayout(this,1,2);
00324         layout -> addStretch(1);
00325         //layout -> addWidget( lockButton );
00326         layout -> addWidget( stickButton );
00327         layout -> addWidget( closeButton );
00328 
00329     } else {
00330         setFixedWidth(14);
00331         setMinimumHeight(100);
00332         QVBoxLayout* layout = new QVBoxLayout(this,1,2);
00333         if ( pos == KoToolDockLeft ) {
00334             //layout -> addWidget( lockButton );
00335             layout -> addWidget(closeButton);
00336             layout -> addWidget(stickButton);
00337             layout -> addStretch(1);
00338         } else {
00339             layout -> addStretch(1);
00340             //layout -> addWidget( lockButton );
00341             layout -> addWidget(stickButton);
00342             layout -> addWidget(closeButton);
00343         }
00344     }
00345 
00346 }
00347 
00348 KoToolDockBaseCaption::~KoToolDockBaseCaption()
00349 {
00350 }
00351 
00352 void KoToolDockBaseCaption::slotClose()
00353 {
00354     emit doClose();
00355 }
00356 
00357 void KoToolDockBaseCaption::slotStick(bool f)
00358 {
00359     emit doStick(f);
00360 }
00361 
00362 void KoToolDockBaseCaption::slotLock( bool f )
00363 {
00364     emit doLock( f );
00365 }
00366 
00367 void KoToolDockBaseCaption::stick(bool f)
00368 {
00369     stickButton -> setDown(f);
00370 }
00371 
00372 void KoToolDockBaseCaption::lock( bool f )
00373 {
00374     lockButton -> setDown( f );
00375 }
00376 
00377 void KoToolDockBaseCaption::paintEvent( QPaintEvent* )
00378 {
00379     QPainter p(this,this);
00380 
00381     int w;
00382     int h;
00383     bool f = false;
00384     int dl = 1;
00385 
00386     if ( position == KoToolDockTop || position == KoToolDockBottom ) {
00387         w = width();
00388         h = height();
00389     } else {
00390         w = height();
00391         h = width();
00392         if ( position == KoToolDockLeft ) {
00393             p.rotate(-90);
00394             p.translate(-w,0);
00395         } else {
00396             p.rotate(90);
00397             p.translate(0,-h);
00398             f = true;
00399             dl++;
00400         }
00401     }
00402 
00403     QString t(parentWidget() -> caption());
00404     int tw = w-37-3;
00405     int textw = p.fontMetrics().width(t);
00406     int lw = 10 + QMAX(0,tw-textw);
00407 
00408     p.drawText(3, 0, w-40, h, AlignLeft | AlignVCenter, t);
00409 
00410     QPoint p1(w-lw-25, (h-5)/2+dl);
00411     QPoint p2(p1);
00412     p1 += QPoint(lw-5,0);
00413 
00414     qDrawShadeLine( &p, p1, p2, colorGroup(), f, 1, 0 );
00415     p1 += QPoint(0,3);
00416     p2 += QPoint(0,3);
00417     qDrawShadeLine( &p, p1, p2, colorGroup(), f, 1, 0 );
00418 
00419     p.end();
00420 }
00421 
00422 void KoToolDockBaseCaption::mouseMoveEvent( QMouseEvent* ev )
00423 {
00424     if (m_bPressed) {
00425         QPoint p = m_ppoint;
00426         p -= ev -> pos();
00427         if (p.manhattanLength() > 2 && !m_bMove ) {
00428             m_bMove = true;
00429             emit moveStart();
00430         }
00431     }
00432 }
00433 
00434 void KoToolDockBaseCaption::mousePressEvent( QMouseEvent* ev )
00435 {
00436     ((KoToolDockBase*)parentWidget()) -> activate();
00437     m_bPressed = true;
00438     m_ppoint = ev -> pos();
00439 }
00440 
00441 void KoToolDockBaseCaption::mouseReleaseEvent( QMouseEvent* )
00442 {
00443     m_bPressed = false;
00444     if (m_bMove) {
00445         m_bMove = false;
00446         emit moveStop();
00447     }
00448 }
00449 
00450 
00451 
00452 /******************************************************************************/
00453 
00454 void KoToolDockSnap::clear()
00455 {
00456     snaps.clear();
00457 }
00458 
00459 void KoToolDockSnap::set( KoToolDockPosition pos, QWidget* widget )
00460 {
00461     snaps.replace(pos,widget);
00462 }
00463 
00464 QWidget* KoToolDockSnap::get( KoToolDockPosition pos )
00465 {
00466     return snaps[pos];
00467 }
00468 
00469 
00470 /******************************************************************************/
00471 
00472 KoToolDockButton::KoToolDockButton( QWidget* parent, const char* name )
00473     : QFrame(parent,name)
00474 {
00475     setFixedSize(12,12);
00476     tg = false;
00477     down = false;
00478     isin = false;
00479     mdown = false;
00480     pixmap = 0L;
00481 }
00482 
00483 KoToolDockButton::~KoToolDockButton()
00484 {
00485     if (pixmap)
00486         delete pixmap;
00487 }
00488 
00489 void KoToolDockButton::paintEvent( QPaintEvent* ev )
00490 {
00491     QFrame::paintEvent(ev);
00492     if (!pixmap)
00493         return;
00494 
00495     QPainter p(this,this);
00496     p.drawPixmap((width()-pixmap -> width())/2,(height()-pixmap -> height())/2,*pixmap);
00497     p.end();
00498 }
00499 
00500 void KoToolDockButton::mousePressEvent( QMouseEvent* )
00501 {
00502     mdown = true;
00503     setFrameStyle(Panel|Sunken);
00504 }
00505 
00506 void KoToolDockButton::mouseReleaseEvent( QMouseEvent* )
00507 {
00508     mdown = false;
00509     if (tg) {
00510         if (isin) {
00511             setDown(!down);
00512             emit toggled(down);
00513         }  else {
00514             setFrameStyle( NoFrame );
00515         }
00516     }  else {
00517         setFrameStyle( isin ? Panel|Raised : NoFrame );
00518     }
00519 
00520     if (isin)
00521         emit clicked();
00522 }
00523 
00524 void KoToolDockButton::enterEvent( QEvent* )
00525 {
00526     isin = true;
00527     if (!down && !mdown)
00528         setFrameStyle(Panel|Raised);
00529 }
00530 
00531 void KoToolDockButton::leaveEvent( QEvent* )
00532 {
00533     isin = false;
00534     if (!down && !mdown)
00535         setFrameStyle(NoFrame);
00536 }
00537 
00538 void KoToolDockButton::setToggled( bool f )
00539 {
00540     tg = f;
00541 }
00542 
00543 void KoToolDockButton::setDown( bool f )
00544 {
00545     down = f;
00546     setFrameStyle(down?Panel|Sunken:NoFrame);
00547 }
00548 
00549 void KoToolDockButton::setPixmap( const QPixmap& p )
00550 {
00551     pixmap = p.isNull() ? 0L : new QPixmap(p);
00552     repaint();
00553 }
00554 
00555 /***************************************************************************/
00556 
00557 KoToolDockBase::KoToolDockBase( QWidget* parent, const char* name )
00558     : QWidget(parent,name,
00559               WStyle_Tool | WStyle_StaysOnTop | WStyle_Customize | WResizeNoErase | WRepaintNoErase)
00560 {
00561     QFont f;
00562     f.setPointSize(8);
00563     setFont(f);
00564 
00565     stick = false;
00566     lock = true;
00567     hStatus = hnone;
00568 
00569     connect(&hideTimer,SIGNAL(timeout()),SLOT(slotHideTimeOut()));
00570     connect(&hideProcessTimer,SIGNAL(timeout()),SLOT(slotHideProcessTimeOut()));
00571 
00572     mrManager = new KoToolDockMoveManager;
00573     m_pView = parent;
00574 
00575     connect(mrManager,SIGNAL(sizeChanged()),SLOT(sizeChanged()));
00576     connect(mrManager,SIGNAL(positionChanged()),SLOT(positionChanged()));
00577     connect(mrManager,
00578             SIGNAL(fixPosition(int&, int&, int&, int&)),
00579             SLOT(fixPosition(int&, int&, int&, int&)));
00580 
00581     connect(mrManager,
00582             SIGNAL(fixSize(int&, int&, int&, int&)),
00583             SLOT(fixSize(int&, int&, int&, int&)));
00584 
00585     m_pLayout = new QGridLayout(this,5,5,0,0);
00586     m_pLayout -> setResizeMode(QLayout::Minimum);
00587 
00588     m_pBaseLayout = new QGridLayout(3,3);
00589     m_pBaseLayout -> setResizeMode(QLayout::Minimum);
00590 
00591     m_pBaseLayout -> setRowStretch(1,10);
00592     m_pBaseLayout -> setColStretch(1,10);
00593 
00594     m_pBorderLeft = new KoToolDockBaseBorder(KoToolDockBaseBorder::Left,this);
00595     m_pBorderRight = new KoToolDockBaseBorder(KoToolDockBaseBorder::Right,this);
00596     m_pBorderTop = new KoToolDockBaseBorder(KoToolDockBaseBorder::Top,this);
00597     m_pBorderBottom = new KoToolDockBaseBorder(KoToolDockBaseBorder::Bottom,this);
00598 
00599     m_pBorderTopLeft = new KoToolDockBaseBorder(KoToolDockBaseBorder::TopLeft,this);
00600     m_pBorderTopRight = new KoToolDockBaseBorder(KoToolDockBaseBorder::TopRight,this);
00601     m_pBorderBottomRight = new KoToolDockBaseBorder(KoToolDockBaseBorder::BottomRight,this);
00602     m_pBorderBottomLeft = new KoToolDockBaseBorder(KoToolDockBaseBorder::BottomLeft,this);
00603 
00604     m_pCaptionManager = new KoToolDockBaseCaptionManager(this);
00605     connect(m_pCaptionManager,SIGNAL(doClose()),SLOT(hide()));
00606     connect(m_pCaptionManager,SIGNAL(doStick(bool)),SLOT(slotStick(bool)));
00607     connect( m_pCaptionManager, SIGNAL( doLock( bool ) ), SLOT( slotLock ( bool ) ) );
00608 
00609     m_pLayout -> addWidget(m_pBorderTopLeft,0,0);
00610     m_pLayout -> addMultiCellWidget(m_pBorderTop,0,0,1,3);
00611     m_pLayout -> addWidget(m_pBorderTopRight,0,4);
00612 
00613     m_pLayout -> addMultiCellWidget(m_pCaptionManager -> captionWidget(KoToolDockTop),1,1,1,3);
00614 
00615     m_pLayout -> addMultiCellWidget(m_pBorderLeft,1,3,0,0);
00616     m_pLayout -> addMultiCellWidget(m_pCaptionManager -> captionWidget(KoToolDockLeft),1,3,1,1);
00617     m_pLayout -> addLayout(m_pBaseLayout,2,2);
00618     m_pLayout -> addMultiCellWidget(m_pCaptionManager -> captionWidget(KoToolDockRight),1,3,3,3);
00619     m_pLayout -> addMultiCellWidget(m_pBorderRight,1,3,4,4);
00620 
00621     m_pLayout -> addMultiCellWidget(m_pCaptionManager -> captionWidget(KoToolDockBottom),3,3,1,3);
00622 
00623     m_pLayout -> addWidget(m_pBorderBottomLeft,4,0);
00624     m_pLayout -> addMultiCellWidget(m_pBorderBottom,4,4,1,3);
00625     m_pLayout -> addWidget(m_pBorderBottomRight,4,4);
00626 
00627     m_pCaptionManager -> setView(KoToolDockTop);
00628 
00629 }
00630 
00631 void KoToolDockBase::restore()
00632 {
00633 
00634     KApplication *app = KApplication::kApplication();
00635     Q_ASSERT(app);
00636     KConfig * cfg = app -> config() ;
00637     Q_ASSERT( cfg );
00638 
00639     cfg -> setGroup( QString( "ToolDock-" ) + name() );
00640 
00641     int x, y, w, h;
00642     x = cfg -> readNumEntry( "x", 0 );
00643     y = cfg -> readNumEntry( "y", 0 );
00644     w = cfg -> readNumEntry( "w", 10 );
00645     h = cfg -> readNumEntry( "h",  10 );
00646 
00647 
00648 //     kdDebug() << "Before fix dims for docker " << name() << " to x,y " 
00649 //        << x << ", " << y
00650 //        << " and w,h " << w << ", " << h 
00651 //        << "\n";
00652 
00653 
00654 //     fixPosition( x, y, w, h );
00655 //    fixSize( x, y, w, h );
00656 
00657     QPoint p = QPoint(x, y);
00658     QSize s = QSize(w ,h);
00659 
00660 //     kdDebug() << " After fix dims for docker " << name() << " to x,y " 
00661 //        << p.x() << ", " << p.y() 
00662 //        << " and w,h " << s.width() << ", " << s.height()
00663 //        << " inside parent " << m_pView -> name()
00664 //        << " with dimensions " << m_pView -> x() << ","
00665 //        << m_pView -> y() << " : " 
00666 //        << m_pView -> width() << ", " << m_pView -> height()
00667 //        << "\n";
00668         
00669     move( p );
00670     resize( s );
00671 
00672     makeVisible( cfg -> readBoolEntry( "visible", false ) );
00673 
00674     slotStick( cfg -> readBoolEntry( "stick", false ) );
00675     slotLock( cfg -> readBoolEntry( "lock", true ) );
00676 }
00677 
00678 
00679 KoToolDockBase::~KoToolDockBase()
00680 {
00681     KApplication *app = KApplication::kApplication();
00682     Q_ASSERT(app);
00683     KConfig * cfg = app -> config() ;
00684     Q_ASSERT( cfg );
00685     cfg -> setGroup( QString( "ToolDock-" ) + name() );
00686     cfg -> writeEntry( "x",  x() );
00687     cfg -> writeEntry( "y",  y() );
00688     cfg -> writeEntry( "w",  width() );
00689     cfg -> writeEntry( "h",  width() );
00690     cfg -> writeEntry( "visible",  isVisible() );
00691     cfg -> writeEntry( "lock",  isLocked() );
00692     cfg -> writeEntry( "stick", isStick() );
00693 
00694     // XXX: write current snap? Or does the docker
00695     // resnap based on position?
00696 
00697 
00698 }
00699 
00700 void KoToolDockBase::updateCaption()
00701 {
00702     m_pCaptionManager -> setView(getCaptionPos());
00703 }
00704 
00705 KoToolDockPosition KoToolDockBase::getCaptionPos(bool* f)
00706 {
00707     bool l = snaps.get(KoToolDockLeft);
00708     bool r = snaps.get(KoToolDockRight);
00709     bool t = snaps.get(KoToolDockTop);
00710     bool b = snaps.get(KoToolDockBottom);
00711     if (f)
00712         *f = true;
00713 
00714     if (l && r && t && b)
00715         return KoToolDockTop;
00716 
00717     if (l && r && t)
00718         return KoToolDockBottom;
00719 
00720     if (l && r && b)
00721         return KoToolDockTop;
00722 
00723     if (l)
00724         return KoToolDockRight;
00725 
00726     if (r)
00727         return KoToolDockLeft;
00728 
00729     if (t)
00730         return KoToolDockBottom;
00731 
00732     if (b)
00733         return KoToolDockTop;
00734 
00735     if (f)
00736         *f = false;
00737 
00738     return KoToolDockTop;
00739 }
00740 
00741 
00742 void KoToolDockBase::slotStick(bool f)
00743 {
00744     stick = f;
00745 }
00746 
00747 void KoToolDockBase::slotLock( bool f )
00748 {
00749     lock = f;
00750 }
00751 
00752 
00753 void KoToolDockBase::show()
00754 {
00755      snaps.clear();
00756 
00757      QPoint p(x(),y());
00758 
00759      if ( QABS(m_pView -> height() - (p.y() + height())) < 17 ) {
00760          p.setY(m_pView -> height() - height());
00761          snaps.set(KoToolDockBottom, m_pView);
00762      }
00763      if ( QABS(p.y()) < 17 ) {
00764          p.setY(0);
00765          snaps.set(KoToolDockTop, m_pView);
00766      }
00767      if ( QABS(p.x()) < 17 ) {
00768          p.setX(0);
00769          snaps.set(KoToolDockLeft, m_pView);
00770      }
00771      if ( QABS(m_pView -> width() - (p.x() + width())) < 17 ) {
00772          p.setX(m_pView -> width() - width());
00773          snaps.set(KoToolDockRight, m_pView);
00774      }
00775      updateCaption();
00776 
00777      QWidget::show();
00778 
00779 
00780      emit visibleChange(true);
00781 }
00782 
00783 void KoToolDockBase::hide()
00784 {
00785     QWidget::hide();
00786     emit visibleChange(false);
00787 }
00788 
00789 void KoToolDockBase::makeVisible(bool v)
00790 {
00791     if (v)
00792         show();
00793     else
00794         hide();
00795 }
00796 
00797 void KoToolDockBase::setView( QWidget* w )
00798 {
00799     if (w -> parentWidget() != this)
00800         w -> reparent(this,QPoint(0, 0), true);
00801     m_pBaseLayout -> addWidget(w, 1, 1);
00802 }
00803 
00804 void KoToolDockBase::resizeEvent( QResizeEvent* ev )
00805 {
00806     QWidget::resizeEvent(ev);
00807 
00808     int w = width();
00809     int h = height();
00810 
00811     QPoint p(x(),y());
00812     if ((m_pView -> height() - (p.y()+h) < 17) || (m_pView -> height() < (p.y()+h))) {
00813         p.setY(m_pView -> height() - h);
00814     }
00815     if (p.y() < 17 || p.y() < 0) {
00816         p.setY(0);
00817     }
00818     if (p.x() < 17 || p.x() < 0) {
00819         p.setX(0);
00820     }
00821     if ((m_pView -> width() - (p.x()+w) < 17) || (m_pView -> width() < (p.x()+w))) {
00822         p.setX(m_pView -> width() - w);
00823     }
00824     move(p);
00825 
00826     QRegion r1(2,0,w-4,h);
00827     QRegion r2(0,2,w,h-4);
00828     QRegion r3(1,1,w-2,h-2);
00829     setMask(r1.unite(r2).unite(r3));
00830 }
00831 
00832 void KoToolDockBase::beginResize()
00833 {
00834     KoToolDockBaseBorder* b = (KoToolDockBaseBorder*)sender();
00835     switch (b -> position()) {
00836     case KoToolDockBaseBorder::Left:
00837         mrManager -> doXResize(this,true);
00838         break;
00839     case KoToolDockBaseBorder::Right:
00840         mrManager -> doXResize(this,false);
00841         break;
00842     case KoToolDockBaseBorder::Top:
00843         mrManager -> doYResize(this,true);
00844         break;
00845     case KoToolDockBaseBorder::Bottom:
00846         mrManager -> doYResize(this,false);
00847         break;
00848     case KoToolDockBaseBorder::TopLeft:
00849         mrManager -> doXYResize(this,true,true);
00850         break;
00851     case KoToolDockBaseBorder::BottomRight:
00852         mrManager -> doXYResize(this,false,false);
00853         break;
00854     case KoToolDockBaseBorder::TopRight:
00855         mrManager -> doXYResize(this,false,true);
00856         break;
00857     case KoToolDockBaseBorder::BottomLeft:
00858         mrManager -> doXYResize(this,true,false);
00859         break;
00860     }
00861 }
00862 
00863 void KoToolDockBase::stopResize()
00864 {
00865     mrManager -> stop();
00866     resize(mrManager -> geometry().size());
00867     move(parentWidget() -> mapFromGlobal(mrManager -> geometry().topLeft()));
00868     updateCaption();
00869 }
00870 
00871 void KoToolDockBase::beginMove()
00872 {
00873     mrManager -> doMove(this);
00874 }
00875 
00876 void KoToolDockBase::stopMove()
00877 {
00878     mrManager -> stop();
00879     move(parentWidget() -> mapFromGlobal(mrManager -> geometry().topLeft()));
00880     updateCaption();
00881 }
00882 
00883 void KoToolDockBase::positionChanged()
00884 {
00885     snaps.clear();
00886 
00887     QPoint p(mrManager -> x(),mrManager -> y());
00888     p = m_pView -> mapFromGlobal(p);
00889 
00890     if ( QABS(m_pView -> height() - (p.y()+height())) < 17 ) {
00891         p.setY(m_pView -> height() - height());
00892         snaps.set(KoToolDockBottom,m_pView);
00893     }
00894     if ( QABS(p.y()) < 17 ) {
00895         p.setY(0);
00896         snaps.set(KoToolDockTop,m_pView);
00897     }
00898     if ( QABS(p.x()) < 17 ) {
00899         p.setX(0);
00900         snaps.set(KoToolDockLeft,m_pView);
00901     }
00902     if ( QABS(m_pView -> width() - (p.x()+width())) < 17 ) {
00903         p.setX(m_pView -> width() - width());
00904         snaps.set(KoToolDockRight,m_pView);
00905     }
00906     mrManager -> move(m_pView -> mapToGlobal(p));
00907 }
00908 
00909 void KoToolDockBase::sizeChanged()
00910 {
00911     snaps.clear();
00912 
00913     QPoint p(mrManager -> x(),mrManager -> y());
00914     p = m_pView -> mapFromGlobal(p);
00915     QRect r(p,QSize(mrManager -> width(),mrManager -> height()));
00916 
00917     if ( QABS(m_pView -> height() - r.bottom()) < 17 ) {
00918         r.setHeight(m_pView -> height() - r.y());
00919         snaps.set(KoToolDockBottom,m_pView);
00920     }
00921     if ( QABS(r.y()) < 17 ) {
00922         r.setY(0);
00923         snaps.set(KoToolDockTop,m_pView);
00924     }
00925     if ( QABS(r.x()) < 17 ) {
00926         r.setX(0);
00927         snaps.set(KoToolDockLeft,m_pView);
00928     }
00929     if ( QABS(m_pView -> width() - r.right()) < 17 ) {
00930         r.setWidth(m_pView -> width() - r.x());
00931         snaps.set(KoToolDockRight,m_pView);
00932     }
00933 
00934     r.moveTopLeft(m_pView -> mapToGlobal(r.topLeft()));
00935     mrManager -> setGeometry(r);
00936 }
00937 
00938 void KoToolDockBase::fixPosition(int& x, int& y, int& w, int& h)
00939 {
00940     QRect r(m_pView -> mapToGlobal(QPoint(0,0)),m_pView -> size());
00941     x = QMIN(QMAX(r.x(),x),r.right()-w+1);
00942     y = QMIN(QMAX(r.y(),y),r.bottom()-h+1);
00943 }
00944 
00945 void KoToolDockBase::fixSize(int& x, int& y, int& w, int& h)
00946 {
00947     QRect r(m_pView -> mapToGlobal(QPoint(0,0)),m_pView -> size());
00948     if (r.x()>x) {
00949         w -= r.x()-x;
00950         x = r.x();
00951     }
00952     if (r.y()>y) {
00953         h -= r.y()-y;
00954         y = r.y();
00955     }
00956     if (x+w>r.right()) {
00957         w -= x + w -r.right()-1;
00958     }
00959     if (y+h>r.bottom()) {
00960         h -= y + h -r.bottom()-1;
00961     }
00962 }
00963 
00964 void KoToolDockBase::mousePressEvent( QMouseEvent* )
00965 {
00966     activate();
00967 }
00968 
00969 void KoToolDockBase::activate()
00970 {
00971     raise();
00972 }
00973 
00974 
00975 void KoToolDockBase::mouseStatus(bool f)
00976 {
00977     if (!isVisible())
00978         return;
00979 
00980     if (f || mrManager -> isWorking()) {
00981         hideTimer.stop();
00982         if (hStatus == hstarthide)
00983             hStatus = hnone;
00984     } else {
00985         if (hStatus!=hnone || stick)
00986             return;
00987 
00988         bool f;
00989         hideDirection = getCaptionPos(&f);
00990         switch (hideDirection) {
00991         case KoToolDockLeft:
00992             hideDirection = KoToolDockRight;
00993             break;
00994         case KoToolDockRight:
00995             hideDirection = KoToolDockLeft;
00996             break;
00997         case KoToolDockTop:
00998             hideDirection = KoToolDockBottom;
00999             break;
01000         case KoToolDockBottom:
01001             hideDirection = KoToolDockTop;
01002             break;
01003         default:
01004             break;
01005         }
01006 
01007         if (f) {
01008             hStatus = hstarthide;
01009             hideTimer.start(1000,true);
01010         }
01011     }
01012 }
01013 
01014 void KoToolDockBase::slotHideTimeOut()
01015 {
01016     m_pBaseLayout -> setEnabled(false);
01017     m_pLayout -> setEnabled(false);
01018 
01019     hpixmap = new QPixmap(QPixmap::grabWidget(this));
01020     hminsize = minimumSize();
01021     hmaxsize = maximumSize();
01022     hsize = size();
01023 
01024     int m = m_pCaptionManager -> captionHeight()+3;
01025 
01026     int wb = 0;
01027     switch (hideDirection) {
01028     case KoToolDockLeft:
01029     case KoToolDockRight:
01030         wb = width();
01031         break;
01032     case KoToolDockTop:
01033     case KoToolDockBottom:
01034         wb = height();
01035         break;
01036     default:
01037         break;
01038     }
01039     hdx = QMAX((wb-m)/50,1);
01040     hStatus = hprocesshide;
01041     setFixedSize(size());
01042 
01043     QObjectList* ch = (QObjectList*)children();
01044     for (QObject* o = ch -> first();o;o=ch -> next())
01045         if (o -> isWidgetType())
01046             ((QWidget*)o) -> hide();
01047 
01048     hideProcessTimer.start(1);
01049 }
01050 
01051 void KoToolDockBase::slotHideProcessTimeOut()
01052 {
01053     QPoint p(pos());
01054     QSize s(size());
01055     int z;
01056     int m = m_pCaptionManager -> captionHeight()+3;
01057 
01058     switch (hideDirection) {
01059     case KoToolDockLeft:
01060         s.setWidth(QMIN(QMAX(s.width()-hdx,m),hsize.width()));
01061         break;
01062     case KoToolDockRight:
01063         z = s.width();
01064         s.setWidth(QMIN(QMAX(s.width()-hdx,m),hsize.width()));
01065         p.setX(p.x()+(z-s.width()));
01066         break;
01067     case KoToolDockTop:
01068         s.setHeight(QMIN(QMAX(s.height()-hdx,m),hsize.height()));
01069         break;
01070     case KoToolDockBottom:
01071         z = s.height();
01072         s.setHeight(QMIN(QMAX(s.height()-hdx,m),hsize.height()));
01073         p.setY(p.y()+(z-s.height()));
01074         break;
01075     default:
01076         break;
01077     }
01078     setFixedSize(s);
01079     move(p);
01080 
01081     if (s.height()==m || s.width()==m)
01082         hideProcessStop();
01083 
01084     if (s.height()==hsize.height() && s.width()==hsize.width())
01085         showProcessStop();
01086 }
01087 
01088 void KoToolDockBase::hideProcessStop()
01089 {
01090     hideProcessTimer.stop();
01091     hStatus = hdonehide;
01092 }
01093 
01094 void KoToolDockBase::paintEvent( QPaintEvent* )
01095 {
01096     if (!(hStatus==hprocesshide||hStatus==hdonehide||hStatus==hprocessshow))
01097         return;
01098 
01099     QPainter p(this,this);
01100     switch (hideDirection) {
01101     case KoToolDockLeft:
01102         p.drawPixmap(width() - hpixmap -> width(),0,*hpixmap);
01103         break;
01104     case KoToolDockRight:
01105     case KoToolDockBottom:
01106         p.drawPixmap(0,0,*hpixmap);
01107         break;
01108     case KoToolDockTop:
01109         p.drawPixmap(0,height() - hpixmap -> height(),*hpixmap);
01110         break;
01111     default:
01112         break;
01113     }
01114     p.end();
01115 }
01116 
01117 void KoToolDockBase::enterEvent( QEvent* )
01118 {
01119     if (hStatus == hdonehide) {
01120         hStatus = hprocessshow;
01121         hdx = -2*hdx;
01122         hideProcessTimer.start(1);
01123     }
01124 }
01125 
01126 void KoToolDockBase::showProcessStop()
01127 {
01128     hideProcessTimer.stop();
01129     hStatus = hnone;
01130 
01131     QObjectList* ch = (QObjectList*)children();
01132     for (QObject* o = ch -> first(); o; o = ch -> next())
01133         if (o -> isWidgetType() && !o -> isA("KoToolDockBaseCaption"))
01134             ((QWidget*)o) -> show();
01135 
01136     updateCaption();
01137     setMinimumSize(hminsize);
01138     setMaximumSize(hmaxsize);
01139     delete hpixmap;
01140 
01141     m_pBaseLayout -> setEnabled(true);
01142     m_pLayout -> setEnabled(true);
01143 
01144     hsize.setWidth(hsize.width() + 1);
01145     resize(hsize);
01146 
01147     hsize.setWidth(hsize.width() - 1);
01148     resize(hsize);
01149 }
01150 
01151 /*********************************************************************************************/
01152 
01153 KoTabbedToolDock::KoTabbedToolDock( QWidget* parent, const char* name )
01154     : KoToolDockBase ( parent, name )
01155 {
01156     QFont f;
01157     f.setPointSize(8);
01158     setFont(f);
01159 
01160     setView( m_tabwidget = new QTabWidget( this ) );
01161     m_tabwidget -> setBaseSize( 175, 125 );
01162 
01163 }
01164 
01165 KoTabbedToolDock::~KoTabbedToolDock()
01166 {
01167     delete m_tabwidget;
01168 }
01169 
01170 void KoTabbedToolDock::plug (QWidget* w)
01171 {
01172     m_tabwidget-> addTab( w , w -> caption());
01173 }
01174 
01175 void KoTabbedToolDock::unplug(QWidget *w)
01176 {
01177     m_tabwidget -> removePage(w);
01178 }
01179 
01180 void KoTabbedToolDock::showPage(QWidget *w)
01181 {
01182     m_tabwidget-> showPage(w);
01183 }
01184 
01185 #include "kotooldockbase.moc"
KDE Logo
This file is part of the documentation for lib Library Version 1.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Feb 13 09:40:13 2006 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003