1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include <sal/main.h> 25 #include <rtl/ref.hxx> 26 #include <rtl/bootstrap.hxx> 27 28 #include <cppuhelper/bootstrap.hxx> 29 #include <cppuhelper/servicefactory.hxx> 30 #include <cppuhelper/interfacecontainer.hxx> 31 #include <cppuhelper/compbase1.hxx> 32 #include <cppuhelper/compbase2.hxx> 33 34 #include <comphelper/processfactory.hxx> 35 #include <comphelper/broadcasthelper.hxx> 36 #include <comphelper/anytostring.hxx> 37 #include <cppuhelper/exc_hlp.hxx> 38 39 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 40 #include <com/sun/star/beans/XPropertySet.hpp> 41 #include <com/sun/star/rendering/XCanvas.hpp> 42 #include <com/sun/star/rendering/XSpriteCanvas.hpp> 43 #include <com/sun/star/presentation/XSlideShow.hpp> 44 #include <com/sun/star/presentation/XSlideShowView.hpp> 45 #include "com/sun/star/animations/TransitionType.hpp" 46 #include "com/sun/star/animations/TransitionSubType.hpp" 47 48 #include <ucbhelper/contentbroker.hxx> 49 #include <ucbhelper/configurationkeys.hxx> 50 51 #include <basegfx/matrix/b2dhommatrix.hxx> 52 #include <basegfx/tools/canvastools.hxx> 53 #include <basegfx/range/b2drectangle.hxx> 54 #include <basegfx/polygon/b2dpolygon.hxx> 55 #include <basegfx/polygon/b2dpolygontools.hxx> 56 57 #include <cppcanvas/vclfactory.hxx> 58 #include <cppcanvas/basegfxfactory.hxx> 59 #include <cppcanvas/polypolygon.hxx> 60 61 #include <canvas/canvastools.hxx> 62 63 #include <vcl/dialog.hxx> 64 #include <vcl/timer.hxx> 65 #include <vcl/window.hxx> 66 #include <vcl/svapp.hxx> 67 68 #include <stdio.h> 69 #include <unistd.h> 70 71 72 using namespace ::com::sun::star; 73 74 namespace { 75 76 typedef ::cppu::WeakComponentImplHelper1< presentation::XSlideShowView > ViewBase; 77 class View : public ::comphelper::OBaseMutex, 78 public ViewBase 79 { 80 public: 81 explicit View( const uno::Reference< rendering::XSpriteCanvas >& rCanvas ) : 82 ViewBase( m_aMutex ), 83 mxCanvas( rCanvas ), 84 maPaintListeners( m_aMutex ), 85 maTransformationListeners( m_aMutex ), 86 maMouseListeners( m_aMutex ), 87 maMouseMotionListeners( m_aMutex ), 88 maTransform(), 89 maSize() 90 { 91 } 92 93 void resize( const ::Size& rNewSize ) 94 { 95 maSize = rNewSize; 96 const sal_Int32 nSize( std::min( rNewSize.Width(), rNewSize.Height() ) - 10); 97 maTransform = basegfx::tools::createScaleTranslateB2DHomMatrix( 98 nSize, nSize, (rNewSize.Width() - nSize) / 2, (rNewSize.Height() - nSize) / 2); 99 100 lang::EventObject aEvent( *this ); 101 maTransformationListeners.notifyEach( &util::XModifyListener::modified, 102 aEvent ); 103 } 104 105 void repaint() 106 { 107 awt::PaintEvent aEvent( *this, 108 awt::Rectangle(), 109 0 ); 110 maPaintListeners.notifyEach( &awt::XPaintListener::windowPaint, 111 aEvent ); 112 } 113 114 private: 115 virtual ~View() {} 116 117 virtual uno::Reference< rendering::XSpriteCanvas > SAL_CALL getCanvas( ) throw (uno::RuntimeException) 118 { 119 return mxCanvas; 120 } 121 122 virtual void SAL_CALL clear( ) throw (uno::RuntimeException) 123 { 124 ::basegfx::B2DPolygon aPoly( ::basegfx::tools::createPolygonFromRect( 125 ::basegfx::B2DRectangle(0.0,0.0, 126 maSize.Width(), 127 maSize.Height() ))); 128 ::cppcanvas::SpriteCanvasSharedPtr pCanvas( 129 ::cppcanvas::VCLFactory::getInstance().createSpriteCanvas( mxCanvas )); 130 if( !pCanvas ) 131 return; 132 133 ::cppcanvas::PolyPolygonSharedPtr pPolyPoly( 134 ::cppcanvas::BaseGfxFactory::getInstance().createPolyPolygon( pCanvas, 135 aPoly ) ); 136 if( !pPolyPoly ) 137 return; 138 139 if( pPolyPoly ) 140 { 141 pPolyPoly->setRGBAFillColor( 0x808080FFU ); 142 pPolyPoly->draw(); 143 } 144 } 145 146 virtual geometry::AffineMatrix2D SAL_CALL getTransformation( ) throw (uno::RuntimeException) 147 { 148 geometry::AffineMatrix2D aRes; 149 return basegfx::unotools::affineMatrixFromHomMatrix( aRes, 150 maTransform ); 151 } 152 153 virtual void SAL_CALL addTransformationChangedListener( const uno::Reference< util::XModifyListener >& xListener ) throw (uno::RuntimeException) 154 { 155 maTransformationListeners.addInterface( xListener ); 156 } 157 158 virtual void SAL_CALL removeTransformationChangedListener( const uno::Reference< util::XModifyListener >& xListener ) throw (uno::RuntimeException) 159 { 160 maTransformationListeners.removeInterface( xListener ); 161 } 162 163 virtual void SAL_CALL addPaintListener( const uno::Reference< awt::XPaintListener >& xListener ) throw (uno::RuntimeException) 164 { 165 maPaintListeners.addInterface( xListener ); 166 } 167 168 virtual void SAL_CALL removePaintListener( const uno::Reference< awt::XPaintListener >& xListener ) throw (uno::RuntimeException) 169 { 170 maPaintListeners.removeInterface( xListener ); 171 } 172 173 virtual void SAL_CALL addMouseListener( const uno::Reference< awt::XMouseListener >& xListener ) throw (uno::RuntimeException) 174 { 175 maMouseListeners.addInterface( xListener ); 176 } 177 178 virtual void SAL_CALL removeMouseListener( const uno::Reference< awt::XMouseListener >& xListener ) throw (uno::RuntimeException) 179 { 180 maMouseListeners.removeInterface( xListener ); 181 } 182 183 virtual void SAL_CALL addMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener ) throw (uno::RuntimeException) 184 { 185 maMouseMotionListeners.addInterface( xListener ); 186 } 187 188 virtual void SAL_CALL removeMouseMotionListener( const uno::Reference< awt::XMouseMotionListener >& xListener ) throw (uno::RuntimeException) 189 { 190 maMouseMotionListeners.removeInterface( xListener ); 191 } 192 193 virtual void SAL_CALL setMouseCursor( ::sal_Int16 /*nPointerShape*/ ) throw (uno::RuntimeException) 194 { 195 } 196 197 uno::Reference< rendering::XSpriteCanvas > mxCanvas; 198 ::cppu::OInterfaceContainerHelper maPaintListeners; 199 ::cppu::OInterfaceContainerHelper maTransformationListeners; 200 ::cppu::OInterfaceContainerHelper maMouseListeners; 201 ::cppu::OInterfaceContainerHelper maMouseMotionListeners; 202 basegfx::B2DHomMatrix maTransform; 203 Size maSize; 204 }; 205 206 typedef ::cppu::WeakComponentImplHelper2< drawing::XDrawPage, 207 beans::XPropertySet > SlideBase; 208 class DummySlide : public ::comphelper::OBaseMutex, 209 public SlideBase 210 { 211 public: 212 DummySlide() : SlideBase( m_aMutex ) {} 213 214 private: 215 // XDrawPage 216 virtual void SAL_CALL add( const uno::Reference< drawing::XShape >& /*xShape*/ ) throw (uno::RuntimeException) 217 { 218 } 219 220 virtual void SAL_CALL remove( const uno::Reference< drawing::XShape >& /*xShape*/ ) throw (uno::RuntimeException) 221 { 222 } 223 224 virtual ::sal_Int32 SAL_CALL getCount( ) throw (uno::RuntimeException) 225 { 226 return 0; 227 } 228 229 virtual uno::Any SAL_CALL getByIndex( ::sal_Int32 /*Index*/ ) throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException) 230 { 231 return uno::Any(); 232 } 233 234 virtual uno::Type SAL_CALL getElementType( ) throw (uno::RuntimeException) 235 { 236 return uno::Type(); 237 } 238 239 virtual ::sal_Bool SAL_CALL hasElements( ) throw (uno::RuntimeException) 240 { 241 return false; 242 } 243 244 // XPropertySet 245 virtual uno::Reference< beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw (uno::RuntimeException) 246 { 247 return uno::Reference< beans::XPropertySetInfo >(); 248 } 249 250 virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& /*aPropertyName*/, 251 const uno::Any& /*aValue*/ ) throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) 252 { 253 } 254 255 virtual uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& PropertyName ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 256 { 257 typedef ::canvas::tools::ValueMap< sal_Int16 > PropMapT; 258 259 // fixed PropertyValue map 260 static PropMapT::MapEntry lcl_propertyMap[] = 261 { 262 {"Height", 100}, 263 {"MinimalFrameNumber", 50}, 264 {"TransitionDuration", 10}, 265 {"TransitionSubtype", animations::TransitionSubType::FROMTOPLEFT}, 266 {"TransitionType", animations::TransitionType::PUSHWIPE}, 267 {"Width", 100} 268 }; 269 270 static PropMapT aMap( lcl_propertyMap, 271 sizeof(lcl_propertyMap)/sizeof(*lcl_propertyMap), 272 true ); 273 274 sal_Int16 aRes; 275 if( !aMap.lookup( PropertyName, aRes )) 276 return uno::Any(); 277 278 return uno::makeAny(aRes); 279 } 280 281 virtual void SAL_CALL addPropertyChangeListener( const ::rtl::OUString& /*aPropertyName*/, 282 const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 283 { 284 } 285 286 virtual void SAL_CALL removePropertyChangeListener( const ::rtl::OUString& /*aPropertyName*/, 287 const uno::Reference< beans::XPropertyChangeListener >& /*aListener*/ ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 288 { 289 } 290 291 virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& /*PropertyName*/, 292 const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 293 { 294 } 295 296 virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& /*PropertyName*/, 297 const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) 298 { 299 } 300 }; 301 302 303 class DemoApp : public Application 304 { 305 public: 306 virtual void Main(); 307 virtual sal_uInt16 Exception( sal_uInt16 nError ); 308 }; 309 310 class ChildWindow : public Window 311 { 312 public: 313 ChildWindow( Window* pParent ); 314 virtual ~ChildWindow(); 315 virtual void Paint( const Rectangle& rRect ); 316 virtual void Resize(); 317 318 void setShow( const uno::Reference< presentation::XSlideShow >& rShow ) { mxShow = rShow; init(); } 319 320 private: 321 void init(); 322 323 rtl::Reference< View > mpView; 324 uno::Reference< presentation::XSlideShow > mxShow; 325 }; 326 327 ChildWindow::ChildWindow( Window* pParent ) : 328 Window(pParent, WB_CLIPCHILDREN | WB_BORDER| WB_3DLOOK ), 329 mpView(), 330 mxShow() 331 { 332 EnablePaint( true ); 333 Show(); 334 } 335 336 ChildWindow::~ChildWindow() 337 { 338 if( mxShow.is() && mpView.is() ) 339 mxShow->removeView( mpView.get() ); 340 } 341 342 void ChildWindow::init() 343 { 344 try 345 { 346 if( !mpView.is() ) 347 { 348 uno::Reference< rendering::XCanvas > xCanvas( GetCanvas(), 349 uno::UNO_QUERY_THROW ); 350 uno::Reference< rendering::XSpriteCanvas > xSpriteCanvas( xCanvas, 351 uno::UNO_QUERY_THROW ); 352 mpView = new View( xSpriteCanvas ); 353 mpView->resize( GetSizePixel() ); 354 355 if( mxShow.is() ) 356 mxShow->addView( mpView.get() ); 357 } 358 } 359 catch (const uno::Exception &e) 360 { 361 OSL_TRACE( "Exception '%s' thrown\n" , 362 (const sal_Char*)::rtl::OUStringToOString( e.Message, 363 RTL_TEXTENCODING_UTF8 )); 364 } 365 } 366 367 void ChildWindow::Paint( const Rectangle& /*rRect*/ ) 368 { 369 try 370 { 371 if( mpView.is() ) 372 mpView->repaint(); 373 } 374 catch (const uno::Exception &e) 375 { 376 OSL_TRACE( "Exception '%s' thrown\n" , 377 (const sal_Char*)::rtl::OUStringToOString( e.Message, 378 RTL_TEXTENCODING_UTF8 )); 379 } 380 } 381 382 void ChildWindow::Resize() 383 { 384 if( mpView.is() ) 385 mpView->resize( GetSizePixel() ); 386 } 387 388 class DemoWindow : public Dialog 389 { 390 public: 391 DemoWindow(); 392 virtual void Paint( const Rectangle& rRect ); 393 virtual void Resize(); 394 395 private: 396 void init(); 397 DECL_LINK( updateHdl, Timer* ); 398 399 ChildWindow maLeftChild; 400 ChildWindow maRightTopChild; 401 ChildWindow maRightBottomChild; 402 uno::Reference< presentation::XSlideShow > mxShow; 403 AutoTimer maUpdateTimer; 404 bool mbSlideDisplayed; 405 }; 406 407 DemoWindow::DemoWindow() : 408 Dialog((Window*)NULL), 409 maLeftChild( this ), 410 maRightTopChild( this ), 411 maRightBottomChild( this ), 412 mxShow(), 413 maUpdateTimer(), 414 mbSlideDisplayed( false ) 415 { 416 SetText( rtl::OUString::createFromAscii( "Slideshow Demo" ) ); 417 SetSizePixel( Size( 640, 480 ) ); 418 EnablePaint( true ); 419 420 maLeftChild.SetPosSizePixel( Point(), Size(320,480) ); 421 maRightTopChild.SetPosSizePixel( Point(320,0), Size(320,240) ); 422 maRightBottomChild.SetPosSizePixel( Point(320,240), Size(320,240) ); 423 Show(); 424 425 maUpdateTimer.SetTimeoutHdl(LINK(this, DemoWindow, updateHdl)); 426 maUpdateTimer.SetTimeout( (sal_uLong)30 ); 427 maUpdateTimer.Start(); 428 } 429 430 void DemoWindow::init() 431 { 432 try 433 { 434 if( !mxShow.is() ) 435 { 436 uno::Reference< lang::XMultiServiceFactory > xFactory( 437 ::comphelper::getProcessServiceFactory(), 438 uno::UNO_QUERY_THROW ); 439 440 uno::Reference< uno::XInterface > xInt( xFactory->createInstance( 441 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.presentation.SlideShow")) )); 442 443 mxShow.set( xInt, 444 uno::UNO_QUERY_THROW ); 445 446 maLeftChild.setShow( mxShow ); 447 maRightTopChild.setShow( mxShow ); 448 maRightBottomChild.setShow( mxShow ); 449 } 450 451 if( mxShow.is() && !mbSlideDisplayed ) 452 { 453 uno::Reference< drawing::XDrawPage > xSlide( new DummySlide ); 454 mxShow->displaySlide( xSlide, 455 uno::Reference< animations::XAnimationNode >(), 456 uno::Sequence< beans::PropertyValue >() ); 457 mxShow->setProperty( beans::PropertyValue( 458 rtl::OUString::createFromAscii("RehearseTimings"), 459 0, 460 uno::makeAny( sal_True ), 461 beans::PropertyState_DIRECT_VALUE )); 462 mbSlideDisplayed = true; 463 } 464 } 465 catch (const uno::Exception &e) 466 { 467 OSL_TRACE( "Exception '%s' thrown\n" , 468 (const sal_Char*)::rtl::OUStringToOString( e.Message, 469 RTL_TEXTENCODING_UTF8 )); 470 } 471 } 472 473 IMPL_LINK( DemoWindow, updateHdl, Timer*, EMPTYARG ) 474 { 475 init(); 476 477 double nTimeout; 478 if( mxShow.is() ) 479 mxShow->update(nTimeout); 480 481 return 0; 482 } 483 484 void DemoWindow::Paint( const Rectangle& /*rRect*/ ) 485 { 486 init(); 487 } 488 489 void DemoWindow::Resize() 490 { 491 // TODO 492 } 493 494 sal_uInt16 DemoApp::Exception( sal_uInt16 nError ) 495 { 496 switch( nError & EXC_MAJORTYPE ) 497 { 498 case EXC_RSCNOTLOADED: 499 Abort( String::CreateFromAscii( "Error: could not load language resources.\nPlease check your installation.\n" ) ); 500 break; 501 } 502 return 0; 503 } 504 505 void DemoApp::Main() 506 { 507 bool bHelp = false; 508 509 for( sal_uInt16 i = 0; i < GetCommandLineParamCount(); i++ ) 510 { 511 ::rtl::OUString aParam = GetCommandLineParam( i ); 512 513 if( aParam.equalsAscii( "--help" ) || 514 aParam.equalsAscii( "-h" ) ) 515 bHelp = true; 516 } 517 518 if( bHelp ) 519 { 520 printf( "demoshow - life Slideshow testbed\n" ); 521 return; 522 } 523 524 // bootstrap UNO 525 uno::Reference< lang::XMultiServiceFactory > xFactory; 526 try 527 { 528 uno::Reference< uno::XComponentContext > xCtx = ::cppu::defaultBootstrap_InitialComponentContext(); 529 xFactory = uno::Reference< lang::XMultiServiceFactory >( xCtx->getServiceManager(), 530 uno::UNO_QUERY ); 531 if( xFactory.is() ) 532 ::comphelper::setProcessServiceFactory( xFactory ); 533 } 534 catch( uno::RuntimeException& ) 535 { 536 throw; 537 } 538 catch( uno::Exception& ) 539 { 540 OSL_ENSURE( false, 541 rtl::OUStringToOString( 542 comphelper::anyToString( cppu::getCaughtException() ), 543 RTL_TEXTENCODING_UTF8 ).getStr() ); 544 } 545 546 if( !xFactory.is() ) 547 { 548 OSL_TRACE( "Could not bootstrap UNO, installation must be in disorder. Exiting.\n" ); 549 exit( 1 ); 550 } 551 552 // Create UCB. 553 uno::Sequence< uno::Any > aArgs( 2 ); 554 aArgs[ 0 ] <<= rtl::OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL ); 555 aArgs[ 1 ] <<= rtl::OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE ); 556 ::ucbhelper::ContentBroker::initialize( xFactory, aArgs ); 557 558 DemoWindow pWindow; 559 pWindow.Execute(); 560 561 // clean up UCB 562 ::ucbhelper::ContentBroker::deinitialize(); 563 } 564 } 565 566 DemoApp aApp; 567