FreeCAD/src/Gui/MDIView.cpp
Mateusz Skowroński 3b463f2138 Qt::WFlags is obsolete in Qt5. Replace it with Qt::WindowFlags.
This change is Qt4/Qt5 neutral.
2016-01-05 16:07:58 +01:00

306 lines
10 KiB
C++

/***************************************************************************
* Copyright (c) 2007 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <qapplication.h>
# include <qregexp.h>
# include <QEvent>
# include <QCloseEvent>
# include <QMdiSubWindow>
#include <iostream>
#endif
#include "MDIView.h"
#include "Command.h"
#include "Document.h"
#include "Application.h"
#include "MainWindow.h"
using namespace Gui;
TYPESYSTEM_SOURCE_ABSTRACT(Gui::MDIView,Gui::BaseView);
MDIView::MDIView(Gui::Document* pcDocument,QWidget* parent, Qt::WindowFlags wflags)
: QMainWindow(parent, wflags), BaseView(pcDocument),currentMode(Child), wstate(Qt::WindowNoState)
{
setAttribute(Qt::WA_DeleteOnClose);
}
MDIView::~MDIView()
{
//This view might be the focus widget of the main window. In this case we must
//clear the focus and e.g. set the focus directly to the main window, otherwise
//the application crashes when accessing this deleted view.
//This effect only occurs if this widget is not in Child mode, because otherwise
//the focus stuff is done correctly.
if (getMainWindow()) {
QWidget* foc = getMainWindow()->focusWidget();
if (foc) {
QWidget* par = foc;
while (par) {
if (par == this) {
getMainWindow()->setFocus();
break;
}
par = par->parentWidget();
}
}
}
}
void MDIView::deleteSelf()
{
// When using QMdiArea make sure to remove the QMdiSubWindow
// this view is associated with.
//
// #0001023: Crash when quitting after using Windows > Tile
// Use deleteLater() instead of delete operator.
QWidget* parent = this->parentWidget();
if (qobject_cast<QMdiSubWindow*>(parent))
parent->deleteLater();
else
this->deleteLater();
_pcDocument = 0;
}
void MDIView::setOverrideCursor(const QCursor& c)
{
}
void MDIView::restoreOverrideCursor()
{
}
void MDIView::onRelabel(Gui::Document *pDoc)
{
if (!bIsPassive) {
// Try to separate document name and view number if there is one
QString cap = windowTitle();
// Either with dirty flag ...
QRegExp rx(QLatin1String("(\\s\\:\\s\\d+\\[\\*\\])$"));
int pos = rx.lastIndexIn(cap);
if (pos == -1) {
// ... or not
rx.setPattern(QLatin1String("(\\s\\:\\s\\d+)$"));
pos = rx.lastIndexIn(cap);
}
if (pos != -1) {
cap = QString::fromUtf8(pDoc->getDocument()->Label.getValue());
cap += rx.cap();
setWindowTitle(cap);
}
else {
cap = QString::fromUtf8(pDoc->getDocument()->Label.getValue());
cap = QString::fromLatin1("%1[*]").arg(cap);
setWindowTitle(cap);
}
}
}
void MDIView::viewAll()
{
}
/// receive a message
bool MDIView::onMsg(const char* pMsg,const char** ppReturn)
{
return false;
}
bool MDIView::onHasMsg(const char* pMsg) const
{
return false;
}
bool MDIView::canClose(void)
{
if (!bIsPassive && getGuiDocument() && getGuiDocument()->isLastView()) {
this->setFocus(); // raises the view to front
return (getGuiDocument()->canClose());
}
return true;
}
void MDIView::closeEvent(QCloseEvent *e)
{
if (canClose()) {
e->accept();
if (!bIsPassive) {
// must be detached so that the last view can get asked
Document* doc = this->getGuiDocument();
if (doc && !doc->isLastView())
doc->detachView(this);
}
// Note: When using QMdiArea we must not use removeWindow()
// because otherwise the QMdiSubWindow will loose its parent
// and thus the notification in QMdiSubWindow::closeEvent of
// other mdi windows to get maximized if this window
// is maximized will fail.
// This odd behaviour is caused by the invocation of
// d->mdiArea->removeSubWindow(parent) which we must let there
// because otherwise other parts don't work as they should.
QMainWindow::closeEvent(e);
}
else
e->ignore();
}
void MDIView::windowStateChanged( MDIView* )
{
}
void MDIView::print(QPrinter* printer)
{
std::cerr << "Printing not implemented for " << this->metaObject()->className() << std::endl;
}
void MDIView::print()
{
std::cerr << "Printing not implemented for " << this->metaObject()->className() << std::endl;
}
void MDIView::printPdf()
{
std::cerr << "Printing PDF not implemented for " << this->metaObject()->className() << std::endl;
}
void MDIView::printPreview()
{
std::cerr << "Printing preview not implemented for " << this->metaObject()->className() << std::endl;
}
QSize MDIView::minimumSizeHint () const
{
return QSize(400, 300);
}
void MDIView::changeEvent(QEvent *e)
{
switch (e->type()) {
case QEvent::ActivationChange:
{
// Forces this top-level window to be the active view of the main window
if (isActiveWindow()) {
if (getMainWindow()->activeWindow() != this)
getMainWindow()->setActiveWindow(this);
}
} break;
case QEvent::WindowTitleChange:
case QEvent::ModifiedChange:
{
// sets the appropriate tab of the tabbar
getMainWindow()->tabChanged(this);
} break;
default:
{
QMainWindow::changeEvent(e);
} break;
}
}
#if defined(Q_WS_X11)
// To fix bug #0000345 move function declaration to here
extern void qt_x11_wait_for_window_manager( QWidget* w ); // defined in qwidget_x11.cpp
#endif
void MDIView::setCurrentViewMode(ViewMode mode)
{
switch (mode) {
// go to normal mode
case Child:
{
if (this->currentMode == FullScreen) {
showNormal();
setWindowFlags(windowFlags() & ~Qt::Window);
}
else if (this->currentMode == TopLevel) {
this->wstate = windowState();
setWindowFlags( windowFlags() & ~Qt::Window );
}
if (this->currentMode != Child) {
this->currentMode = Child;
getMainWindow()->addWindow(this);
getMainWindow()->activateWindow();
update();
}
} break;
// go to top-level mode
case TopLevel:
{
if (this->currentMode == Child) {
if (qobject_cast<QMdiSubWindow*>(this->parentWidget()))
getMainWindow()->removeWindow(this);
setWindowFlags(windowFlags() | Qt::Window);
setParent(0, Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
Qt::WindowMinMaxButtonsHint);
if (this->wstate & Qt::WindowMaximized)
showMaximized();
else
showNormal();
#if defined(Q_WS_X11)
//extern void qt_x11_wait_for_window_manager( QWidget* w ); // defined in qwidget_x11.cpp
qt_x11_wait_for_window_manager(this);
#endif
activateWindow();
}
else if (this->currentMode == FullScreen) {
if (this->wstate & Qt::WindowMaximized)
showMaximized();
else
showNormal();
}
this->currentMode = TopLevel;
update();
} break;
// go to fullscreen mode
case FullScreen:
{
if (this->currentMode == Child) {
if (qobject_cast<QMdiSubWindow*>(this->parentWidget()))
getMainWindow()->removeWindow(this);
setWindowFlags(windowFlags() | Qt::Window);
setParent(0, Qt::Window);
showFullScreen();
}
else if (this->currentMode == TopLevel) {
this->wstate = windowState();
showFullScreen();
}
this->currentMode = FullScreen;
update();
} break;
}
}
#include "moc_MDIView.cpp"