25#include <com/sun/star/awt/XWindowPeer.hpp>
26#include <com/sun/star/rendering/CompositeOperation.hpp>
36 const sal_Int16 gnSuperSampleFactor = 2;
44 const Reference<XComponentContext>& rxContext,
45 const Reference<XResourceId>& rxViewId,
46 const Reference<XPane>& rxAnchorPane,
47 const ::rtl::Reference<PresenterController>& rpPresenterController)
51 mnSlideAspectRatio(28.0 / 21.0)
55 || ! rxAnchorPane.is()
56 || ! rpPresenterController.is())
59 "PresenterSlidePreview can not be constructed due to empty argument",
60 static_cast<XWeak*
>(
this));
63 mxWindow = rxAnchorPane->getWindow();
64 mxCanvas = rxAnchorPane->getCanvas();
68 mxWindow->addWindowListener(
this);
69 mxWindow->addPaintListener(
this);
71 Reference<awt::XWindowPeer> xPeer (mxWindow, UNO_QUERY);
73 xPeer->setBackground(util::Color(0xff000000));
75 mxWindow->setVisible(
true);
81 Reference<lang::XMultiComponentFactory>
xFactory = rxContext->getServiceManager();
83 mxPreviewRenderer.set(
85 "com.sun.star.drawing.SlideRenderer",
88 mpBitmaps = std::make_shared<PresenterBitmapContainer>(
89 "PresenterScreenSettings/ScrollBar/Bitmaps",
90 std::shared_ptr<PresenterBitmapContainer>(),
96PresenterSlidePreview::~PresenterSlidePreview()
100void SAL_CALL PresenterSlidePreview::disposing()
104 mxWindow->removeWindowListener(
this);
105 mxWindow->removePaintListener(
this);
110 Reference<lang::XComponent> xComponent (mxPreviewRenderer, UNO_QUERY);
112 xComponent->dispose();
117Reference<XResourceId> SAL_CALL PresenterSlidePreview::getResourceId()
122sal_Bool SAL_CALL PresenterSlidePreview::isAnchorOnly()
129void SAL_CALL PresenterSlidePreview::windowResized (
const awt::WindowEvent&)
132 ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
136void SAL_CALL PresenterSlidePreview::windowMoved (
const awt::WindowEvent&) {}
138void SAL_CALL PresenterSlidePreview::windowShown (
const lang::EventObject&)
141 ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
145void SAL_CALL PresenterSlidePreview::windowHidden (
const lang::EventObject&) {}
149void SAL_CALL PresenterSlidePreview::windowPaint (
const awt::PaintEvent& rEvent)
153 ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
155 Paint(awt::Rectangle(
158 rEvent.UpdateRect.Width,
159 rEvent.UpdateRect.Height));
164void SAL_CALL PresenterSlidePreview::disposing (
const lang::EventObject& rEvent)
166 if (rEvent.Source == mxWindow)
176void SAL_CALL PresenterSlidePreview::setCurrentPage (
const Reference<drawing::XDrawPage>& rxSlide)
179 ::osl::MutexGuard aGuard (::osl::Mutex::getGlobalMutex());
183Reference<drawing::XDrawPage> SAL_CALL PresenterSlidePreview::getCurrentPage()
190void PresenterSlidePreview::SetSlide (
const Reference<drawing::XDrawPage>& rxPage)
192 mxCurrentSlide = rxPage;
200void PresenterSlidePreview::Paint (
const awt::Rectangle& rBoundingBox)
202 if ( ! mxWindow.is())
206 if ( ! mxPreviewRenderer.is())
210 awt::Rectangle aWindowBox (mxWindow->getPosSize());
212 bool bCustomAnimation =
false;
213 bool bTransition =
false;
214 if( mxCurrentSlide.is() )
216 bCustomAnimation = PresenterController::HasCustomAnimation(mxCurrentSlide);
217 bTransition = PresenterController::HasTransition(mxCurrentSlide);
220 if ( ! mxPreview.is() && mxCurrentSlide.is())
223 mxPreview = mxPreviewRenderer->createPreviewForCanvas(
225 awt::Size(aWindowBox.Width, aWindowBox.Height),
231 awt::Rectangle aPreviewBox;
234 const geometry::IntegerSize2D aPreviewSize (mxPreview->getSize());
235 aPreviewBox = awt::Rectangle(
236 (aWindowBox.Width - aPreviewSize.Width)/2,
237 (aWindowBox.Height - aPreviewSize.Height)/2,
239 aPreviewSize.Height);
243 if (mnSlideAspectRatio > 0)
245 const awt::Size aPreviewSize (mxPreviewRenderer->calculatePreviewSize(
246 mnSlideAspectRatio,awt::Size(aWindowBox.Width, aWindowBox.Height)));
247 aPreviewBox = awt::Rectangle(
248 (aWindowBox.Width - aPreviewSize.Width)/2,
249 (aWindowBox.Height - aPreviewSize.Height)/2,
251 aPreviewSize.Height);
260 awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height),
264 const rendering::ViewState aViewState(
265 geometry::AffineMatrix2D(1,0,0, 0,1,0),
268 Sequence<double> aBackgroundColor(4);
269 rendering::RenderState aRenderState (
270 geometry::AffineMatrix2D(1, 0, aPreviewBox.X, 0, 1, aPreviewBox.Y),
273 rendering::CompositeOperation::SOURCE);
274 PresenterCanvasHelper::SetDeviceColor(aRenderState, 0x00000000);
277 mxCanvas->drawBitmap(mxPreview, aViewState, aRenderState);
280 const awt::Rectangle aTransitionPreviewBox(5, aWindowBox.Height-20, 0, 0);
282 Reference<rendering::XBitmap> xTransitionIcon (aTransitionDescriptor->GetNormalBitmap());
283 rendering::RenderState aTransitionRenderState (
284 geometry::AffineMatrix2D(1, 0, aTransitionPreviewBox.X, 0, 1, aTransitionPreviewBox.Y),
287 rendering::CompositeOperation::SOURCE);
288 mxCanvas->drawBitmap(xTransitionIcon, aViewState, aTransitionRenderState);
290 if( bCustomAnimation )
292 const awt::Rectangle aAnimationPreviewBox(5, aWindowBox.Height-40, 0, 0);
294 Reference<rendering::XBitmap> xAnimationIcon (aAnimationDescriptor->GetNormalBitmap());
295 rendering::RenderState aAnimationRenderState (
296 geometry::AffineMatrix2D(1, 0, aAnimationPreviewBox.X, 0, 1, aAnimationPreviewBox.Y),
299 rendering::CompositeOperation::SOURCE);
300 mxCanvas->drawBitmap(xAnimationIcon, aViewState, aAnimationRenderState);
305 if (mnSlideAspectRatio > 0)
307 Reference<rendering::XPolyPolygon2D> xPolygon (
308 PresenterGeometryHelper::CreatePolygon(aPreviewBox,
mxCanvas->getDevice()));
310 mxCanvas->fillPolyPolygon(xPolygon, aViewState, aRenderState);
314 Reference<rendering::XSpriteCanvas> xSpriteCanvas (
mxCanvas, UNO_QUERY);
315 if (xSpriteCanvas.is())
316 xSpriteCanvas->updateScreen(
false);
319void PresenterSlidePreview::Resize()
321 if (mxPreviewRenderer.is() && mxPreview.is())
323 const awt::Rectangle aWindowBox (mxWindow->getPosSize());
324 const awt::Size aNewPreviewSize (mxPreviewRenderer->calculatePreviewSize(
326 awt::Size(aWindowBox.Width, aWindowBox.Height)));
327 const geometry::IntegerSize2D aPreviewSize (mxPreview->getSize());
328 if (aNewPreviewSize.Width==aPreviewSize.Width
329 && aNewPreviewSize.Height==aPreviewSize.Height)
337 SetSlide(mxCurrentSlide);
340void PresenterSlidePreview::ThrowIfDisposed()
342 if (PresenterSlidePreviewInterfaceBase::rBHelper.bDisposed || PresenterSlidePreviewInterfaceBase::rBHelper.bInDispose)
344 throw lang::DisposedException (
345 "PresenterSlidePreview object has already been disposed",
346 static_cast<uno::XWeak*
>(
this));
rtl::Reference< PresenterController > mpPresenterController
Reference< rendering::XCanvas > mxCanvas
std::shared_ptr< PresenterBitmapContainer > mpBitmaps
PresenterSlidePreview(const css::uno::Reference< css::uno::XComponentContext > &rxContext, const css::uno::Reference< css::drawing::framework::XResourceId > &rxViewId, const css::uno::Reference< css::drawing::framework::XPane > &rxAnchorPane, const ::rtl::Reference< PresenterController > &rpPresenterController)
Reference< XSingleServiceFactory > xFactory
::cppu::WeakComponentImplHelper< css::drawing::framework::XView, css::drawing::XDrawView, css::awt::XPaintListener, css::awt::XWindowListener > PresenterSlidePreviewInterfaceBase
std::shared_ptr< PresenterBitmapContainer::BitmapDescriptor > SharedBitmapDescriptor