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