summaryrefslogtreecommitdiffstats
path: root/src/gui/widgets/qmainwindowlayout_p.h
diff options
context:
space:
mode:
authorQt by Nokia <qt-info@nokia.com>2011-04-27 12:05:43 +0200
committeraxis <qt-info@nokia.com>2011-04-27 12:05:43 +0200
commit38be0d13830efd2d98281c645c3a60afe05ffece (patch)
tree6ea73f3ec77f7d153333779883e8120f82820abe /src/gui/widgets/qmainwindowlayout_p.h
Initial import from the monolithic Qt.
This is the beginning of revision history for this module. If you want to look at revision history older than this, please refer to the Qt Git wiki for how to use Git history grafting. At the time of writing, this wiki is located here: http://qt.gitorious.org/qt/pages/GitIntroductionWithQt If you have already performed the grafting and you don't see any history beyond this commit, try running "git log" with the "--follow" argument. Branched from the monolithic repo, Qt master branch, at commit 896db169ea224deb96c59ce8af800d019de63f12
Diffstat (limited to 'src/gui/widgets/qmainwindowlayout_p.h')
-rw-r--r--src/gui/widgets/qmainwindowlayout_p.h357
1 files changed, 357 insertions, 0 deletions
diff --git a/src/gui/widgets/qmainwindowlayout_p.h b/src/gui/widgets/qmainwindowlayout_p.h
new file mode 100644
index 0000000000..20aca61deb
--- /dev/null
+++ b/src/gui/widgets/qmainwindowlayout_p.h
@@ -0,0 +1,357 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 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
+
+#if defined(Q_DEBUG_MAINWINDOW_LAYOUT) && !defined(QT_NO_DOCKWIDGET)
+QT_BEGIN_NAMESPACE
+class QTextStream;
+Q_GUI_EXPORT void qt_dumpLayout(QTextStream &qout, QMainWindow *window);
+QT_END_NAMESPACE
+#endif // Q_DEBUG_MAINWINDOW_LAYOUT && !QT_NO_DOCKWIDGET
+
+#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;
+
+# ifdef QT_MAC_USE_COCOA
+#include <private/qunifiedtoolbarsurface_mac_p.h>
+# endif // QT_MAC_USE_COCOA
+
+#endif // Q_WS_MAC
+
+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;
+
+ QMainWindowLayout(QMainWindow *mainwindow, QLayout *parentLayout);
+ ~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;
+ bool activateUnifiedToolbarAfterFullScreen;
+ void syncUnifiedToolbarVisibility();
+ bool blockVisiblityCheck;
+
+#ifdef QT_MAC_USE_COCOA
+ QUnifiedToolbarSurface *unifiedSurface;
+ void updateUnifiedToolbarOffset();
+#endif // QT_MAC_USE_COCOA
+
+#endif // Q_WS_MAC
+};
+QT_END_NAMESPACE
+
+#endif // QT_NO_MAINWINDOW
+
+#endif // QDYNAMICMAINWINDOWLAYOUT_P_H