office-gobmx/sd/source/console/PresenterPaneBase.cxx
Noel Grandin 02c4386a09 move presenter console from sdext/ to sd/
It really wants to part of the main sd UI where it can interact
nicely with the existing logic, instead of using awkward UNO
APIs.

Change-Id: I6e0d486275515d48abe3438b88d4f58d4bee58fa
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145913
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-01-21 16:23:19 +00:00

343 lines
9.1 KiB
C++

/* -*- 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 .
*/
#include "PresenterPaneBase.hxx"
#include "PresenterController.hxx"
#include "PresenterPaintManager.hxx"
#include <com/sun/star/awt/PosSize.hpp>
#include <com/sun/star/awt/XWindow2.hpp>
#include <utility>
using namespace css;
using namespace css::uno;
using namespace css::drawing::framework;
namespace sdext::presenter {
//===== PresenterPaneBase =====================================================
PresenterPaneBase::PresenterPaneBase (
const Reference<XComponentContext>& rxContext,
::rtl::Reference<PresenterController> xPresenterController)
: PresenterPaneBaseInterfaceBase(m_aMutex),
mpPresenterController(std::move(xPresenterController)),
mxComponentContext(rxContext)
{
if (mpPresenterController)
mxPresenterHelper = mpPresenterController->GetPresenterHelper();
}
PresenterPaneBase::~PresenterPaneBase()
{
}
void PresenterPaneBase::disposing()
{
if (mxBorderWindow.is())
{
mxBorderWindow->removeWindowListener(this);
mxBorderWindow->removePaintListener(this);
}
{
Reference<XComponent> xComponent (mxContentCanvas, UNO_QUERY);
mxContentCanvas = nullptr;
if (xComponent.is())
xComponent->dispose();
}
{
Reference<XComponent> xComponent = mxContentWindow;
mxContentWindow = nullptr;
if (xComponent.is())
xComponent->dispose();
}
{
Reference<XComponent> xComponent (mxBorderCanvas, UNO_QUERY);
mxBorderCanvas = nullptr;
if (xComponent.is())
xComponent->dispose();
}
{
Reference<XComponent> xComponent = mxBorderWindow;
mxBorderWindow = nullptr;
if (xComponent.is())
xComponent->dispose();
}
mxComponentContext = nullptr;
}
void PresenterPaneBase::SetTitle (const OUString& rsTitle)
{
msTitle = rsTitle;
OSL_ASSERT(mpPresenterController);
OSL_ASSERT(mpPresenterController->GetPaintManager() != nullptr);
mpPresenterController->GetPaintManager()->Invalidate(mxBorderWindow);
}
const OUString& PresenterPaneBase::GetTitle() const
{
return msTitle;
}
const Reference<drawing::framework::XPaneBorderPainter>&
PresenterPaneBase::GetPaneBorderPainter() const
{
return mxBorderPainter;
}
//----- XInitialization -------------------------------------------------------
void SAL_CALL PresenterPaneBase::initialize (const Sequence<Any>& rArguments)
{
ThrowIfDisposed();
if ( ! mxComponentContext.is())
{
throw RuntimeException(
"PresenterSpritePane: missing component context",
static_cast<XWeak*>(this));
}
if (rArguments.getLength() != 5 && rArguments.getLength() != 6)
{
throw RuntimeException(
"PresenterSpritePane: invalid number of arguments",
static_cast<XWeak*>(this));
}
try
{
// Get the resource id from the first argument.
if ( ! (rArguments[0] >>= mxPaneId))
{
throw lang::IllegalArgumentException(
"PresenterPane: invalid pane id",
static_cast<XWeak*>(this),
0);
}
if ( ! (rArguments[1] >>= mxParentWindow))
{
throw lang::IllegalArgumentException(
"PresenterPane: invalid parent window",
static_cast<XWeak*>(this),
1);
}
Reference<rendering::XSpriteCanvas> xParentCanvas;
if ( ! (rArguments[2] >>= xParentCanvas))
{
throw lang::IllegalArgumentException(
"PresenterPane: invalid parent canvas",
static_cast<XWeak*>(this),
2);
}
if ( ! (rArguments[3] >>= msTitle))
{
throw lang::IllegalArgumentException(
"PresenterPane: invalid title",
static_cast<XWeak*>(this),
3);
}
if ( ! (rArguments[4] >>= mxBorderPainter))
{
throw lang::IllegalArgumentException(
"PresenterPane: invalid border painter",
static_cast<XWeak*>(this),
4);
}
bool bIsWindowVisibleOnCreation (true);
if (rArguments.getLength()>5 && ! (rArguments[5] >>= bIsWindowVisibleOnCreation))
{
throw lang::IllegalArgumentException(
"PresenterPane: invalid window visibility flag",
static_cast<XWeak*>(this),
5);
}
CreateWindows(bIsWindowVisibleOnCreation);
if (mxBorderWindow.is())
{
mxBorderWindow->addWindowListener(this);
mxBorderWindow->addPaintListener(this);
}
CreateCanvases(xParentCanvas);
// Raise new windows.
ToTop();
}
catch (Exception&)
{
mxContentWindow = nullptr;
mxComponentContext = nullptr;
throw;
}
}
//----- XResourceId -----------------------------------------------------------
Reference<XResourceId> SAL_CALL PresenterPaneBase::getResourceId()
{
ThrowIfDisposed();
return mxPaneId;
}
sal_Bool SAL_CALL PresenterPaneBase::isAnchorOnly()
{
return true;
}
//----- XWindowListener -------------------------------------------------------
void SAL_CALL PresenterPaneBase::windowResized (const awt::WindowEvent&)
{
ThrowIfDisposed();
}
void SAL_CALL PresenterPaneBase::windowMoved (const awt::WindowEvent&)
{
ThrowIfDisposed();
}
void SAL_CALL PresenterPaneBase::windowShown (const lang::EventObject&)
{
ThrowIfDisposed();
}
void SAL_CALL PresenterPaneBase::windowHidden (const lang::EventObject&)
{
ThrowIfDisposed();
}
//----- lang::XEventListener --------------------------------------------------
void SAL_CALL PresenterPaneBase::disposing (const lang::EventObject& rEvent)
{
if (rEvent.Source == mxBorderWindow)
{
mxBorderWindow = nullptr;
}
}
void PresenterPaneBase::CreateWindows (
const bool bIsWindowVisibleOnCreation)
{
if (!(mxPresenterHelper.is() && mxParentWindow.is()))
return;
mxBorderWindow = mxPresenterHelper->createWindow(
mxParentWindow,
false,
bIsWindowVisibleOnCreation,
false,
false);
mxContentWindow = mxPresenterHelper->createWindow(
mxBorderWindow,
false,
bIsWindowVisibleOnCreation,
false,
false);
}
const Reference<awt::XWindow>& PresenterPaneBase::GetBorderWindow() const
{
return mxBorderWindow;
}
void PresenterPaneBase::ToTop()
{
if (mxPresenterHelper.is())
mxPresenterHelper->toTop(mxContentWindow);
}
void PresenterPaneBase::PaintBorder (const awt::Rectangle& rUpdateBox)
{
OSL_ASSERT(mxPaneId.is());
if (!(mxBorderPainter.is() && mxBorderWindow.is() && mxBorderCanvas.is()))
return;
awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
awt::Rectangle aLocalBorderBox (0,0, aBorderBox.Width, aBorderBox.Height);
//TODO: paint border background?
mxBorderPainter->paintBorder(
mxPaneId->getResourceURL(),
mxBorderCanvas,
aLocalBorderBox,
rUpdateBox,
msTitle);
}
void PresenterPaneBase::LayoutContextWindow()
{
OSL_ASSERT(mxPaneId.is());
OSL_ASSERT(mxBorderWindow.is());
OSL_ASSERT(mxContentWindow.is());
if (!(mxBorderPainter.is() && mxPaneId.is() && mxBorderWindow.is() && mxContentWindow.is()))
return;
const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
const awt::Rectangle aInnerBox (mxBorderPainter->removeBorder(
mxPaneId->getResourceURL(),
aBorderBox,
drawing::framework::BorderType_TOTAL_BORDER));
mxContentWindow->setPosSize(
aInnerBox.X - aBorderBox.X,
aInnerBox.Y - aBorderBox.Y,
aInnerBox.Width,
aInnerBox.Height,
awt::PosSize::POSSIZE);
}
bool PresenterPaneBase::IsVisible() const
{
Reference<awt::XWindow2> xWindow2 (mxBorderPainter, UNO_QUERY);
if (xWindow2.is())
return xWindow2->isVisible();
return false;
}
void PresenterPaneBase::ThrowIfDisposed()
{
if (rBHelper.bDisposed || rBHelper.bInDispose)
{
throw lang::DisposedException (
"PresenterPane object has already been disposed",
static_cast<uno::XWeak*>(this));
}
}
} // end of namespace ::sdext::presenter
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */