00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef KDOCKWIDGET_H
00047 #define KDOCKWIDGET_H
00048
00049 #define _KDOCKWIDGET_2_2_
00050
00051 #include <qpoint.h>
00052 #include <qptrlist.h>
00053 #include <qframe.h>
00054 #include <qdom.h>
00055 #include <qtabwidget.h>
00056
00057 #ifndef NO_KDE2
00058 #include <kmainwindow.h>
00059 #include <netwm_def.h>
00060 #undef EXPORT_DOCKCLASS
00061 #define EXPORT_DOCKCLASS
00062 #else
00063 #include <qmainwindow.h>
00064 #include "exportdockclass.h"
00065 #include "dummykmainwindow.h"
00066 #endif
00067
00068 class KDockSplitter;
00069 class KDockManager;
00070 class KDockMoveManager;
00071 class KDockWidget;
00072 class KDockButton_Private;
00073 class KDockWidgetPrivate;
00074 class KDockWidgetHeaderPrivate;
00075 class KDockArea;
00076
00077 class QObjectList;
00078 class QPopupMenu;
00079 class QVBoxLayout;
00080 class QHBoxLayout;
00081 class QPixmap;
00082
00083 #ifndef NO_KDE2
00084 class KToolBar;
00085 class KConfig;
00086 #else
00087 class QToolBar;
00088 #endif
00089
00090 class KDockContainer;
00091
00099 class KDockWidgetAbstractHeader : public QFrame
00100 {
00101 Q_OBJECT
00102 public:
00103
00110 KDockWidgetAbstractHeader( KDockWidget* parent, const char* name = 0L );
00111
00115 virtual ~KDockWidgetAbstractHeader(){};
00116
00120 virtual void setTopLevel( bool ){};
00121
00122 #ifndef NO_KDE2
00123
00126 virtual void saveConfig( KConfig* ){};
00127
00131 virtual void loadConfig( KConfig* ){};
00132 #endif
00133
00134 protected:
00135 virtual void virtual_hook( int id, void* data );
00136 private:
00137 class KDockWidgetAbstractHeaderPrivate;
00138 KDockWidgetAbstractHeaderPrivate *d;
00139 };
00140
00148 class KDockWidgetAbstractHeaderDrag : public QFrame
00149 {
00150 Q_OBJECT
00151 public:
00152
00160 KDockWidgetAbstractHeaderDrag( KDockWidgetAbstractHeader* parent,
00161 KDockWidget* dock, const char* name = 0L );
00162
00166 virtual ~KDockWidgetAbstractHeaderDrag(){};
00167
00171 KDockWidget* dockWidget() const { return dw; }
00172
00173 private:
00177 KDockWidget* dw;
00178 protected:
00179 virtual void virtual_hook( int id, void* data );
00180 private:
00181 class KDockWidgetAbstractHeaderDragPrivate;
00182 KDockWidgetAbstractHeaderDragPrivate *d;
00183 };
00184
00193 class KDockWidgetHeaderDrag : public KDockWidgetAbstractHeaderDrag
00194 {
00195 Q_OBJECT
00196 public:
00197
00205 KDockWidgetHeaderDrag( KDockWidgetAbstractHeader* parent, KDockWidget* dock,
00206 const char* name = 0L );
00207
00211 virtual ~KDockWidgetHeaderDrag(){};
00212
00213 protected:
00214
00218 virtual void paintEvent( QPaintEvent* );
00219
00220 protected:
00221 virtual void virtual_hook( int id, void* data );
00222 private:
00223 class KDockWidgetHeaderDragPrivate;
00224 KDockWidgetHeaderDragPrivate *d;
00225 };
00226
00234 class KDockWidgetHeader : public KDockWidgetAbstractHeader
00235 {
00236 Q_OBJECT
00237 public:
00238
00245 KDockWidgetHeader( KDockWidget* parent, const char* name = 0L );
00246
00250 virtual ~KDockWidgetHeader(){};
00251
00257 virtual void setTopLevel( bool t);
00258
00264 void setDragPanel( KDockWidgetHeaderDrag* nd );
00265
00266 bool dragEnabled() const;
00267 void setDragEnabled(bool b);
00269 void showUndockButton(bool show);
00270
00272 void forceCloseButtonHidden(bool enable=true);
00273 #ifndef NO_KDE2
00274
00279 virtual void saveConfig( KConfig* c);
00280
00286 virtual void loadConfig( KConfig* c);
00287 #endif
00288
00289
00290
00291
00292
00293
00294 void addButton(KDockButton_Private*);
00295
00296
00297
00298
00299
00300
00301 void removeButton(KDockButton_Private*);
00302
00303
00304
00305 protected slots:
00309 void slotStayClicked();
00310
00311 protected:
00312
00316 QHBoxLayout* layout;
00317
00321 KDockButton_Private* closeButton;
00322
00326 KDockButton_Private* stayButton;
00327
00331 KDockButton_Private* dockbackButton;
00332
00336 KDockWidgetHeaderDrag* drag;
00337
00338 protected:
00339 virtual void virtual_hook( int id, void* data );
00340 private:
00341 KDockWidgetHeaderPrivate *d;
00342 };
00343
00352 class EXPORT_DOCKCLASS KDockTabGroup : public QTabWidget
00353 {
00354 Q_OBJECT
00355 public:
00359 KDockTabGroup( QWidget *parent = 0, const char *name = 0 )
00360 :QTabWidget( parent, name ){};
00361
00365 virtual ~KDockTabGroup(){};
00366
00367 QWidget *transientTo();
00368 protected:
00369 virtual void virtual_hook( int id, void* data );
00370 private:
00371 class KDockTabGroupPrivate;
00372 KDockTabGroupPrivate *d;
00373 };
00374
00375
00412 class EXPORT_DOCKCLASS KDockWidget: public QWidget
00413 {
00414 Q_OBJECT
00415 friend class KDockManager;
00416 friend class KDockSplitter;
00417 friend class KDockMainWindow;
00418 friend class KDockArea;
00419
00420 public:
00436 KDockWidget( KDockManager* dockManager, const char* name,
00437 const QPixmap &pixmap, QWidget* parent = 0L, const QString& strCaption = QString::null,
00438 const QString& strTabPageLabel = QString::fromLatin1( " " ), WFlags f = 0);
00439
00443 virtual ~KDockWidget();
00444
00448 enum DockPosition
00449 {
00450 DockNone = 0,
00451 DockTop = 0x0001,
00452 DockLeft = 0x0002,
00453 DockRight = 0x0004,
00454 DockBottom = 0x0008,
00455 DockCenter = 0x0010,
00456 DockDesktop= 0x0020,
00457 DockToSpecialSites=0x0040,
00458 DockCorner = DockTop | DockLeft | DockRight | DockBottom,
00459 DockFullSite = DockCorner | DockCenter,
00460 DockFullDocking = DockFullSite | DockDesktop
00461 };
00462
00482 KDockWidget* manualDock( KDockWidget* target, DockPosition dockPos, int spliPos = 50, QPoint pos = QPoint(0,0), bool check = false, int tabIndex = -1);
00483
00489 void setEnableDocking( int pos );
00490
00494 int enableDocking() const { return eDocking; }
00495
00501 void setDockSite( int pos ){ sDocking = pos;}
00502
00506 int dockSite() const { return sDocking; }
00507
00515 void setWidget( QWidget* w);
00516
00522 QWidget* getWidget() const { return widget; };
00523
00532 void setHeader( KDockWidgetAbstractHeader* ah);
00533
00537 KDockWidgetAbstractHeader *getHeader();
00538
00544 void makeDockVisible();
00545
00555 bool mayBeHide() const;
00556
00564 bool mayBeShow() const;
00565
00569 KDockManager* dockManager() const { return manager; }
00570
00581 void setToolTipString(const QString& ttStr) { toolTipStr = ttStr; };
00582
00586 const QString& toolTipString() const { return toolTipStr; };
00587
00591 bool isDockBackPossible() const;
00592
00597 void setTabPageLabel( const QString& label) { tabPageTitle = label; };
00598
00602 const QString& tabPageLabel() const { return tabPageTitle; };
00603
00607 virtual bool event( QEvent * );
00608
00612 virtual void show();
00616 KDockTabGroup* parentDockTabGroup() const;
00617
00619 QWidget *parentDockContainer() const;
00620
00621 #ifndef NO_KDE2
00622
00628 void setDockWindowType (NET::WindowType windowType);
00629
00630 #endif
00631
00632 void setDockWindowTransient (QWidget *parent, bool transientEnabled);
00633
00638 QWidget *transientTo();
00639
00646 KDockWidget *findNearestDockWidget(DockPosition pos);
00647
00654 void setPixmap(const QPixmap& pixmap=QPixmap());
00655
00661 const QPixmap& pixmap() const;
00662 public slots:
00669 void setForcedFixedWidth(int);
00676 void setForcedFixedHeight(int);
00678 void restoreFromForcedFixedSize();
00679
00681 int forcedFixedWidth();
00683 int forcedFixedHeight();
00684
00689 void dockBack();
00690
00694 void changeHideShowState();
00695
00701 void undock();
00702
00707 void toDesktop( );
00708
00709 protected:
00710 friend class KMdiMainFrm;
00718 void updateHeader();
00719
00721 void setLatestKDockContainer(QWidget *);
00723 QWidget *latestKDockContainer();
00724
00726 void setFormerBrotherDockWidget(KDockWidget *);
00727
00728 signals:
00733 void widgetSet(QWidget*);
00734
00741 void docking( KDockWidget* dw, KDockWidget::DockPosition dp);
00742
00746 void setDockDefaultPos();
00747
00751 void headerCloseButtonClicked();
00752
00756 void headerDockbackButtonClicked();
00757
00761 void iMBeingClosed();
00765 void hasUndocked();
00766
00767 protected slots:
00768
00773 void loseFormerBrotherDockWidget();
00774
00775 virtual void paintEvent(QPaintEvent*);
00776
00777 virtual void mousePressEvent(QMouseEvent*);
00778 virtual void mouseReleaseEvent(QMouseEvent*);
00779 virtual void mouseMoveEvent(QMouseEvent*);
00780 virtual void leaveEvent(QEvent*);
00781 protected:
00782 friend class KDockWidgetHeader;
00786 KDockWidget* formerBrotherDockWidget;
00790 DockPosition currentDockPos;
00794 DockPosition formerDockPos;
00798 QString toolTipStr;
00802 QString tabPageTitle;
00803
00804 private:
00810 void setDockTabName( KDockTabGroup* g);
00811
00819 void applyToWidget( QWidget* s, const QPoint& p = QPoint(0,0) );
00820
00824 KDockWidgetAbstractHeader* header;
00825
00829 QWidget* widget;
00830
00834 QVBoxLayout* layout;
00835
00839 KDockManager* manager;
00840
00844 QPixmap* pix;
00845
00849 int eDocking;
00850
00854 int sDocking;
00855
00859 KDockWidget::DockPosition prevSideDockPosBeforeDrag;
00860
00861
00862 QString firstName;
00863 QString lastName;
00864 Orientation splitterOrientation;
00865 bool isGroup;
00866 bool isTabGroup;
00867 protected:
00868 virtual void virtual_hook( int id, void* data );
00869 private:
00870 KDockWidgetPrivate *d;
00871 };
00872
00885 class EXPORT_DOCKCLASS KDockManager: public QObject
00886 {
00887 Q_OBJECT
00888 friend class KDockWidget;
00889 friend class KDockMainWindow;
00890
00891 public:
00892 enum EnReadDockConfigMode {
00893 Unknown,
00894 WrapExistingWidgetsOnly,
00895 RestoreAllDockwidgets
00896 };
00897
00898 public:
00909 KDockManager( QWidget* mainWindow, const char* name = 0L );
00910
00914 virtual ~KDockManager();
00915
00916 void dumpDockWidgets();
00917
00918 #ifndef NO_KDE2
00919
00928 void writeConfig( KConfig* c = 0L, QString group = QString::null );
00929
00946 void readConfig ( KConfig* c = 0L, QString group = QString::null );
00947 #endif
00948
00950 void setMainDockWidget2(KDockWidget *);
00951
00955 void writeConfig(QDomElement &base);
00959 void readConfig(QDomElement &base);
00960
00965 void activate();
00966
00975 virtual bool eventFilter( QObject * object, QEvent * event );
00976
00984 KDockWidget* findWidgetParentDock( QWidget* w) const;
00985
00991 void makeWidgetDockVisible( QWidget* w ){ findWidgetParentDock(w)->makeDockVisible(); }
00992
00996 QPopupMenu* dockHideShowMenu() const { return menu; }
00997
01002 KDockWidget* getDockWidgetFromName( const QString& dockName );
01003
01008 void setSplitterOpaqueResize(bool b=true);
01009
01013 bool splitterOpaqueResize() const;
01014
01020 void setSplitterKeepSize(bool b=true);
01021
01025 bool splitterKeepSize() const;
01026
01033 void setSplitterHighResolution(bool b=true);
01034
01038 bool splitterHighResolution() const;
01039
01043 void setSpecialLeftDockContainer(KDockWidget* container);
01044 void setSpecialTopDockContainer(KDockWidget* container);
01045 void setSpecialRightDockContainer(KDockWidget* container);
01046 void setSpecialBottomDockContainer(KDockWidget* container);
01047
01048 void removeFromAutoCreateList(KDockWidget* pDockWidget);
01049 void finishReadDockConfig();
01050 void setReadDockConfigMode(int mode);
01051
01052 signals:
01053
01057 void change();
01058
01062 void replaceDock( KDockWidget* oldDock, KDockWidget* newDock );
01063
01067 void setDockDefaultPos( KDockWidget* );
01068
01069 private slots:
01070
01074 void slotMenuPopup();
01075
01081 void slotMenuActivated( int id);
01082
01083
01084
01085
01086
01087 void drawDragRectangle();
01088
01089 private:
01090
01094 struct MenuDockData
01095 {
01096 MenuDockData( KDockWidget* _dock, bool _hide )
01097 {
01098 dock = _dock;
01099 hide = _hide;
01100 };
01101 ~MenuDockData(){};
01102
01103 KDockWidget* dock;
01104 bool hide;
01105 };
01106
01113 KDockWidget* findDockWidgetAt( const QPoint& pos );
01114
01122 void findChildDockWidget( QWidget*& w, const QWidget* p, const QPoint& pos );
01123
01130 void findChildDockWidget( const QWidget* p, QWidgetList*& l);
01131
01135 void startDrag( KDockWidget* );
01136
01143 void dragMove( KDockWidget* d, QPoint pos );
01144
01148 void cancelDrop();
01149
01154 void drop();
01155
01156
01157
01161 QWidget* main;
01162
01166 KDockWidget* currentDragWidget;
01167
01171 KDockWidget* currentMoveWidget;
01172
01176 QWidgetList* childDockWidgetList;
01177
01181 KDockWidget::DockPosition curPos;
01182
01187 QObjectList* childDock;
01188
01192 QObjectList* autoCreateDock;
01193
01197 int storeW;
01198
01202 int storeH;
01203
01207 bool dragging;
01208
01212 bool undockProcess;
01213
01218 bool dropCancel;
01219
01224 QPopupMenu* menu;
01225
01229 QPtrList<MenuDockData> *menuData;
01230
01231 protected:
01232 virtual void virtual_hook( int id, void* data );
01233 private:
01234 class KDockManagerPrivate;
01235 KDockManagerPrivate *d;
01236 };
01237
01281 class EXPORT_DOCKCLASS KDockMainWindow : public KMainWindow
01282 {
01283 Q_OBJECT
01284
01285 friend class KDockManager;
01286
01287 public:
01288
01301 KDockMainWindow( QWidget* parent = 0L, const char *name = 0L, WFlags f = WType_TopLevel | WDestructiveClose );
01302
01306 virtual ~KDockMainWindow();
01307
01312 KDockManager* manager() const { return dockManager; }
01313
01320 void setMainDockWidget( KDockWidget* dockwidget);
01321
01327 KDockWidget* getMainDockWidget() const { return mainDockWidget; }
01328
01341 KDockWidget* createDockWidget( const QString& name, const QPixmap &pixmap, QWidget* parent = 0L,
01342 const QString& strCaption = QString::null, const QString& strTabPageLabel = QString::fromLatin1( " " ) );
01343
01347 void writeDockConfig(QDomElement &base);
01351 void readDockConfig(QDomElement &base);
01352
01353 #ifndef NO_KDE2
01354
01360 void writeDockConfig( KConfig* c = 0L, QString group = QString::null );
01361
01368 void readDockConfig ( KConfig* c = 0L, QString group = QString::null );
01369 #endif
01370
01376 void activateDock(){ dockManager->activate(); }
01377
01384 QPopupMenu* dockHideShowMenu() const { return dockManager->dockHideShowMenu(); }
01385
01393 void makeDockVisible( KDockWidget* dock );
01394
01400 void makeDockInvisible( KDockWidget* dock );
01401
01406 void makeWidgetDockVisible( QWidget* widget );
01407
01414 void setView( QWidget * widget );
01415
01416 signals:
01420 void dockWidgetHasUndocked(KDockWidget*);
01421
01422 protected:
01423
01427 KDockWidget* mainDockWidget;
01428
01432 KDockManager* dockManager;
01433
01434 protected slots:
01438 void slotDockWidgetUndocked();
01439
01440 protected:
01441 virtual void virtual_hook( int id, void* data );
01442 private:
01443 class KDockMainWindowPrivate;
01444 KDockMainWindowPrivate *d;
01445 };
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462 class EXPORT_DOCKCLASS KDockArea : public QWidget
01463 {
01464 Q_OBJECT
01465
01466 friend class KDockManager;
01467
01468 public:
01469
01470
01471 KDockArea( QWidget* parent = 0L, const char *name = 0L);
01472
01473 virtual ~KDockArea();
01474
01475 KDockManager* manager(){ return dockManager; }
01476
01477
01478 void setMainDockWidget( KDockWidget* );
01479 KDockWidget* getMainDockWidget(){ return mainDockWidget; }
01480
01481 KDockWidget* createDockWidget( const QString& name, const QPixmap &pixmap, QWidget* parent = 0L,
01482 const QString& strCaption = QString::null, const QString& strTabPageLabel = QString::fromLatin1( " " ) );
01483
01484 void writeDockConfig(QDomElement &base);
01485 void readDockConfig(QDomElement &base);
01486
01487 #ifndef NO_KDE2
01488 void writeDockConfig( KConfig* c = 0L, QString group = QString::null );
01489 void readDockConfig ( KConfig* c = 0L, QString group = QString::null );
01490 #endif
01491
01492
01493
01494 void activateDock(){ dockManager->activate(); }
01495 QPopupMenu* dockHideShowMenu(){ return dockManager->dockHideShowMenu(); }
01496 void makeDockVisible( KDockWidget* dock );
01497 void makeDockInvisible( KDockWidget* dock );
01498 void makeWidgetDockVisible( QWidget* widget );
01499
01500
01501 signals:
01505 void dockWidgetHasUndocked(KDockWidget*);
01506
01507 protected:
01508
01509 KDockWidget* mainDockWidget;
01510 KDockManager* dockManager;
01511
01512 protected slots:
01513 void slotDockWidgetUndocked();
01514
01515 public:
01516 virtual void resizeEvent(QResizeEvent *);
01517
01518 protected:
01519 virtual void virtual_hook( int id, void* data );
01520 private:
01521 class KDockMainWindowPrivate;
01522 KDockMainWindowPrivate *d;
01523 };
01524
01525
01526 #endif
01527
01528