1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sdext.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "PresenterSpritePane.hxx"
32*cdf0e10cSrcweir #include "PresenterGeometryHelper.hxx"
33*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/rendering/CompositeOperation.hpp>
35*cdf0e10cSrcweir #include <osl/mutex.hxx>
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir using namespace ::com::sun::star;
38*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
39*cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
40*cdf0e10cSrcweir using ::rtl::OUString;
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir namespace sdext { namespace presenter {
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir //===== PresenterSpritePane =========================================================
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir PresenterSpritePane::PresenterSpritePane (const Reference<XComponentContext>& rxContext,
47*cdf0e10cSrcweir         const ::rtl::Reference<PresenterController>& rpPresenterController)
48*cdf0e10cSrcweir     : PresenterPaneBase(rxContext, rpPresenterController),
49*cdf0e10cSrcweir       mxParentWindow(),
50*cdf0e10cSrcweir       mxParentCanvas(),
51*cdf0e10cSrcweir       mpSprite(new PresenterSprite())
52*cdf0e10cSrcweir {
53*cdf0e10cSrcweir     Reference<lang::XMultiComponentFactory> xFactory (
54*cdf0e10cSrcweir         mxComponentContext->getServiceManager(), UNO_QUERY_THROW);
55*cdf0e10cSrcweir     mxPresenterHelper = Reference<drawing::XPresenterHelper>(
56*cdf0e10cSrcweir         xFactory->createInstanceWithContext(
57*cdf0e10cSrcweir             OUString::createFromAscii("com.sun.star.comp.Draw.PresenterHelper"),
58*cdf0e10cSrcweir             mxComponentContext),
59*cdf0e10cSrcweir         UNO_QUERY_THROW);
60*cdf0e10cSrcweir }
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir PresenterSpritePane::~PresenterSpritePane (void)
66*cdf0e10cSrcweir {
67*cdf0e10cSrcweir }
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir void PresenterSpritePane::disposing (void)
73*cdf0e10cSrcweir {
74*cdf0e10cSrcweir     mpSprite->SetFactory(NULL);
75*cdf0e10cSrcweir     mxParentWindow = NULL;
76*cdf0e10cSrcweir     mxParentCanvas = NULL;
77*cdf0e10cSrcweir     PresenterPaneBase::disposing();
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir //----- XPane -----------------------------------------------------------------
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir Reference<awt::XWindow> SAL_CALL PresenterSpritePane::getWindow (void)
86*cdf0e10cSrcweir     throw (RuntimeException)
87*cdf0e10cSrcweir {
88*cdf0e10cSrcweir     ThrowIfDisposed();
89*cdf0e10cSrcweir     return mxContentWindow;
90*cdf0e10cSrcweir }
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir Reference<rendering::XCanvas> SAL_CALL PresenterSpritePane::getCanvas (void)
96*cdf0e10cSrcweir     throw (RuntimeException)
97*cdf0e10cSrcweir {
98*cdf0e10cSrcweir     ThrowIfDisposed();
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir     if ( ! mxContentCanvas.is())
101*cdf0e10cSrcweir         UpdateCanvases();
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir     return mxContentCanvas;
104*cdf0e10cSrcweir }
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir //----- XWindowListener -------------------------------------------------------
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowResized (const awt::WindowEvent& rEvent)
112*cdf0e10cSrcweir     throw (RuntimeException)
113*cdf0e10cSrcweir {
114*cdf0e10cSrcweir     (void)rEvent;
115*cdf0e10cSrcweir     PresenterPaneBase::windowResized(rEvent);
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir     mpSprite->Resize(geometry::RealSize2D(rEvent.Width, rEvent.Height));
118*cdf0e10cSrcweir     LayoutContextWindow();
119*cdf0e10cSrcweir     UpdateCanvases();
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowMoved (const awt::WindowEvent& rEvent)
127*cdf0e10cSrcweir     throw (RuntimeException)
128*cdf0e10cSrcweir {
129*cdf0e10cSrcweir     (void)rEvent;
130*cdf0e10cSrcweir     PresenterPaneBase::windowMoved(rEvent);
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir     awt::Rectangle aBox (
133*cdf0e10cSrcweir         mxPresenterHelper->getWindowExtentsRelative(mxBorderWindow, mxParentWindow));
134*cdf0e10cSrcweir     mpSprite->MoveTo(geometry::RealPoint2D(aBox.X, aBox.Y));
135*cdf0e10cSrcweir     mpSprite->Update();
136*cdf0e10cSrcweir }
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowShown (const lang::EventObject& rEvent)
142*cdf0e10cSrcweir     throw (RuntimeException)
143*cdf0e10cSrcweir {
144*cdf0e10cSrcweir     (void)rEvent;
145*cdf0e10cSrcweir     PresenterPaneBase::windowShown(rEvent);
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir     mpSprite->Show();
148*cdf0e10cSrcweir     ToTop();
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir     if (mxContentWindow.is())
151*cdf0e10cSrcweir     {
152*cdf0e10cSrcweir         LayoutContextWindow();
153*cdf0e10cSrcweir         mxContentWindow->setVisible(sal_True);
154*cdf0e10cSrcweir     }
155*cdf0e10cSrcweir }
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowHidden (const lang::EventObject& rEvent)
161*cdf0e10cSrcweir     throw (RuntimeException)
162*cdf0e10cSrcweir {
163*cdf0e10cSrcweir     (void)rEvent;
164*cdf0e10cSrcweir     PresenterPaneBase::windowHidden(rEvent);
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir     mpSprite->Hide();
167*cdf0e10cSrcweir     if (mxContentWindow.is())
168*cdf0e10cSrcweir         mxContentWindow->setVisible(sal_False);
169*cdf0e10cSrcweir }
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir //----- XPaintListener --------------------------------------------------------
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowPaint (const awt::PaintEvent& rEvent)
177*cdf0e10cSrcweir     throw (RuntimeException)
178*cdf0e10cSrcweir {
179*cdf0e10cSrcweir     (void)rEvent;
180*cdf0e10cSrcweir     ThrowIfDisposed();
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir     /*
183*cdf0e10cSrcweir     Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxParentCanvas, UNO_QUERY);
184*cdf0e10cSrcweir     if (xSpriteCanvas.is())
185*cdf0e10cSrcweir         xSpriteCanvas->updateScreen(sal_False);
186*cdf0e10cSrcweir     */
187*cdf0e10cSrcweir }
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir //-----------------------------------------------------------------------------
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir ::boost::shared_ptr<PresenterSprite> PresenterSpritePane::GetSprite (void)
196*cdf0e10cSrcweir {
197*cdf0e10cSrcweir     return mpSprite;
198*cdf0e10cSrcweir }
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir void PresenterSpritePane::ShowTransparentBorder (void)
204*cdf0e10cSrcweir {
205*cdf0e10cSrcweir }
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir 
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir void PresenterSpritePane::UpdateCanvases (void)
211*cdf0e10cSrcweir {
212*cdf0e10cSrcweir     Reference<XComponent> xContentCanvasComponent (mxContentCanvas, UNO_QUERY);
213*cdf0e10cSrcweir     if (xContentCanvasComponent.is())
214*cdf0e10cSrcweir     {
215*cdf0e10cSrcweir         if (xContentCanvasComponent.is())
216*cdf0e10cSrcweir             xContentCanvasComponent->dispose();
217*cdf0e10cSrcweir     }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir     // The border canvas is the content canvas of the sprite.
220*cdf0e10cSrcweir     mxBorderCanvas = mpSprite->GetCanvas();
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir     // The content canvas is a wrapper of the border canvas.
223*cdf0e10cSrcweir     if (mxBorderCanvas.is())
224*cdf0e10cSrcweir         mxContentCanvas = mxPresenterHelper->createSharedCanvas(
225*cdf0e10cSrcweir             mxParentCanvas,
226*cdf0e10cSrcweir             mxParentWindow,
227*cdf0e10cSrcweir             mxBorderCanvas,
228*cdf0e10cSrcweir             mxBorderWindow,
229*cdf0e10cSrcweir             mxContentWindow);
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir     const awt::Rectangle aWindowBox (mxBorderWindow->getPosSize());
232*cdf0e10cSrcweir     PaintBorder(awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height));
233*cdf0e10cSrcweir }
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir void PresenterSpritePane::CreateCanvases (
239*cdf0e10cSrcweir     const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
240*cdf0e10cSrcweir     const css::uno::Reference<css::rendering::XSpriteCanvas>& rxParentCanvas)
241*cdf0e10cSrcweir {
242*cdf0e10cSrcweir     OSL_ASSERT(!mxParentWindow.is() || mxParentWindow==rxParentWindow);
243*cdf0e10cSrcweir     OSL_ASSERT(!mxParentCanvas.is() || mxParentCanvas==rxParentCanvas);
244*cdf0e10cSrcweir     mxParentWindow = rxParentWindow;
245*cdf0e10cSrcweir     mxParentCanvas = rxParentCanvas;
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir     mpSprite->SetFactory(mxParentCanvas);
248*cdf0e10cSrcweir     if (mxBorderWindow.is())
249*cdf0e10cSrcweir     {
250*cdf0e10cSrcweir         const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
251*cdf0e10cSrcweir         mpSprite->Resize(geometry::RealSize2D(aBorderBox.Width, aBorderBox.Height));
252*cdf0e10cSrcweir     }
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir     UpdateCanvases();
255*cdf0e10cSrcweir }
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir } } // end of namespace ::sd::presenter
261