blob: 8fadfc2cad848d920209d83eb90a9e033c92ed45 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sdext.hxx"
#include "PresenterScreen.hxx"
#include "PresenterConfigurationAccess.hxx"
#include "PresenterController.hxx"
#include "PresenterFrameworkObserver.hxx"
#include "PresenterHelper.hxx"
#include "PresenterPaneContainer.hxx"
#include "PresenterPaneFactory.hxx"
#include "PresenterViewFactory.hxx"
#include "PresenterWindowManager.hxx"
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/drawing/framework/Configuration.hpp>
#include <com/sun/star/drawing/framework/XControllerManager.hpp>
#include <com/sun/star/drawing/framework/ResourceId.hpp>
#include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
#include <com/sun/star/presentation/XSlideShow.hpp>
#include <com/sun/star/presentation/XPresentation2.hpp>
#include <com/sun/star/presentation/XPresentationSupplier.hpp>
#include <com/sun/star/document/XEventBroadcaster.hpp>
#include <boost/bind.hpp>
#include <tools/debug.hxx>
#include <com/sun/star/view/XSelectionSupplier.hpp>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::presentation;
using namespace ::com::sun::star::drawing::framework;
using ::rtl::OUString;
#define A2S(s) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)))
namespace sdext { namespace presenter {
namespace {
static sal_Bool lcl_IsPresenterEnabled(
const css::uno::Reference< css::uno::XComponentContext > &rxContext )
{
sal_Bool bEnabled( sal_True );
PresenterConfigurationAccess aConfig(
rxContext,
A2S( "/org.openoffice.Office.Impress" ),
PresenterConfigurationAccess::READ_ONLY );
if ( aConfig.IsValid() )
{
sal_Bool bVal( sal_False );
if ( ( aConfig.GetConfigurationNode(
A2S( "Misc/Start/PresenterScreen" )) >>= bVal ) )
bEnabled = bVal;
}
return bEnabled;
}
typedef ::cppu::WeakComponentImplHelper1 <
css::document::XEventListener
> PresenterScreenListenerInterfaceBase;
/** One instance of a PresenterScreenListener is registered per Impress
document and waits for the full screen slide show to start and to
end.
*/
class PresenterScreenListener
: private ::boost::noncopyable,
private ::cppu::BaseMutex,
public PresenterScreenListenerInterfaceBase
{
public:
PresenterScreenListener (
const css::uno::Reference<css::uno::XComponentContext>& rxContext,
const css::uno::Reference<css::frame::XModel2>& rxModel);
virtual ~PresenterScreenListener (void);
void Initialize (void);
virtual void SAL_CALL disposing (void);
// document::XEventListener
virtual void SAL_CALL notifyEvent( const css::document::EventObject& Event ) throw (css::uno::RuntimeException);
// XEventListener
virtual void SAL_CALL disposing ( const css::lang::EventObject& rEvent) throw (css::uno::RuntimeException);
private:
css::uno::Reference<css::frame::XModel2 > mxModel;
css::uno::Reference<css::uno::XComponentContext> mxComponentContext;
rtl::Reference<PresenterScreen> mpPresenterScreen;
void ThrowIfDisposed (void) const throw (::com::sun::star::lang::DisposedException);
};
}
//----- Service ---------------------------------------------------------------
OUString PresenterScreenJob::getImplementationName_static (void)
{
return A2S("com.sun.star.comp.presentation.PresenterScreenJob");
}
Sequence<OUString> PresenterScreenJob::getSupportedServiceNames_static (void)
{
static const ::rtl::OUString sServiceName(
A2S("com.sun.star.presentation.PresenterScreenJob"));
return Sequence<rtl::OUString>(&sServiceName, 1);
}
Reference<XInterface> PresenterScreenJob::Create (const Reference<uno::XComponentContext>& rxContext)
SAL_THROW((css::uno::Exception))
{
return Reference<XInterface>(static_cast<XWeak*>(new PresenterScreenJob(rxContext)));
}
//===== PresenterScreenJob ====================================================
PresenterScreenJob::PresenterScreenJob (const Reference<XComponentContext>& rxContext)
: PresenterScreenJobInterfaceBase(m_aMutex),
mxComponentContext(rxContext)
{
}
PresenterScreenJob::~PresenterScreenJob (void)
{
}
void SAL_CALL PresenterScreenJob::disposing (void)
{
mxComponentContext = NULL;
}
//----- XJob -----------------------------------------------------------
Any SAL_CALL PresenterScreenJob::execute(
const Sequence< beans::NamedValue >& Arguments )
throw (lang::IllegalArgumentException, Exception, RuntimeException)
{
Sequence< beans::NamedValue > lEnv;
sal_Int32 i = 0;
sal_Int32 c = Arguments.getLength();
const beans::NamedValue* p = Arguments.getConstArray();
for (i=0; i<c; ++i)
{
if (p[i].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Environment")))
{
p[i].Value >>= lEnv;
break;
}
}
Reference<frame::XModel2> xModel;
c = lEnv.getLength();
p = lEnv.getConstArray();
for (i=0; i<c; ++i)
{
if (p[i].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Model")))
{
p[i].Value >>= xModel;
break;
}
}
Reference< XServiceInfo > xInfo( xModel, UNO_QUERY );
if( !xInfo.is() || !xInfo->supportsService(
A2S( "com.sun.star.presentation.PresentationDocument" ) ) )
return Any();
// Create a new listener that waits for the full screen presentation
// to start and to end. It takes care of its own lifetime.
::rtl::Reference<PresenterScreenListener> pListener (
new PresenterScreenListener(mxComponentContext, xModel));
pListener->Initialize();
return Any();
}
//===== PresenterScreenListener ===============================================
namespace {
PresenterScreenListener::PresenterScreenListener (
const css::uno::Reference<css::uno::XComponentContext>& rxContext,
const css::uno::Reference<css::frame::XModel2>& rxModel)
: PresenterScreenListenerInterfaceBase(m_aMutex),
mxModel(rxModel),
mxComponentContext(rxContext),
mpPresenterScreen()
{
}
void PresenterScreenListener::Initialize (void)
{
Reference< document::XEventListener > xDocListener(
static_cast< document::XEventListener* >(this), UNO_QUERY);
Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY );
if( xDocBroadcaster.is() )
xDocBroadcaster->addEventListener(xDocListener);
}
PresenterScreenListener::~PresenterScreenListener (void)
{
}
void SAL_CALL PresenterScreenListener::disposing (void)
{
Reference< document::XEventBroadcaster > xDocBroadcaster( mxModel, UNO_QUERY );
if( xDocBroadcaster.is() )
xDocBroadcaster->removeEventListener(
Reference<document::XEventListener>(
static_cast<document::XEventListener*>(this), UNO_QUERY));
if (mpPresenterScreen.is())
{
mpPresenterScreen->RequestShutdownPresenterScreen();
mpPresenterScreen = NULL;
}
}
// document::XEventListener
void SAL_CALL PresenterScreenListener::notifyEvent( const css::document::EventObject& Event ) throw (css::uno::RuntimeException)
{
ThrowIfDisposed();
if( Event.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnStartPresentation" ) ) )
{
mpPresenterScreen = new PresenterScreen(mxComponentContext, mxModel);
mpPresenterScreen->InitializePresenterScreen();
}
else if( Event.EventName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OnEndPresentation" ) ) )
{
if (mpPresenterScreen.is())
{
mpPresenterScreen->RequestShutdownPresenterScreen();
mpPresenterScreen = NULL;
}
}
}
// XEventListener
void SAL_CALL PresenterScreenListener::disposing (const css::lang::EventObject& rEvent)
throw (css::uno::RuntimeException)
{
(void)rEvent;
if (mpPresenterScreen.is())
{
mpPresenterScreen->RequestShutdownPresenterScreen();
mpPresenterScreen = NULL;
}
}
void PresenterScreenListener::ThrowIfDisposed (void) const throw (
::com::sun::star::lang::DisposedException)
{
if (rBHelper.bDisposed || rBHelper.bInDispose)
{
throw lang::DisposedException (
A2S("PresenterScreenListener object has already been disposed"),
const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
}
}
} // end of anonymous namespace
//===== PresenterScreen =======================================================
PresenterScreen::PresenterScreen (
const Reference<XComponentContext>& rxContext,
const css::uno::Reference<css::frame::XModel2>& rxModel)
: PresenterScreenInterfaceBase(m_aMutex),
mxModel(rxModel),
mxController(),
mxConfigurationControllerWeak(),
mxContextWeak(rxContext),
mxSlideShowControllerWeak(),
mpPresenterController(),
mxSlideShowViewId(),
mxSavedConfiguration(),
mpPaneContainer(),
mnComponentIndex(0),
mxPaneFactory(),
mxViewFactory(),
maViewDescriptors()
{
}
PresenterScreen::~PresenterScreen (void)
{
}
void SAL_CALL PresenterScreen::disposing (void)
{
Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
if (xCC.is() && mxSavedConfiguration.is())
{
xCC->restoreConfiguration(mxSavedConfiguration);
}
mxConfigurationControllerWeak = Reference<XConfigurationController>(NULL);
Reference<lang::XComponent> xViewFactoryComponent (mxViewFactory, UNO_QUERY);
if (xViewFactoryComponent.is())
xViewFactoryComponent->dispose();
Reference<lang::XComponent> xPaneFactoryComponent (mxPaneFactory, UNO_QUERY);
if (xPaneFactoryComponent.is())
xPaneFactoryComponent->dispose();
mxModel = NULL;
}
//----- XEventListener --------------------------------------------------------
void SAL_CALL PresenterScreen::disposing (const lang::EventObject& /*rEvent*/)
throw (RuntimeException)
{
mxSlideShowControllerWeak = WeakReference<presentation::XSlideShowController>();
RequestShutdownPresenterScreen();
}
//-----------------------------------------------------------------------------
void PresenterScreen::InitializePresenterScreen (void)
{
try
{
Reference<XComponentContext> xContext (mxContextWeak);
// Check if disabled by configuration
if (!lcl_IsPresenterEnabled(xContext) )
return;
mpPaneContainer =
new PresenterPaneContainer(Reference<XComponentContext>(xContext));
Reference<XPresentationSupplier> xPS ( mxModel, UNO_QUERY_THROW);
Reference<XPresentation2> xPresentation(xPS->getPresentation(), UNO_QUERY_THROW);
Reference<presentation::XSlideShowController> xSlideShowController( xPresentation->getController() );
mxSlideShowControllerWeak = xSlideShowController;
if( !xSlideShowController.is() || !xSlideShowController->isFullScreen() )
return;
// find first controller that is not the current controller (the one with the slideshow
mxController = mxModel->getCurrentController();
Reference< container::XEnumeration > xEnum( mxModel->getControllers() );
if( xEnum.is() )
{
while( xEnum->hasMoreElements() )
{
Reference< frame::XController > xC( xEnum->nextElement(), UNO_QUERY );
if( xC.is() && (xC != mxController) )
{
mxController = xC;
break;
}
}
}
// Get the XController from the first argument.
Reference<XControllerManager> xCM(mxController, UNO_QUERY_THROW);
Reference<XConfigurationController> xCC( xCM->getConfigurationController());
mxConfigurationControllerWeak = xCC;
Reference<drawing::framework::XResourceId> xMainPaneId(
GetMainPaneId(xPresentation));
// An empty reference means that the presenter screen can
// not or must not be displayed.
if ( ! xMainPaneId.is())
return;
if (xCC.is() && xContext.is())
{
// Store the current configuration so that we can restore it when
// the presenter view is deactivated.
mxSavedConfiguration = xCC->getRequestedConfiguration();
xCC->lock();
try
{
// At the moment the presenter controller is displayed in its
// own full screen window that is controlled by the same
// configuration controller as the Impress document from
// which the presentation was started. Therefore the main
// pane is actived additionally to the already existing
// panes and does not replace them.
xCC->requestResourceActivation(
xMainPaneId,
ResourceActivationMode_ADD);
SetupConfiguration(xContext, xMainPaneId);
mpPresenterController = new PresenterController(
xContext,
mxController,
xSlideShowController,
mpPaneContainer,
xMainPaneId);
// Create pane and view factories and integrate them into the
// drawing framework.
SetupPaneFactory(xContext);
SetupViewFactory(xContext);
mpPresenterController->GetWindowManager()->RestoreViewMode();
}
catch (RuntimeException&)
{
xCC->restoreConfiguration(mxSavedConfiguration);
}
xCC->unlock();
}
}
catch (Exception&)
{
}
}
sal_Int32 PresenterScreen::GetScreenNumber (
const Reference<presentation::XPresentation2>& rxPresentation) const
{
// Determine the screen on which the full screen presentation is being
// displayed.
sal_Int32 nScreenNumber (0);
sal_Int32 nScreenCount (1);
try
{
Reference<beans::XPropertySet> xProperties (rxPresentation, UNO_QUERY);
if ( ! xProperties.is())
return -1;
sal_Int32 nDisplayNumber (-1);
if ( ! (xProperties->getPropertyValue(A2S("Display")) >>= nDisplayNumber))
return -1;
if (nDisplayNumber == -1)
{
// The special value -1 indicates that the slide show
// spans all available displays. That leaves no room for
// the presenter screen.
return -1;
}
Reference<XComponentContext> xContext (mxContextWeak);
if ( ! xContext.is())
return -1;
Reference<lang::XMultiComponentFactory> xFactory (
xContext->getServiceManager(), UNO_QUERY);
if ( ! xFactory.is())
return -1;
Reference<beans::XPropertySet> xDisplayProperties (
xFactory->createInstanceWithContext(A2S("com.sun.star.awt.DisplayAccess"),xContext),
UNO_QUERY);
if ( ! xDisplayProperties.is())
return -1;
if (nDisplayNumber > 0)
{
nScreenNumber = nDisplayNumber - 1;
}
else if (nDisplayNumber == 0)
{
// A display number value of 0 indicates the primary screen.
// Instantiate the DisplayAccess service to find out which
// screen number that is.
if (nDisplayNumber <= 0 && xDisplayProperties.is())
xDisplayProperties->getPropertyValue(A2S("DefaultDisplay")) >>= nScreenNumber;
}
// We still have to determine the number of screens to decide
// whether the presenter screen may be shown at all.
Reference<container::XIndexAccess> xIndexAccess (xDisplayProperties, UNO_QUERY);
if ( ! xIndexAccess.is())
return -1;
nScreenCount = xIndexAccess->getCount();
if (nScreenCount < 2 || nDisplayNumber > nScreenCount)
{
// There is either only one screen or the full screen
// presentation spans all available screens. The presenter
// screen is shown only when a special flag in the configuration
// is set.
PresenterConfigurationAccess aConfiguration (
xContext,
A2S("/org.openoffice.Office.PresenterScreen/"),
PresenterConfigurationAccess::READ_ONLY);
bool bStartAlways (false);
if (aConfiguration.GetConfigurationNode(
A2S("Presenter/StartAlways")) >>= bStartAlways)
{
if (bStartAlways)
return nScreenNumber;
}
return -1;
}
}
catch (beans::UnknownPropertyException&)
{
OSL_ASSERT(false);
// For some reason we can not access the screen number. Use
// the default instead.
}
return nScreenNumber;
}
Reference<drawing::framework::XResourceId> PresenterScreen::GetMainPaneId (
const Reference<presentation::XPresentation2>& rxPresentation) const
{
// A negative value means that the presentation spans all available
// displays. That leaves no room for the presenter.
const sal_Int32 nScreenNumber(GetScreenNumber(rxPresentation));
if (nScreenNumber < 0)
return NULL;
// Setup the resource id of the full screen background pane so that
// it is displayed on another screen than the presentation.
sal_Int32 nPresenterScreenNumber (1);
switch (nScreenNumber)
{
case 0:
nPresenterScreenNumber = 1;
break;
case 1:
nPresenterScreenNumber = 0;
break;
default:
// When the full screen presentation is displayed on a screen
// other than 0 or 1 then place the presenter on the first
// available screen.
nPresenterScreenNumber = 0;
break;
}
return ResourceId::create(
Reference<XComponentContext>(mxContextWeak),
PresenterHelper::msFullScreenPaneURL
+A2S("?FullScreen=true&ScreenNumber=")
+ OUString::valueOf(nPresenterScreenNumber));
}
void PresenterScreen::RequestShutdownPresenterScreen (void)
{
// Restore the configuration that was active before the presenter screen
// has been activated. Now, that the presenter screen is displayed in
// its own top level window this probably not necessary, but one never knows.
Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
if (xCC.is() && mxSavedConfiguration.is())
{
xCC->restoreConfiguration(mxSavedConfiguration);
mxSavedConfiguration = NULL;
}
if (xCC.is())
{
// The actual restoration of the configuration takes place
// asynchronously. The view and pane factories can only by disposed
// after that. Therefore, set up a listener and wait for the
// restoration.
rtl::Reference<PresenterScreen> pSelf (this);
PresenterFrameworkObserver::RunOnUpdateEnd(
xCC,
::boost::bind(&PresenterScreen::ShutdownPresenterScreen, pSelf));
xCC->update();
}
}
void PresenterScreen::ShutdownPresenterScreen (void)
{
Reference<lang::XComponent> xViewFactoryComponent (mxViewFactory, UNO_QUERY);
if (xViewFactoryComponent.is())
xViewFactoryComponent->dispose();
mxViewFactory = NULL;
Reference<lang::XComponent> xPaneFactoryComponent (mxPaneFactory, UNO_QUERY);
if (xPaneFactoryComponent.is())
xPaneFactoryComponent->dispose();
mxPaneFactory = NULL;
if (mpPresenterController.get() != NULL)
{
mpPresenterController->dispose();
mpPresenterController = rtl::Reference<PresenterController>();
}
mpPaneContainer = new PresenterPaneContainer(Reference<XComponentContext>(mxContextWeak));
}
void PresenterScreen::SetupPaneFactory (const Reference<XComponentContext>& rxContext)
{
try
{
if ( ! mxPaneFactory.is())
mxPaneFactory = PresenterPaneFactory::Create(
rxContext,
mxController,
mpPresenterController);
}
catch (RuntimeException&)
{
OSL_ASSERT(false);
}
}
void PresenterScreen::SetupViewFactory (const Reference<XComponentContext>& rxContext)
{
try
{
if ( ! mxViewFactory.is())
mxViewFactory = PresenterViewFactory::Create(
rxContext,
mxController,
mpPresenterController);
}
catch (RuntimeException&)
{
OSL_ASSERT(false);
}
}
void PresenterScreen::SetupConfiguration (
const Reference<XComponentContext>& rxContext,
const Reference<XResourceId>& rxAnchorId)
{
try
{
PresenterConfigurationAccess aConfiguration (
rxContext,
A2S("org.openoffice.Office.PresenterScreen"),
PresenterConfigurationAccess::READ_ONLY);
maViewDescriptors.clear();
ProcessViewDescriptions(aConfiguration);
OUString sLayoutName (RTL_CONSTASCII_USTRINGPARAM("DefaultLayout"));
aConfiguration.GetConfigurationNode(
A2S("Presenter/CurrentLayout")) >>= sLayoutName;
ProcessLayout(aConfiguration, sLayoutName, rxContext, rxAnchorId);
}
catch (RuntimeException&)
{
}
}
void PresenterScreen::ProcessLayout (
PresenterConfigurationAccess& rConfiguration,
const OUString& rsLayoutName,
const Reference<XComponentContext>& rxContext,
const Reference<XResourceId>& rxAnchorId)
{
try
{
Reference<container::XHierarchicalNameAccess> xLayoutNode (
rConfiguration.GetConfigurationNode(
A2S("Presenter/Layouts/") + rsLayoutName),
UNO_QUERY_THROW);
// Read the parent layout first, if one is referenced.
OUString sParentLayout;
rConfiguration.GetConfigurationNode(
xLayoutNode,
A2S("ParentLayout")) >>= sParentLayout;
if (sParentLayout.getLength() > 0)
{
// Prevent infinite recursion.
if (rsLayoutName != sParentLayout)
ProcessLayout(rConfiguration, sParentLayout, rxContext, rxAnchorId);
}
// Process the actual layout list.
Reference<container::XNameAccess> xList (
rConfiguration.GetConfigurationNode(
xLayoutNode,
A2S("Layout")),
UNO_QUERY_THROW);
::std::vector<rtl::OUString> aProperties (6);
aProperties[0] = A2S("PaneURL");
aProperties[1] = A2S("ViewURL");
aProperties[2] = A2S("RelativeX");
aProperties[3] = A2S("RelativeY");
aProperties[4] = A2S("RelativeWidth");
aProperties[5] = A2S("RelativeHeight");
mnComponentIndex = 1;
PresenterConfigurationAccess::ForAll(
xList,
aProperties,
::boost::bind(&PresenterScreen::ProcessComponent, this,
_1,
_2,
rxContext,
rxAnchorId));
}
catch (RuntimeException&)
{
}
}
void PresenterScreen::ProcessViewDescriptions (
PresenterConfigurationAccess& rConfiguration)
{
try
{
Reference<container::XNameAccess> xViewDescriptionsNode (
rConfiguration.GetConfigurationNode(A2S("Presenter/Views")),
UNO_QUERY_THROW);
::std::vector<rtl::OUString> aProperties (4);
aProperties[0] = A2S("ViewURL");
aProperties[1] = A2S("Title");
aProperties[2] = A2S("AccessibleTitle");
aProperties[3] = A2S("IsOpaque");
mnComponentIndex = 1;
PresenterConfigurationAccess::ForAll(
xViewDescriptionsNode,
aProperties,
::boost::bind(&PresenterScreen::ProcessViewDescription, this, _1, _2));
}
catch (RuntimeException&)
{
OSL_ASSERT(false);
}
}
void PresenterScreen::ProcessComponent (
const OUString& rsKey,
const ::std::vector<Any>& rValues,
const Reference<XComponentContext>& rxContext,
const Reference<XResourceId>& rxAnchorId)
{
(void)rsKey;
if (rValues.size() != 6)
return;
try
{
OUString sPaneURL;
OUString sViewURL;
double nX = 0;
double nY = 0;
double nWidth = 0;
double nHeight = 0;
rValues[0] >>= sPaneURL;
rValues[1] >>= sViewURL;
rValues[2] >>= nX;
rValues[3] >>= nY;
rValues[4] >>= nWidth;
rValues[5] >>= nHeight;
if (nX>=0 && nY>=0 && nWidth>0 && nHeight>0)
{
SetupView(
rxContext,
rxAnchorId,
sPaneURL,
sViewURL,
PresenterPaneContainer::ViewInitializationFunction(),
nX,
nY,
nX+nWidth,
nY+nHeight);
}
}
catch (Exception& e)
{
(void)e;
OSL_ASSERT(false);
}
}
void PresenterScreen::ProcessViewDescription (
const OUString& rsKey,
const ::std::vector<Any>& rValues)
{
(void)rsKey;
if (rValues.size() != 4)
return;
try
{
ViewDescriptor aViewDescriptor;
OUString sViewURL;
rValues[0] >>= sViewURL;
rValues[1] >>= aViewDescriptor.msTitle;
rValues[2] >>= aViewDescriptor.msAccessibleTitle;
rValues[3] >>= aViewDescriptor.mbIsOpaque;
if (aViewDescriptor.msAccessibleTitle.getLength()==0)
aViewDescriptor.msAccessibleTitle = aViewDescriptor.msTitle;
maViewDescriptors[sViewURL] = aViewDescriptor;
}
catch (Exception&)
{
OSL_ASSERT(false);
}
}
void PresenterScreen::SetupView(
const Reference<XComponentContext>& rxContext,
const Reference<XResourceId>& rxAnchorId,
const OUString& rsPaneURL,
const OUString& rsViewURL,
const PresenterPaneContainer::ViewInitializationFunction& rViewInitialization,
const double nLeft,
const double nTop,
const double nRight,
const double nBottom)
{
Reference<XConfigurationController> xCC (mxConfigurationControllerWeak);
if (xCC.is())
{
Reference<XResourceId> xPaneId (ResourceId::createWithAnchor(rxContext,rsPaneURL,rxAnchorId));
// Look up the view descriptor.
ViewDescriptor aViewDescriptor;
ViewDescriptorContainer::const_iterator iDescriptor (maViewDescriptors.find(rsViewURL));
if (iDescriptor != maViewDescriptors.end())
aViewDescriptor = iDescriptor->second;
// Prepare the pane.
OSL_ASSERT(mpPaneContainer.get() != NULL);
mpPaneContainer->PreparePane(
xPaneId,
rsViewURL,
aViewDescriptor.msTitle,
aViewDescriptor.msAccessibleTitle,
aViewDescriptor.mbIsOpaque,
rViewInitialization,
nLeft,
nTop,
nRight,
nBottom);
}
}
} } // end of namespace ::sdext::presenter