summaryrefslogtreecommitdiffstats
path: root/src/gui/widgets/qmdisubwindow_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets/qmdisubwindow_p.h')
-rw-r--r--src/gui/widgets/qmdisubwindow_p.h348
1 files changed, 348 insertions, 0 deletions
diff --git a/src/gui/widgets/qmdisubwindow_p.h b/src/gui/widgets/qmdisubwindow_p.h
new file mode 100644
index 0000000000..e5b9d8091f
--- /dev/null
+++ b/src/gui/widgets/qmdisubwindow_p.h
@@ -0,0 +1,348 @@
+/****************************************************************************
+**
+** 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 QMDISUBWINDOW_P_H
+#define QMDISUBWINDOW_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 "qmdisubwindow.h"
+
+#ifndef QT_NO_MDIAREA
+
+#include <QStyle>
+#include <QStyleOptionTitleBar>
+#include <QMenuBar>
+#include <QSizeGrip>
+#include <QPointer>
+#include <QDebug>
+#include <private/qwidget_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QVBoxLayout;
+class QMouseEvent;
+
+namespace QMdi {
+template<typename T>
+class ControlElement : public T
+{
+public:
+ ControlElement(QMdiSubWindow *child) : T(child, 0)
+ {
+ Q_ASSERT(child);
+ mdiChild = child;
+ }
+
+ void *qt_metacast(const char *classname)
+ {
+ if (classname && strcmp(classname, "ControlElement") == 0)
+ return this;
+ return 0;
+ }
+
+ QPointer<QMdiSubWindow> mdiChild;
+};
+
+class ControlContainer : public QObject
+{
+public:
+ ControlContainer(QMdiSubWindow *mdiChild);
+ ~ControlContainer();
+
+#ifndef QT_NO_MENUBAR
+ void showButtonsInMenuBar(QMenuBar *menuBar);
+ void removeButtonsFromMenuBar(QMenuBar *menuBar = 0);
+ QMenuBar *menuBar() const { return m_menuBar; }
+#endif
+ void updateWindowIcon(const QIcon &windowIcon);
+ QWidget *controllerWidget() const { return m_controllerWidget; }
+ QWidget *systemMenuLabel() const { return m_menuLabel; }
+
+private:
+ QPointer<QWidget> previousLeft;
+ QPointer<QWidget> previousRight;
+#ifndef QT_NO_MENUBAR
+ QPointer<QMenuBar> m_menuBar;
+#endif
+ QPointer<QWidget> m_controllerWidget;
+ QPointer<QWidget> m_menuLabel;
+ QPointer<QMdiSubWindow> mdiChild;
+};
+} // namespace QMdi
+
+class QMdiSubWindowPrivate : public QWidgetPrivate
+{
+ Q_DECLARE_PUBLIC(QMdiSubWindow)
+public:
+ // Enums and typedefs.
+ enum Operation {
+ None,
+ Move,
+ TopResize,
+ BottomResize,
+ LeftResize,
+ RightResize,
+ TopLeftResize,
+ TopRightResize,
+ BottomLeftResize,
+ BottomRightResize
+ };
+
+ enum ChangeFlag {
+ HMove = 0x01,
+ VMove = 0x02,
+ HResize = 0x04,
+ VResize = 0x08,
+ HResizeReverse = 0x10,
+ VResizeReverse = 0x20
+ };
+
+ enum WindowStateAction {
+ RestoreAction,
+ MoveAction,
+ ResizeAction,
+ MinimizeAction,
+ MaximizeAction,
+ StayOnTopAction,
+ CloseAction,
+ /* Add new states _above_ this line! */
+ NumWindowStateActions
+ };
+
+ struct OperationInfo {
+ uint changeFlags;
+ Qt::CursorShape cursorShape;
+ QRegion region;
+ bool hover;
+ OperationInfo(uint changeFlags, Qt::CursorShape cursorShape, bool hover = true)
+ : changeFlags(changeFlags),
+ cursorShape(cursorShape),
+ hover(hover)
+ {}
+ };
+
+ typedef QMap<Operation, OperationInfo> OperationInfoMap;
+
+ QMdiSubWindowPrivate();
+
+ // Variables.
+ QPointer<QWidget> baseWidget;
+ QPointer<QWidget> restoreFocusWidget;
+ QPointer<QMdi::ControlContainer> controlContainer;
+#ifndef QT_NO_SIZEGRIP
+ QPointer<QSizeGrip> sizeGrip;
+#endif
+#ifndef QT_NO_RUBBERBAND
+ QRubberBand *rubberBand;
+#endif
+ QPoint mousePressPosition;
+ QRect oldGeometry;
+ QSize internalMinimumSize;
+ QSize userMinimumSize;
+ QSize restoreSize;
+ bool resizeEnabled;
+ bool moveEnabled;
+ bool isInInteractiveMode;
+#ifndef QT_NO_RUBBERBAND
+ bool isInRubberBandMode;
+#endif
+ bool isShadeMode;
+ bool ignoreWindowTitleChange;
+ bool ignoreNextActivationEvent;
+ bool activationEnabled;
+ bool isShadeRequestFromMinimizeMode;
+ bool isMaximizeMode;
+ bool isWidgetHiddenByUs;
+ bool isActive;
+ bool isExplicitlyDeactivated;
+ int keyboardSingleStep;
+ int keyboardPageStep;
+ int resizeTimerId;
+ Operation currentOperation;
+ QStyle::SubControl hoveredSubControl;
+ QStyle::SubControl activeSubControl;
+ Qt::FocusReason focusInReason;
+ OperationInfoMap operationMap;
+ QPointer<QMenu> systemMenu;
+#ifndef QT_NO_ACTIONS
+ QPointer<QAction> actions[NumWindowStateActions];
+#endif
+ QMdiSubWindow::SubWindowOptions options;
+ QString lastChildWindowTitle;
+ QPalette titleBarPalette;
+ QString windowTitle;
+ QFont font;
+ QIcon menuIcon;
+ QStyleOptionTitleBar cachedStyleOptions;
+ QString originalTitle;
+
+ // Slots.
+ void _q_updateStaysOnTopHint();
+ void _q_enterInteractiveMode();
+ void _q_processFocusChanged(QWidget *old, QWidget *now);
+
+ // Functions.
+ void leaveInteractiveMode();
+ void removeBaseWidget();
+ void initOperationMap();
+#ifndef QT_NO_MENU
+ void createSystemMenu();
+#endif
+ void updateCursor();
+ void updateDirtyRegions();
+ void updateGeometryConstraints();
+ void updateMask();
+ void setNewGeometry(const QPoint &pos);
+ void setMinimizeMode();
+ void setNormalMode();
+ void setMaximizeMode();
+ void setActive(bool activate, bool changeFocus = true);
+ void processClickedSubControl();
+ QRegion getRegion(Operation operation) const;
+ Operation getOperation(const QPoint &pos) const;
+ QStyleOptionTitleBar titleBarOptions() const;
+ void ensureWindowState(Qt::WindowState state);
+ int titleBarHeight(const QStyleOptionTitleBar &options) const;
+ void sizeParameters(int *margin, int *minWidth) const;
+ bool drawTitleBarWhenMaximized() const;
+#ifndef QT_NO_MENUBAR
+ QMenuBar *menuBar() const;
+ void showButtonsInMenuBar(QMenuBar *menuBar);
+ void removeButtonsFromMenuBar();
+#endif
+ void updateWindowTitle(bool requestFromChild);
+#ifndef QT_NO_RUBBERBAND
+ void enterRubberBandMode();
+ void leaveRubberBandMode();
+#endif
+ QPalette desktopPalette() const;
+ void updateActions();
+ void setFocusWidget();
+ void restoreFocus();
+ void setWindowFlags(Qt::WindowFlags windowFlags);
+ void setVisible(WindowStateAction, bool visible = true);
+#ifndef QT_NO_ACTION
+ void setEnabled(WindowStateAction, bool enable = true);
+#ifndef QT_NO_MENU
+ void addToSystemMenu(WindowStateAction, const QString &text, const char *slot);
+#endif
+#endif // QT_NO_ACTION
+ QSize iconSize() const;
+#ifndef QT_NO_SIZEGRIP
+ void setSizeGrip(QSizeGrip *sizeGrip);
+ void setSizeGripVisible(bool visible = true) const;
+#endif
+ void updateInternalWindowTitle();
+ QString originalWindowTitle();
+ void setNewWindowTitle();
+
+ inline int titleBarHeight() const
+ {
+ Q_Q(const QMdiSubWindow);
+ if (!parent || q->windowFlags() & Qt::FramelessWindowHint
+ || (q->isMaximized() && !drawTitleBarWhenMaximized())) {
+ return 0;
+ }
+ QStyleOptionTitleBar options = titleBarOptions();
+ int height = options.rect.height();
+ if (hasBorder(options))
+ height += q->isMinimized() ? 8 : 4;
+ return height;
+ }
+
+ inline QStyle::SubControl getSubControl(const QPoint &pos) const
+ {
+ Q_Q(const QMdiSubWindow);
+ QStyleOptionTitleBar titleBarOptions = this->titleBarOptions();
+ return q->style()->hitTestComplexControl(QStyle::CC_TitleBar, &titleBarOptions, pos, q);
+ }
+
+ inline void setNewGeometry(QRect *geometry)
+ {
+ Q_Q(QMdiSubWindow);
+ Q_ASSERT(parent);
+ geometry->setSize(geometry->size().expandedTo(internalMinimumSize));
+#ifndef QT_NO_RUBBERBAND
+ if (isInRubberBandMode)
+ rubberBand->setGeometry(*geometry);
+ else
+#endif
+ q->setGeometry(*geometry);
+ }
+
+ inline bool hasBorder(const QStyleOptionTitleBar &options) const
+ {
+ Q_Q(const QMdiSubWindow);
+ return !q->style()->styleHint(QStyle::SH_TitleBar_NoBorder, &options, q);
+ }
+
+ inline bool autoRaise() const
+ {
+ Q_Q(const QMdiSubWindow);
+ return q->style()->styleHint(QStyle::SH_TitleBar_AutoRaise, 0, q);
+ }
+
+ inline bool isResizeOperation() const
+ {
+ return currentOperation != None && currentOperation != Move;
+ }
+
+ inline bool isMoveOperation() const
+ {
+ return currentOperation == Move;
+ }
+};
+
+#endif // QT_NO_MDIAREA
+
+QT_END_NAMESPACE
+
+#endif // QMDISUBWINDOW_P_H