1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_slideshow.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // must be first
28*b1cdbd2cSJim Jagielski #include <canvas/debug.hxx>
29*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
30*b1cdbd2cSJim Jagielski #include <canvas/verbosetrace.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <math.h>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <comphelper/anytostring.hxx>
35*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/syschild.hxx>
39*b1cdbd2cSJim Jagielski #include <vcl/salbtype.hxx>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx>
42*b1cdbd2cSJim Jagielski #include <basegfx/numeric/ftools.hxx>
43*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
44*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx>
45*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
46*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
47*b1cdbd2cSJim Jagielski #include <basegfx/range/b2irange.hxx>
48*b1cdbd2cSJim Jagielski #include <canvas/canvastools.hxx>
49*b1cdbd2cSJim Jagielski #include <cppcanvas/vclfactory.hxx>
50*b1cdbd2cSJim Jagielski #include <cppcanvas/basegfxfactory.hxx>
51*b1cdbd2cSJim Jagielski #include <cppcanvas/basegfxfactory.hxx>
52*b1cdbd2cSJim Jagielski #include <avmedia/mediawindow.hxx>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <com/sun/star/media/XManager.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/media/XPlayer.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/media/XPlayerWindow.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/NoSupportException.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XCanvas.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hdl>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #include "viewmediashape.hxx"
65*b1cdbd2cSJim Jagielski #include "mediashape.hxx"
66*b1cdbd2cSJim Jagielski #include "tools.hxx"
67*b1cdbd2cSJim Jagielski #include "unoview.hxx"
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski namespace slideshow
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski     namespace internal
74*b1cdbd2cSJim Jagielski     {
ViewMediaShape(const ViewLayerSharedPtr & rViewLayer,const uno::Reference<drawing::XShape> & rxShape,const uno::Reference<uno::XComponentContext> & rxContext)75*b1cdbd2cSJim Jagielski         ViewMediaShape::ViewMediaShape( const ViewLayerSharedPtr&                       rViewLayer,
76*b1cdbd2cSJim Jagielski 										const uno::Reference< drawing::XShape >&        rxShape,
77*b1cdbd2cSJim Jagielski                                         const uno::Reference< uno::XComponentContext >& rxContext ) :
78*b1cdbd2cSJim Jagielski 			mpViewLayer( rViewLayer ),
79*b1cdbd2cSJim Jagielski 			mpMediaWindow(),
80*b1cdbd2cSJim Jagielski 			maWindowOffset( 0, 0 ),
81*b1cdbd2cSJim Jagielski             maBounds(),
82*b1cdbd2cSJim Jagielski 			mxShape( rxShape ),
83*b1cdbd2cSJim Jagielski 			mxPlayer(),
84*b1cdbd2cSJim Jagielski 			mxPlayerWindow(),
85*b1cdbd2cSJim Jagielski             mxComponentContext( rxContext ),
86*b1cdbd2cSJim Jagielski             mbIsSoundEnabled(true)
87*b1cdbd2cSJim Jagielski         {
88*b1cdbd2cSJim Jagielski             ENSURE_OR_THROW( mxShape.is(), "ViewMediaShape::ViewMediaShape(): Invalid Shape" );
89*b1cdbd2cSJim Jagielski             ENSURE_OR_THROW( mpViewLayer, "ViewMediaShape::ViewMediaShape(): Invalid View" );
90*b1cdbd2cSJim Jagielski             ENSURE_OR_THROW( mpViewLayer->getCanvas(), "ViewMediaShape::ViewMediaShape(): Invalid ViewLayer canvas" );
91*b1cdbd2cSJim Jagielski             ENSURE_OR_THROW( mxComponentContext.is(), "ViewMediaShape::ViewMediaShape(): Invalid component context" );
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski             UnoViewSharedPtr pUnoView (::boost::dynamic_pointer_cast<UnoView>(rViewLayer));
94*b1cdbd2cSJim Jagielski             if (pUnoView)
95*b1cdbd2cSJim Jagielski             {
96*b1cdbd2cSJim Jagielski                 mbIsSoundEnabled = pUnoView->isSoundEnabled();
97*b1cdbd2cSJim Jagielski             }
98*b1cdbd2cSJim Jagielski         }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
101*b1cdbd2cSJim Jagielski 
~ViewMediaShape()102*b1cdbd2cSJim Jagielski 		ViewMediaShape::~ViewMediaShape()
103*b1cdbd2cSJim Jagielski 		{
104*b1cdbd2cSJim Jagielski             try
105*b1cdbd2cSJim Jagielski             {
106*b1cdbd2cSJim Jagielski                 endMedia();
107*b1cdbd2cSJim Jagielski             }
108*b1cdbd2cSJim Jagielski             catch (uno::Exception &)
109*b1cdbd2cSJim Jagielski             {
110*b1cdbd2cSJim Jagielski                 OSL_ENSURE( false, rtl::OUStringToOString(
111*b1cdbd2cSJim Jagielski                                 comphelper::anyToString(
112*b1cdbd2cSJim Jagielski                                     cppu::getCaughtException() ),
113*b1cdbd2cSJim Jagielski                                 RTL_TEXTENCODING_UTF8 ).getStr() );
114*b1cdbd2cSJim Jagielski             }
115*b1cdbd2cSJim Jagielski 		}
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
118*b1cdbd2cSJim Jagielski 
getViewLayer() const119*b1cdbd2cSJim Jagielski         ViewLayerSharedPtr ViewMediaShape::getViewLayer() const
120*b1cdbd2cSJim Jagielski         {
121*b1cdbd2cSJim Jagielski             return mpViewLayer;
122*b1cdbd2cSJim Jagielski         }
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
125*b1cdbd2cSJim Jagielski 
startMedia()126*b1cdbd2cSJim Jagielski         bool ViewMediaShape::startMedia()
127*b1cdbd2cSJim Jagielski         {
128*b1cdbd2cSJim Jagielski             if( !mxPlayer.is() )
129*b1cdbd2cSJim Jagielski 			    implInitialize( maBounds );
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski             if( mxPlayer.is() && ( mxPlayer->getDuration() > 0.0 ) )
132*b1cdbd2cSJim Jagielski 				mxPlayer->start();
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 			return true;
135*b1cdbd2cSJim Jagielski         }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
138*b1cdbd2cSJim Jagielski 
endMedia()139*b1cdbd2cSJim Jagielski         void ViewMediaShape::endMedia()
140*b1cdbd2cSJim Jagielski         {
141*b1cdbd2cSJim Jagielski 			// shutdown player window
142*b1cdbd2cSJim Jagielski 			if( mxPlayerWindow.is() )
143*b1cdbd2cSJim Jagielski 			{
144*b1cdbd2cSJim Jagielski 				uno::Reference< lang::XComponent > xComponent( mxPlayerWindow, uno::UNO_QUERY );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 				if( xComponent.is() )
147*b1cdbd2cSJim Jagielski 					xComponent->dispose();
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 				mxPlayerWindow.clear();
150*b1cdbd2cSJim Jagielski 			}
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski             mpMediaWindow = ::std::auto_ptr< SystemChildWindow >();
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 			// shutdown player
155*b1cdbd2cSJim Jagielski 			if( mxPlayer.is() )
156*b1cdbd2cSJim Jagielski 			{
157*b1cdbd2cSJim Jagielski 				mxPlayer->stop();
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 				uno::Reference< lang::XComponent > xComponent( mxPlayer, uno::UNO_QUERY );
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 				if( xComponent.is() )
162*b1cdbd2cSJim Jagielski 					xComponent->dispose();
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 				mxPlayer.clear();
165*b1cdbd2cSJim Jagielski 			}
166*b1cdbd2cSJim Jagielski 		}
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
169*b1cdbd2cSJim Jagielski 
pauseMedia()170*b1cdbd2cSJim Jagielski         void ViewMediaShape::pauseMedia()
171*b1cdbd2cSJim Jagielski         {
172*b1cdbd2cSJim Jagielski             if( mxPlayer.is() && ( mxPlayer->getDuration() > 0.0 ) )
173*b1cdbd2cSJim Jagielski 				mxPlayer->stop();
174*b1cdbd2cSJim Jagielski 		}
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
177*b1cdbd2cSJim Jagielski 
setMediaTime(double fTime)178*b1cdbd2cSJim Jagielski         void ViewMediaShape::setMediaTime(double fTime)
179*b1cdbd2cSJim Jagielski         {
180*b1cdbd2cSJim Jagielski             if( mxPlayer.is() && ( mxPlayer->getDuration() > 0.0 ) )
181*b1cdbd2cSJim Jagielski 				mxPlayer->setMediaTime(fTime);
182*b1cdbd2cSJim Jagielski         }
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
185*b1cdbd2cSJim Jagielski 
render(const::basegfx::B2DRectangle & rBounds) const186*b1cdbd2cSJim Jagielski         bool ViewMediaShape::render( const ::basegfx::B2DRectangle&	rBounds ) const
187*b1cdbd2cSJim Jagielski         {
188*b1cdbd2cSJim Jagielski             ::cppcanvas::CanvasSharedPtr pCanvas = mpViewLayer->getCanvas();;
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski             if( !pCanvas )
191*b1cdbd2cSJim Jagielski                 return false;
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 			if( !mpMediaWindow.get() && !mxPlayerWindow.is() )
194*b1cdbd2cSJim Jagielski 			{
195*b1cdbd2cSJim Jagielski                 // fill the shape background with black
196*b1cdbd2cSJim Jagielski                 fillRect( pCanvas,
197*b1cdbd2cSJim Jagielski                           rBounds,
198*b1cdbd2cSJim Jagielski                           0x000000FFU );
199*b1cdbd2cSJim Jagielski 			}
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski             return true;
202*b1cdbd2cSJim Jagielski         }
203*b1cdbd2cSJim Jagielski 
resize(const::basegfx::B2DRectangle & rNewBounds) const204*b1cdbd2cSJim Jagielski         bool ViewMediaShape::resize( const ::basegfx::B2DRectangle&	rNewBounds ) const
205*b1cdbd2cSJim Jagielski         {
206*b1cdbd2cSJim Jagielski             maBounds = rNewBounds;
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski             ::cppcanvas::CanvasSharedPtr pCanvas = mpViewLayer->getCanvas();;
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski             if( !pCanvas )
211*b1cdbd2cSJim Jagielski                 return false;
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 			if( !mxPlayerWindow.is() )
214*b1cdbd2cSJim Jagielski                 return true;
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski             uno::Reference< beans::XPropertySet > xPropSet( pCanvas->getUNOCanvas()->getDevice(),
217*b1cdbd2cSJim Jagielski                                                             uno::UNO_QUERY );
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski             uno::Reference< awt::XWindow > xParentWindow;
220*b1cdbd2cSJim Jagielski             if( xPropSet.is() &&
221*b1cdbd2cSJim Jagielski                 getPropertyValue( xParentWindow,
222*b1cdbd2cSJim Jagielski                                   xPropSet,
223*b1cdbd2cSJim Jagielski                                   ::rtl::OUString::createFromAscii( "Window" )) )
224*b1cdbd2cSJim Jagielski             {
225*b1cdbd2cSJim Jagielski                 const awt::Rectangle aRect( xParentWindow->getPosSize() );
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski                 maWindowOffset.X = aRect.X;
228*b1cdbd2cSJim Jagielski                 maWindowOffset.Y = aRect.Y;
229*b1cdbd2cSJim Jagielski             }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski             ::basegfx::B2DRange aTmpRange;
232*b1cdbd2cSJim Jagielski             ::canvas::tools::calcTransformedRectBounds( aTmpRange,
233*b1cdbd2cSJim Jagielski                                                         rNewBounds,
234*b1cdbd2cSJim Jagielski                                                         mpViewLayer->getTransformation() );
235*b1cdbd2cSJim Jagielski             const ::basegfx::B2IRange& rRangePix(
236*b1cdbd2cSJim Jagielski                 ::basegfx::unotools::b2ISurroundingRangeFromB2DRange( aTmpRange ));
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski             mxPlayerWindow->setEnable( !rRangePix.isEmpty() );
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski             if( rRangePix.isEmpty() )
241*b1cdbd2cSJim Jagielski                 return true;
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski             const Point aPosPixel( rRangePix.getMinX() + maWindowOffset.X,
244*b1cdbd2cSJim Jagielski                                    rRangePix.getMinY() + maWindowOffset.Y );
245*b1cdbd2cSJim Jagielski             const Size	aSizePixel( rRangePix.getMaxX() - rRangePix.getMinX(),
246*b1cdbd2cSJim Jagielski                                     rRangePix.getMaxY() - rRangePix.getMinY() );
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski             if( mpMediaWindow.get() )
249*b1cdbd2cSJim Jagielski             {
250*b1cdbd2cSJim Jagielski                 mpMediaWindow->SetPosSizePixel( aPosPixel, aSizePixel );
251*b1cdbd2cSJim Jagielski                 mxPlayerWindow->setPosSize( 0, 0,
252*b1cdbd2cSJim Jagielski                                             aSizePixel.Width(), aSizePixel.Height(),
253*b1cdbd2cSJim Jagielski                                             0 );
254*b1cdbd2cSJim Jagielski             }
255*b1cdbd2cSJim Jagielski             else
256*b1cdbd2cSJim Jagielski             {
257*b1cdbd2cSJim Jagielski                 mxPlayerWindow->setPosSize( aPosPixel.X(), aPosPixel.Y(),
258*b1cdbd2cSJim Jagielski                                             aSizePixel.Width(), aSizePixel.Height(),
259*b1cdbd2cSJim Jagielski                                             0 );
260*b1cdbd2cSJim Jagielski             }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 			return true;
263*b1cdbd2cSJim Jagielski         }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
266*b1cdbd2cSJim Jagielski 
implInitialize(const::basegfx::B2DRectangle & rBounds)267*b1cdbd2cSJim Jagielski 		bool ViewMediaShape::implInitialize( const ::basegfx::B2DRectangle& rBounds )
268*b1cdbd2cSJim Jagielski 		{
269*b1cdbd2cSJim Jagielski 			if( !mxPlayer.is() && mxShape.is() )
270*b1cdbd2cSJim Jagielski 			{
271*b1cdbd2cSJim Jagielski 				ENSURE_OR_RETURN_FALSE( mpViewLayer->getCanvas(),
272*b1cdbd2cSJim Jagielski                                    "ViewMediaShape::update(): Invalid layer canvas" );
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski 				uno::Reference< rendering::XCanvas > xCanvas( mpViewLayer->getCanvas()->getUNOCanvas() );
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 				if( xCanvas.is() )
277*b1cdbd2cSJim Jagielski 				{
278*b1cdbd2cSJim Jagielski 					uno::Reference< beans::XPropertySet >	xPropSet;
279*b1cdbd2cSJim Jagielski 					::rtl::OUString 						aURL;
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 					try
282*b1cdbd2cSJim Jagielski 					{
283*b1cdbd2cSJim Jagielski 						xPropSet.set( mxShape, uno::UNO_QUERY );
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 						// create Player
286*b1cdbd2cSJim Jagielski 						if( xPropSet.is() &&
287*b1cdbd2cSJim Jagielski 							( xPropSet->getPropertyValue(
288*b1cdbd2cSJim Jagielski                                   ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ) ) >>=aURL ) )
289*b1cdbd2cSJim Jagielski 						{
290*b1cdbd2cSJim Jagielski 							implInitializeMediaPlayer( aURL );
291*b1cdbd2cSJim Jagielski 						}
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 						// create visible object
294*b1cdbd2cSJim Jagielski 						uno::Sequence< uno::Any > aDeviceParams;
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 						if( ::canvas::tools::getDeviceInfo( xCanvas, aDeviceParams ).getLength() > 1 )
297*b1cdbd2cSJim Jagielski 						{
298*b1cdbd2cSJim Jagielski 							::rtl::OUString aImplName;
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski 							aDeviceParams[ 0 ] >>= aImplName;
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 							if( aImplName.endsWithIgnoreAsciiCaseAsciiL(
303*b1cdbd2cSJim Jagielski                                     RTL_CONSTASCII_STRINGPARAM("VCL") ))
304*b1cdbd2cSJim Jagielski                             {
305*b1cdbd2cSJim Jagielski 								implInitializeVCLBasedPlayerWindow( rBounds, aDeviceParams );
306*b1cdbd2cSJim Jagielski                             }
307*b1cdbd2cSJim Jagielski 							else if( aImplName.endsWithIgnoreAsciiCaseAsciiL(
308*b1cdbd2cSJim Jagielski                                          RTL_CONSTASCII_STRINGPARAM("DX")) ||
309*b1cdbd2cSJim Jagielski 									 aImplName.endsWithIgnoreAsciiCaseAsciiL(
310*b1cdbd2cSJim Jagielski                                          RTL_CONSTASCII_STRINGPARAM("DX9")))
311*b1cdbd2cSJim Jagielski                             {
312*b1cdbd2cSJim Jagielski 								implInitializeDXBasedPlayerWindow( rBounds, aDeviceParams );
313*b1cdbd2cSJim Jagielski                             }
314*b1cdbd2cSJim Jagielski 						}
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski 						// set player properties
317*b1cdbd2cSJim Jagielski 						implSetMediaProperties( xPropSet );
318*b1cdbd2cSJim Jagielski 					}
319*b1cdbd2cSJim Jagielski                     catch( uno::RuntimeException& )
320*b1cdbd2cSJim Jagielski                     {
321*b1cdbd2cSJim Jagielski                         throw;
322*b1cdbd2cSJim Jagielski                     }
323*b1cdbd2cSJim Jagielski 					catch( uno::Exception& )
324*b1cdbd2cSJim Jagielski 					{
325*b1cdbd2cSJim Jagielski                         OSL_ENSURE( false,
326*b1cdbd2cSJim Jagielski                                     rtl::OUStringToOString(
327*b1cdbd2cSJim Jagielski                                         comphelper::anyToString( cppu::getCaughtException() ),
328*b1cdbd2cSJim Jagielski                                         RTL_TEXTENCODING_UTF8 ).getStr() );
329*b1cdbd2cSJim Jagielski 					}
330*b1cdbd2cSJim Jagielski 				}
331*b1cdbd2cSJim Jagielski 			}
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 			return mxPlayer.is() || mxPlayerWindow.is();
334*b1cdbd2cSJim Jagielski 	    }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
337*b1cdbd2cSJim Jagielski 
implSetMediaProperties(const uno::Reference<beans::XPropertySet> & rxProps)338*b1cdbd2cSJim Jagielski 		void ViewMediaShape::implSetMediaProperties( const uno::Reference< beans::XPropertySet >& rxProps )
339*b1cdbd2cSJim Jagielski 		{
340*b1cdbd2cSJim Jagielski 			if( mxPlayer.is() )
341*b1cdbd2cSJim Jagielski 			{
342*b1cdbd2cSJim Jagielski 				mxPlayer->setMediaTime( 0.0 );
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski                 if( rxProps.is() )
345*b1cdbd2cSJim Jagielski                 {
346*b1cdbd2cSJim Jagielski 					sal_Bool bLoop( false );
347*b1cdbd2cSJim Jagielski 					getPropertyValue( bLoop,
348*b1cdbd2cSJim Jagielski                                       rxProps,
349*b1cdbd2cSJim Jagielski                                       ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Loop" )));
350*b1cdbd2cSJim Jagielski 					mxPlayer->setPlaybackLoop( bLoop );
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 					sal_Bool bMute( false );
353*b1cdbd2cSJim Jagielski 					getPropertyValue( bMute,
354*b1cdbd2cSJim Jagielski                                       rxProps,
355*b1cdbd2cSJim Jagielski                                       ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Mute" )));
356*b1cdbd2cSJim Jagielski 					mxPlayer->setMute( bMute || !mbIsSoundEnabled);
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 					sal_Int16 nVolumeDB(0);
359*b1cdbd2cSJim Jagielski 					getPropertyValue( nVolumeDB,
360*b1cdbd2cSJim Jagielski                                       rxProps,
361*b1cdbd2cSJim Jagielski                                       ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" )));
362*b1cdbd2cSJim Jagielski 					mxPlayer->setVolumeDB( nVolumeDB );
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski                     if( mxPlayerWindow.is() )
365*b1cdbd2cSJim Jagielski                     {
366*b1cdbd2cSJim Jagielski 						media::ZoomLevel eZoom(media::ZoomLevel_FIT_TO_WINDOW);
367*b1cdbd2cSJim Jagielski 						getPropertyValue( eZoom,
368*b1cdbd2cSJim Jagielski                                           rxProps,
369*b1cdbd2cSJim Jagielski                                           ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" )));
370*b1cdbd2cSJim Jagielski 						mxPlayerWindow->setZoomLevel( eZoom );
371*b1cdbd2cSJim Jagielski 					}
372*b1cdbd2cSJim Jagielski 				}
373*b1cdbd2cSJim Jagielski 			}
374*b1cdbd2cSJim Jagielski 		}
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
377*b1cdbd2cSJim Jagielski 
implInitializeMediaPlayer(const::rtl::OUString & rMediaURL)378*b1cdbd2cSJim Jagielski 		void ViewMediaShape::implInitializeMediaPlayer( const ::rtl::OUString& rMediaURL )
379*b1cdbd2cSJim Jagielski 		{
380*b1cdbd2cSJim Jagielski 			if( !mxPlayer.is() )
381*b1cdbd2cSJim Jagielski 			{
382*b1cdbd2cSJim Jagielski 				try
383*b1cdbd2cSJim Jagielski 				{
384*b1cdbd2cSJim Jagielski 					if( rMediaURL.getLength() )
385*b1cdbd2cSJim Jagielski 					{
386*b1cdbd2cSJim Jagielski 						mxPlayer.set( avmedia::MediaWindow::createPlayer( rMediaURL ),
387*b1cdbd2cSJim Jagielski                             uno::UNO_QUERY );
388*b1cdbd2cSJim Jagielski 					}
389*b1cdbd2cSJim Jagielski 				}
390*b1cdbd2cSJim Jagielski                 catch( uno::RuntimeException& )
391*b1cdbd2cSJim Jagielski                 {
392*b1cdbd2cSJim Jagielski                     throw;
393*b1cdbd2cSJim Jagielski                 }
394*b1cdbd2cSJim Jagielski 				catch( const uno::Exception& )
395*b1cdbd2cSJim Jagielski 				{
396*b1cdbd2cSJim Jagielski                     throw lang::NoSupportException(
397*b1cdbd2cSJim Jagielski                         rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
398*b1cdbd2cSJim Jagielski                                            "No video support for ") ) + rMediaURL,
399*b1cdbd2cSJim Jagielski                         uno::Reference<uno::XInterface>() );
400*b1cdbd2cSJim Jagielski 				}
401*b1cdbd2cSJim Jagielski 			}
402*b1cdbd2cSJim Jagielski 		}
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
405*b1cdbd2cSJim Jagielski 
implInitializeVCLBasedPlayerWindow(const::basegfx::B2DRectangle & rBounds,const uno::Sequence<uno::Any> & rVCLDeviceParams)406*b1cdbd2cSJim Jagielski 		bool ViewMediaShape::implInitializeVCLBasedPlayerWindow( const ::basegfx::B2DRectangle&   rBounds,
407*b1cdbd2cSJim Jagielski 																 const uno::Sequence< uno::Any >& rVCLDeviceParams)
408*b1cdbd2cSJim Jagielski 		{
409*b1cdbd2cSJim Jagielski 			if( !mpMediaWindow.get() && !rBounds.isEmpty() )
410*b1cdbd2cSJim Jagielski 			{
411*b1cdbd2cSJim Jagielski 				try
412*b1cdbd2cSJim Jagielski 				{
413*b1cdbd2cSJim Jagielski 					sal_Int64 aVal=0;
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 					rVCLDeviceParams[ 1 ] >>= aVal;
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 					Window* pWindow = reinterpret_cast< Window* >( aVal );
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 					if( pWindow )
420*b1cdbd2cSJim Jagielski 					{
421*b1cdbd2cSJim Jagielski 						::basegfx::B2DRange aTmpRange;
422*b1cdbd2cSJim Jagielski 						::canvas::tools::calcTransformedRectBounds( aTmpRange,
423*b1cdbd2cSJim Jagielski                                                                     rBounds,
424*b1cdbd2cSJim Jagielski 																	mpViewLayer->getTransformation() );
425*b1cdbd2cSJim Jagielski                         const ::basegfx::B2IRange& rRangePix(
426*b1cdbd2cSJim Jagielski                             ::basegfx::unotools::b2ISurroundingRangeFromB2DRange( aTmpRange ));
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski 						if( !rRangePix.isEmpty() )
429*b1cdbd2cSJim Jagielski 						{
430*b1cdbd2cSJim Jagielski 							uno::Sequence< uno::Any > 	aArgs( 3 );
431*b1cdbd2cSJim Jagielski 							awt::Rectangle				aAWTRect( rRangePix.getMinX(),
432*b1cdbd2cSJim Jagielski 																  rRangePix.getMinY(),
433*b1cdbd2cSJim Jagielski 														  		  rRangePix.getMaxX() - rRangePix.getMinX(),
434*b1cdbd2cSJim Jagielski 														  		  rRangePix.getMaxY() - rRangePix.getMinY() );
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 							mpMediaWindow = ::std::auto_ptr< SystemChildWindow >( new
437*b1cdbd2cSJim Jagielski                                                 SystemChildWindow( pWindow, WB_CLIPCHILDREN ) );
438*b1cdbd2cSJim Jagielski 							mpMediaWindow->SetBackground( Color( COL_BLACK ) );
439*b1cdbd2cSJim Jagielski 							mpMediaWindow->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ),
440*b1cdbd2cSJim Jagielski                                                            Size( aAWTRect.Width, aAWTRect.Height ) );
441*b1cdbd2cSJim Jagielski 							mpMediaWindow->Show();
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 							if( mxPlayer.is() )
444*b1cdbd2cSJim Jagielski 							{
445*b1cdbd2cSJim Jagielski 								aArgs[ 0 ] = uno::makeAny(
446*b1cdbd2cSJim Jagielski                                     sal::static_int_cast< sal_IntPtr >( mpMediaWindow->GetParentWindowHandle() ) );
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 								aAWTRect.X = aAWTRect.Y = 0;
449*b1cdbd2cSJim Jagielski 								aArgs[ 1 ] = uno::makeAny( aAWTRect );
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski                                 aArgs[ 2 ] = uno::makeAny( reinterpret_cast< sal_IntPtr >( mpMediaWindow.get() ) );
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 								mxPlayerWindow.set( mxPlayer->createPlayerWindow( aArgs ) );
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 								if( mxPlayerWindow.is() )
456*b1cdbd2cSJim Jagielski 								{
457*b1cdbd2cSJim Jagielski 									mxPlayerWindow->setVisible( true );
458*b1cdbd2cSJim Jagielski 									mxPlayerWindow->setEnable( true );
459*b1cdbd2cSJim Jagielski 								}
460*b1cdbd2cSJim Jagielski 							}
461*b1cdbd2cSJim Jagielski 						}
462*b1cdbd2cSJim Jagielski 					}
463*b1cdbd2cSJim Jagielski 				}
464*b1cdbd2cSJim Jagielski                 catch( uno::RuntimeException& )
465*b1cdbd2cSJim Jagielski                 {
466*b1cdbd2cSJim Jagielski                     throw;
467*b1cdbd2cSJim Jagielski                 }
468*b1cdbd2cSJim Jagielski 				catch( uno::Exception& )
469*b1cdbd2cSJim Jagielski 				{
470*b1cdbd2cSJim Jagielski                     OSL_ENSURE( false,
471*b1cdbd2cSJim Jagielski                                 rtl::OUStringToOString(
472*b1cdbd2cSJim Jagielski                                     comphelper::anyToString( cppu::getCaughtException() ),
473*b1cdbd2cSJim Jagielski                                     RTL_TEXTENCODING_UTF8 ).getStr() );
474*b1cdbd2cSJim Jagielski 				}
475*b1cdbd2cSJim Jagielski 			}
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski 			return mxPlayerWindow.is();
478*b1cdbd2cSJim Jagielski 		}
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski 		// ---------------------------------------------------------------------
481*b1cdbd2cSJim Jagielski 
implInitializeDXBasedPlayerWindow(const::basegfx::B2DRectangle & rBounds,const uno::Sequence<uno::Any> & rDXDeviceParams)482*b1cdbd2cSJim Jagielski 		bool ViewMediaShape::implInitializeDXBasedPlayerWindow( const ::basegfx::B2DRectangle&   rBounds,
483*b1cdbd2cSJim Jagielski 																const uno::Sequence< uno::Any >& rDXDeviceParams )
484*b1cdbd2cSJim Jagielski 		{
485*b1cdbd2cSJim Jagielski             if( !mxPlayerWindow.is() )
486*b1cdbd2cSJim Jagielski 	    	{
487*b1cdbd2cSJim Jagielski         		try
488*b1cdbd2cSJim Jagielski 		        {
489*b1cdbd2cSJim Jagielski 				    if( rDXDeviceParams.getLength() == 2 )
490*b1cdbd2cSJim Jagielski 				    {
491*b1cdbd2cSJim Jagielski 					    sal_Int64 aWNDVal=0;
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 					    rDXDeviceParams[ 1 ] >>= aWNDVal;
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 					    if( aWNDVal )
496*b1cdbd2cSJim Jagielski 					    {
497*b1cdbd2cSJim Jagielski 						    ::basegfx::B2DRange aTmpRange;
498*b1cdbd2cSJim Jagielski 						    ::canvas::tools::calcTransformedRectBounds( aTmpRange,
499*b1cdbd2cSJim Jagielski                                                                         rBounds,
500*b1cdbd2cSJim Jagielski 																	    mpViewLayer->getTransformation() );
501*b1cdbd2cSJim Jagielski                             const ::basegfx::B2IRange& rRangePix(
502*b1cdbd2cSJim Jagielski                                 ::basegfx::unotools::b2ISurroundingRangeFromB2DRange( aTmpRange ));
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 						    if( !rRangePix.isEmpty() )
505*b1cdbd2cSJim Jagielski 						    {
506*b1cdbd2cSJim Jagielski 							    uno::Sequence< uno::Any > 	aArgs( 2 );
507*b1cdbd2cSJim Jagielski 							    awt::Rectangle				aAWTRect( rRangePix.getMinX() + maWindowOffset.X,
508*b1cdbd2cSJim Jagielski                                                                       rRangePix.getMinY() + maWindowOffset.Y,
509*b1cdbd2cSJim Jagielski                                                                       rRangePix.getMaxX() - rRangePix.getMinX(),
510*b1cdbd2cSJim Jagielski                                                                       rRangePix.getMaxY() - rRangePix.getMinY() );
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski 							    if( mxPlayer.is() )
513*b1cdbd2cSJim Jagielski 							    {
514*b1cdbd2cSJim Jagielski 								    aArgs[ 0 ] = uno::makeAny( sal::static_int_cast< sal_Int32 >( aWNDVal) );
515*b1cdbd2cSJim Jagielski 								    aArgs[ 1 ] = uno::makeAny( aAWTRect );
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 								    mxPlayerWindow.set( mxPlayer->createPlayerWindow( aArgs ) );
518*b1cdbd2cSJim Jagielski 							    }
519*b1cdbd2cSJim Jagielski 						    }
520*b1cdbd2cSJim Jagielski 					    }
521*b1cdbd2cSJim Jagielski 				    }
522*b1cdbd2cSJim Jagielski     			}
523*b1cdbd2cSJim Jagielski                 catch( uno::RuntimeException& )
524*b1cdbd2cSJim Jagielski                 {
525*b1cdbd2cSJim Jagielski                     throw;
526*b1cdbd2cSJim Jagielski                 }
527*b1cdbd2cSJim Jagielski 	    	    catch( uno::Exception& )
528*b1cdbd2cSJim Jagielski 		        {
529*b1cdbd2cSJim Jagielski                     OSL_ENSURE( false,
530*b1cdbd2cSJim Jagielski                                 rtl::OUStringToOString(
531*b1cdbd2cSJim Jagielski                                     comphelper::anyToString( cppu::getCaughtException() ),
532*b1cdbd2cSJim Jagielski                                     RTL_TEXTENCODING_UTF8 ).getStr() );
533*b1cdbd2cSJim Jagielski 		        }
534*b1cdbd2cSJim Jagielski 		    }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski 			return mxPlayerWindow.is();
537*b1cdbd2cSJim Jagielski 		}
538*b1cdbd2cSJim Jagielski 	}
539*b1cdbd2cSJim Jagielski }
540