diff options
Diffstat (limited to 'tqtinterface/qt4/src/widgets/tqmainwindow.cpp')
-rw-r--r-- | tqtinterface/qt4/src/widgets/tqmainwindow.cpp | 2644 |
1 files changed, 0 insertions, 2644 deletions
diff --git a/tqtinterface/qt4/src/widgets/tqmainwindow.cpp b/tqtinterface/qt4/src/widgets/tqmainwindow.cpp deleted file mode 100644 index 446371c..0000000 --- a/tqtinterface/qt4/src/widgets/tqmainwindow.cpp +++ /dev/null @@ -1,2644 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQMainWindow class -** -** Created : 980312 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the widgets module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at [email protected]. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqmainwindow.h" -#ifndef TQT_NO_MAINWINDOW - -#include "tqtimer.h" -#include "tqlayout.h" -#include "tqobjectlist.h" -#include "tqintdict.h" -#include "tqapplication.h" -#include "tqptrlist.h" -#include "tqmap.h" -#include "tqcursor.h" -#include "tqpainter.h" -#include "tqmenubar.h" -#include "tqpopupmenu.h" -#include "tqtoolbar.h" -#include "tqstatusbar.h" -#include "tqscrollview.h" -#include "tqtooltip.h" -#include "tqdatetime.h" -#include "tqwhatsthis.h" -#include "tqbitmap.h" -#include "tqdockarea.h" -#include "tqstringlist.h" -#include "tqstyle.h" -#ifdef TQ_WS_MACX -# include "tqt_mac.h" -#endif - -class TQHideDock; -class TQMainWindowLayout; - -class TQMainWindowPrivate -{ -public: - TQMainWindowPrivate() - : mb(0), sb(0), ttg(0), mc(0), tll(0), mwl(0), ubp( FALSE ), utl( FALSE ), - justify( FALSE ), movable( TRUE ), opaque( FALSE ), dockMenu( TRUE ) - { - docks.insert( TQt::DockTop, TRUE ); - docks.insert( TQt::DockBottom, TRUE ); - docks.insert( TQt::DockLeft, TRUE ); - docks.insert( TQt::DockRight, TRUE ); - docks.insert( TQt::DockMinimized, FALSE ); - docks.insert( TQt::DockTornOff, TRUE ); - } - - ~TQMainWindowPrivate() - { - } - -#ifndef TQT_NO_MENUBAR - TQMenuBar * mb; -#else - TQWidget * mb; -#endif - TQStatusBar * sb; - TQToolTipGroup * ttg; - - TQWidget * mc; - - TQBoxLayout * tll; - TQMainWindowLayout * mwl; - - uint ubp :1; - uint utl :1; - uint justify :1; - uint movable :1; - uint opaque :1; - uint dockMenu :1; - - TQDockArea *topDock, *bottomDock, *leftDock, *rightDock; - - TQPtrList<TQDockWindow> dockWindows; - TQMap<TQt::Dock, bool> docks; - TQStringList disabledDocks; - TQHideDock *hideDock; - - TQGuardedPtr<TQPopupMenu> rmbMenu, tbMenu, dwMenu; - TQMap<TQDockWindow*, bool> appropriate; - TQMap<TQPopupMenu*, TQMainWindow::DockWindows> dockWindowModes; - -}; - - -/* TQMainWindowLayout, respects widthForHeight layouts (like the left - and right docks are) -*/ - -class TQMainWindowLayout : public TQLayout -{ - Q_OBJECT - TQ_OBJECT - -public: - TQMainWindowLayout( TQMainWindow *mw, TQLayout* parent = 0 ); - ~TQMainWindowLayout() {} - - void addItem( QLayoutItem * ); - void setLeftDock( TQDockArea *l ); - void setRightDock( TQDockArea *r ); - void setCentralWidget( TQWidget *w ); - bool hasHeightForWidth() const { return FALSE; } - TQSize tqsizeHint() const; - TQSize tqminimumSize() const; - TQLayoutIterator iterator(); - TQ_SPExpandData expandingDirections() const { return (Qt::Orientations)TQSizePolicy::BothDirections; } - void tqinvalidate() {} - -protected: - void setGeometry( const TQRect &r ) { - TQLayout::setGeometry( r ); - layoutItems( r ); - } - -private: - int layoutItems( const TQRect&, bool testonly = FALSE ); - int extraPixels() const; - - TQDockArea *left, *right; - TQWidget *central; - TQMainWindow *mainWindow; - -#ifdef USE_QT4 - - QLAYOUT_REQUIRED_METHOD_DECLARATIONS - -#endif // USE_QT4 - -}; - -/*! - \reimp -*/ -int TQMainWindowLayout::count() const { - return 0; -} - -/*! - \reimp -*/ -TQLayoutItem* TQMainWindowLayout::itemAt(int index) const { - return 0; -} - -/*! - \reimp -*/ -TQLayoutItem* TQMainWindowLayout::takeAt(int index) { - return 0; -} - -TQSize TQMainWindowLayout::tqsizeHint() const -{ - int w = 0; - int h = 0; - - if ( left ) { - w += left->tqsizeHint().width(); - h = TQMAX( h, left->tqsizeHint().height() ); - } - if ( right ) { - w += right->tqsizeHint().width(); - h = TQMAX( h, right->tqsizeHint().height() ); - } - if ( central ) { - w += central->tqsizeHint().width(); - int diff = extraPixels(); - h = TQMAX( h, central->tqsizeHint().height() + diff ); - } - - return TQSize( w, h ); -} - -TQSize TQMainWindowLayout::tqminimumSize() const -{ - int w = 0; - int h = 0; - - if ( left ) { - TQSize ms = left->tqminimumSizeHint().expandedTo( left->tqminimumSize() ); - w += ms.width(); - h = TQMAX( h, ms.height() ); - } - if ( right ) { - TQSize ms = right->tqminimumSizeHint().expandedTo( right->tqminimumSize() ); - w += ms.width(); - h = TQMAX( h, ms.height() ); - } - if ( central ) { - TQSize min = central->tqminimumSize().isNull() ? - central->tqminimumSizeHint() : central->tqminimumSize(); - w += min.width(); - int diff = extraPixels(); - h = TQMAX( h, min.height() + diff ); - } - return TQSize( w, h ); -} - -TQMainWindowLayout::TQMainWindowLayout( TQMainWindow *mw, TQLayout* parent ) - : TQLayout( parent ), left( 0 ), right( 0 ), central( 0 ) -{ - mainWindow = mw; -} - -void TQMainWindowLayout::setLeftDock( TQDockArea *l ) -{ - left = l; -} - -void TQMainWindowLayout::setRightDock( TQDockArea *r ) -{ - right = r; -} - -void TQMainWindowLayout::setCentralWidget( TQWidget *w ) -{ - central = w; -} - -int TQMainWindowLayout::layoutItems( const TQRect &r, bool testonly ) -{ - if ( !left && !central && !right ) - return 0; - - int wl = 0, wr = 0; - if ( left ) - wl = ( (TQDockAreaLayout*)left->TQWidget::tqlayout() )->widthForHeight( r.height() ); - if ( right ) - wr = ( (TQDockAreaLayout*)right->TQWidget::tqlayout() )->widthForHeight( r.height() ); - int w = r.width() - wr - wl; - if ( w < 0 ) - w = 0; - - int diff = extraPixels(); - if ( !testonly ) { - TQRect g( tqgeometry() ); - if ( left ) - left->setGeometry( TQRect( g.x(), g.y() + diff, wl, r.height() - diff ) ); - if ( right ) - right->setGeometry( TQRect( g.x() + g.width() - wr, g.y() + diff, wr, r.height() - diff ) ); - if ( central ) - central->setGeometry( g.x() + wl, g.y() + diff, w, r.height() - diff ); - } - - w = wl + wr; - if ( central ) - w += central->tqminimumSize().width(); - return w; -} - -int TQMainWindowLayout::extraPixels() const -{ - if ( mainWindow->d->topDock->isEmpty() && - !(mainWindow->d->leftDock->isEmpty() && - mainWindow->d->rightDock->isEmpty()) ) { - return 2; - } else { - return 0; - } -} - -void TQMainWindowLayout::addItem( QLayoutItem * /* item */ ) -{ -} - - -TQLayoutIterator TQMainWindowLayout::iterator() -{ - return 0; -} - - -/* - TQHideToolTip and TQHideDock - minimized dock -*/ - -#ifndef TQT_NO_TOOLTIP -class TQHideToolTip : public TQToolTip -{ -public: - TQHideToolTip( TQWidget *parent ) : TQToolTip( parent ) {} - ~TQHideToolTip() {} - - virtual void maybeTip( const TQPoint &pos ); -}; -#endif - - -class TQHideDock : public TQWidget -{ - Q_OBJECT - TQ_OBJECT - -public: - TQHideDock( TQMainWindow *parent ) : TQWidget( parent, "qt_hide_dock" ) { - hide(); - setFixedHeight( tqstyle().tqpixelMetric( TQStyle::PM_DockWindowHandleExtent, - this ) + 3 ); - pressedHandle = -1; - pressed = FALSE; - setMouseTracking( TRUE ); - win = parent; -#ifndef TQT_NO_TOOLTIP - tip = new TQHideToolTip( this ); -#endif - } - ~TQHideDock() - { -#ifndef TQT_NO_TOOLTIP - delete tip; -#endif - } - -protected: - void paintEvent( TQPaintEvent *e ) { - - if ( childrenListObject().isEmpty() ) - return; - - TQPainter p( this ); - p.setClipRegion( e->rect() ); - p.fillRect( e->rect(), tqcolorGroup().brush( TQColorGroup::Background ) ); - int x = 0; - int i = -1; - TQObjectListIt it( childrenListObject() ); - TQObject *o; - while ( ( o = it.current() ) ) { - ++it; - ++i; - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(o); - if ( !dw || !dw->isVisible() ) - continue; - - TQStyle::SFlags flags = TQStyle::Style_Default; - if ( i == pressedHandle ) - flags |= TQStyle::Style_On; - - tqstyle().tqdrawPrimitive( TQStyle::PE_DockWindowHandle, &p, - TQRect( x, 0, 30, 10 ), tqcolorGroup(), - flags ); - x += 30; - } - } - - void mousePressEvent( TQMouseEvent *e ) { - pressed = TRUE; - if ( childrenListObject().isEmpty() ) - return; - mouseMoveEvent( e ); - pressedHandle = -1; - - if ( e->button() == Qt::RightButton && win->isDockMenuEnabled() ) { - // ### TODO: HideDock menu - } else { - mouseMoveEvent( e ); - } - } - - void mouseMoveEvent( TQMouseEvent *e ) { - if ( childrenListObject().isEmpty() ) - return; - if ( !pressed ) - return; - int x = 0; - int i = -1; - if ( e->y() >= 0 && e->y() <= height() ) { - TQObjectListIt it( childrenListObject() ); - TQObject *o; - while ( ( o = it.current() ) ) { - ++it; - ++i; - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(o); - if ( !dw || !dw->isVisible() ) - continue; - - if ( e->x() >= x && e->x() <= x + 30 ) { - int old = pressedHandle; - pressedHandle = i; - if ( pressedHandle != old ) - tqrepaint( TRUE ); - return; - } - x += 30; - } - } - int old = pressedHandle; - pressedHandle = -1; - if ( old != -1 ) - tqrepaint( TRUE ); - } - - void mouseReleaseEvent( TQMouseEvent *e ) { - pressed = FALSE; - if ( pressedHandle == -1 ) - return; - if ( childrenListObject().isEmpty() ) - return; - if ( e->button() == Qt::LeftButton ) { - if ( e->y() >= 0 && e->y() <= height() ) { - TQObject *o = childrenListObject().at( pressedHandle ); - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(o); - if ( dw ) { - dw->show(); - dw->dock(); - } - } - } - pressedHandle = -1; - tqrepaint( FALSE ); - } - - bool eventFilter( TQObject *o, TQEvent *e ) { - if ( TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this) || !o->isWidgetType() ) - return TQWidget::eventFilter( o, e ); - if ( e->type() == TQEvent::Hide || - e->type() == TQEvent::Show || - e->type() == TQEvent::ShowToParent ) - updateState(); - return TQWidget::eventFilter( o, e ); - } - -protected slots: - void updateState() { - bool visible = TRUE; - if ( childrenListObject().isEmpty() ) { - visible = FALSE; - } else { - TQObjectListIt it( childrenListObject() ); - TQObject *o; - while ( ( o = it.current() ) ) { - ++it; - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(o); - if ( !dw ) - continue; - if ( dw->isHidden() ) { - visible = FALSE; - continue; - } - if ( !dw->isVisible() ) - continue; - visible = TRUE; - break; - } - } - - if ( visible ) - show(); - else - hide(); - win->triggerLayout( FALSE ); - update(); - } - -protected: - void childEvent( TQChildEvent *e ) { - TQWidget::childEvent( e ); - if ( e->type() == TQEvent::ChildInserted ) - e->child()->installEventFilter( this ); - else - e->child()->removeEventFilter( this ); - TQTimer::singleShot( 50, this, SLOT(updateState()) ); // Prevent crash due to show() calling childEvent() in an infinite recursion loop under certain conditions - } - -private: - TQMainWindow *win; - int pressedHandle; - bool pressed; -#ifndef TQT_NO_TOOLTIP - TQHideToolTip *tip; - friend class TQHideToolTip; -#endif -}; - -#ifndef TQT_NO_TOOLTIP -void TQHideToolTip::maybeTip( const TQPoint &pos ) -{ - if ( !parentWidget() ) - return; - TQHideDock *dock = (TQHideDock*)parentWidget(); - - if ( dock->childrenListObject().isEmpty() ) - return; - TQObjectListIt it( dock->childrenListObject() ); - TQObject *o; - int x = 0; - while ( ( o = it.current() ) ) { - ++it; - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(o); - if ( !dw || !dw->isVisible() ) - continue; - - if ( pos.x() >= x && pos.x() <= x + 30 ) { - TQDockWindow *dw = (TQDockWindow*)o; - if ( !dw->caption().isEmpty() ) - tip( TQRect( x, 0, 30, dock->height() ), dw->caption() ); - return; - } - x += 30; - } -} -#endif - -/*! - \class TQMainWindow tqmainwindow.h - \brief The TQMainWindow class provides a main application window, - with a menu bar, dock windows (e.g. for toolbars), and a status - bar. - - \ingroup application - \mainclass - - Main windows are most often used to provide menus, toolbars and a - status bar around a large central widget, such as a text edit, - drawing canvas or TQWorkspace (for MDI applications). TQMainWindow - is usually subclassed since this makes it easier to encapsulate - the central widget, menus and toolbars as well as the window's - state. Subclassing makes it possible to create the Q_SLOTS that are - called when the user clicks menu items or toolbar buttons. You can - also create main windows using \link designer-manual.book TQt - Designer\endlink. We'll briefly review adding menu items and - toolbar buttons then describe the facilities of TQMainWindow - itself. - - \code - TQMainWindow *mw = new TQMainWindow; - TQTextEdit *edit = new TQTextEdit( mw, "editor" ); - edit->setFocus(); - mw->setCaption( "Main Window" ); - mw->setCentralWidget( edit ); - mw->show(); - \endcode - - TQMainWindows may be created in their own right as shown above. - The central widget is set with setCentralWidget(). Popup menus can - be added to the default menu bar, widgets can be added to the - status bar, toolbars and dock windows can be added to any of the - dock areas. - - \quotefile application/main.cpp - \skipto ApplicationWindow - \printuntil show - - In the extract above ApplicationWindow is a subclass of - TQMainWindow that we must write for ourselves; this is the usual - approach to using TQMainWindow. (The source for the extracts in - this description are taken from \l application/main.cpp, \l - application/application.cpp, \l action/main.cpp, and \l - action/application.cpp ) - - When subclassing we add the menu items and toolbars in the - subclass's constructor. If we've created a TQMainWindow instance - directly we can add menu items and toolbars just as easily by - passing the TQMainWindow instance as the parent instead of the \e - this pointer. - - \quotefile application/application.cpp - \skipto help = new - \printuntil about - - Here we've added a new menu with one menu item. The menu has been - inserted into the menu bar that TQMainWindow provides by default - and which is accessible through the menuBar() function. The slot - will be called when the menu item is clicked. - - \quotefile application/application.cpp - \skipto fileTools - \printuntil setLabel - \skipto TQToolButton - \printuntil open file - - This extract shows the creation of a toolbar with one toolbar - button. TQMainWindow supplies four dock areas for toolbars. When a - toolbar is created as a child of a TQMainWindow (or derived class) - instance it will be placed in a dock area (the \c Top dock area by - default). The slot will be called when the toolbar button is - clicked. Any dock window can be added to a dock area either using - addDockWindow(), or by creating a dock window with the TQMainWindow - as the parent. - - \quotefile application/application.cpp - \skipto editor - \printuntil statusBar - - Having created the menus and toolbar we create an instance of the - large central widget, give it the focus and set it as the main - window's central widget. In the example we've also set the status - bar, accessed via the statusBar() function, to an initial message - which will be displayed for two seconds. Note that you can add - additional widgets to the status bar, for example labels, to show - further status information. See the TQStatusBar documentation for - details, particularly the addWidget() function. - - Often we want to synchronize a toolbar button with a menu item. - For example, if the user clicks a 'bold' toolbar button we want - the 'bold' menu item to be checked. This synchronization can be - achieved automatically by creating actions and adding the actions - to the toolbar and menu. - - \quotefile action/application.cpp - \skipto TQAction * fileOpen - \printline - \skipto fileOpenAction - \printuntil choose - - Here we create an action with an icon which will be used in any - menu and toolbar that the action is added to. We've also given the - action a menu name, '\&Open', and a keyboard shortcut. The - connection that we have made will be used when the user clicks - either the menu item \e or the toolbar button. - - \quotefile action/application.cpp - \skipto TQPopupMenu * file - \printuntil menuBar - \skipto fileOpen - \printline - - The extract above shows the creation of a popup menu. We add the - menu to the TQMainWindow's menu bar and add our action. - - \quotefile action/application.cpp - \skipto TQToolBar * fileTool - \printuntil OpenAction - - Here we create a new toolbar as a child of the TQMainWindow and add - our action to the toolbar. - - We'll now explore the functionality offered by TQMainWindow. - - The main window will take care of the dock areas, and the tqgeometry - of the central widget, but all other aspects of the central widget - are left to you. TQMainWindow automatically detects the creation of - a menu bar or status bar if you specify the TQMainWindow as parent, - or you can use the provided menuBar() and statusBar() functions. - The functions menuBar() and statusBar() create a suitable widget - if one doesn't exist, and update the window's tqlayout to make - space. - - TQMainWindow provides a TQToolTipGroup connected to the status bar. - The function toolTipGroup() provides access to the default - TQToolTipGroup. It isn't possible to set a different tool tip - group. - - New dock windows and toolbars can be added to a TQMainWindow using - addDockWindow(). Dock windows can be moved using moveDockWindow() - and removed with removeDockWindow(). TQMainWindow allows default - dock window (toolbar) docking in all its dock areas (\c Top, \c - Left, \c Right, \c Bottom). You can use setDockEnabled() to - enable and disable docking areas for dock windows. When adding or - moving dock windows you can specify their 'edge' (dock area). The - currently available edges are: \c Top, \c Left, \c Right, \c - Bottom, \c Minimized (effectively a 'hidden' dock area) and \c - TornOff (floating). See \l TQt::Dock for an explanation of these - areas. Note that the *ToolBar functions are included for backward - compatibility; all new code should use the *DockWindow functions. - TQToolbar is a subclass of TQDockWindow so all functions that work - with dock windows work on toolbars in the same way. - - \target dwm - If the user clicks the close button, then the dock window is - hidden. A dock window can be hidden or unhidden by the user by - right clicking a dock area and clicking the name of the relevant - dock window on the pop up dock window menu. This menu lists the - names of every dock window; visible dock windows have a tick - beside their names. The dock window menu is created automatically - as required by createDockWindowMenu(). Since it may not always be - appropriate for a dock window to appear on this menu the - setAppropriate() function is used to inform the main window - whether or not the dock window menu should include a particular - dock window. Double clicking a dock window handle (usually on the - left-hand side of the dock window) undocks (floats) the dock - window. Double clicking a floating dock window's titlebar will - dock the floating dock window. (See also - \l{TQMainWindow::DockWindows}.) - - Some functions change the appearance of a TQMainWindow globally: - \list - \i TQDockWindow::setHorizontalStretchable() and - TQDockWindow::setVerticalStretchable() are used to make specific dock - windows or toolbars stretchable. - \i setUsesBigPixmaps() is used to set whether tool buttons should - draw small or large pixmaps (see TQIconSet for more information). - \i setUsesTextLabel() is used to set whether tool buttons - should display a textual label in addition to pixmaps - (see TQToolButton for more information). - \endlist - - The user can drag dock windows into any enabled docking area. Dock - windows can also be dragged \e within a docking area, for example - to rearrange the order of some toolbars. Dock windows can also be - dragged outside any docking area (undocked or 'floated'). Being - able to drag dock windows can be enabled (the default) and - disabled using setDockWindowsMovable(). - - The \c Minimized edge is a hidden dock area. If this dock area is - enabled the user can hide (minimize) a dock window or show (restore) - a minimized dock window by clicking the dock window handle. If the - user hovers the mouse cursor over one of the handles, the caption of - the dock window is displayed in a tool tip (see - TQDockWindow::caption() or TQToolBar::label()), so if you enable the - \c Minimized dock area, it is best to specify a meaningful caption - or label for each dock window. To minimize a dock window - programmatically use moveDockWindow() with an edge of \c Minimized. - - Dock windows are moved transparently by default, i.e. during the - drag an outline rectangle is drawn on the screen representing the - position of the dock window as it moves. If you want the dock - window to be shown normally whilst it is moved use - setOpaqueMoving(). - - The location of a dock window, i.e. its dock area and position - within the dock area, can be determined by calling getLocation(). - Movable dock windows can be lined up to minimize wasted space with - lineUpDockWindows(). Pointers to the dock areas are available from - topDock(), leftDock(), rightDock() and bottomDock(). A customize - menu item is added to the pop up dock window menu if - isCustomizable() returns TRUE; it returns FALSE by default. - Reimplement isCustomizable() and customize() if you want to offer - this extra menu item, for example, to allow the user to change - settings relating to the main window and its toolbars and dock - windows. - - The main window's menu bar is fixed (at the top) by default. If - you want a movable menu bar, create a TQMenuBar as a stretchable - widget inside its own movable dock window and restrict this dock - window to only live within the \c Top or \c Bottom dock: - - \code - TQToolBar *tb = new TQToolBar( this ); - addDockWindow( tb, tr( "Menubar" ), Top, FALSE ); - TQMenuBar *mb = new TQMenuBar( tb ); - mb->setFrameStyle( TQFrame::NoFrame ); - tb->setStretchableWidget( mb ); - setDockEnabled( tb, Left, FALSE ); - setDockEnabled( tb, Right, FALSE ); - \endcode - - An application with multiple dock windows can choose to save the - current dock window tqlayout in order to restore it later, e.g. in - the next session. You can do this by using the streaming operators - for TQMainWindow. - - To save the tqlayout and positions of all the dock windows do this: - - \code - TQFile file( filename ); - if ( file.open( IO_WriteOnly ) ) { - TQTextStream stream( &file ); - stream << *mainWindow; - file.close(); - } - \endcode - - To restore the dock window positions and sizes (normally when the - application is next started), do following: - - \code - TQFile file( filename ); - if ( file.open( IO_ReadOnly ) ) { - TQTextStream stream( &file ); - stream >> *mainWindow; - file.close(); - } - \endcode - - The TQSettings class can be used in conjunction with the streaming - operators to store the application's settings. - - TQMainWindow's management of dock windows and toolbars is done - transparently behind-the-scenes by TQDockArea. - - For multi-document interfaces (MDI), use a TQWorkspace as the - central widget. - - Adding dock windows, e.g. toolbars, to TQMainWindow's dock areas is - straightforward. If the supplied dock areas are not sufficient for - your application we suggest that you create a TQWidget subclass and - add your own dock areas (see \l TQDockArea) to the subclass since - TQMainWindow provides functionality specific to the standard dock - areas it provides. - - <img src=qmainwindow-m.png> <img src=qmainwindow-w.png> - - \sa TQToolBar TQDockWindow TQStatusBar TQAction TQMenuBar TQPopupMenu TQToolTipGroup TQDialog -*/ - -/*! \enum TQt::ToolBarDock - \internal -*/ - -/*! - \enum TQt::Dock - - Each dock window can be in one of the following positions: - - \value DockTop above the central widget, below the menu bar. - - \value DockBottom below the central widget, above the status bar. - - \value DockLeft to the left of the central widget. - - \value DockRight to the right of the central widget. - - \value DockMinimized the dock window is not shown (this is - effectively a 'hidden' dock area); the handles of all minimized - dock windows are drawn in one row below the menu bar. - - \value DockTornOff the dock window floats as its own top level - window which always stays on top of the main window. - - \value DockUnmanaged not managed by a TQMainWindow. -*/ - -/*! - \enum TQMainWindow::DockWindows - - Right-clicking a dock area will pop-up the dock window menu - (createDockWindowMenu() is called automatically). When called in - code you can specify what items should appear on the menu with - this enum. - - \value OnlyToolBars The menu will list all the toolbars, but not - any other dock windows. - - \value NoToolBars The menu will list dock windows but not - toolbars. - - \value AllDockWindows The menu will list all toolbars and other - dock windows. (This is the default.) -*/ - -/*! - \obsolete - \fn void TQMainWindow::addToolBar( TQDockWindow *, Dock = Top, bool newLine = FALSE ); -*/ - -/*! - \obsolete - \overload void TQMainWindow::addToolBar( TQDockWindow *, const TQString &label, Dock = Top, bool newLine = FALSE ); -*/ - -/*! - \obsolete - \fn void TQMainWindow::moveToolBar( TQDockWindow *, Dock = Top ); -*/ - -/*! - \obsolete - \overload void TQMainWindow::moveToolBar( TQDockWindow *, Dock, bool nl, int index, int extraOffset = -1 ); -*/ - -/*! - \obsolete - \fn void TQMainWindow::removeToolBar( TQDockWindow * ); -*/ - -/*! - \obsolete - \fn void TQMainWindow::lineUpToolBars( bool keepNewLines = FALSE ); -*/ - -/*! - \obsolete - \fn void TQMainWindow::toolBarPositionChanged( TQToolBar * ); -*/ - -/*! - \obsolete - \fn bool TQMainWindow::toolBarsMovable() const -*/ - -/*! - \obsolete - \fn void TQMainWindow::setToolBarsMovable( bool ) -*/ - -/*! - Constructs an empty main window. The \a parent, \a name and widget - flags \a f, are passed on to the TQWidget constructor. - - By default, the widget flags are set to \c WType_TopLevel rather - than 0 as they are with TQWidget. If you don't want your - TQMainWindow to be a top level widget then you will need to set \a - f to 0. -*/ - -TQMainWindow::TQMainWindow( TQWidget * parent, const char * name, WFlags f ) - : TQWidget( parent, name, f ) -{ - d = new TQMainWindowPrivate; -#ifdef TQ_WS_MACX - d->opaque = TRUE; -#else - d->opaque = FALSE; -#endif - installEventFilter( this ); - d->topDock = new TQDockArea( Qt::Horizontal, TQDockArea::Normal, this, "qt_top_dock" ); - d->topDock->installEventFilter( this ); - d->bottomDock = new TQDockArea( Qt::Horizontal, TQDockArea::Reverse, this, "qt_bottom_dock" ); - d->bottomDock->installEventFilter( this ); - d->leftDock = new TQDockArea( Qt::Vertical, TQDockArea::Normal, this, "qt_left_dock" ); - d->leftDock->installEventFilter( this ); - d->rightDock = new TQDockArea( Qt::Vertical, TQDockArea::Reverse, this, "qt_right_dock" ); - d->rightDock->installEventFilter( this ); - d->hideDock = new TQHideDock( this ); -} - - -/*! - Destroys the object and frees any allocated resources. -*/ - -TQMainWindow::~TQMainWindow() -{ - delete tqlayout(); - delete d; -} - -#ifndef TQT_NO_MENUBAR -/*! - Sets this main window to use the menu bar \a newMenuBar. - - The existing menu bar (if any) is deleted along with its contents. - - \sa menuBar() -*/ - -void TQMainWindow::setMenuBar( TQMenuBar * newMenuBar ) -{ - if ( !newMenuBar ) - return; - if ( d->mb ) - delete d->mb; - d->mb = newMenuBar; - d->mb->installEventFilter( this ); - triggerLayout(); -} - - -/*! - Returns the menu bar for this window. - - If there isn't one, then menuBar() creates an empty menu bar. - - \sa statusBar() -*/ - -TQMenuBar * TQMainWindow::menuBar() const -{ - if ( d->mb ) - return d->mb; - - TQObjectList * l - = ((TQObject*)this)->queryList( "TQMenuBar", 0, FALSE, FALSE ); - TQMenuBar * b; - if ( l && l->count() ) { - b = (TQMenuBar *)l->first(); - } else { - b = new TQMenuBar( (TQMainWindow *)this, "automatic menu bar" ); - b->show(); - } - delete l; - d->mb = b; - d->mb->installEventFilter( const_cast<TQT_BASE_OBJECT_NAME*>(static_cast<const TQT_BASE_OBJECT_NAME*>(this)) ); - ((TQMainWindow *)this)->triggerLayout(); - return b; -} -#endif // TQT_NO_MENUBAR - -/*! - Sets this main window to use the status bar \a newtqStatusBar. - - The existing status bar (if any) is deleted along with its - contents. - - Note that \a newtqStatusBar \e must be a child of this main window, - and that it is not automatically displayed. If you call this - function after show(), you will probably also need to call - newtqStatusBar->show(). - - \sa setMenuBar() statusBar() -*/ - -void TQMainWindow::setqStatusBar( TQStatusBar * newtqStatusBar ) -{ - if ( !newtqStatusBar || newtqStatusBar == d->sb ) - return; - if ( d->sb ) - delete d->sb; - d->sb = newtqStatusBar; -#ifndef TQT_NO_TOOLTIP - // ### this code can cause unnecessary creation of a tool tip group - connect( toolTipGroup(), TQT_SIGNAL(showTip(const TQString&)), - d->sb, TQT_SLOT(message(const TQString&)) ); - connect( toolTipGroup(), TQT_SIGNAL(removeTip()), - d->sb, TQT_SLOT(clear()) ); -#endif - d->sb->installEventFilter( this ); - triggerLayout(); -} - - -/*! - Returns this main window's status bar. If there isn't one, - statusBar() creates an empty status bar, and if necessary a tool - tip group too. - - \sa menuBar() toolTipGroup() -*/ - -TQStatusBar * TQMainWindow::statusBar() const -{ - if ( d->sb ) - return d->sb; - - TQObjectList * l - = ((TQObject*)this)->queryList( "TQStatusBar", 0, FALSE, FALSE ); - TQStatusBar * s; - if ( l && l->count() ) { - s = (TQStatusBar *)l->first(); - } else { - s = new TQStatusBar( (TQMainWindow *)this, "automatic status bar" ); - s->show(); - } - delete l; - ((TQMainWindow *)this)->setqStatusBar( s ); - ((TQMainWindow *)this)->triggerLayout( TRUE ); - return s; -} - - -#ifndef TQT_NO_TOOLTIP -/*! - Sets this main window to use the tool tip group \a - newToolTipGroup. - - The existing tool tip group (if any) is deleted along with its - contents. All the tool tips connected to it lose the ability to - display the group texts. - - \sa menuBar() toolTipGroup() -*/ - -void TQMainWindow::setToolTipGroup( TQToolTipGroup * newToolTipGroup ) -{ - if ( !newToolTipGroup || newToolTipGroup == d->ttg ) - return; - if ( d->ttg ) - delete d->ttg; - d->ttg = newToolTipGroup; - - connect( toolTipGroup(), TQT_SIGNAL(showTip(const TQString&)), - statusBar(), TQT_SLOT(message(const TQString&)) ); - connect( toolTipGroup(), TQT_SIGNAL(removeTip()), - statusBar(), TQT_SLOT(clear()) ); -} - - -/*! - Returns this main window's tool tip group. If there isn't one, - toolTipGroup() creates an empty tool tip group. - - \sa menuBar() statusBar() -*/ - -TQToolTipGroup * TQMainWindow::toolTipGroup() const -{ - if ( d->ttg ) - return d->ttg; - - TQToolTipGroup * t = new TQToolTipGroup( TQT_TQOBJECT((TQMainWindow*)this), - "automatic tool tip group" ); - ((TQMainWindowPrivate*)d)->ttg = t; - return t; -} -#endif - - -/*! - If \a enable is TRUE then users can dock windows in the \a dock - area. If \a enable is FALSE users cannot dock windows in the \a - dock dock area. - - Users can dock (drag) dock windows into any enabled dock area. -*/ - -void TQMainWindow::setDockEnabled( TQt::Dock dock, bool enable ) -{ - d->docks.replace( dock, enable ); -} - - -/*! - Returns TRUE if the \a dock dock area is enabled, i.e. it can - accept user dragged dock windows; otherwise returns FALSE. - - \sa setDockEnabled() -*/ - -bool TQMainWindow::isDockEnabled( TQt::Dock dock ) const -{ - return d->docks[ dock ]; -} - -/*! - \overload - - Returns TRUE if dock area \a area is enabled, i.e. it can accept - user dragged dock windows; otherwise returns FALSE. - - \sa setDockEnabled() -*/ - -bool TQMainWindow::isDockEnabled( TQDockArea *area ) const -{ - - if ( area == d->leftDock ) - return d->docks[ TQt::DockLeft ]; - if ( area == d->rightDock ) - return d->docks[ TQt::DockRight ]; - if ( area == d->topDock ) - return d->docks[ TQt::DockTop ]; - if ( area == d->bottomDock ) - return d->docks[ TQt::DockBottom ]; - return FALSE; -} - -/*! - \overload - - If \a enable is TRUE then users can dock the \a dw dock window in - the \a dock area. If \a enable is FALSE users cannot dock the \a - dw dock window in the \a dock area. - - In general users can dock (drag) dock windows into any enabled - dock area. Using this function particular dock areas can be - enabled (or disabled) as docking points for particular dock - windows. -*/ - - -void TQMainWindow::setDockEnabled( TQDockWindow *dw, TQt::Dock dock, bool enable ) -{ - if ( d->dockWindows.find( dw ) == -1 ) { - d->dockWindows.append( dw ); - connect( dw, TQT_SIGNAL( placeChanged(TQDockWindow::Place) ), - this, TQT_SLOT( slotPlaceChanged() ) ); - } - TQString s; - s.sprintf( "%p_%d", (void*)dw, (int)dock ); - if ( enable ) - d->disabledDocks.remove( s ); - else if ( d->disabledDocks.find( s ) == d->disabledDocks.end() ) - d->disabledDocks << s; - switch ( dock ) { - case TQt::DockTop: - topDock()->setAcceptDockWindow( dw, enable ); - break; - case TQt::DockLeft: - leftDock()->setAcceptDockWindow( dw, enable ); - break; - case TQt::DockRight: - rightDock()->setAcceptDockWindow( dw, enable ); - break; - case TQt::DockBottom: - bottomDock()->setAcceptDockWindow( dw, enable ); - break; - default: - break; - } -} - -/*! - \overload - - Returns TRUE if dock area \a area is enabled for the dock window - \a dw; otherwise returns FALSE. - - \sa setDockEnabled() -*/ - -bool TQMainWindow::isDockEnabled( TQDockWindow *dw, TQDockArea *area ) const -{ - if ( !isDockEnabled( area ) ) - return FALSE; - TQt::Dock dock; - if ( area == d->leftDock ) - dock = TQt::DockLeft; - else if ( area == d->rightDock ) - dock = TQt::DockRight; - else if ( area == d->topDock ) - dock = TQt::DockTop; - else if ( area == d->bottomDock ) - dock = TQt::DockBottom; - else - return FALSE; - return isDockEnabled( dw, dock ); -} - -/*! - \overload - - Returns TRUE if dock area \a dock is enabled for the dock window - \a tb; otherwise returns FALSE. - - \sa setDockEnabled() -*/ - -bool TQMainWindow::isDockEnabled( TQDockWindow *tb, TQt::Dock dock ) const -{ - if ( !isDockEnabled( dock ) ) - return FALSE; - TQString s; - s.sprintf( "%p_%d", (void*)tb, (int)dock ); - return d->disabledDocks.find( s ) == d->disabledDocks.end(); -} - - - -/*! - Adds \a dockWindow to the \a edge dock area. - - If \a newLine is FALSE (the default) then the \a dockWindow is - added at the end of the \a edge. For vertical edges the end is at - the bottom, for horizontal edges (including \c Minimized) the end - is at the right. If \a newLine is TRUE a new line of dock windows - is started with \a dockWindow as the first (left-most and - top-most) dock window. - - If \a dockWindow is managed by another main window, it is first - removed from that window. -*/ - -void TQMainWindow::addDockWindow( TQDockWindow *dockWindow, - TQt::Dock edge, bool newLine ) -{ -#ifdef TQ_WS_MAC - if(isTopLevel() && edge == DockTop) - ChangeWindowAttributes((WindowPtr)handle(), kWindowToolbarButtonAttribute, 0); -#endif - moveDockWindow( dockWindow, edge ); - dockWindow->setNewLine( newLine ); - if ( d->dockWindows.find( dockWindow ) == -1 ) { - d->dockWindows.append( dockWindow ); - connect( dockWindow, TQT_SIGNAL( placeChanged(TQDockWindow::Place) ), - this, TQT_SLOT( slotPlaceChanged() ) ); - dockWindow->installEventFilter( this ); - } - dockWindow->setOpaqueMoving( d->opaque ); -} - - -/*! - \overload - - Adds \a dockWindow to the dock area with label \a label. - - If \a newLine is FALSE (the default) the \a dockWindow is added at - the end of the \a edge. For vertical edges the end is at the - bottom, for horizontal edges (including \c Minimized) the end is - at the right. If \a newLine is TRUE a new line of dock windows is - started with \a dockWindow as the first (left-most and top-most) - dock window. - - If \a dockWindow is managed by another main window, it is first - removed from that window. -*/ - -void TQMainWindow::addDockWindow( TQDockWindow * dockWindow, const TQString &label, - TQt::Dock edge, bool newLine ) -{ - addDockWindow( dockWindow, edge, newLine ); -#ifndef TQT_NO_TOOLBAR - TQToolBar *tb = ::tqqt_cast<TQToolBar*>(dockWindow); - if ( tb ) - tb->setLabel( label ); -#endif -} - -/*! - Moves \a dockWindow to the end of the \a edge. - - For vertical edges the end is at the bottom, for horizontal edges - (including \c Minimized) the end is at the right. - - If \a dockWindow is managed by another main window, it is first - removed from that window. -*/ - -void TQMainWindow::moveDockWindow( TQDockWindow * dockWindow, TQt::Dock edge ) -{ - Qt::Orientation oo = dockWindow->orientation(); - switch ( edge ) { - case TQt::DockTop: - if ( dockWindow->area() != d->topDock ) - dockWindow->removeFromDock( FALSE ); - d->topDock->moveDockWindow( dockWindow ); - emit dockWindowPositionChanged( dockWindow ); - break; - case TQt::DockBottom: - if ( dockWindow->area() != d->bottomDock ) - dockWindow->removeFromDock( FALSE ); - d->bottomDock->moveDockWindow( dockWindow ); - emit dockWindowPositionChanged( dockWindow ); - break; - case TQt::DockRight: - if ( dockWindow->area() != d->rightDock ) - dockWindow->removeFromDock( FALSE ); - d->rightDock->moveDockWindow( dockWindow ); - emit dockWindowPositionChanged( dockWindow ); - break; - case TQt::DockLeft: - if ( dockWindow->area() != d->leftDock ) - dockWindow->removeFromDock( FALSE ); - d->leftDock->moveDockWindow( dockWindow ); - emit dockWindowPositionChanged( dockWindow ); - break; - case TQt::DockTornOff: - dockWindow->undock(); - break; - case TQt::DockMinimized: - dockWindow->undock( d->hideDock ); - break; - case TQt::DockUnmanaged: - break; - } - - if ( oo != dockWindow->orientation() ) - dockWindow->setOrientation( dockWindow->orientation() ); -} - -/*! - \overload - - Moves \a dockWindow to position \a index within the \a edge dock - area. - - Any dock windows with positions \a index or higher have their - position number incremented and any of these on the same line are - moved right (down for vertical dock areas) to make room. - - If \a nl is TRUE, a new dock window line is created below the line - in which the moved dock window appears and the moved dock window, - with any others with higher positions on the same line, is moved - to this new line. - - The \a extraOffset is the space to put between the left side of - the dock area (top side for vertical dock areas) and the dock - window. (This is mostly used for restoring dock windows to the - positions the user has dragged them to.) - - If \a dockWindow is managed by another main window, it is first - removed from that window. -*/ - -void TQMainWindow::moveDockWindow( TQDockWindow * dockWindow, TQt::Dock edge, bool nl, int index, int extraOffset ) -{ - Qt::Orientation oo = dockWindow->orientation(); - - dockWindow->setNewLine( nl ); - dockWindow->setOffset( extraOffset ); - switch ( edge ) { - case TQt::DockTop: - if ( dockWindow->area() != d->topDock ) - dockWindow->removeFromDock( FALSE ); - d->topDock->moveDockWindow( dockWindow, index ); - break; - case TQt::DockBottom: - if ( dockWindow->area() != d->bottomDock ) - dockWindow->removeFromDock( FALSE ); - d->bottomDock->moveDockWindow( dockWindow, index ); - break; - case TQt::DockRight: - if ( dockWindow->area() != d->rightDock ) - dockWindow->removeFromDock( FALSE ); - d->rightDock->moveDockWindow( dockWindow, index ); - break; - case TQt::DockLeft: - if ( dockWindow->area() != d->leftDock ) - dockWindow->removeFromDock( FALSE ); - d->leftDock->moveDockWindow( dockWindow, index ); - break; - case TQt::DockTornOff: - dockWindow->undock(); - break; - case TQt::DockMinimized: - dockWindow->undock( d->hideDock ); - break; - case TQt::DockUnmanaged: - break; - } - - if ( oo != dockWindow->orientation() ) - dockWindow->setOrientation( dockWindow->orientation() ); -} - -/*! - Removes \a dockWindow from the main window's docking area, - provided \a dockWindow is non-null and managed by this main - window. -*/ - -void TQMainWindow::removeDockWindow( TQDockWindow * dockWindow ) -{ -#ifdef TQ_WS_MAC - if(isTopLevel() && dockWindow->area() == topDock() && !dockWindows( DockTop ).count()) - ChangeWindowAttributes((WindowPtr)handle(), 0, kWindowToolbarButtonAttribute); -#endif - - dockWindow->hide(); - d->dockWindows.removeRef( dockWindow ); - disconnect( dockWindow, TQT_SIGNAL( placeChanged(TQDockWindow::Place) ), - this, TQT_SLOT( slotPlaceChanged() ) ); - dockWindow->removeEventFilter( this ); -} - -/*! - Sets up the tqgeometry management of the window. It is called - automatically when needed, so you shouldn't need to call it. -*/ - -void TQMainWindow::setUpLayout() -{ -#ifndef TQT_NO_MENUBAR - if ( !d->mb ) { - // slightly evil hack here. reconsider this - TQObjectList * l - = ((TQObject*)this)->queryList( "TQMenuBar", 0, FALSE, FALSE ); - if ( l && l->count() ) - d->mb = menuBar(); - delete l; - } -#endif - if ( !d->sb ) { - // as above. - TQObjectList * l - = ((TQObject*)this)->queryList( "TQStatusBar", 0, FALSE, FALSE ); - if ( l && l->count() ) - d->sb = statusBar(); - delete l; - } - - if (!d->tll) { - d->tll = new TQBoxLayout( this, TQBoxLayout::Down ); - d->tll->setResizeMode( tqminimumSize().isNull() ? TQLayout::Minimum : TQLayout::FreeResize ); - } else { - d->tll->setMenuBar( 0 ); - TQLayoutIterator it = d->tll->iterator(); - TQLayoutItem *item; - while ( (item = it.takeCurrent()) ) - delete item; - } - -#ifndef TQT_NO_MENUBAR - if ( d->mb && d->mb->isVisibleTo( this ) ) { - d->tll->setMenuBar( d->mb ); - if (tqstyle().tqstyleHint(TQStyle::SH_MainWindow_SpaceBelowMenuBar, this)) - d->tll->addSpacing( d->movable ? 1 : 2 ); - } -#endif - - d->tll->addWidget( d->hideDock ); - if(d->topDock->parentWidget() == this) - d->tll->addWidget( d->topDock ); - - TQMainWindowLayout *mwl = new TQMainWindowLayout( this, d->tll ); - d->tll->setStretchFactor( mwl, 1 ); - - if(d->leftDock->parentWidget() == this) - mwl->setLeftDock( d->leftDock ); - if ( centralWidget() ) - mwl->setCentralWidget( centralWidget() ); - if(d->rightDock->parentWidget() == this) - mwl->setRightDock( d->rightDock ); - d->mwl = mwl; - - if(d->bottomDock->parentWidget() == this) - d->tll->addWidget( d->bottomDock ); - - if ( d->sb && d->sb->parentWidget() == this) { - d->tll->addWidget( d->sb, 0 ); - // make the sb stay on top of tool bars if there isn't enough space - d->sb->raise(); - } -} - -/*! \reimp */ -void TQMainWindow::show() -{ - if ( !d->tll ) - setUpLayout(); - - // show all floating dock windows not explicitly hidden - if (!isVisible()) { - TQPtrListIterator<TQDockWindow> it(d->dockWindows); - while ( it.current() ) { - TQDockWindow *dw = it.current(); - ++it; - if ( dw->isTopLevel() && !dw->isVisible() && !dw->testWState(TQt::WState_ForceHide) ) - dw->show(); - } - } - - // show us last so we get focus - TQWidget::show(); -} - - -/*! \reimp -*/ -void TQMainWindow::hide() -{ - if ( isVisible() ) { - TQPtrListIterator<TQDockWindow> it(d->dockWindows); - while ( it.current() ) { - TQDockWindow *dw = it.current(); - ++it; - if ( dw->isTopLevel() && dw->isVisible() ) { - dw->hide(); // implicit hide, so clear forcehide - ((TQMainWindow*)dw)->clearWState(TQt::WState_ForceHide); - } - } - } - - TQWidget::hide(); -} - - -/*! \reimp */ -TQSize TQMainWindow::tqsizeHint() const -{ - TQMainWindow* that = (TQMainWindow*) this; - // Workaround: because d->tll get's deleted in - // totalSizeHint->polish->sendPostedEvents->childEvent->triggerLayout - // [eg. canvas example on TQt/Embedded] - TQApplication::sendPostedEvents( that, TQEvent::ChildInserted ); - if ( !that->d->tll ) - that->setUpLayout(); - return that->d->tll->totalSizeHint(); -} - -/*! \reimp */ -TQSize TQMainWindow::tqminimumSizeHint() const -{ - if ( !d->tll ) { - TQMainWindow* that = (TQMainWindow*) this; - that->setUpLayout(); - } - return d->tll->totalMinimumSize(); -} - -/*! - Sets the central widget for this main window to \a w. - - The central widget is surrounded by the left, top, right and - bottom dock areas. The menu bar is above the top dock area. - - \sa centralWidget() -*/ - -void TQMainWindow::setCentralWidget( TQWidget * w ) -{ - if ( d->mc ) - d->mc->removeEventFilter( this ); - d->mc = w; - if ( d->mc ) - d->mc->installEventFilter( this ); - triggerLayout(); -} - - -/*! - Returns a pointer to the main window's central widget. - - The central widget is surrounded by the left, top, right and - bottom dock areas. The menu bar is above the top dock area. - - \sa setCentralWidget() -*/ - -TQWidget * TQMainWindow::centralWidget() const -{ - return d->mc; -} - - -/*! \reimp */ - -void TQMainWindow::paintEvent( TQPaintEvent * ) -{ - if (d->mb && - tqstyle().tqstyleHint(TQStyle::SH_MainWindow_SpaceBelowMenuBar, this)) { - - TQPainter p( this ); - int y = d->mb->height() + 1; - tqstyle().tqdrawPrimitive(TQStyle::PE_Separator, &p, TQRect(0, y, width(), 1), - tqcolorGroup(), TQStyle::Style_Sunken); - } -} - - -bool TQMainWindow::dockMainWindow( TQObject *dock ) -{ - while ( dock ) { - if ( dock->parent() && TQT_BASE_OBJECT(dock->parent()) == TQT_BASE_OBJECT(this) ) - return TRUE; - if ( ::tqqt_cast<TQMainWindow*>(dock->parent()) ) - return FALSE; - dock = dock->parent(); - } - return FALSE; -} - -/*! - \reimp -*/ - -bool TQMainWindow::eventFilter( TQObject* o, TQEvent *e ) -{ - if ( e->type() == TQEvent::Show && TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(this) ) { - if ( !d->tll ) - setUpLayout(); - d->tll->activate(); - } else if ( e->type() == TQEvent::ContextMenu && d->dockMenu && - ( ::tqqt_cast<TQDockArea*>(o) && dockMainWindow( o ) || TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(d->hideDock) || TQT_BASE_OBJECT(o) == TQT_BASE_OBJECT(d->mb) ) ) { - if ( showDockMenu( ( (TQMouseEvent*)e )->globalPos() ) ) { - ( (TQContextMenuEvent*)e )->accept(); - return TRUE; - } - } - - return TQWidget::eventFilter( o, e ); -} - - -/*! - Monitors events, recieved in \a e, to ensure the tqlayout is updated. -*/ -void TQMainWindow::childEvent( TQChildEvent* e) -{ - if ( e->type() == TQEvent::ChildRemoved ) { - if ( e->child() == 0 || - !e->child()->isWidgetType() || - ((TQWidget*)e->child())->testWFlags( TQt::WType_TopLevel ) ) { - // nothing - } else if ( e->child() == d->sb ) { - d->sb = 0; - triggerLayout(); - } else if ( e->child() == d->mb ) { - d->mb = 0; - triggerLayout(); - } else if ( e->child() == d->mc ) { - d->mc = 0; - d->mwl->setCentralWidget( 0 ); - triggerLayout(); - } else if ( ::tqqt_cast<TQDockWindow*>(e->child()) ) { - removeDockWindow( (TQDockWindow *)(e->child()) ); - d->appropriate.remove( (TQDockWindow*)e->child() ); - triggerLayout(); - } - } else if ( e->type() == TQEvent::ChildInserted && !d->sb ) { - d->sb = ::tqqt_cast<TQStatusBar*>(e->child()); - if ( d->sb ) { - if ( d->tll ) { - if ( !d->tll->findWidget( d->sb ) ) - d->tll->addWidget( d->sb ); - } else { - triggerLayout(); - } - } - } -} - -/*! - \reimp -*/ - -bool TQMainWindow::event( TQEvent * e ) -{ - if ( e->type() == TQEvent::ChildRemoved && ( (TQChildEvent*)e )->child() == d->mc ) { - d->mc->removeEventFilter( this ); - d->mc = 0; - d->mwl->setCentralWidget( 0 ); - } - - return TQWidget::event( e ); -} - - -/*! - \property TQMainWindow::usesBigPixmaps - \brief whether big pixmaps are enabled - - If FALSE (the default), the tool buttons will use small pixmaps; - otherwise big pixmaps will be used. - - Tool buttons and other widgets that wish to respond to this - setting are responsible for reading the correct state on startup, - and for connecting to the main window's widget's - pixmapSizeChanged() signal. -*/ - -bool TQMainWindow::usesBigPixmaps() const -{ - return d->ubp; -} - -void TQMainWindow::setUsesBigPixmaps( bool enable ) -{ - if ( enable == (bool)d->ubp ) - return; - - d->ubp = enable; - emit pixmapSizeChanged( enable ); - - TQObjectList *l = queryList( "TQLayout" ); - if ( !l || !l->first() ) { - delete l; - return; - } - for ( TQLayout *lay = (TQLayout*)l->first(); lay; lay = (TQLayout*)l->next() ) - lay->activate(); - delete l; -} - -/*! - \property TQMainWindow::usesTextLabel - \brief whether text labels for toolbar buttons are enabled - - If disabled (the default), the tool buttons will not use text - labels. If enabled, text labels will be used. - - Tool buttons and other widgets that wish to respond to this - setting are responsible for reading the correct state on startup, - and for connecting to the main window's widget's - usesTextLabelChanged() signal. - - \sa TQToolButton::setUsesTextLabel() -*/ - -bool TQMainWindow::usesTextLabel() const -{ - return d->utl; -} - - -void TQMainWindow::setUsesTextLabel( bool enable ) -{ - if ( enable == (bool)d->utl ) - return; - - d->utl = enable; - emit usesTextLabelChanged( enable ); - - TQObjectList *l = queryList( "TQLayout" ); - if ( !l || !l->first() ) { - delete l; - return; - } - for ( TQLayout *lay = (TQLayout*)l->first(); lay; lay = (TQLayout*)l->next() ) - lay->activate(); - delete l; -} - - -/*! - \fn void TQMainWindow::pixmapSizeChanged( bool ) - - This signal is emitted whenever the setUsesBigPixmaps() is called - with a value different to the current setting. All widgets that - should respond to such changes, e.g. toolbar buttons, must connect - to this signal. -*/ - -/*! - \fn void TQMainWindow::usesTextLabelChanged( bool ) - - This signal is emitted whenever the setUsesTextLabel() is called - with a value different to the current setting. All widgets that - should respond to such changes, e.g. toolbar buttons, must connect - to this signal. -*/ - -/*! - \fn void TQMainWindow::dockWindowPositionChanged( TQDockWindow *dockWindow ) - - This signal is emitted when the \a dockWindow has changed its - position. A change in position occurs when a dock window is moved - within its dock area or moved to another dock area (including the - \c Minimized and \c TearOff dock areas). - - \sa getLocation() -*/ - -void TQMainWindow::setRightJustification( bool enable ) -{ - if ( enable == (bool)d->justify ) - return; - d->justify = enable; - triggerLayout( TRUE ); -} - - -/*! - \obsolete - \property TQMainWindow::rightJustification - \brief whether the main window right-justifies its dock windows - - If disabled (the default), stretchable dock windows are expanded, - and non-stretchable dock windows are given the minimum space they - need. Since most dock windows are not stretchable, this usually - results in an unjustified right edge (or unjustified bottom edge - for a vertical dock area). If enabled, the main window will - right-justify its dock windows. - - \sa TQDockWindow::setVerticalStretchable(), TQDockWindow::setHorizontalStretchable() -*/ - -bool TQMainWindow::rightJustification() const -{ - return d->justify; -} - -/*! \internal - */ - -void TQMainWindow::triggerLayout( bool deleteLayout ) -{ - if ( deleteLayout || !d->tll ) - setUpLayout(); - TQApplication::postEvent( this, new TQEvent( TQEvent::LayoutHint ) ); -} - -/*! - Enters 'What's This?' mode and returns immediately. - - This is the same as TQWhatsThis::enterWhatsThisMode(), but - implemented as a main window object's slot. This way it can easily - be used for popup menus, for example: - - \code - TQPopupMenu * help = new TQPopupMenu( this ); - help->insertItem( "What's &This", this , TQT_SLOT(whatsThis()), SHIFT+Key_F1); - \endcode - - \sa TQWhatsThis::enterWhatsThisMode() -*/ -void TQMainWindow::whatsThis() -{ -#ifndef TQT_NO_WHATSTHIS - TQWhatsThis::enterWhatsThisMode(); -#endif -} - - -/*! - \reimp -*/ - -void TQMainWindow::styleChange( TQStyle& old ) -{ - TQWidget::styleChange( old ); -} - -/*! - Finds the location of the dock window \a dw. - - If the \a dw dock window is found in the main window the function - returns TRUE and populates the \a dock variable with the dw's dock - area and the \a index with the dw's position within the dock area. - It also sets \a nl to TRUE if the \a dw begins a new line - (otherwise FALSE), and \a extraOffset with the dock window's offset. - - If the \a dw dock window is not found then the function returns - FALSE and the state of \a dock, \a index, \a nl and \a extraOffset - is undefined. - - If you want to save and restore dock window positions then use - operator>>() and operator<<(). - - \sa operator>>() operator<<() -*/ - -bool TQMainWindow::getLocation( TQDockWindow *dw, TQt::Dock &dock, int &index, bool &nl, int &extraOffset ) const -{ - dock = TQt::DockTornOff; - if ( d->topDock->hasDockWindow( dw, &index ) ) - dock = TQt::DockTop; - else if ( d->bottomDock->hasDockWindow( dw, &index ) ) - dock = TQt::DockBottom; - else if ( d->leftDock->hasDockWindow( dw, &index ) ) - dock = TQt::DockLeft; - else if ( d->rightDock->hasDockWindow( dw, &index ) ) - dock = TQt::DockRight; - else if ( dw->parentWidget() == d->hideDock ) { - index = 0; - dock = TQt::DockMinimized; - } else { - index = 0; - } - nl = dw->newLine(); - extraOffset = dw->offset(); - return TRUE; -} - -#ifndef TQT_NO_TOOLBAR -/*! - Returns a list of all the toolbars which are in the \a dock dock - area, regardless of their state. - - For example, the \c TornOff dock area may contain closed toolbars - but these are returned along with the visible toolbars. - - \sa dockWindows() -*/ - -TQPtrList<TQToolBar> TQMainWindow::toolBars( TQt::Dock dock ) const -{ - TQPtrList<TQDockWindow> lst = dockWindows( dock ); - TQPtrList<TQToolBar> tbl; - for ( TQDockWindow *w = lst.first(); w; w = lst.next() ) { - TQToolBar *tb = ::tqqt_cast<TQToolBar*>(w); - if ( tb ) - tbl.append( tb ); - } - return tbl; -} -#endif - -/*! - Returns a list of all the dock windows which are in the \a dock - dock area, regardless of their state. - - For example, the \c DockTornOff dock area may contain closed dock - windows but these are returned along with the visible dock - windows. -*/ - -TQPtrList<TQDockWindow> TQMainWindow::dockWindows( TQt::Dock dock ) const -{ - TQPtrList<TQDockWindow> lst; - switch ( dock ) { - case TQt::DockTop: - return d->topDock->dockWindowList(); - case TQt::DockBottom: - return d->bottomDock->dockWindowList(); - case TQt::DockLeft: - return d->leftDock->dockWindowList(); - case TQt::DockRight: - return d->rightDock->dockWindowList(); - case TQt::DockTornOff: { - for ( TQDockWindow *w = d->dockWindows.first(); w; w = d->dockWindows.next() ) { - if ( !w->area() && w->place() == TQDockWindow::OutsideDock ) - lst.append( w ); - } - } - return lst; - case TQt::DockMinimized: { - if ( !d->hideDock->childrenListObject().isEmpty() ) { - TQObjectListIt it( d->hideDock->childrenListObject() ); - TQObject *o; - while ( ( o = it.current() ) ) { - ++it; - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(o); - if ( !dw ) - continue; - lst.append( dw ); - } - } - } - return lst; - default: - break; - } - return lst; -} - -/*! - \overload - - Returns the list of dock windows which belong to this main window, - regardless of which dock area they are in or what their state is, - (e.g. irrespective of whether they are visible or not). -*/ - -TQPtrList<TQDockWindow> TQMainWindow::dockWindows() const -{ - return d->dockWindows; -} - -void TQMainWindow::setDockWindowsMovable( bool enable ) -{ - d->movable = enable; - TQObjectList *l = queryList( "TQDockWindow" ); - if ( l ) { - for ( TQObject *o = l->first(); o; o = l->next() ) - ( (TQDockWindow*)o )->setMovingEnabled( enable ); - } - delete l; -} - -/*! - \property TQMainWindow::dockWindowsMovable - \brief whether the dock windows are movable - - If TRUE (the default), the user will be able to move movable dock - windows from one TQMainWindow dock area to another, including the - \c TearOff area (i.e. where the dock window floats freely as a - window in its own right), and the \c Minimized area (where only - the dock window's handle is shown below the menu bar). Moveable - dock windows can also be moved within TQMainWindow dock areas, i.e. - to rearrange them within a dock area. - - If FALSE the user will not be able to move any dock windows. - - By default dock windows are moved transparently (i.e. only an - outline rectangle is shown during the drag), but this setting can - be changed with setOpaqueMoving(). - - \sa setDockEnabled(), setOpaqueMoving() -*/ - -bool TQMainWindow::dockWindowsMovable() const -{ - return d->movable; -} - -void TQMainWindow::setOpaqueMoving( bool b ) -{ - d->opaque = b; - TQObjectList *l = queryList( "TQDockWindow" ); - if ( l ) { - for ( TQObject *o = l->first(); o; o = l->next() ) - ( (TQDockWindow*)o )->setOpaqueMoving( b ); - } - delete l; -} - -/*! - \property TQMainWindow::opaqueMoving - \brief whether dock windows are moved opaquely - - If TRUE the dock windows of the main window are shown opaquely - (i.e. it shows the toolbar as it looks when docked) whilst it is - being moved. If FALSE (the default) they are shown transparently, - (i.e. as an outline rectangle). - - \warning Opaque moving of toolbars and dockwindows is known to - have several problems. We recommend avoiding the use of this - feature for the time being. We intend fixing the problems in a - future release. -*/ - -bool TQMainWindow::opaqueMoving() const -{ - return d->opaque; -} - -/*! - This function will line up dock windows within the visible dock - areas (\c Top, \c Left, \c Right and \c Bottom) as compactly as - possible. - - If \a keepNewLines is TRUE, all dock windows stay on their - original lines. If \a keepNewLines is FALSE then newlines may be - removed to achieve the most compact tqlayout possible. - - The method only works if dockWindowsMovable() returns TRUE. -*/ - -void TQMainWindow::lineUpDockWindows( bool keepNewLines ) -{ - if ( !dockWindowsMovable() ) - return; - d->topDock->lineUp( keepNewLines ); - d->leftDock->lineUp( keepNewLines ); - d->rightDock->lineUp( keepNewLines ); - d->bottomDock->lineUp( keepNewLines ); -} - -/*! - Returns TRUE, if the dock window menu is enabled; otherwise - returns FALSE. - - The menu lists the (appropriate()) dock windows (which may be - shown or hidden), and has a "Line Up Dock Windows" menu item. It - will also have a "Customize" menu item if isCustomizable() returns - TRUE. - - \sa setDockEnabled(), lineUpDockWindows() appropriate() - setAppropriate() -*/ - -bool TQMainWindow::isDockMenuEnabled() const -{ - return d->dockMenu; -} - -/*! - If \a b is TRUE, then right clicking on a dock window or dock area - will pop up the dock window menu. If \a b is FALSE, right clicking - a dock window or dock area will not pop up the menu. - - The menu lists the (appropriate()) dock windows (which may be - shown or hidden), and has a "Line Up Dock Windows" item. It will - also have a "Customize" menu item if isCustomizable() returns - TRUE. - - \sa lineUpDockWindows(), isDockMenuEnabled() -*/ - -void TQMainWindow::setDockMenuEnabled( bool b ) -{ - d->dockMenu = b; -} - -/*! - Creates the dock window menu which contains all toolbars (if \a - dockWindows is \c OnlyToolBars ), all dock windows (if \a - dockWindows is \c NoToolBars) or all toolbars and dock windows (if - \a dockWindows is \c AllDockWindows - the default). - - This function is called internally when necessary, e.g. when the - user right clicks a dock area (providing isDockMenuEnabled() - returns TRUE). -\omit -### TQt 4.0 - You can reimplement this function if you wish to customize the - behaviour. -\endomit - - The menu items representing the toolbars and dock windows are - checkable. The visible dock windows are checked and the hidden - dock windows are unchecked. The user can click a menu item to - change its state (show or hide the dock window). - - The list and the state are always kept up-to-date. - - Toolbars and dock windows which are not appropriate in the current - context (see setAppropriate()) are not listed in the menu. - - The menu also has a menu item for lining up the dock windows. - - If isCustomizable() returns TRUE, a Customize menu item is added - to the menu, which if clicked will call customize(). The - isCustomizable() function we provide returns FALSE and customize() - does nothing, so they must be reimplemented in a subclass to be - useful. -*/ - -TQPopupMenu *TQMainWindow::createDockWindowMenu( DockWindows dockWindows ) const -{ - TQObjectList *l = queryList( "TQDockWindow" ); - - if ( !l || l->isEmpty() ) - return 0; - - delete l; - - TQPopupMenu *menu = new TQPopupMenu( (TQMainWindow*)this, "qt_customize_menu" ); - menu->setCheckable( TRUE ); - d->dockWindowModes.replace( menu, dockWindows ); - connect( menu, TQT_SIGNAL( aboutToShow() ), this, TQT_SLOT( menuAboutToShow() ) ); - return menu; -} - -/*! - This slot is called from the aboutToShow() signal of the default - dock menu of the mainwindow. The default implementation - initializes the menu with all dock windows and toolbars in this - slot. -\omit -### TQt 4.0 - If you want to do small adjustments to the menu, you can do it in - this slot; or you can reimplement createDockWindowMenu(). -\endomit -*/ - -void TQMainWindow::menuAboutToShow() -{ - TQPopupMenu *menu = (TQPopupMenu*)sender(); - TQMap<TQPopupMenu*, DockWindows>::Iterator it = d->dockWindowModes.find( menu ); - if ( it == d->dockWindowModes.end() ) - return; - menu->clear(); - - DockWindows dockWindows = *it; - - TQObjectList *l = queryList( "TQDockWindow" ); - - bool empty = TRUE; - if ( l && !l->isEmpty() ) { - - TQObject *o = 0; - if ( dockWindows == AllDockWindows || dockWindows == NoToolBars ) { - for ( o = l->first(); o; o = l->next() ) { - TQDockWindow *dw = (TQDockWindow*)o; - if ( !appropriate( dw ) || ::tqqt_cast<TQToolBar*>(dw) || !dockMainWindow( TQT_TQOBJECT(dw) ) ) - continue; - TQString label = dw->caption(); - if ( !label.isEmpty() ) { - int id = menu->insertItem( label, TQT_TQOBJECT(dw), TQT_SLOT( toggleVisible() ) ); - menu->setItemChecked( id, dw->isVisible() ); - empty = FALSE; - } - } - if ( !empty ) - menu->insertSeparator(); - } - - empty = TRUE; - -#ifndef TQT_NO_TOOLBAR - if ( dockWindows == AllDockWindows || dockWindows == OnlyToolBars ) { - for ( o = l->first(); o; o = l->next() ) { - TQToolBar *tb = ::tqqt_cast<TQToolBar*>(o); - if ( !tb || !appropriate(tb) || !dockMainWindow(TQT_TQOBJECT(tb)) ) - continue; - TQString label = tb->label(); - if ( !label.isEmpty() ) { - int id = menu->insertItem( label, TQT_TQOBJECT(tb), TQT_SLOT( toggleVisible() ) ); - menu->setItemChecked( id, tb->isVisible() ); - empty = FALSE; - } - } - } -#endif - - } - - delete l; - - if ( !empty ) - menu->insertSeparator(); - - if ( dockWindowsMovable() ) - menu->insertItem( tr( "Line up" ), TQT_TQOBJECT(this), TQT_SLOT( doLineUp() ) ); - if ( isCustomizable() ) - menu->insertItem( tr( "Customize..." ), TQT_TQOBJECT(this), TQT_SLOT( customize() ) ); -} - -/*! - Shows the dock menu at the position \a globalPos. The menu lists - the dock windows so that they can be shown (or hidden), lined up, - and possibly customized. Returns TRUE if the menu is shown; - otherwise returns FALSE. - - If you want a custom menu, reimplement this function. You can - create the menu from scratch or call createDockWindowMenu() and - modify the result. -\omit -### TQt 4.0 - The default implementation uses the dock window menu which gets - created by createDockWindowMenu(). You can reimplement - createDockWindowMenu() if you want to use your own specialized - popup menu. -\endomit -*/ - -bool TQMainWindow::showDockMenu( const TQPoint &globalPos ) -{ - if ( !d->dockMenu ) - return FALSE; - if ( !d->rmbMenu ) - d->rmbMenu = createDockWindowMenu(); - if ( !d->rmbMenu ) - return FALSE; - - d->rmbMenu->exec( globalPos ); - return TRUE; -} - -void TQMainWindow::slotPlaceChanged() -{ - TQObject* obj = (TQObject*)sender(); - TQDockWindow *dw = ::tqqt_cast<TQDockWindow*>(obj); - if ( dw ) - emit dockWindowPositionChanged( dw ); -#ifndef TQT_NO_TOOLBAR - TQToolBar *tb = ::tqqt_cast<TQToolBar*>(obj); - if ( tb ) - emit toolBarPositionChanged( tb ); -#endif -} - -/*! - \internal - For internal use of TQDockWindow only. - */ - -TQDockArea *TQMainWindow::dockingArea( const TQPoint &p ) -{ - int mh = d->mb ? d->mb->height() : 0; - int sh = d->sb ? d->sb->height() : 0; - if ( p.x() >= -5 && p.x() <= 100 && p.y() > mh && p.y() - height() - sh ) - return d->leftDock; - if ( p.x() >= width() - 100 && p.x() <= width() + 5 && p.y() > mh && p.y() - height() - sh ) - return d->rightDock; - if ( p.y() >= -5 && p.y() < mh + 100 && p.x() >= 0 && p.x() <= width() ) - return d->topDock; - if ( p.y() >= height() - sh - 100 && p.y() <= height() + 5 && p.x() >= 0 && p.x() <= width() ) - return d->bottomDock; - return 0; -} - -/*! - Returns TRUE if \a dw is a dock window known to the main window; - otherwise returns FALSE. -*/ - -bool TQMainWindow::hasDockWindow( TQDockWindow *dw ) -{ - return d->dockWindows.findRef( dw ) != -1; -} - -/*! - Returns the \c Left dock area - - \sa rightDock() topDock() bottomDock() -*/ - -TQDockArea *TQMainWindow::leftDock() const -{ - return d->leftDock; -} - -/*! - Returns the \c Right dock area - - \sa leftDock() topDock() bottomDock() -*/ - -TQDockArea *TQMainWindow::rightDock() const -{ - return d->rightDock; -} - -/*! - Returns the \c Top dock area - - \sa bottomDock() leftDock() rightDock() -*/ - -TQDockArea *TQMainWindow::topDock() const -{ - return d->topDock; -} - -/*! - Returns a pointer the \c Bottom dock area - - \sa topDock() leftDock() rightDock() -*/ - -TQDockArea *TQMainWindow::bottomDock() const -{ - return d->bottomDock; -} - -/*! - This function is called when the user clicks the Customize menu - item on the dock window menu. - - The customize menu item will only appear if isCustomizable() - returns TRUE (it returns FALSE by default). - - The function is intended, for example, to provide the user with a - means of telling the application that they wish to customize the - main window, dock windows or dock areas. - - The default implementation does nothing and the Customize menu - item is not shown on the right-click menu by default. If you want - the item to appear then reimplement isCustomizable() to return - TRUE, and reimplement this function to do whatever you want. - - \sa isCustomizable() -*/ - -void TQMainWindow::customize() -{ -} - -/*! - Returns TRUE if the dock area dock window menu includes the - Customize menu item (which calls customize() when clicked). - Returns FALSE by default, i.e. the popup menu will not contain a - Customize menu item. You will need to reimplement this function - and set it to return TRUE if you wish the user to be able to see - the dock window menu. - - \sa customize() -*/ - -bool TQMainWindow::isCustomizable() const -{ - return FALSE; -} - -/*! - Returns TRUE if it is appropriate to include a menu item for the - \a dw dock window in the dock window menu; otherwise returns - FALSE. - - The user is able to change the state (show or hide) a dock window - that has a menu item by clicking the item. - - Call setAppropriate() to indicate whether or not a particular dock - window should appear on the popup menu. - - \sa setAppropriate() -*/ - -bool TQMainWindow::appropriate( TQDockWindow *dw ) const -{ - TQMap<TQDockWindow*, bool>::ConstIterator it = d->appropriate.find( dw ); - if ( it == d->appropriate.end() ) - return TRUE; - return *it; -} - -/*! - Use this function to control whether or not the \a dw dock - window's caption should appear as a menu item on the dock window - menu that lists the dock windows. - - If \a a is TRUE then the \a dw will appear as a menu item on the - dock window menu. The user is able to change the state (show or - hide) a dock window that has a menu item by clicking the item; - depending on the state of your application, this may or may not be - appropriate. If \a a is FALSE the \a dw will not appear on the - popup menu. - - \sa showDockMenu() isCustomizable() customize() -*/ - -void TQMainWindow::setAppropriate( TQDockWindow *dw, bool a ) -{ - d->appropriate.replace( dw, a ); -} - -#ifndef TQT_NO_TEXTSTREAM -static void saveDockArea( TQTextStream &ts, TQDockArea *a ) -{ - TQPtrList<TQDockWindow> l = a->dockWindowList(); - for ( TQDockWindow *dw = l.first(); dw; dw = l.next() ) { - ts << TQString( dw->caption() ); - ts << ","; - } - ts << endl; - ts << *a; -} - -/*! - \relates TQMainWindow - - Writes the tqlayout (sizes and positions) of the dock windows in the - dock areas of the TQMainWindow \a mainWindow, including \c - Minimized and \c TornOff dock windows, to the text stream \a ts. - - This can be used, for example, in conjunction with TQSettings to - save the user's tqlayout when the \mainWindow receives a closeEvent. - - \sa operator>>() closeEvent() -*/ - -TQTextStream &operator<<( TQTextStream &ts, const TQMainWindow &mainWindow ) -{ - TQPtrList<TQDockWindow> l = mainWindow.dockWindows( TQt::DockMinimized ); - TQDockWindow *dw = 0; - for ( dw = l.first(); dw; dw = l.next() ) { - ts << dw->caption(); - ts << ","; - } - ts << endl; - - l = mainWindow.dockWindows( TQt::DockTornOff ); - for ( dw = l.first(); dw; dw = l.next() ) { - ts << dw->caption(); - ts << ","; - } - ts << endl; - for ( dw = l.first(); dw; dw = l.next() ) { - ts << "[" << dw->caption() << "," - << (int)dw->tqgeometry().x() << "," - << (int)dw->tqgeometry().y() << "," - << (int)dw->tqgeometry().width() << "," - << (int)dw->tqgeometry().height() << "," - << (int)dw->isVisible() << "]"; - } - ts << endl; - - saveDockArea( ts, mainWindow.topDock() ); - saveDockArea( ts, mainWindow.bottomDock() ); - saveDockArea( ts, mainWindow.rightDock() ); - saveDockArea( ts, mainWindow.leftDock() ); - return ts; -} - -static void loadDockArea( const TQStringList &names, TQDockArea *a, TQt::Dock d, TQPtrList<TQDockWindow> &l, TQMainWindow *mw, TQTextStream &ts ) -{ - for ( TQStringList::ConstIterator it = names.begin(); it != names.end(); ++it ) { - for ( TQDockWindow *dw = l.first(); dw; dw = l.next() ) { - if ( dw->caption() == *it ) { - mw->addDockWindow( dw, d ); - break; - } - } - } - if ( a ) { - ts >> *a; - } else if ( d == TQt::DockTornOff ) { - TQString s = ts.readLine(); - enum State { Pre, Name, X, Y, Width, Height, Visible, Post }; - int state = Pre; - TQString name, x, y, w, h, visible; - TQChar c; - for ( int i = 0; i < (int)s.length(); ++i ) { - c = s[ i ]; - if ( state == Pre && c == '[' ) { - state++; - continue; - } - if ( c == ',' && - ( state == Name || state == X || state == Y || state == Width || state == Height ) ) { - state++; - continue; - } - if ( state == Visible && c == ']' ) { - for ( TQDockWindow *dw = l.first(); dw; dw = l.next() ) { - if ( TQString( dw->caption() ) == name ) { - if ( !::tqqt_cast<TQToolBar*>(dw) ) - dw->setGeometry( x.toInt(), y.toInt(), w.toInt(), h.toInt() ); - else - dw->setGeometry( x.toInt(), y.toInt(), dw->width(), dw->height() ); - if ( !(bool)visible.toInt() ) - dw->hide(); - else - dw->show(); - break; - } - } - - name = x = y = w = h = visible = ""; - - state = Pre; - continue; - } - if ( state == Name ) - name += c; - else if ( state == X ) - x += c; - else if ( state == Y ) - y += c; - else if ( state == Width ) - w += c; - else if ( state == Height ) - h += c; - else if ( state == Visible ) - visible += c; - } - } -} - -/*! - \relates TQMainWindow - - Reads the tqlayout (sizes and positions) of the dock windows in the - dock areas of the TQMainWindow \a mainWindow from the text stream, - \a ts, including \c Minimized and \c TornOff dock windows. - Restores the dock windows and dock areas to these sizes and - positions. The tqlayout information must be in the format produced - by operator<<(). - - This can be used, for example, in conjunction with TQSettings to - restore the user's tqlayout. - - \sa operator<<() -*/ - -TQTextStream &operator>>( TQTextStream &ts, TQMainWindow &mainWindow ) -{ - TQPtrList<TQDockWindow> l = mainWindow.dockWindows(); - - TQString s = ts.readLine(); - TQStringList names = TQStringList::split( ',', s ); - loadDockArea( names, 0, TQt::DockMinimized, l, &mainWindow, ts ); - - s = ts.readLine(); - names = TQStringList::split( ',', s ); - loadDockArea( names, 0, TQt::DockTornOff, l, &mainWindow, ts ); - - int i = 0; - TQDockArea *areas[] = { mainWindow.topDock(), mainWindow.bottomDock(), mainWindow.rightDock(), mainWindow.leftDock() }; - for ( int d = (int)TQt::DockTop; d != (int)TQt::DockMinimized; ++d, ++i ) { - s = ts.readLine(); - names = TQStringList::split( ',', s ); - loadDockArea( names, areas[ i ], (TQt::Dock)d, l, &mainWindow, ts ); - } - return ts; -} -#endif - -#include "tqmainwindow.tqmoc" - -#endif |