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 "precompiled_sd.hxx" 25 26 #include "framework/PresentationFactory.hxx" 27 28 #include "framework/FrameworkHelper.hxx" 29 #include "DrawController.hxx" 30 #include "ViewShellBase.hxx" 31 #include <com/sun/star/drawing/framework/XControllerManager.hpp> 32 #include <cppuhelper/compbase1.hxx> 33 #include <tools/diagnose_ex.h> 34 #include "slideshow.hxx" 35 36 using namespace ::com::sun::star; 37 using namespace ::com::sun::star::uno; 38 using namespace ::com::sun::star::lang; 39 using namespace ::com::sun::star::drawing::framework; 40 41 using ::rtl::OUString; 42 using ::sd::framework::FrameworkHelper; 43 44 45 namespace sd { namespace framework { 46 47 namespace { 48 49 typedef ::cppu::WeakComponentImplHelper1 <lang::XInitialization> PresentationFactoryProviderInterfaceBase; 50 51 class PresentationFactoryProvider 52 : protected MutexOwner, 53 public PresentationFactoryProviderInterfaceBase 54 { 55 public: 56 PresentationFactoryProvider (const Reference<XComponentContext>& rxContext); 57 virtual ~PresentationFactoryProvider (void); 58 59 virtual void SAL_CALL disposing (void); 60 61 // XInitialization 62 63 virtual void SAL_CALL initialize( 64 const ::com::sun::star::uno::Sequence<com::sun::star::uno::Any>& aArguments) 65 throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); 66 }; 67 68 69 70 71 typedef ::cppu::WeakComponentImplHelper1 <XView> PresentationViewInterfaceBase; 72 73 /** The PresentationView is not an actual view, it is a marker whose 74 existence in a configuration indicates that a slideshow is running 75 (in another application window). 76 */ 77 class PresentationView 78 : protected MutexOwner, 79 public PresentationViewInterfaceBase 80 { 81 public: 82 PresentationView (const Reference<XResourceId>& rxViewId) 83 : PresentationViewInterfaceBase(maMutex),mxResourceId(rxViewId) {}; 84 virtual ~PresentationView (void) {}; 85 86 // XView 87 88 virtual Reference<XResourceId> SAL_CALL getResourceId (void) throw (RuntimeException) 89 { return mxResourceId; }; 90 91 virtual sal_Bool SAL_CALL isAnchorOnly (void) throw (RuntimeException) 92 { return false; } 93 94 95 private: 96 Reference<XResourceId> mxResourceId; 97 }; 98 99 } // end of anonymous namespace. 100 101 102 103 104 //===== PresentationFactoryProvider service =================================== 105 106 Reference<XInterface> SAL_CALL PresentationFactoryProvider_createInstance ( 107 const Reference<XComponentContext>& rxContext) 108 { 109 return Reference<XInterface>(static_cast<XWeak*>(new PresentationFactoryProvider(rxContext))); 110 } 111 112 113 114 115 ::rtl::OUString PresentationFactoryProvider_getImplementationName (void) throw(RuntimeException) 116 { 117 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 118 "com.sun.star.comp.Draw.framework.PresentationFactoryProvider")); 119 } 120 121 122 123 124 Sequence<rtl::OUString> SAL_CALL PresentationFactoryProvider_getSupportedServiceNames (void) 125 throw (RuntimeException) 126 { 127 static const ::rtl::OUString sServiceName(RTL_CONSTASCII_USTRINGPARAM( 128 "com.sun.star.drawing.framework.PresentationFactoryProvider")); 129 return Sequence<rtl::OUString>(&sServiceName, 1); 130 } 131 132 133 134 135 //===== PresentationFactory =================================================== 136 137 const ::rtl::OUString PresentationFactory::msPresentationViewURL( 138 OUString::createFromAscii("private:resource/view/Presentation")); 139 140 141 PresentationFactory::PresentationFactory ( 142 const Reference<frame::XController>& rxController) 143 : PresentationFactoryInterfaceBase(MutexOwner::maMutex), 144 mxConfigurationController(), 145 mxController(rxController) 146 { 147 try 148 { 149 // Get the XController from the first argument. 150 Reference<XControllerManager> xControllerManager(rxController, UNO_QUERY_THROW); 151 mxConfigurationController = xControllerManager->getConfigurationController(); 152 } 153 catch (RuntimeException&) 154 { 155 DBG_UNHANDLED_EXCEPTION(); 156 } 157 } 158 159 160 161 162 163 PresentationFactory::~PresentationFactory (void) 164 { 165 } 166 167 168 169 170 void SAL_CALL PresentationFactory::disposing (void) 171 { 172 } 173 174 175 176 177 //----- XViewFactory ---------------------------------------------------------- 178 179 Reference<XResource> SAL_CALL PresentationFactory::createResource ( 180 const Reference<XResourceId>& rxViewId) 181 throw (RuntimeException, IllegalArgumentException, WrappedTargetException) 182 { 183 ThrowIfDisposed(); 184 185 if (rxViewId.is()) 186 if ( ! rxViewId->hasAnchor() && rxViewId->getResourceURL().equals(msPresentationViewURL)) 187 return new PresentationView(rxViewId); 188 189 return Reference<XResource>(); 190 } 191 192 193 194 195 void SAL_CALL PresentationFactory::releaseResource ( 196 const Reference<XResource>& rxView) 197 throw (RuntimeException) 198 { 199 ThrowIfDisposed(); 200 (void)rxView; 201 202 Reference<lang::XUnoTunnel> xTunnel (mxController, UNO_QUERY); 203 if (xTunnel.is()) 204 { 205 ::sd::DrawController* pController = reinterpret_cast<sd::DrawController*>( 206 xTunnel->getSomething(sd::DrawController::getUnoTunnelId())); 207 if (pController != NULL) 208 { 209 ViewShellBase* pBase = pController->GetViewShellBase(); 210 if (pBase != NULL) 211 SlideShow::Stop( *pBase ); 212 } 213 } 214 } 215 216 217 218 219 //===== XConfigurationChangeListener ========================================== 220 221 void SAL_CALL PresentationFactory::notifyConfigurationChange ( 222 const ConfigurationChangeEvent& rEvent) 223 throw (RuntimeException) 224 { 225 (void)rEvent; 226 } 227 228 229 230 231 //===== lang::XEventListener ================================================== 232 233 void SAL_CALL PresentationFactory::disposing ( 234 const lang::EventObject& rEventObject) 235 throw (RuntimeException) 236 { 237 (void)rEventObject; 238 } 239 240 241 242 243 244 //----------------------------------------------------------------------------- 245 246 void PresentationFactory::ThrowIfDisposed (void) const 247 throw (lang::DisposedException) 248 { 249 if (rBHelper.bDisposed || rBHelper.bInDispose) 250 { 251 throw lang::DisposedException ( 252 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 253 "PresentationFactory object has already been disposed")), 254 const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this))); 255 } 256 } 257 258 259 260 namespace { 261 262 //===== PresentationFactoryProvider =========================================== 263 264 PresentationFactoryProvider::PresentationFactoryProvider ( 265 const Reference<XComponentContext>& rxContext) 266 : PresentationFactoryProviderInterfaceBase(maMutex) 267 { 268 (void)rxContext; 269 } 270 271 272 273 274 PresentationFactoryProvider::~PresentationFactoryProvider (void) 275 { 276 } 277 278 279 280 281 void PresentationFactoryProvider::disposing (void) 282 { 283 } 284 285 286 287 288 // XInitialization 289 290 void SAL_CALL PresentationFactoryProvider::initialize( 291 const Sequence<Any>& aArguments) 292 throw (Exception, RuntimeException) 293 { 294 if (aArguments.getLength() > 0) 295 { 296 try 297 { 298 // Get the XController from the first argument. 299 Reference<frame::XController> xController (aArguments[0], UNO_QUERY_THROW); 300 Reference<XControllerManager> xCM (xController, UNO_QUERY_THROW); 301 Reference<XConfigurationController> xCC (xCM->getConfigurationController()); 302 if (xCC.is()) 303 xCC->addResourceFactory( 304 PresentationFactory::msPresentationViewURL, 305 new PresentationFactory(xController)); 306 } 307 catch (RuntimeException&) 308 { 309 DBG_UNHANDLED_EXCEPTION(); 310 } 311 } 312 } 313 314 315 316 } // end of anonymous namespace. 317 318 319 } } // end of namespace sd::framework 320