kdockwidget.h
00001 /* This file is part of the KDE libraries 00002 Copyright (C) 2000 Max Judin <novaprint@mtu-net.ru> 00003 Copyright (C) 2000 Falk Brettschneider <falk@kdevelop.org> 00004 Copyright (C) 2002,2003 Joseph Wenninger <jowenn@kde.org> 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License version 2 as published by the Free Software Foundation. 00009 00010 This library 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 GNU 00013 Library General Public License for more details. 00014 00015 You should have received a copy of the GNU Library General Public License 00016 along with this library; see the file COPYING.LIB. If not, write to 00017 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00018 Boston, MA 02110-1301, USA. 00019 */ 00020 00021 /* 00022 activities: 00023 ----------- 00024 05/2001 - : useful patches, bugfixes by Christoph Cullmann <crossfire@babylon2k.de>, 00025 Joseph Wenninger <jowenn@bigfoot.com> and Falk Brettschneider 00026 03/2001 - 05/2001 : maintained and enhanced by Falk Brettschneider <falk@kdevelop.org> 00027 03/2000 : class documentation added by Falk Brettschneider <gigafalk@yahoo.com> 00028 10/1999 - 03/2000 : programmed by Max Judin <novaprint@mtu-net.ru> 00029 00030 C++ classes in this file: 00031 ------------------------- 00032 - KDockWidgetAbstractHeader - minor helper class 00033 - KDockWidgetAbstractHeaderDrag - minor helper class 00034 - KDockWidgetHeaderDrag - drag panel in a dockwidget title bar 00035 - KDockWidgetHeader - dockwidget title bar containing the drag panel 00036 - KDockTabGroup - minor helper class 00037 - KDockWidget - IMPORTANT CLASS: the one and only dockwidget class 00038 - KDockManager - helper class 00039 - KDockMainWindow - IMPORTANT CLASS: a special KMainWindow that can have dockwidgets 00040 - KDockArea - like KDockMainWindow but inherits just QWidget 00041 00042 IMPORTANT Note: This file compiles also in Qt-only mode by using the NO_KDE2 precompiler definition! 00043 */ 00044 00045 00046 #ifndef KDOCKWIDGET_H 00047 #define KDOCKWIDGET_H 00048 00049 #define _KDOCKWIDGET_2_2_ 00050 00051 #include <tqpoint.h> 00052 #include <tqptrlist.h> 00053 #include <tqframe.h> 00054 #include <tqdom.h> 00055 #include <tqtabwidget.h> 00056 00057 #ifndef NO_KDE2 00058 #include <kmainwindow.h> 00059 #include <netwm_def.h> 00060 #else 00061 00062 #include <tqmainwindow.h> 00063 #include "exportdockclass.h" 00064 #include "dummykmainwindow.h" 00065 #endif 00066 00067 class KDockSplitter; 00068 class KDockManager; 00069 class KDockMoveManager; 00070 class KDockWidget; 00071 class KDockButton_Private; 00072 class KDockWidgetPrivate; 00073 class KDockWidgetHeaderPrivate; 00074 class KDockArea; 00075 00076 class TQObjectList; 00077 class TQPopupMenu; 00078 class TQVBoxLayout; 00079 class TQHBoxLayout; 00080 class TQPixmap; 00081 00082 #ifndef NO_KDE2 00083 class KToolBar; 00084 class KConfig; 00085 #else 00086 class TQToolBar; 00087 #endif 00088 00089 class KDockContainer; 00090 00091 namespace KMDI 00092 { 00093 class MainWindow; 00094 } 00095 00103 class KDEUI_EXPORT KDockWidgetAbstractHeader : public TQFrame 00104 { 00105 Q_OBJECT 00106 TQ_OBJECT 00107 public: 00108 00115 KDockWidgetAbstractHeader( KDockWidget* parent, const char* name = 0L ); 00116 00120 virtual ~KDockWidgetAbstractHeader(){} 00121 00125 virtual void setTopLevel( bool ){} 00126 00127 #ifndef NO_KDE2 00128 00131 virtual void saveConfig( KConfig* ){} 00132 00136 virtual void loadConfig( KConfig* ){} 00137 #endif 00138 00139 protected: 00140 virtual void virtual_hook( int id, void* data ); 00141 private: 00142 class KDockWidgetAbstractHeaderPrivate; 00143 KDockWidgetAbstractHeaderPrivate *d; 00144 }; 00145 00153 class KDEUI_EXPORT KDockWidgetAbstractHeaderDrag : public TQFrame 00154 { 00155 Q_OBJECT 00156 TQ_OBJECT 00157 public: 00158 00166 KDockWidgetAbstractHeaderDrag( KDockWidgetAbstractHeader* parent, 00167 KDockWidget* dock, const char* name = 0L ); 00168 00172 virtual ~KDockWidgetAbstractHeaderDrag(){} 00173 00177 KDockWidget* dockWidget() const { return dw; } 00178 00179 private: 00183 KDockWidget* dw; 00184 protected: 00185 virtual void virtual_hook( int id, void* data ); 00186 private: 00187 class KDockWidgetAbstractHeaderDragPrivate; 00188 KDockWidgetAbstractHeaderDragPrivate *d; 00189 }; 00190 00199 class KDEUI_EXPORT KDockWidgetHeaderDrag : public KDockWidgetAbstractHeaderDrag 00200 { 00201 Q_OBJECT 00202 TQ_OBJECT 00203 public: 00204 00212 KDockWidgetHeaderDrag( KDockWidgetAbstractHeader* parent, KDockWidget* dock, 00213 const char* name = 0L ); 00214 00218 virtual ~KDockWidgetHeaderDrag(){} 00219 00220 protected: 00221 00225 virtual void paintEvent( TQPaintEvent* ); 00226 00227 protected: 00228 virtual void virtual_hook( int id, void* data ); 00229 private: 00230 class KDockWidgetHeaderDragPrivate; 00231 KDockWidgetHeaderDragPrivate *d; 00232 }; 00233 00241 class KDEUI_EXPORT KDockWidgetHeader : public KDockWidgetAbstractHeader 00242 { 00243 Q_OBJECT 00244 TQ_OBJECT 00245 public: 00246 00253 KDockWidgetHeader( KDockWidget* parent, const char* name = 0L ); 00254 00258 virtual ~KDockWidgetHeader(){} 00259 00265 virtual void setTopLevel( bool t); 00266 00272 void setDragPanel( KDockWidgetHeaderDrag* nd ); 00273 00279 KDockWidgetHeaderDrag *dragPanel(); 00280 00281 bool dragEnabled() const; 00282 void setDragEnabled(bool b); 00284 void showUndockButton(bool show); 00285 00287 void forceCloseButtonHidden(bool enable=true); 00288 #ifndef NO_KDE2 00289 00294 virtual void saveConfig( KConfig* c); 00295 00301 virtual void loadConfig( KConfig* c); 00302 #endif 00303 00304 /*@since 3.2 00305 * add an arbitrary button to the dockwidget header 00306 * NOT PART OF THE PUBLIC API (you don't have access the class defintion anyways, without special 00307 * header file copying. (don't do it)) 00308 */ 00309 void addButton(KDockButton_Private*); 00310 00311 /*@since 3.2 00312 * remove an arbtrary button from the dockwidget header 00313 * NOT PART OF THE PUBLIC API (you don't have access the class defintion anyways, without special 00314 * header file copying. (don't do it)) 00315 */ 00316 void removeButton(KDockButton_Private*); 00317 00318 00319 00320 protected slots: 00324 void slotStayClicked(); 00325 00326 protected: 00327 00331 TQHBoxLayout* layout; 00332 00336 KDockButton_Private* closeButton; 00337 00341 KDockButton_Private* stayButton; 00342 00346 KDockButton_Private* dockbackButton; 00347 00351 KDockWidgetHeaderDrag* drag; 00352 00353 protected: 00354 virtual void virtual_hook( int id, void* data ); 00355 private: 00356 KDockWidgetHeaderPrivate *d; 00357 }; 00358 00367 class KDEUI_EXPORT KDockTabGroup : public TQTabWidget 00368 { 00369 Q_OBJECT 00370 TQ_OBJECT 00371 public: 00375 KDockTabGroup( TQWidget *parent = 0, const char *name = 0 ) 00376 :TQTabWidget( parent, name ){} 00377 00381 virtual ~KDockTabGroup(){} 00382 00383 TQWidget *transientTo(); 00384 protected: 00385 virtual void virtual_hook( int id, void* data ); 00386 private: 00387 class KDockTabGroupPrivate; 00388 KDockTabGroupPrivate *d; 00389 }; 00390 00391 00428 class KDEUI_EXPORT KDockWidget: public TQWidget 00429 { 00430 Q_OBJECT 00431 TQ_OBJECT 00432 friend class KDockManager; 00433 friend class KDockSplitter; 00434 friend class KDockMainWindow; 00435 friend class KDockArea; 00436 00437 public: 00453 KDockWidget( KDockManager* dockManager, const char* name, 00454 const TQPixmap &pixmap, TQWidget* parent = 0L, const TQString& strCaption = TQString::null, 00455 const TQString& strTabPageLabel = TQString::fromLatin1( " " ), WFlags f = 0); 00456 00460 virtual ~KDockWidget(); 00461 00465 enum DockPosition 00466 { 00467 DockNone = 0, 00468 DockTop = 0x0001, 00469 DockLeft = 0x0002, 00470 DockRight = 0x0004, 00471 DockBottom = 0x0008, 00472 DockCenter = 0x0010, 00473 DockDesktop= 0x0020, 00474 DockToSpecialSites=0x0040, 00475 DockCorner = DockTop | DockLeft | DockRight | DockBottom, 00476 DockFullSite = DockCorner | DockCenter, 00477 DockFullDocking = DockFullSite | DockDesktop 00478 }; 00479 00504 KDockWidget* manualDock( KDockWidget* target, DockPosition dockPos, int spliPos = 50, TQPoint pos = TQPoint(0,0), bool check = false, int tabIndex = -1); 00505 00511 void setEnableDocking( int pos ); 00512 00516 int enableDocking() const { return eDocking; } 00517 00523 void setDockSite( int pos ){ sDocking = pos;} 00524 00528 int dockSite() const { return sDocking; } 00529 00537 void setWidget( TQWidget* w); 00538 00544 TQWidget* getWidget() const { return widget; } 00545 00554 void setHeader( KDockWidgetAbstractHeader* ah); 00555 00559 KDockWidgetAbstractHeader *getHeader(); 00560 00566 void makeDockVisible(); 00567 00577 bool mayBeHide() const; 00578 00586 bool mayBeShow() const; 00587 00591 KDockManager* dockManager() const { return manager; } 00592 00603 void setToolTipString(const TQString& ttStr) { toolTipStr = ttStr; } 00604 00608 const TQString& toolTipString() const { return toolTipStr; } 00609 00613 bool isDockBackPossible() const; 00614 00619 void setTabPageLabel( const TQString& label) { tabPageTitle = label; } 00620 00624 const TQString& tabPageLabel() const { return tabPageTitle; } 00625 00629 virtual bool event( TQEvent * ); 00630 00634 virtual void show(); 00638 KDockTabGroup* parentDockTabGroup() const; 00639 00641 TQWidget *parentDockContainer() const; 00642 00643 #ifndef NO_KDE2 00644 00650 void setDockWindowType (NET::WindowType windowType); 00651 00652 #endif 00653 00654 void setDockWindowTransient (TQWidget *parent, bool transientEnabled); 00655 00660 TQWidget *transientTo(); 00661 00668 KDockWidget *findNearestDockWidget(DockPosition pos); 00669 00676 void setPixmap(const TQPixmap& pixmap=TQPixmap()); 00677 00683 const TQPixmap& pixmap() const; 00684 00689 KDockWidget::DockPosition currentDockPosition() const; 00690 00691 public slots: 00698 void setForcedFixedWidth(int); 00705 void setForcedFixedHeight(int); 00707 void restoreFromForcedFixedSize(); 00708 00710 int forcedFixedWidth(); 00712 int forcedFixedHeight(); 00713 00718 void dockBack(); 00719 00723 void changeHideShowState(); 00724 00730 void undock(); 00731 00736 void toDesktop( ); 00737 00738 protected: 00739 friend class KMdiMainFrm; 00740 friend class KMDI::MainWindow; 00748 void updateHeader(); 00749 00751 void setLatestKDockContainer(TQWidget *); 00753 TQWidget *latestKDockContainer(); 00754 00756 void setFormerBrotherDockWidget(KDockWidget *); 00757 00758 signals: 00763 void widgetSet(TQWidget*); 00764 00771 void docking( KDockWidget* dw, KDockWidget::DockPosition dp); 00772 00776 void setDockDefaultPos(); 00777 00781 void headerCloseButtonClicked(); 00782 00786 void headerDockbackButtonClicked(); 00787 00791 void iMBeingClosed(); 00795 void hasUndocked(); 00796 00797 protected slots: 00798 00803 void loseFormerBrotherDockWidget(); 00804 00805 virtual void paintEvent(TQPaintEvent*); 00806 00807 virtual void mousePressEvent(TQMouseEvent*); 00808 virtual void mouseReleaseEvent(TQMouseEvent*); 00809 virtual void mouseMoveEvent(TQMouseEvent*); 00810 virtual void leaveEvent(TQEvent*); 00811 protected: 00812 friend class KDockWidgetHeader; 00816 KDockWidget* formerBrotherDockWidget; 00820 DockPosition currentDockPos; 00824 DockPosition formerDockPos; 00828 TQString toolTipStr; 00832 TQString tabPageTitle; 00833 00834 private: 00840 void setDockTabName( KDockTabGroup* g); 00841 00849 void applyToWidget( TQWidget* s, const TQPoint& p = TQPoint(0,0) ); 00850 00854 KDockWidgetAbstractHeader* header; 00855 00859 TQWidget* widget; 00860 00864 TQVBoxLayout* layout; 00865 00869 KDockManager* manager; 00870 00874 TQPixmap* pix; 00875 00879 int eDocking; 00880 00884 int sDocking; 00885 00889 KDockWidget::DockPosition prevSideDockPosBeforeDrag; 00890 00891 // GROUP data 00892 TQString firstName; 00893 TQString lastName; 00894 Orientation splitterOrientation; 00895 bool isGroup; 00896 bool isTabGroup; 00897 protected: 00898 virtual void virtual_hook( int id, void* data ); 00899 private: 00900 KDockWidgetPrivate *d; 00901 }; 00902 00915 class KDEUI_EXPORT KDockManager: public TQObject 00916 { 00917 Q_OBJECT 00918 TQ_OBJECT 00919 friend class KDockWidget; 00920 friend class KDockMainWindow; 00921 00922 public: 00923 enum EnReadDockConfigMode { 00924 Unknown, 00925 WrapExistingWidgetsOnly, 00926 RestoreAllDockwidgets 00927 }; 00928 00929 public: 00940 KDockManager( TQWidget* mainWindow, const char* name = 0L ); 00941 00945 virtual ~KDockManager(); 00946 00947 void dumpDockWidgets(); 00948 00949 #ifndef NO_KDE2 00950 00959 void writeConfig( KConfig* c = 0L, TQString group = TQString::null ); 00960 00977 void readConfig ( KConfig* c = 0L, TQString group = TQString::null ); 00978 #endif 00979 00981 void setMainDockWidget2(KDockWidget *); 00982 00986 void writeConfig(TQDomElement &base); 00990 void readConfig(TQDomElement &base); 00991 00996 void activate(); 00997 01006 virtual bool eventFilter( TQObject * object, TQEvent * event ); 01007 01015 KDockWidget* findWidgetParentDock( TQWidget* w) const; 01016 01022 void makeWidgetDockVisible( TQWidget* w ){ findWidgetParentDock(w)->makeDockVisible(); } 01023 01027 TQPopupMenu* dockHideShowMenu() const { return menu; } 01028 01033 KDockWidget* getDockWidgetFromName( const TQString& dockName ); 01034 01039 void setSplitterOpaqueResize(bool b=true); 01040 01044 bool splitterOpaqueResize() const; 01045 01051 void setSplitterKeepSize(bool b=true); 01052 01056 bool splitterKeepSize() const; 01057 01066 void setSplitterHighResolution(bool b=true); 01067 01071 bool splitterHighResolution() const; 01072 01076 void setSpecialLeftDockContainer(KDockWidget* container); 01077 void setSpecialTopDockContainer(KDockWidget* container); 01078 void setSpecialRightDockContainer(KDockWidget* container); 01079 void setSpecialBottomDockContainer(KDockWidget* container); 01080 01081 void removeFromAutoCreateList(KDockWidget* pDockWidget); 01082 void finishReadDockConfig(); 01083 void setReadDockConfigMode(int mode); 01084 01085 signals: 01086 01090 void change(); 01091 01095 void replaceDock( KDockWidget* oldDock, KDockWidget* newDock ); 01096 01100 void setDockDefaultPos( KDockWidget* ); 01101 01102 private slots: 01103 01107 void slotMenuPopup(); 01108 01114 void slotMenuActivated( int id); 01115 01116 /* clears the old drawn drag rectangle (oldDragRect) from screen and 01117 * draws the new current drag rectangle (dragRect) depending on the current mouse position. 01118 * This highlights the dockwidget which is the currently chosen target during a dock action. 01119 */ 01120 void drawDragRectangle(); 01121 01122 private: 01123 01127 struct MenuDockData 01128 { 01129 MenuDockData( KDockWidget* _dock, bool _hide ) 01130 { 01131 dock = _dock; 01132 hide = _hide; 01133 } 01134 ~MenuDockData(){} 01135 01136 KDockWidget* dock; 01137 bool hide; 01138 }; 01139 01146 KDockWidget* findDockWidgetAt( const TQPoint& pos ); 01147 01155 void findChildDockWidget( TQWidget*& w, const TQWidget* p, const TQPoint& pos ); 01156 01163 void findChildDockWidget( const TQWidget* p, TQWidgetList*& l); 01164 01168 void startDrag( KDockWidget* ); 01169 01176 void dragMove( KDockWidget* d, TQPoint pos ); 01177 01181 void cancelDrop(); 01182 01187 void drop(); 01188 01189 // class members 01190 01194 TQWidget* main; 01195 01199 KDockWidget* currentDragWidget; 01200 01204 KDockWidget* currentMoveWidget; // widget where mouse moving 01205 01209 TQWidgetList* childDockWidgetList; 01210 01214 KDockWidget::DockPosition curPos; 01215 01220 TQObjectList* childDock; 01221 01225 TQObjectList* autoCreateDock; 01226 01230 int storeW; 01231 01235 int storeH; 01236 01240 bool dragging; 01241 01245 bool undockProcess; 01246 01251 bool dropCancel; 01252 01257 TQPopupMenu* menu; 01258 01262 TQPtrList<MenuDockData> *menuData; 01263 01264 protected: 01265 virtual void virtual_hook( int id, void* data ); 01266 private: 01267 class KDockManagerPrivate; 01268 KDockManagerPrivate *d; 01269 }; 01270 01314 class KDEUI_EXPORT KDockMainWindow : public KMainWindow 01315 { 01316 Q_OBJECT 01317 TQ_OBJECT 01318 01319 friend class KDockManager; 01320 01321 public: 01322 01335 #ifdef qdoc 01336 KDockMainWindow( TQWidget* parent = 0L, const char *name = 0L, WFlags f = WType_TopLevel | WDestructiveClose ); 01337 #else 01338 KDockMainWindow( TQWidget* parent = 0L, const char *name = 0L, WFlags f = (WFlags)(WType_TopLevel | WDestructiveClose) ); 01339 #endif 01340 01344 virtual ~KDockMainWindow(); 01345 01350 KDockManager* manager() const { return dockManager; } 01351 01358 void setMainDockWidget( KDockWidget* dockwidget); 01359 01365 KDockWidget* getMainDockWidget() const { return mainDockWidget; } 01366 01379 KDockWidget* createDockWidget( const TQString& name, const TQPixmap &pixmap, TQWidget* parent = 0L, 01380 const TQString& strCaption = TQString::null, const TQString& strTabPageLabel = TQString::fromLatin1( " " ) ); 01381 01385 void writeDockConfig(TQDomElement &base); 01389 void readDockConfig(TQDomElement &base); 01390 01391 #ifndef NO_KDE2 01392 01398 void writeDockConfig( KConfig* c = 0L, TQString group = TQString::null ); 01399 01406 void readDockConfig ( KConfig* c = 0L, TQString group = TQString::null ); 01407 #endif 01408 01414 void activateDock(){ dockManager->activate(); } 01415 01422 TQPopupMenu* dockHideShowMenu() const { return dockManager->dockHideShowMenu(); } 01423 01431 void makeDockVisible( KDockWidget* dock ); 01432 01438 void makeDockInvisible( KDockWidget* dock ); 01439 01444 void makeWidgetDockVisible( TQWidget* widget ); 01445 01452 void setView( TQWidget * widget ); 01453 01454 signals: 01458 void dockWidgetHasUndocked(KDockWidget*); 01459 01460 protected: 01461 01465 KDockWidget* mainDockWidget; 01466 01470 KDockManager* dockManager; 01471 01472 protected slots: 01476 void slotDockWidgetUndocked(); 01477 01478 protected: 01479 virtual void virtual_hook( int id, void* data ); 01480 private: 01481 class KDockMainWindowPrivate; 01482 KDockMainWindowPrivate *d; 01483 }; 01484 01485 class KDEUI_EXPORT KDockArea : public TQWidget 01486 { 01487 Q_OBJECT 01488 TQ_OBJECT 01489 01490 friend class KDockManager; 01491 01492 public: 01493 01494 01495 KDockArea( TQWidget* parent = 0L, const char *name = 0L); 01496 01497 virtual ~KDockArea(); 01498 01499 KDockManager* manager(){ return dockManager; } 01500 01501 01502 void setMainDockWidget( KDockWidget* ); 01503 KDockWidget* getMainDockWidget(){ return mainDockWidget; } 01504 01505 KDockWidget* createDockWidget( const TQString& name, const TQPixmap &pixmap, TQWidget* parent = 0L, 01506 const TQString& strCaption = TQString::null, const TQString& strTabPageLabel = TQString::fromLatin1( " " ) ); 01507 01508 void writeDockConfig(TQDomElement &base); 01509 void readDockConfig(TQDomElement &base); 01510 01511 #ifndef NO_KDE2 01512 void writeDockConfig( KConfig* c = 0L, TQString group = TQString::null ); 01513 void readDockConfig ( KConfig* c = 0L, TQString group = TQString::null ); 01514 #endif 01515 01516 01517 01518 void activateDock(){ dockManager->activate(); } 01519 TQPopupMenu* dockHideShowMenu(){ return dockManager->dockHideShowMenu(); } 01520 void makeDockVisible( KDockWidget* dock ); 01521 void makeDockInvisible( KDockWidget* dock ); 01522 void makeWidgetDockVisible( TQWidget* widget ); 01523 //void setView( TQWidget* ); 01524 01525 signals: 01529 void dockWidgetHasUndocked(KDockWidget*); 01530 01531 protected: 01532 01533 KDockWidget* mainDockWidget; 01534 KDockManager* dockManager; 01535 01536 protected slots: 01537 void slotDockWidgetUndocked(); 01538 01539 public: 01540 virtual void resizeEvent(TQResizeEvent *); 01541 01542 protected: 01543 virtual void virtual_hook( int id, void* data ); 01544 private: 01545 class KDockMainWindowPrivate; 01546 KDockMainWindowPrivate *d; 01547 }; 01548 01549 01550 #endif 01551 01552 01553