1*c142477cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*c142477cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*c142477cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*c142477cSAndrew Rist  * distributed with this work for additional information
6*c142477cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*c142477cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*c142477cSAndrew Rist  * "License"); you may not use this file except in compliance
9*c142477cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*c142477cSAndrew Rist  *
11*c142477cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*c142477cSAndrew Rist  *
13*c142477cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*c142477cSAndrew Rist  * software distributed under the License is distributed on an
15*c142477cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*c142477cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*c142477cSAndrew Rist  * specific language governing permissions and limitations
18*c142477cSAndrew Rist  * under the License.
19*c142477cSAndrew Rist  *
20*c142477cSAndrew Rist  *************************************************************/
21*c142477cSAndrew Rist 
22*c142477cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sdext.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "PresenterSpritePane.hxx"
28cdf0e10cSrcweir #include "PresenterGeometryHelper.hxx"
29cdf0e10cSrcweir #include <com/sun/star/lang/XMultiComponentFactory.hpp>
30cdf0e10cSrcweir #include <com/sun/star/rendering/CompositeOperation.hpp>
31cdf0e10cSrcweir #include <osl/mutex.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir using namespace ::com::sun::star;
34cdf0e10cSrcweir using namespace ::com::sun::star::uno;
35cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
36cdf0e10cSrcweir using ::rtl::OUString;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir namespace sdext { namespace presenter {
39cdf0e10cSrcweir 
40cdf0e10cSrcweir //===== PresenterSpritePane =========================================================
41cdf0e10cSrcweir 
PresenterSpritePane(const Reference<XComponentContext> & rxContext,const::rtl::Reference<PresenterController> & rpPresenterController)42cdf0e10cSrcweir PresenterSpritePane::PresenterSpritePane (const Reference<XComponentContext>& rxContext,
43cdf0e10cSrcweir         const ::rtl::Reference<PresenterController>& rpPresenterController)
44cdf0e10cSrcweir     : PresenterPaneBase(rxContext, rpPresenterController),
45cdf0e10cSrcweir       mxParentWindow(),
46cdf0e10cSrcweir       mxParentCanvas(),
47cdf0e10cSrcweir       mpSprite(new PresenterSprite())
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     Reference<lang::XMultiComponentFactory> xFactory (
50cdf0e10cSrcweir         mxComponentContext->getServiceManager(), UNO_QUERY_THROW);
51cdf0e10cSrcweir     mxPresenterHelper = Reference<drawing::XPresenterHelper>(
52cdf0e10cSrcweir         xFactory->createInstanceWithContext(
53cdf0e10cSrcweir             OUString::createFromAscii("com.sun.star.comp.Draw.PresenterHelper"),
54cdf0e10cSrcweir             mxComponentContext),
55cdf0e10cSrcweir         UNO_QUERY_THROW);
56cdf0e10cSrcweir }
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 
~PresenterSpritePane(void)61cdf0e10cSrcweir PresenterSpritePane::~PresenterSpritePane (void)
62cdf0e10cSrcweir {
63cdf0e10cSrcweir }
64cdf0e10cSrcweir 
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 
disposing(void)68cdf0e10cSrcweir void PresenterSpritePane::disposing (void)
69cdf0e10cSrcweir {
70cdf0e10cSrcweir     mpSprite->SetFactory(NULL);
71cdf0e10cSrcweir     mxParentWindow = NULL;
72cdf0e10cSrcweir     mxParentCanvas = NULL;
73cdf0e10cSrcweir     PresenterPaneBase::disposing();
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 
78cdf0e10cSrcweir 
79cdf0e10cSrcweir //----- XPane -----------------------------------------------------------------
80cdf0e10cSrcweir 
getWindow(void)81cdf0e10cSrcweir Reference<awt::XWindow> SAL_CALL PresenterSpritePane::getWindow (void)
82cdf0e10cSrcweir     throw (RuntimeException)
83cdf0e10cSrcweir {
84cdf0e10cSrcweir     ThrowIfDisposed();
85cdf0e10cSrcweir     return mxContentWindow;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 
getCanvas(void)91cdf0e10cSrcweir Reference<rendering::XCanvas> SAL_CALL PresenterSpritePane::getCanvas (void)
92cdf0e10cSrcweir     throw (RuntimeException)
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     ThrowIfDisposed();
95cdf0e10cSrcweir 
96cdf0e10cSrcweir     if ( ! mxContentCanvas.is())
97cdf0e10cSrcweir         UpdateCanvases();
98cdf0e10cSrcweir 
99cdf0e10cSrcweir     return mxContentCanvas;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
105cdf0e10cSrcweir //----- XWindowListener -------------------------------------------------------
106cdf0e10cSrcweir 
windowResized(const awt::WindowEvent & rEvent)107cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowResized (const awt::WindowEvent& rEvent)
108cdf0e10cSrcweir     throw (RuntimeException)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir     (void)rEvent;
111cdf0e10cSrcweir     PresenterPaneBase::windowResized(rEvent);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     mpSprite->Resize(geometry::RealSize2D(rEvent.Width, rEvent.Height));
114cdf0e10cSrcweir     LayoutContextWindow();
115cdf0e10cSrcweir     UpdateCanvases();
116cdf0e10cSrcweir }
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 
windowMoved(const awt::WindowEvent & rEvent)122cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowMoved (const awt::WindowEvent& rEvent)
123cdf0e10cSrcweir     throw (RuntimeException)
124cdf0e10cSrcweir {
125cdf0e10cSrcweir     (void)rEvent;
126cdf0e10cSrcweir     PresenterPaneBase::windowMoved(rEvent);
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     awt::Rectangle aBox (
129cdf0e10cSrcweir         mxPresenterHelper->getWindowExtentsRelative(mxBorderWindow, mxParentWindow));
130cdf0e10cSrcweir     mpSprite->MoveTo(geometry::RealPoint2D(aBox.X, aBox.Y));
131cdf0e10cSrcweir     mpSprite->Update();
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 
windowShown(const lang::EventObject & rEvent)137cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowShown (const lang::EventObject& rEvent)
138cdf0e10cSrcweir     throw (RuntimeException)
139cdf0e10cSrcweir {
140cdf0e10cSrcweir     (void)rEvent;
141cdf0e10cSrcweir     PresenterPaneBase::windowShown(rEvent);
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     mpSprite->Show();
144cdf0e10cSrcweir     ToTop();
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     if (mxContentWindow.is())
147cdf0e10cSrcweir     {
148cdf0e10cSrcweir         LayoutContextWindow();
149cdf0e10cSrcweir         mxContentWindow->setVisible(sal_True);
150cdf0e10cSrcweir     }
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 
windowHidden(const lang::EventObject & rEvent)156cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowHidden (const lang::EventObject& rEvent)
157cdf0e10cSrcweir     throw (RuntimeException)
158cdf0e10cSrcweir {
159cdf0e10cSrcweir     (void)rEvent;
160cdf0e10cSrcweir     PresenterPaneBase::windowHidden(rEvent);
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     mpSprite->Hide();
163cdf0e10cSrcweir     if (mxContentWindow.is())
164cdf0e10cSrcweir         mxContentWindow->setVisible(sal_False);
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 
170cdf0e10cSrcweir //----- XPaintListener --------------------------------------------------------
171cdf0e10cSrcweir 
windowPaint(const awt::PaintEvent & rEvent)172cdf0e10cSrcweir void SAL_CALL PresenterSpritePane::windowPaint (const awt::PaintEvent& rEvent)
173cdf0e10cSrcweir     throw (RuntimeException)
174cdf0e10cSrcweir {
175cdf0e10cSrcweir     (void)rEvent;
176cdf0e10cSrcweir     ThrowIfDisposed();
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     /*
179cdf0e10cSrcweir     Reference<rendering::XSpriteCanvas> xSpriteCanvas (mxParentCanvas, UNO_QUERY);
180cdf0e10cSrcweir     if (xSpriteCanvas.is())
181cdf0e10cSrcweir         xSpriteCanvas->updateScreen(sal_False);
182cdf0e10cSrcweir     */
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 
188cdf0e10cSrcweir //-----------------------------------------------------------------------------
189cdf0e10cSrcweir 
190cdf0e10cSrcweir 
GetSprite(void)191cdf0e10cSrcweir ::boost::shared_ptr<PresenterSprite> PresenterSpritePane::GetSprite (void)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir     return mpSprite;
194cdf0e10cSrcweir }
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 
ShowTransparentBorder(void)199cdf0e10cSrcweir void PresenterSpritePane::ShowTransparentBorder (void)
200cdf0e10cSrcweir {
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 
UpdateCanvases(void)206cdf0e10cSrcweir void PresenterSpritePane::UpdateCanvases (void)
207cdf0e10cSrcweir {
208cdf0e10cSrcweir     Reference<XComponent> xContentCanvasComponent (mxContentCanvas, UNO_QUERY);
209cdf0e10cSrcweir     if (xContentCanvasComponent.is())
210cdf0e10cSrcweir     {
211cdf0e10cSrcweir         if (xContentCanvasComponent.is())
212cdf0e10cSrcweir             xContentCanvasComponent->dispose();
213cdf0e10cSrcweir     }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     // The border canvas is the content canvas of the sprite.
216cdf0e10cSrcweir     mxBorderCanvas = mpSprite->GetCanvas();
217cdf0e10cSrcweir 
218cdf0e10cSrcweir     // The content canvas is a wrapper of the border canvas.
219cdf0e10cSrcweir     if (mxBorderCanvas.is())
220cdf0e10cSrcweir         mxContentCanvas = mxPresenterHelper->createSharedCanvas(
221cdf0e10cSrcweir             mxParentCanvas,
222cdf0e10cSrcweir             mxParentWindow,
223cdf0e10cSrcweir             mxBorderCanvas,
224cdf0e10cSrcweir             mxBorderWindow,
225cdf0e10cSrcweir             mxContentWindow);
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     const awt::Rectangle aWindowBox (mxBorderWindow->getPosSize());
228cdf0e10cSrcweir     PaintBorder(awt::Rectangle(0,0,aWindowBox.Width,aWindowBox.Height));
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 
CreateCanvases(const css::uno::Reference<css::awt::XWindow> & rxParentWindow,const css::uno::Reference<css::rendering::XSpriteCanvas> & rxParentCanvas)234cdf0e10cSrcweir void PresenterSpritePane::CreateCanvases (
235cdf0e10cSrcweir     const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
236cdf0e10cSrcweir     const css::uno::Reference<css::rendering::XSpriteCanvas>& rxParentCanvas)
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     OSL_ASSERT(!mxParentWindow.is() || mxParentWindow==rxParentWindow);
239cdf0e10cSrcweir     OSL_ASSERT(!mxParentCanvas.is() || mxParentCanvas==rxParentCanvas);
240cdf0e10cSrcweir     mxParentWindow = rxParentWindow;
241cdf0e10cSrcweir     mxParentCanvas = rxParentCanvas;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     mpSprite->SetFactory(mxParentCanvas);
244cdf0e10cSrcweir     if (mxBorderWindow.is())
245cdf0e10cSrcweir     {
246cdf0e10cSrcweir         const awt::Rectangle aBorderBox (mxBorderWindow->getPosSize());
247cdf0e10cSrcweir         mpSprite->Resize(geometry::RealSize2D(aBorderBox.Width, aBorderBox.Height));
248cdf0e10cSrcweir     }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir     UpdateCanvases();
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 
256cdf0e10cSrcweir } } // end of namespace ::sd::presenter
257