src/gui/widgets/qmainwindowlayout_p.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/widgets/qmainwindowlayout_p.h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,346 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDYNAMICMAINWINDOWLAYOUT_P_H
+#define QDYNAMICMAINWINDOWLAYOUT_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qmainwindow.h"
+
+#ifndef QT_NO_MAINWINDOW
+
+#include "QtGui/qlayout.h"
+#include "QtGui/qtabbar.h"
+#include "QtCore/qvector.h"
+#include "QtCore/qset.h"
+#include "QtCore/qbasictimer.h"
+#include "private/qlayoutengine_p.h"
+#include "private/qwidgetanimator_p.h"
+
+#include "qdockarealayout_p.h"
+#include "qtoolbararealayout_p.h"
+
+//#define Q_DEBUG_MAINWINDOW_LAYOUT
+
+#ifdef Q_DEBUG_MAINWINDOW_LAYOUT
+QT_BEGIN_NAMESPACE
+class QTextStream;
+Q_GUI_EXPORT void qt_dumpLayout(QTextStream &qout, QMainWindow *window);
+QT_END_NAMESPACE
+#endif // Q_DEBUG_MAINWINDOW_LAYOUT
+
+#ifdef Q_WS_MAC
+// Forward defs to make avoid including Carbon.h (faster compile you know ;).
+struct OpaqueHIObjectRef;
+typedef struct OpaqueHIObjectRef*       HIObjectRef;
+typedef HIObjectRef                     HIToolbarItemRef;
+typedef const void * CFTypeRef;
+typedef const struct __CFString * CFStringRef;
+
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QToolBar;
+class QRubberBand;
+
+/* This data structure represents the state of all the tool-bars and dock-widgets. It's value based
+   so it can be easilly copied into a temporary variable. All operations are performed without moving
+   any widgets. Only when we are sure we have the desired state, we call apply(), which moves the
+   widgets.
+*/
+
+class QMainWindowLayoutState
+{
+public:
+    QRect rect;
+    QMainWindow *mainWindow;
+
+    QMainWindowLayoutState(QMainWindow *win);
+
+#ifndef QT_NO_TOOLBAR
+    QToolBarAreaLayout toolBarAreaLayout;
+#endif
+
+#ifndef QT_NO_DOCKWIDGET
+    QDockAreaLayout dockAreaLayout;
+#else
+    QLayoutItem *centralWidgetItem;
+    QRect centralWidgetRect;
+#endif
+
+    void apply(bool animated);
+    void deleteAllLayoutItems();
+    void deleteCentralWidgetItem();
+
+    QSize sizeHint() const;
+    QSize minimumSize() const;
+    void fitLayout();
+
+    QLayoutItem *itemAt(int index, int *x) const;
+    QLayoutItem *takeAt(int index, int *x);
+    QList<int> indexOf(QWidget *widget) const;
+    QLayoutItem *item(const QList<int> &path);
+    QRect itemRect(const QList<int> &path) const;
+    QRect gapRect(const QList<int> &path) const; // ### get rid of this, use itemRect() instead
+
+    bool contains(QWidget *widget) const;
+
+    void setCentralWidget(QWidget *widget);
+    QWidget *centralWidget() const;
+
+    QList<int> gapIndex(QWidget *widget, const QPoint &pos) const;
+    bool insertGap(const QList<int> &path, QLayoutItem *item);
+    void remove(const QList<int> &path);
+    void remove(QLayoutItem *item);
+    void clear();
+    bool isValid() const;
+
+    QLayoutItem *plug(const QList<int> &path);
+    QLayoutItem *unplug(const QList<int> &path, QMainWindowLayoutState *savedState = 0);
+
+    void saveState(QDataStream &stream) const;
+    bool checkFormat(QDataStream &stream, bool pre43);
+    bool restoreState(QDataStream &stream, const QMainWindowLayoutState &oldState);
+};
+
+class Q_AUTOTEST_EXPORT QMainWindowLayout : public QLayout
+{
+    Q_OBJECT
+
+public:
+    QMainWindowLayoutState layoutState, savedState;
+
+    explicit QMainWindowLayout(QMainWindow *mainwindow);
+    ~QMainWindowLayout();
+
+    QMainWindow::DockOptions dockOptions;
+    void setDockOptions(QMainWindow::DockOptions opts);
+    bool usesHIToolBar(QToolBar *toolbar) const;
+
+    void timerEvent(QTimerEvent *e);
+
+    // status bar
+
+    QLayoutItem *statusbar;
+
+#ifndef QT_NO_STATUSBAR
+    QStatusBar *statusBar() const;
+    void setStatusBar(QStatusBar *sb);
+#endif
+
+    // central widget
+
+    QWidget *centralWidget() const;
+    void setCentralWidget(QWidget *cw);
+
+    // toolbars
+
+#ifndef QT_NO_TOOLBAR
+    void addToolBarBreak(Qt::ToolBarArea area);
+    void insertToolBarBreak(QToolBar *before);
+    void removeToolBarBreak(QToolBar *before);
+
+    void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar, bool needAddChildWidget = true);
+    void insertToolBar(QToolBar *before, QToolBar *toolbar);
+    Qt::ToolBarArea toolBarArea(QToolBar *toolbar) const;
+    bool toolBarBreak(QToolBar *toolBar) const;
+    void getStyleOptionInfo(QStyleOptionToolBar *option, QToolBar *toolBar) const;
+    void removeToolBar(QToolBar *toolbar);
+    void toggleToolBarsVisible();
+    void moveToolBar(QToolBar *toolbar, int pos);
+#endif
+
+    // dock widgets
+
+#ifndef QT_NO_DOCKWIDGET
+    void setCorner(Qt::Corner corner, Qt::DockWidgetArea area);
+    Qt::DockWidgetArea corner(Qt::Corner corner) const;
+    void addDockWidget(Qt::DockWidgetArea area,
+                       QDockWidget *dockwidget,
+                       Qt::Orientation orientation);
+    void splitDockWidget(QDockWidget *after,
+                         QDockWidget *dockwidget,
+                         Qt::Orientation orientation);
+    void tabifyDockWidget(QDockWidget *first, QDockWidget *second);
+    Qt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget) const;
+    void raise(QDockWidget *widget);
+    void setVerticalTabsEnabled(bool enabled);
+    bool restoreDockWidget(QDockWidget *dockwidget);
+
+#ifndef QT_NO_TABBAR
+    bool _documentMode;
+    bool documentMode() const;
+    void setDocumentMode(bool enabled);
+
+    QTabBar *getTabBar();
+    QSet<QTabBar*> usedTabBars;
+    QList<QTabBar*> unusedTabBars;
+    bool verticalTabsEnabled;
+
+    QWidget *getSeparatorWidget();
+    QSet<QWidget*> usedSeparatorWidgets;
+    QList<QWidget*> unusedSeparatorWidgets;
+    int sep; // separator extent
+
+#ifndef QT_NO_TABWIDGET
+    QTabWidget::TabPosition tabPositions[4];
+    QTabWidget::TabShape _tabShape;
+
+    QTabWidget::TabShape tabShape() const;
+    void setTabShape(QTabWidget::TabShape tabShape);
+    QTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area) const;
+    void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition);
+#endif // QT_NO_TABWIDGET
+#endif // QT_NO_TABBAR
+
+    // separators
+
+    QList<int> movingSeparator;
+    QPoint movingSeparatorOrigin, movingSeparatorPos;
+    QBasicTimer separatorMoveTimer;
+
+    bool startSeparatorMove(const QPoint &pos);
+    bool separatorMove(const QPoint &pos);
+    bool endSeparatorMove(const QPoint &pos);
+    void keepSize(QDockWidget *w);
+#endif // QT_NO_DOCKWIDGET
+
+    // save/restore
+
+    enum { // sentinel values used to validate state data
+        VersionMarker = 0xff
+    };
+    void saveState(QDataStream &stream) const;
+    bool restoreState(QDataStream &stream);
+
+    // QLayout interface
+
+    void addItem(QLayoutItem *item);
+    void setGeometry(const QRect &r);
+    QLayoutItem *itemAt(int index) const;
+    QLayoutItem *takeAt(int index);
+    int count() const;
+
+    QSize sizeHint() const;
+    QSize minimumSize() const;
+    mutable QSize szHint;
+    mutable QSize minSize;
+    void invalidate();
+
+    // animations
+
+    QWidgetAnimator widgetAnimator;
+    QList<int> currentGapPos;
+    QRect currentGapRect;
+    QWidget *pluggingWidget;
+#ifndef QT_NO_RUBBERBAND
+    QRubberBand *gapIndicator;
+#endif
+
+    QList<int> hover(QLayoutItem *widgetItem, const QPoint &mousePos);
+    bool plug(QLayoutItem *widgetItem);
+    QLayoutItem *unplug(QWidget *widget);
+    void revert(QLayoutItem *widgetItem);
+    void updateGapIndicator();
+    void paintDropIndicator(QPainter *p, QWidget *widget, const QRegion &clip);
+    void applyState(QMainWindowLayoutState &newState, bool animate = true);
+    void restore(bool keepSavedState = false);
+    void updateHIToolBarStatus();
+    void animationFinished(QWidget *widget);
+
+private Q_SLOTS:
+#ifndef QT_NO_DOCKWIDGET
+#ifndef QT_NO_TABBAR
+    void tabChanged();
+#endif
+#endif
+private:
+#ifndef QT_NO_TABBAR
+    void updateTabBarShapes();
+#endif
+#ifdef Q_WS_MAC
+#  ifndef QT_MAC_USE_COCOA
+    static OSStatus qtmacToolbarDelegate(EventHandlerCallRef, EventRef , void *);
+    static OSStatus qtoolbarInHIToolbarHandler(EventHandlerCallRef inCallRef, EventRef event,
+                                               void *data);
+    static void qtMacHIToolbarRegisterQToolBarInHIToolborItemClass();
+    static HIToolbarItemRef CreateToolbarItemForIdentifier(CFStringRef identifier, CFTypeRef data);
+    static HIToolbarItemRef createQToolBarInHIToolbarItem(QToolBar *toolbar,
+                                                          QMainWindowLayout *layout);
+#  endif
+public:
+    struct ToolBarSaveState {
+        ToolBarSaveState() : movable(false) { }
+        ToolBarSaveState(bool newMovable, const QSize &newMax)
+        : movable(newMovable), maximumSize(newMax) { }
+        bool movable;
+        QSize maximumSize;
+    };
+    QList<QToolBar *> qtoolbarsInUnifiedToolbarList;
+    QList<void *> toolbarItemsCopy;
+    QHash<void *, QToolBar *> unifiedToolbarHash;
+    QHash<QToolBar *, ToolBarSaveState> toolbarSaveState;
+    QHash<QString, QToolBar *> cocoaItemIDToToolbarHash;
+    void insertIntoMacToolbar(QToolBar *before, QToolBar *after);
+    void removeFromMacToolbar(QToolBar *toolbar);
+    void cleanUpMacToolbarItems();
+    void fixSizeInUnifiedToolbar(QToolBar *tb) const;
+    bool useHIToolBar;
+    void syncUnifiedToolbarVisibility();
+    bool blockVisiblityCheck;
+#endif
+};
+QT_END_NAMESPACE
+
+#endif // QT_NO_MAINWINDOW
+
+#endif // QDYNAMICMAINWINDOWLAYOUT_P_H