2017-10-21 13:50:30 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
#include "Qt5Frame.hxx"
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
#include "Qt5Tools.hxx"
|
|
|
|
#include "Qt5Instance.hxx"
|
|
|
|
#include "Qt5Graphics.hxx"
|
|
|
|
#include "Qt5Widget.hxx"
|
2017-10-30 19:32:45 +01:00
|
|
|
#include "Qt5Data.hxx"
|
2018-05-15 16:29:15 +02:00
|
|
|
#include <Qt5Menu.hxx>
|
2017-10-27 13:15:37 +02:00
|
|
|
|
2017-10-30 18:33:06 +01:00
|
|
|
#include <QtCore/QPoint>
|
|
|
|
#include <QtCore/QSize>
|
|
|
|
#include <QtGui/QIcon>
|
2017-10-27 13:15:37 +02:00
|
|
|
#include <QtGui/QWindow>
|
2017-10-30 19:44:40 +01:00
|
|
|
#include <QtGui/QScreen>
|
2017-10-30 19:55:18 +01:00
|
|
|
#include <QtWidgets/QApplication>
|
2017-10-27 13:15:37 +02:00
|
|
|
|
2017-10-30 18:33:06 +01:00
|
|
|
#include <saldatabasic.hxx>
|
2017-11-14 00:10:58 +02:00
|
|
|
#include <window.h>
|
2017-10-30 19:44:40 +01:00
|
|
|
#include <vcl/layout.hxx>
|
2017-10-30 18:33:06 +01:00
|
|
|
#include <vcl/syswin.hxx>
|
|
|
|
|
2017-10-24 19:49:45 +02:00
|
|
|
#include <cairo.h>
|
|
|
|
#include <headless/svpgdi.hxx>
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
static void SvpDamageHandler(void* handle, sal_Int32 nExtentsX, sal_Int32 nExtentsY,
|
|
|
|
sal_Int32 nExtentsWidth, sal_Int32 nExtentsHeight)
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Frame* pThis = static_cast<Qt5Frame*>(handle);
|
|
|
|
pThis->Damage(nExtentsX, nExtentsY, nExtentsWidth, nExtentsHeight);
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo)
|
|
|
|
: m_bUseCairo(bUseCairo)
|
|
|
|
, m_bGraphicsInUse(false)
|
|
|
|
, m_ePointerStyle(PointerStyle::Arrow)
|
|
|
|
, m_bDefaultSize(true)
|
|
|
|
, m_bDefaultPos(true)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
|
|
|
|
pInst->insertFrame(this);
|
2017-10-27 13:15:37 +02:00
|
|
|
|
2017-10-24 19:49:45 +02:00
|
|
|
m_aDamageHandler.handle = this;
|
|
|
|
m_aDamageHandler.damaged = ::SvpDamageHandler;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if (nStyle & SalFrameStyleFlags::DEFAULT) // ensure default style
|
2017-10-27 13:15:37 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
nStyle |= SalFrameStyleFlags::MOVEABLE | SalFrameStyleFlags::SIZEABLE
|
|
|
|
| SalFrameStyleFlags::CLOSEABLE;
|
2017-10-27 13:15:37 +02:00
|
|
|
nStyle &= ~SalFrameStyleFlags::FLOAT;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_nStyle = nStyle;
|
|
|
|
m_pParent = pParent;
|
|
|
|
|
|
|
|
Qt::WindowFlags aWinFlags;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!(nStyle & SalFrameStyleFlags::SYSTEMCHILD))
|
2017-10-27 13:15:37 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (nStyle & SalFrameStyleFlags::INTRO)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::SplashScreen;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (nStyle & (SalFrameStyleFlags::FLOAT | SalFrameStyleFlags::TOOLTIP))
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::ToolTip;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if ((nStyle & SalFrameStyleFlags::FLOAT)
|
|
|
|
&& !(nStyle & SalFrameStyleFlags::OWNERDRAWDECORATION))
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Popup;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (nStyle & SalFrameStyleFlags::DIALOG && pParent)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Dialog;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (nStyle & SalFrameStyleFlags::TOOLWINDOW)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Tool;
|
2018-01-08 09:40:37 +02:00
|
|
|
else if (nStyle & SalFrameStyleFlags::OWNERDRAWDECORATION)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Window | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus;
|
|
|
|
else
|
|
|
|
aWinFlags |= Qt::Window;
|
|
|
|
}
|
|
|
|
|
2018-05-14 15:39:30 +02:00
|
|
|
m_pQWidget.reset(createQt5Widget(*this, pParent ? pParent->GetQWidget() : nullptr, aWinFlags));
|
2017-10-27 13:15:37 +02:00
|
|
|
|
|
|
|
if (pParent && !(pParent->m_nStyle & SalFrameStyleFlags::PLUG))
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QWindow* pParentWindow = pParent->GetQWidget()->window()->windowHandle();
|
|
|
|
QWindow* pChildWindow = m_pQWidget->window()->windowHandle();
|
|
|
|
if (pParentWindow != pChildWindow)
|
|
|
|
pChildWindow->setTransientParent(pParentWindow);
|
2017-10-27 13:15:37 +02:00
|
|
|
}
|
2017-12-08 11:37:18 +00:00
|
|
|
|
|
|
|
// fake an initial geometry, gets updated via configure event or SetPosSize
|
|
|
|
if (m_bDefaultPos || m_bDefaultSize)
|
|
|
|
{
|
|
|
|
Size aDefSize = CalcDefaultSize();
|
|
|
|
maGeometry.nX = -1;
|
|
|
|
maGeometry.nY = -1;
|
|
|
|
maGeometry.nWidth = aDefSize.Width();
|
|
|
|
maGeometry.nHeight = aDefSize.Height();
|
|
|
|
maGeometry.nTopDecoration = 0;
|
|
|
|
maGeometry.nBottomDecoration = 0;
|
|
|
|
maGeometry.nLeftDecoration = 0;
|
|
|
|
maGeometry.nRightDecoration = 0;
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
Qt5Frame::~Qt5Frame()
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
|
|
|
|
pInst->eraseFrame(this);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::Damage(sal_Int32 nExtentsX, sal_Int32 nExtentsY, sal_Int32 nExtentsWidth,
|
|
|
|
sal_Int32 nExtentsHeight) const
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->update(nExtentsX, nExtentsY, nExtentsWidth, nExtentsHeight);
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
void Qt5Frame::TriggerPaintEvent()
|
2017-10-31 01:07:06 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QSize aSize(m_pQWidget->size());
|
|
|
|
SalPaintEvent aPaintEvt(0, 0, aSize.width(), aSize.height(), true);
|
|
|
|
CallCallback(SalEvent::Paint, &aPaintEvt);
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::TriggerPaintEvent(QRect aRect)
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
SalPaintEvent aPaintEvt(aRect.x(), aRect.y(), aRect.width(), aRect.height(), true);
|
|
|
|
CallCallback(SalEvent::Paint, &aPaintEvt);
|
2017-10-31 01:07:06 +01:00
|
|
|
}
|
|
|
|
|
2018-04-19 14:20:27 +02:00
|
|
|
void Qt5Frame::InitSvpSalGraphics( SvpSalGraphics* pSvpSalGraphics )
|
|
|
|
{
|
|
|
|
int width = m_pQWidget->size().width();
|
|
|
|
int height = m_pQWidget->size().height();
|
|
|
|
m_pSvpGraphics = pSvpSalGraphics;
|
|
|
|
m_pSurface.reset(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height));
|
|
|
|
m_pSvpGraphics->setSurface(m_pSurface.get(), basegfx::B2IVector(width, height));
|
|
|
|
cairo_surface_set_user_data(m_pSurface.get(), SvpSalGraphics::getDamageKey(),
|
|
|
|
&m_aDamageHandler, nullptr);
|
|
|
|
TriggerPaintEvent();
|
|
|
|
}
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
SalGraphics* Qt5Frame::AcquireGraphics()
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_bGraphicsInUse)
|
2017-10-31 01:07:06 +01:00
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
m_bGraphicsInUse = true;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_bUseCairo)
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2018-04-19 14:20:27 +02:00
|
|
|
if (!m_pOurSvpGraphics.get())
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2018-04-19 14:20:27 +02:00
|
|
|
m_pOurSvpGraphics.reset( new SvpSalGraphics() );
|
|
|
|
InitSvpSalGraphics( m_pOurSvpGraphics.get() );
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
2018-04-19 14:20:27 +02:00
|
|
|
return m_pOurSvpGraphics.get();
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!m_pQt5Graphics.get())
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQt5Graphics.reset(new Qt5Graphics(this));
|
|
|
|
m_pQImage.reset(new QImage(m_pQWidget->size(), Qt5_DefaultFormat32));
|
|
|
|
m_pQt5Graphics->ChangeQImage(m_pQImage.get());
|
2017-10-24 19:49:45 +02:00
|
|
|
TriggerPaintEvent();
|
|
|
|
}
|
|
|
|
return m_pQt5Graphics.get();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::ReleaseGraphics(SalGraphics* pSalGraph)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
(void)pSalGraph;
|
|
|
|
if (m_bUseCairo)
|
2018-04-19 14:20:27 +02:00
|
|
|
assert(pSalGraph == m_pOurSvpGraphics.get());
|
2017-10-24 19:49:45 +02:00
|
|
|
else
|
2017-11-08 11:28:04 +01:00
|
|
|
assert(pSalGraph == m_pQt5Graphics.get());
|
2017-10-31 01:07:06 +01:00
|
|
|
m_bGraphicsInUse = false;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
bool Qt5Frame::PostEvent(ImplSVEvent* pData)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
|
|
|
|
pInst->PostEvent(this, pData, SalEvent::UserEvent);
|
2017-10-31 01:07:06 +01:00
|
|
|
return true;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetTitle(const OUString& rTitle)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->window()->setWindowTitle(toQString(rTitle));
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetIcon(sal_uInt16 nIcon)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-13 09:08:30 +01:00
|
|
|
if (m_nStyle
|
|
|
|
& (SalFrameStyleFlags::PLUG | SalFrameStyleFlags::SYSTEMCHILD
|
|
|
|
| SalFrameStyleFlags::FLOAT | SalFrameStyleFlags::INTRO
|
|
|
|
| SalFrameStyleFlags::OWNERDRAWDECORATION)
|
2017-11-08 11:28:04 +01:00
|
|
|
|| !m_pQWidget->isWindow())
|
2017-10-30 18:33:06 +01:00
|
|
|
return;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
const char* appicon;
|
2017-10-30 18:33:06 +01:00
|
|
|
|
|
|
|
if (nIcon == SV_ICON_ID_TEXT)
|
|
|
|
appicon = "libreoffice-writer";
|
|
|
|
else if (nIcon == SV_ICON_ID_SPREADSHEET)
|
|
|
|
appicon = "libreoffice-calc";
|
|
|
|
else if (nIcon == SV_ICON_ID_DRAWING)
|
|
|
|
appicon = "libreoffice-draw";
|
|
|
|
else if (nIcon == SV_ICON_ID_PRESENTATION)
|
|
|
|
appicon = "libreoffice-impress";
|
|
|
|
else if (nIcon == SV_ICON_ID_DATABASE)
|
|
|
|
appicon = "libreoffice-base";
|
|
|
|
else if (nIcon == SV_ICON_ID_FORMULA)
|
|
|
|
appicon = "libreoffice-math";
|
|
|
|
else
|
|
|
|
appicon = "libreoffice-startcenter";
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
QIcon aIcon = QIcon::fromTheme(appicon);
|
|
|
|
m_pQWidget->window()->setWindowIcon(aIcon);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-05-15 16:29:15 +02:00
|
|
|
void Qt5Frame::SetMenu(SalMenu* pMenu)
|
|
|
|
{
|
|
|
|
m_pSalMenu = static_cast<Qt5Menu*>( pMenu );
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::DrawMenuBar() {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::SetExtendedFrameStyle(SalExtStyle /*nExtStyle*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::Show(bool bVisible, bool /*bNoActivate*/)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
assert(m_pQWidget.get());
|
|
|
|
m_pQWidget->setVisible(bVisible);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetMinClientSize(long nWidth, long nHeight)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!isChild())
|
|
|
|
m_pQWidget->setMinimumSize(nWidth, nHeight);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetMaxClientSize(long nWidth, long nHeight)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!isChild())
|
|
|
|
m_pQWidget->setMaximumSize(nWidth, nHeight);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-10-30 19:44:40 +01:00
|
|
|
void Qt5Frame::Center()
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_pParent)
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QWidget* pWindow = m_pParent->GetQWidget()->window();
|
|
|
|
m_pQWidget->move(pWindow->frameGeometry().topLeft() + pWindow->rect().center()
|
|
|
|
- m_pQWidget->rect().center());
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Size Qt5Frame::CalcDefaultSize()
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
assert(m_pQWidget->isWindow());
|
|
|
|
QScreen* pScreen = m_pQWidget->windowHandle()->screen();
|
|
|
|
if (!pScreen)
|
2017-10-30 19:44:40 +01:00
|
|
|
return Size();
|
2017-11-08 11:28:04 +01:00
|
|
|
return bestmaxFrameSizeForScreenSize(toSize(pScreen->size()));
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Qt5Frame::SetDefaultSize()
|
|
|
|
{
|
|
|
|
Size aDefSize = CalcDefaultSize();
|
2017-11-08 11:28:04 +01:00
|
|
|
SetPosSize(0, 0, aDefSize.Width(), aDefSize.Height(),
|
|
|
|
SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT);
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!m_pQWidget->isWindow() || isChild(true, false))
|
2017-10-30 19:44:40 +01:00
|
|
|
return;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if ((nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT))
|
|
|
|
&& (nWidth > 0 && nHeight > 0) // sometimes stupid things happen
|
2017-11-13 09:08:30 +01:00
|
|
|
)
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
|
|
|
m_bDefaultSize = false;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (isChild(false) || !m_pQWidget->isMaximized())
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->resize(nWidth, nHeight);
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (m_bDefaultSize)
|
2017-10-30 19:44:40 +01:00
|
|
|
SetDefaultSize();
|
|
|
|
|
|
|
|
m_bDefaultSize = false;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if (nFlags & (SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y))
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_pParent)
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
|
|
|
QRect aRect = m_pParent->GetQWidget()->geometry();
|
|
|
|
nX += aRect.x();
|
|
|
|
nY += aRect.y();
|
|
|
|
}
|
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
maGeometry.nX = nX;
|
|
|
|
maGeometry.nY = nY;
|
|
|
|
|
2017-10-30 19:44:40 +01:00
|
|
|
m_bDefaultPos = false;
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->move(nX, nY);
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (m_bDefaultPos)
|
2017-10-30 19:44:40 +01:00
|
|
|
Center();
|
|
|
|
|
|
|
|
m_bDefaultPos = false;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
void Qt5Frame::GetClientSize(long& rWidth, long& rHeight)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-10-31 01:07:06 +01:00
|
|
|
rWidth = m_pQWidget->width();
|
|
|
|
rHeight = m_pQWidget->height();
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::GetWorkArea(tools::Rectangle& rRect)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!m_pQWidget->isWindow())
|
2017-10-30 19:44:40 +01:00
|
|
|
return;
|
2017-11-08 11:28:04 +01:00
|
|
|
QScreen* pScreen = m_pQWidget->windowHandle()->screen();
|
|
|
|
if (!pScreen)
|
2017-10-30 19:44:40 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
QSize aSize = pScreen->availableVirtualSize();
|
2017-11-08 11:28:04 +01:00
|
|
|
rRect = tools::Rectangle(0, 0, aSize.width(), aSize.height());
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
SalFrame* Qt5Frame::GetParent() const { return m_pParent; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetWindowState(const SalFrameState* pState)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!m_pQWidget->isWindow() || !pState || isChild(true, false))
|
2017-10-30 18:33:06 +01:00
|
|
|
return;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
const WindowStateMask nMaxGeometryMask
|
|
|
|
= WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width | WindowStateMask::Height
|
|
|
|
| WindowStateMask::MaximizedX | WindowStateMask::MaximizedY
|
|
|
|
| WindowStateMask::MaximizedWidth | WindowStateMask::MaximizedHeight;
|
2017-10-30 18:33:06 +01:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if ((pState->mnMask & WindowStateMask::State) && (pState->mnState & WindowStateState::Maximized)
|
|
|
|
&& (pState->mnMask & nMaxGeometryMask) == nMaxGeometryMask)
|
2017-10-30 18:33:06 +01:00
|
|
|
m_pQWidget->showMaximized();
|
2017-11-13 09:08:30 +01:00
|
|
|
else if (pState->mnMask
|
|
|
|
& (WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width
|
|
|
|
| WindowStateMask::Height))
|
2017-10-30 18:33:06 +01:00
|
|
|
{
|
2017-10-30 19:44:40 +01:00
|
|
|
sal_uInt16 nPosSizeFlags = 0;
|
|
|
|
QPoint aPos = m_pQWidget->pos();
|
|
|
|
QPoint aParentPos;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_pParent)
|
2017-10-30 19:44:40 +01:00
|
|
|
aParentPos = m_pParent->GetQWidget()->window()->pos();
|
|
|
|
long nX = pState->mnX - aParentPos.x();
|
|
|
|
long nY = pState->mnY - aParentPos.y();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::X)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_X;
|
|
|
|
else
|
|
|
|
nX = aPos.x() - aParentPos.x();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::Y)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_Y;
|
|
|
|
else
|
|
|
|
nY = aPos.y() - aParentPos.y();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::Width)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_WIDTH;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::Height)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_HEIGHT;
|
2017-11-08 11:28:04 +01:00
|
|
|
SetPosSize(nX, nY, pState->mnWidth, pState->mnHeight, nPosSizeFlags);
|
2017-10-30 18:33:06 +01:00
|
|
|
}
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (pState->mnMask & WindowStateMask::State && !isChild())
|
2017-10-30 18:33:06 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if ((pState->mnState & WindowStateState::Minimized) && m_pQWidget->isWindow())
|
2017-10-30 18:33:06 +01:00
|
|
|
m_pQWidget->showMinimized();
|
|
|
|
else
|
|
|
|
m_pQWidget->showNormal();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
bool Qt5Frame::GetWindowState(SalFrameState* pState)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-10-30 18:33:06 +01:00
|
|
|
pState->mnState = WindowStateState::Normal;
|
2017-11-08 11:28:04 +01:00
|
|
|
pState->mnMask = WindowStateMask::State;
|
|
|
|
if (m_pQWidget->isMinimized() || !m_pQWidget->windowHandle())
|
2017-10-30 18:33:06 +01:00
|
|
|
pState->mnState |= WindowStateState::Minimized;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (m_pQWidget->isMaximized())
|
2017-10-30 18:33:06 +01:00
|
|
|
{
|
|
|
|
pState->mnState |= WindowStateState::Maximized;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
QRect rect = m_pQWidget->geometry();
|
|
|
|
pState->mnX = rect.x();
|
|
|
|
pState->mnY = rect.y();
|
|
|
|
pState->mnWidth = rect.width();
|
|
|
|
pState->mnHeight = rect.height();
|
2017-11-08 11:28:04 +01:00
|
|
|
pState->mnMask |= WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width
|
|
|
|
| WindowStateMask::Height;
|
2017-10-30 18:33:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::ShowFullScreen(bool /*bFullScreen*/, sal_Int32 /*nDisplay*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::StartPresentation(bool /*bStart*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::SetAlwaysOnTop(bool /*bOnTop*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::ToTop(SalFrameToTop /*nFlags*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetPointer(PointerStyle ePointerStyle)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QWindow* pWindow = m_pQWidget->window()->windowHandle();
|
|
|
|
if (!pWindow)
|
2017-10-30 19:32:45 +01:00
|
|
|
return;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (ePointerStyle == m_ePointerStyle)
|
2017-10-30 19:32:45 +01:00
|
|
|
return;
|
|
|
|
m_ePointerStyle = ePointerStyle;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
pWindow->setCursor(static_cast<Qt5Data*>(GetSalData())->getCursor(ePointerStyle));
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::CaptureMouse(bool /*bMouse*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::SetPointerPos(long /*nX*/, long /*nY*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::Flush() {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::Flush(const tools::Rectangle& /*rRect*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::SetInputContext(SalInputContext* /*pContext*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::EndExtTextInput(EndExtTextInputFlags /*nFlags*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
OUString Qt5Frame::GetKeyName(sal_uInt16 /*nKeyCode*/) { return OUString(); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
bool Qt5Frame::MapUnicodeToKeyCode(sal_Unicode /*aUnicode*/, LanguageType /*aLangType*/,
|
|
|
|
vcl::KeyCode& /*rKeyCode*/)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
LanguageType Qt5Frame::GetInputLanguage() { return LANGUAGE_DONTKNOW; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
void Qt5Frame::UpdateSettings(AllSettings& rSettings)
|
|
|
|
{
|
|
|
|
StyleSettings style(rSettings.GetStyleSettings());
|
|
|
|
|
|
|
|
const int flash_time = QApplication::cursorFlashTime();
|
|
|
|
style.SetCursorBlinkTime(flash_time != 0 ? flash_time / 2 : STYLE_CURSOR_NOBLINKTIME);
|
|
|
|
|
|
|
|
rSettings.SetStyleSettings(style);
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::Beep() {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
const SystemEnvData* Qt5Frame::GetSystemData() const { return nullptr; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
SalFrame::SalPointerState Qt5Frame::GetPointerState()
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-10-30 19:55:18 +01:00
|
|
|
SalPointerState aState;
|
|
|
|
QPoint pos = QCursor::pos();
|
2017-11-08 11:28:04 +01:00
|
|
|
aState.maPos = Point(pos.x(), pos.y());
|
2018-01-08 09:40:00 +02:00
|
|
|
aState.mnState = GetMouseModCode(QGuiApplication::mouseButtons())
|
|
|
|
| GetKeyModCode(QGuiApplication::keyboardModifiers());
|
2017-10-30 19:55:18 +01:00
|
|
|
return aState;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
KeyIndicatorState Qt5Frame::GetIndicatorState() { return KeyIndicatorState(); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::SimulateKeyPress(sal_uInt16 /*nKeyCode*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetParent(SalFrame* pNewParent) { m_pParent = static_cast<Qt5Frame*>(pNewParent); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
bool Qt5Frame::SetPluginParent(SystemParentData* /*pNewParent*/) { return false; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::ResetClipRegion() {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::BeginSetClipRegion(sal_uLong /*nRects*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::UnionClipRegion(long /*nX*/, long /*nY*/, long /*nWidth*/, long /*nHeight*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::EndSetClipRegion() {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetScreenNumber(unsigned int) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetApplicationID(const OUString&) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|