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 "PresenterPaneFactory.hxx"
28cdf0e10cSrcweir #include "PresenterController.hxx"
29cdf0e10cSrcweir #include "PresenterPane.hxx"
30cdf0e10cSrcweir #include "PresenterPaneBorderPainter.hxx"
31cdf0e10cSrcweir #include "PresenterPaneContainer.hxx"
32cdf0e10cSrcweir #include "PresenterSpritePane.hxx"
33cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
34cdf0e10cSrcweir #include <com/sun/star/drawing/framework/ResourceId.hpp>
35cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XControllerManager.hpp>
36cdf0e10cSrcweir #include <com/sun/star/drawing/framework/XConfigurationController.hpp>
37cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp>
38cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
39cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
40cdf0e10cSrcweir #include <boost/bind.hpp>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir using namespace ::com::sun::star;
43cdf0e10cSrcweir using namespace ::com::sun::star::uno;
44cdf0e10cSrcweir using namespace ::com::sun::star::lang;
45cdf0e10cSrcweir using namespace ::com::sun::star::drawing::framework;
46cdf0e10cSrcweir using ::rtl::OUString;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir namespace sdext { namespace presenter {
49cdf0e10cSrcweir 
50cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msCurrentSlidePreviewPaneURL(
51cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Pane1"));
52cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msNextSlidePreviewPaneURL(
53cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Pane2"));
54cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msNotesPaneURL(
55cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Pane3"));
56cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msToolBarPaneURL(
57cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Pane4"));
58cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msSlideSorterPaneURL(
59cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Pane5"));
60cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msHelpPaneURL(
61cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Pane6"));
62cdf0e10cSrcweir 
63cdf0e10cSrcweir const ::rtl::OUString PresenterPaneFactory::msOverlayPaneURL(
64cdf0e10cSrcweir     OUString::createFromAscii("private:resource/pane/Presenter/Overlay"));
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 
67cdf0e10cSrcweir 
68cdf0e10cSrcweir //===== PresenterPaneFactory ==================================================
69cdf0e10cSrcweir 
Create(const Reference<uno::XComponentContext> & rxContext,const Reference<frame::XController> & rxController,const::rtl::Reference<PresenterController> & rpPresenterController)70cdf0e10cSrcweir Reference<drawing::framework::XResourceFactory> PresenterPaneFactory::Create (
71cdf0e10cSrcweir     const Reference<uno::XComponentContext>& rxContext,
72cdf0e10cSrcweir     const Reference<frame::XController>& rxController,
73cdf0e10cSrcweir     const ::rtl::Reference<PresenterController>& rpPresenterController)
74cdf0e10cSrcweir {
75cdf0e10cSrcweir     rtl::Reference<PresenterPaneFactory> pFactory (
76cdf0e10cSrcweir         new PresenterPaneFactory(rxContext,rpPresenterController));
77cdf0e10cSrcweir     pFactory->Register(rxController);
78cdf0e10cSrcweir     return Reference<drawing::framework::XResourceFactory>(
79cdf0e10cSrcweir         static_cast<XWeak*>(pFactory.get()), UNO_QUERY);
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 
PresenterPaneFactory(const Reference<uno::XComponentContext> & rxContext,const::rtl::Reference<PresenterController> & rpPresenterController)85cdf0e10cSrcweir PresenterPaneFactory::PresenterPaneFactory (
86cdf0e10cSrcweir     const Reference<uno::XComponentContext>& rxContext,
87cdf0e10cSrcweir     const ::rtl::Reference<PresenterController>& rpPresenterController)
88cdf0e10cSrcweir     : PresenterPaneFactoryInterfaceBase(m_aMutex),
89cdf0e10cSrcweir       mxComponentContextWeak(rxContext),
90cdf0e10cSrcweir       mxConfigurationControllerWeak(),
91cdf0e10cSrcweir       mpPresenterController(rpPresenterController),
92cdf0e10cSrcweir       mpResourceCache()
93cdf0e10cSrcweir {
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 
Register(const Reference<frame::XController> & rxController)99cdf0e10cSrcweir void PresenterPaneFactory::Register (const Reference<frame::XController>& rxController)
100cdf0e10cSrcweir {
101cdf0e10cSrcweir     Reference<XConfigurationController> xCC;
102cdf0e10cSrcweir     try
103cdf0e10cSrcweir     {
104cdf0e10cSrcweir         // Get the configuration controller.
105cdf0e10cSrcweir         Reference<XControllerManager> xCM (rxController, UNO_QUERY_THROW);
106cdf0e10cSrcweir         xCC = Reference<XConfigurationController>(xCM->getConfigurationController());
107cdf0e10cSrcweir         mxConfigurationControllerWeak = xCC;
108cdf0e10cSrcweir         if ( ! xCC.is())
109cdf0e10cSrcweir         {
110cdf0e10cSrcweir             throw RuntimeException();
111cdf0e10cSrcweir         }
112cdf0e10cSrcweir         else
113cdf0e10cSrcweir         {
114cdf0e10cSrcweir             xCC->addResourceFactory(
115cdf0e10cSrcweir                 OUString::createFromAscii("private:resource/pane/Presenter/*"),
116cdf0e10cSrcweir                 this);
117cdf0e10cSrcweir         }
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir     catch (RuntimeException&)
120cdf0e10cSrcweir     {
121cdf0e10cSrcweir         OSL_ASSERT(false);
122cdf0e10cSrcweir         if (xCC.is())
123cdf0e10cSrcweir             xCC->removeResourceFactoryForReference(this);
124cdf0e10cSrcweir         mxConfigurationControllerWeak = WeakReference<XConfigurationController>();
125cdf0e10cSrcweir 
126cdf0e10cSrcweir         throw;
127cdf0e10cSrcweir     }
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 
132cdf0e10cSrcweir 
~PresenterPaneFactory(void)133cdf0e10cSrcweir PresenterPaneFactory::~PresenterPaneFactory (void)
134cdf0e10cSrcweir {
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 
disposing(void)140cdf0e10cSrcweir void SAL_CALL PresenterPaneFactory::disposing (void)
141cdf0e10cSrcweir     throw (RuntimeException)
142cdf0e10cSrcweir {
143cdf0e10cSrcweir     Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
144cdf0e10cSrcweir     if (xCC.is())
145cdf0e10cSrcweir         xCC->removeResourceFactoryForReference(this);
146cdf0e10cSrcweir     mxConfigurationControllerWeak = WeakReference<XConfigurationController>();
147cdf0e10cSrcweir 
148cdf0e10cSrcweir     // Dispose the panes in the cache.
149cdf0e10cSrcweir     if (mpResourceCache.get() != NULL)
150cdf0e10cSrcweir     {
151cdf0e10cSrcweir         ResourceContainer::const_iterator iPane (mpResourceCache->begin());
152cdf0e10cSrcweir         ResourceContainer::const_iterator iEnd (mpResourceCache->end());
153cdf0e10cSrcweir         for ( ; iPane!=iEnd; ++iPane)
154cdf0e10cSrcweir         {
155cdf0e10cSrcweir             Reference<lang::XComponent> xPaneComponent (iPane->second, UNO_QUERY);
156cdf0e10cSrcweir             if (xPaneComponent.is())
157cdf0e10cSrcweir                 xPaneComponent->dispose();
158cdf0e10cSrcweir         }
159cdf0e10cSrcweir         mpResourceCache.reset();
160cdf0e10cSrcweir     }
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 
166cdf0e10cSrcweir //----- XPaneFactory ----------------------------------------------------------
167cdf0e10cSrcweir 
createResource(const Reference<XResourceId> & rxPaneId)168cdf0e10cSrcweir Reference<XResource> SAL_CALL PresenterPaneFactory::createResource (
169cdf0e10cSrcweir     const Reference<XResourceId>& rxPaneId)
170cdf0e10cSrcweir     throw (RuntimeException, IllegalArgumentException, WrappedTargetException)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir     ThrowIfDisposed();
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     if ( ! rxPaneId.is())
175cdf0e10cSrcweir         return NULL;
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     const OUString sPaneURL (rxPaneId->getResourceURL());
178cdf0e10cSrcweir     if (sPaneURL.getLength() == 0)
179cdf0e10cSrcweir         return NULL;
180cdf0e10cSrcweir 
181cdf0e10cSrcweir     if (mpResourceCache.get() != NULL)
182cdf0e10cSrcweir     {
183cdf0e10cSrcweir         // Has the requested resource already been created?
184cdf0e10cSrcweir         ResourceContainer::const_iterator iResource (mpResourceCache->find(sPaneURL));
185cdf0e10cSrcweir         if (iResource != mpResourceCache->end())
186cdf0e10cSrcweir         {
187cdf0e10cSrcweir             // Yes.  Mark it as active.
188cdf0e10cSrcweir             rtl::Reference<PresenterPaneContainer> pPaneContainer(
189cdf0e10cSrcweir                 mpPresenterController->GetPaneContainer());
190cdf0e10cSrcweir             PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
191cdf0e10cSrcweir                 pPaneContainer->FindPaneURL(sPaneURL));
192cdf0e10cSrcweir             if (pDescriptor.get() != NULL)
193cdf0e10cSrcweir             {
194cdf0e10cSrcweir                 pDescriptor->SetActivationState(true);
195cdf0e10cSrcweir                 if (pDescriptor->mxBorderWindow.is())
196cdf0e10cSrcweir                     pDescriptor->mxBorderWindow->setVisible(sal_True);
197cdf0e10cSrcweir                 pPaneContainer->StorePane(pDescriptor->mxPane);
198cdf0e10cSrcweir             }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir             return iResource->second;
201cdf0e10cSrcweir         }
202cdf0e10cSrcweir     }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     // No.  Create a new one.
205cdf0e10cSrcweir     Reference<XResource> xResource = CreatePane(rxPaneId, OUString());
206cdf0e10cSrcweir     return xResource;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 
210cdf0e10cSrcweir 
211cdf0e10cSrcweir 
releaseResource(const Reference<XResource> & rxResource)212cdf0e10cSrcweir void SAL_CALL PresenterPaneFactory::releaseResource (const Reference<XResource>& rxResource)
213cdf0e10cSrcweir     throw (RuntimeException)
214cdf0e10cSrcweir {
215cdf0e10cSrcweir     ThrowIfDisposed();
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     if ( ! rxResource.is())
218cdf0e10cSrcweir         throw lang::IllegalArgumentException();
219cdf0e10cSrcweir 
220cdf0e10cSrcweir     // Mark the pane as inactive.
221cdf0e10cSrcweir     rtl::Reference<PresenterPaneContainer> pPaneContainer(
222cdf0e10cSrcweir         mpPresenterController->GetPaneContainer());
223cdf0e10cSrcweir     const OUString sPaneURL (rxResource->getResourceId()->getResourceURL());
224cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
225cdf0e10cSrcweir         pPaneContainer->FindPaneURL(sPaneURL));
226cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
227cdf0e10cSrcweir     {
228cdf0e10cSrcweir         pDescriptor->SetActivationState(false);
229cdf0e10cSrcweir         if (pDescriptor->mxBorderWindow.is())
230cdf0e10cSrcweir             pDescriptor->mxBorderWindow->setVisible(sal_False);
231cdf0e10cSrcweir 
232cdf0e10cSrcweir         if (mpResourceCache.get() != NULL)
233cdf0e10cSrcweir         {
234cdf0e10cSrcweir             // Store the pane in the cache.
235cdf0e10cSrcweir             (*mpResourceCache)[sPaneURL] = rxResource;
236cdf0e10cSrcweir         }
237cdf0e10cSrcweir         else
238cdf0e10cSrcweir         {
239cdf0e10cSrcweir             // Dispose the pane.
240cdf0e10cSrcweir             Reference<lang::XComponent> xPaneComponent (rxResource, UNO_QUERY);
241cdf0e10cSrcweir             if (xPaneComponent.is())
242cdf0e10cSrcweir                 xPaneComponent->dispose();
243cdf0e10cSrcweir         }
244cdf0e10cSrcweir     }
245cdf0e10cSrcweir }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 
250cdf0e10cSrcweir //-----------------------------------------------------------------------------
251cdf0e10cSrcweir 
CreatePane(const Reference<XResourceId> & rxPaneId,const OUString & rsTitle)252cdf0e10cSrcweir Reference<XResource> PresenterPaneFactory::CreatePane (
253cdf0e10cSrcweir     const Reference<XResourceId>& rxPaneId,
254cdf0e10cSrcweir     const OUString& rsTitle)
255cdf0e10cSrcweir {
256cdf0e10cSrcweir     if ( ! rxPaneId.is())
257cdf0e10cSrcweir         return NULL;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
260cdf0e10cSrcweir     if ( ! xCC.is())
261cdf0e10cSrcweir         return NULL;
262cdf0e10cSrcweir 
263cdf0e10cSrcweir     Reference<XComponentContext> xContext (mxComponentContextWeak);
264cdf0e10cSrcweir     if ( ! xContext.is())
265cdf0e10cSrcweir         return NULL;
266cdf0e10cSrcweir 
267cdf0e10cSrcweir     Reference<XPane> xParentPane (xCC->getResource(rxPaneId->getAnchor()), UNO_QUERY);
268cdf0e10cSrcweir     if ( ! xParentPane.is())
269cdf0e10cSrcweir         return NULL;
270cdf0e10cSrcweir 
271cdf0e10cSrcweir     try
272cdf0e10cSrcweir     {
273cdf0e10cSrcweir         return CreatePane(
274cdf0e10cSrcweir             rxPaneId,
275cdf0e10cSrcweir             rsTitle,
276cdf0e10cSrcweir             xParentPane,
277cdf0e10cSrcweir             rxPaneId->getFullResourceURL().Arguments.compareToAscii("Sprite=1") == 0);
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir     catch (Exception&)
280cdf0e10cSrcweir     {
281cdf0e10cSrcweir         OSL_ASSERT(false);
282cdf0e10cSrcweir     }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir     return NULL;
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 
CreatePane(const Reference<XResourceId> & rxPaneId,const OUString & rsTitle,const Reference<drawing::framework::XPane> & rxParentPane,const bool bIsSpritePane)290cdf0e10cSrcweir Reference<XResource> PresenterPaneFactory::CreatePane (
291cdf0e10cSrcweir     const Reference<XResourceId>& rxPaneId,
292cdf0e10cSrcweir     const OUString& rsTitle,
293cdf0e10cSrcweir     const Reference<drawing::framework::XPane>& rxParentPane,
294cdf0e10cSrcweir     const bool bIsSpritePane)
295cdf0e10cSrcweir {
296cdf0e10cSrcweir     Reference<XComponentContext> xContext (mxComponentContextWeak);
297cdf0e10cSrcweir     Reference<lang::XMultiComponentFactory> xFactory (
298cdf0e10cSrcweir         xContext->getServiceManager(), UNO_QUERY_THROW);
299cdf0e10cSrcweir 
300cdf0e10cSrcweir     // Create a border window and canvas and store it in the pane
301cdf0e10cSrcweir     // container.
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     // Create the pane.
304cdf0e10cSrcweir     ::rtl::Reference<PresenterPaneBase> xPane;
305cdf0e10cSrcweir     if (bIsSpritePane)
306cdf0e10cSrcweir     {
307cdf0e10cSrcweir         xPane = ::rtl::Reference<PresenterPaneBase>(
308cdf0e10cSrcweir             new PresenterSpritePane(xContext, mpPresenterController));
309cdf0e10cSrcweir     }
310cdf0e10cSrcweir     else
311cdf0e10cSrcweir     {
312cdf0e10cSrcweir         xPane = ::rtl::Reference<PresenterPaneBase>(
313cdf0e10cSrcweir             new PresenterPane(xContext, mpPresenterController));
314cdf0e10cSrcweir     }
315cdf0e10cSrcweir 
316cdf0e10cSrcweir     // Supply arguments.
317cdf0e10cSrcweir     Sequence<Any> aArguments (6);
318cdf0e10cSrcweir     aArguments[0] <<= rxPaneId;
319cdf0e10cSrcweir     aArguments[1] <<= rxParentPane->getWindow();
320cdf0e10cSrcweir     aArguments[2] <<= rxParentPane->getCanvas();
321cdf0e10cSrcweir     aArguments[3] <<= rsTitle;
322cdf0e10cSrcweir     aArguments[4] <<= Reference<drawing::framework::XPaneBorderPainter>(
323cdf0e10cSrcweir         static_cast<XWeak*>(mpPresenterController->GetPaneBorderPainter().get()),
324cdf0e10cSrcweir         UNO_QUERY);
325cdf0e10cSrcweir     aArguments[5] <<= bIsSpritePane ? false : true;
326cdf0e10cSrcweir     xPane->initialize(aArguments);
327cdf0e10cSrcweir 
328cdf0e10cSrcweir     // Store pane and canvases and windows in container.
329cdf0e10cSrcweir     ::rtl::Reference<PresenterPaneContainer> pContainer (
330cdf0e10cSrcweir         mpPresenterController->GetPaneContainer());
331cdf0e10cSrcweir     PresenterPaneContainer::SharedPaneDescriptor pDescriptor(
332cdf0e10cSrcweir         pContainer->StoreBorderWindow(rxPaneId, xPane->GetBorderWindow()));
333cdf0e10cSrcweir     pContainer->StorePane(xPane);
334cdf0e10cSrcweir     if (pDescriptor.get() != NULL)
335cdf0e10cSrcweir     {
336cdf0e10cSrcweir         if (bIsSpritePane)
337cdf0e10cSrcweir         {
338cdf0e10cSrcweir             pDescriptor->maSpriteProvider = ::boost::bind(
339cdf0e10cSrcweir                 &PresenterSpritePane::GetSprite,
340cdf0e10cSrcweir                 dynamic_cast<PresenterSpritePane*>(xPane.get()));
341cdf0e10cSrcweir             pDescriptor->mbIsSprite = true;
342cdf0e10cSrcweir             pDescriptor->mbNeedsClipping = false;
343cdf0e10cSrcweir         }
344cdf0e10cSrcweir         else
345cdf0e10cSrcweir         {
346cdf0e10cSrcweir             pDescriptor->mbIsSprite = false;
347cdf0e10cSrcweir             pDescriptor->mbNeedsClipping = true;
348cdf0e10cSrcweir         }
349cdf0e10cSrcweir 
350cdf0e10cSrcweir         // Get the window of the frame and make that visible.
351cdf0e10cSrcweir         Reference<awt::XWindow> xWindow (pDescriptor->mxBorderWindow, UNO_QUERY_THROW);
352cdf0e10cSrcweir         xWindow->setVisible(sal_True);
353cdf0e10cSrcweir     }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir     return Reference<XResource>(static_cast<XWeak*>(xPane.get()), UNO_QUERY_THROW);
356cdf0e10cSrcweir }
357cdf0e10cSrcweir 
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 
ThrowIfDisposed(void) const361cdf0e10cSrcweir void PresenterPaneFactory::ThrowIfDisposed (void) const
362cdf0e10cSrcweir     throw (::com::sun::star::lang::DisposedException)
363cdf0e10cSrcweir {
364cdf0e10cSrcweir 	if (rBHelper.bDisposed || rBHelper.bInDispose)
365cdf0e10cSrcweir 	{
366cdf0e10cSrcweir         throw lang::DisposedException (
367cdf0e10cSrcweir             OUString(RTL_CONSTASCII_USTRINGPARAM(
368cdf0e10cSrcweir                 "PresenterPaneFactory object has already been disposed")),
369cdf0e10cSrcweir             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
370cdf0e10cSrcweir     }
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 
374cdf0e10cSrcweir } } // end of namespace sdext::presenter
375