00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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* )
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* )
00119 {
00120 ((KoToolDockBase*)parentWidget()) -> activate();
00121 emit resizeStart();
00122 }
00123
00124 void KoToolDockBaseBorder::mouseReleaseEvent( QMouseEvent* )
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
00273
00274 connect( closeButton,SIGNAL(clicked()),SLOT(slotClose()));
00275 connect( stickButton,SIGNAL(toggled(bool)),SLOT(slotStick(bool)));
00276
00277
00278 stickButton -> setToggled(true);
00279
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
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
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
00335 layout -> addWidget(closeButton);
00336 layout -> addWidget(stickButton);
00337 layout -> addStretch(1);
00338 } else {
00339 layout -> addStretch(1);
00340
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
00649
00650
00651
00652
00653
00654
00655
00656
00657 QPoint p = QPoint(x, y);
00658 QSize s = QSize(w ,h);
00659
00660
00661
00662
00663
00664
00665
00666
00667
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
00695
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"