2009-09-11 13:52:41 +0200 cl r276061 : CWS-TOOLING: rebase CWS impressnotes01 to trunk@276043 (milestone: DEV300:m58) 2009-09-10 15:44:57 +0200 cl r276039 : #i103139# continued work on the impress annotation feature 2009-09-10 14:52:31 +0200 cl r276032 : #i103139# continued work on the impress annotation feature 2009-09-10 14:50:32 +0200 cl r276031 : #i103139# continued work on the impress annotation feature 2009-09-10 14:48:29 +0200 cl r276030 : #i103139# continued work on the impress annotation feature 2009-09-10 11:36:11 +0200 cl r276027 : #i103139# continued work on the impress annotation feature 2009-09-09 20:22:41 +0200 cl r276018 : #i103139# continued work on the impress annotation feature 2009-09-09 20:21:45 +0200 cl r276017 : #i103139# continued work on the impress annotation feature 2009-09-09 19:32:29 +0200 sj r276015 : #i103139# added import of comments (ppt binary) 2009-09-09 19:31:07 +0200 sj r276014 : #i103139# added import of comments (ppt binary) 2009-09-09 19:16:41 +0200 cl r276011 : #i103139# continued work on the impress annotation feature 2009-09-09 19:15:19 +0200 cl r276010 : #i103139# continued work on the impress annotation feature 2009-09-09 16:27:19 +0200 cl r276001 : #i104579# fixed isEmptyPresObj() 2009-09-09 15:12:02 +0200 cl r275997 : #i103139# continued work on the impress annotation feature 2009-09-09 15:06:29 +0200 sj r275996 : #i103139# added import of comments (ppt binary) 2009-09-09 14:53:01 +0200 cl r275995 : #i103139# continued work on the impress annotation feature 2009-09-09 14:51:32 +0200 cl r275994 : #i103139# continued work on the impress annotation feature 2009-09-09 12:11:17 +0200 cl r275982 : #i103139# continued work on the impress annotation feature 2009-09-09 11:47:55 +0200 cl r275981 : #i103139# continued work on the impress annotation feature 2009-09-09 11:47:23 +0200 cl r275980 : #i103139# continued work on the impress annotation feature 2009-09-09 11:44:47 +0200 cl r275978 : #i104315# added missing tab pages 2009-09-08 16:04:44 +0200 cl r275936 : #i103139# continued work on the impress annotation feature 2009-09-08 16:03:28 +0200 cl r275935 : #i103139# continued work on the impress annotation feature 2009-09-08 11:45:47 +0200 cl r275920 : #i103139# continued work on the impress annotation feature 2009-09-08 11:41:51 +0200 cl r275919 : #i103139# continued work on the impress annotation feature 2009-09-07 18:30:55 +0200 cl r275910 : #i103139# continued work on the impress annotation feature 2009-09-07 18:29:37 +0200 cl r275909 : #i103139# continued work on the impress annotation feature 2009-09-07 17:25:43 +0200 cl r275905 : #i103139# continued work on the impress annotation feature 2009-09-07 12:00:28 +0200 cl r275884 : #i103139# continued work on the impress annotation feature 2009-09-06 14:14:00 +0200 cl r275859 : #i103139# continued work on the impress annotation feature 2009-09-05 20:57:24 +0200 cl r275854 : #i103139# continued work on the impress annotation feature 2009-09-05 20:56:29 +0200 cl r275853 : #i103139# continued work on the impress annotation feature 2009-09-05 20:55:27 +0200 cl r275852 : #i103139# continued work on the impress annotation feature 2009-09-05 20:11:42 +0200 cl r275851 : #i103139# continued work on the impress annotation feature 2009-09-05 20:11:09 +0200 cl r275850 : #i103139# continued work on the impress annotation feature 2009-09-05 17:43:33 +0200 cl r275845 : #i103139# continued work on the impress annotation feature 2009-09-05 17:04:41 +0200 cl r275843 : #i103139# continued work on the impress annotation feature 2009-09-05 17:03:26 +0200 cl r275842 : #i103139# continued work on the impress annotation feature 2009-09-05 17:02:53 +0200 cl r275841 : #i103139# continued work on the impress annotation feature 2009-09-05 13:15:04 +0200 pl r275839 : #i104823# WB_NEEDSFOCUS 2009-09-05 13:14:41 +0200 pl r275838 : #i104823# WB_NEEDSFOCUS 2009-09-04 17:48:21 +0200 cl r275826 : #i103139# continued work on the impress annotation feature 2009-09-04 17:35:03 +0200 cl r275825 : #i103139# continued work on the impress annotation feature 2009-09-04 17:15:46 +0200 cl r275824 : #i103139# continued work on the impress annotation feature 2009-09-04 17:12:54 +0200 cl r275823 : #i103139# continued work on the impress annotation feature 2009-09-04 17:05:23 +0200 cl r275822 : #i103139# continued work on the impress annotation feature 2009-09-04 16:48:28 +0200 cl r275820 : #i103139# continued work on the impress annotation feature 2009-09-04 16:44:02 +0200 cl r275818 : #i103139# continued work on the impress annotation feature 2009-09-04 16:43:23 +0200 cl r275817 : #i103139# continued work on the impress annotation feature 2009-09-04 16:06:04 +0200 cl r275812 : #i103139# continued work on the impress annotation feature 2009-09-04 16:05:45 +0200 cl r275811 : #i103139# continued work on the impress annotation feature 2009-09-04 15:04:33 +0200 cl r275806 : #i103139# continued work on the impress annotation feature 2009-09-04 11:43:14 +0200 cl r275795 : #i103139# continued work on the impress annotation feature 2009-09-04 11:27:10 +0200 cl r275793 : #i103139# continued work on the impress annotation feature 2009-09-04 11:10:02 +0200 cl r275792 : #i103139# continued work on the impress annotation feature 2009-09-04 11:07:05 +0200 cl r275790 : #i103139# continued work on the impress annotation feature 2009-09-04 11:05:01 +0200 cl r275789 : #i103139# continued work on the impress annotation feature 2009-09-04 10:55:51 +0200 cl r275785 : #i103139# renamed notes to comments 2009-09-04 10:54:57 +0200 cl r275784 : #i103139# renamed notes to comments 2009-09-03 20:37:35 +0200 cl r275772 : #i103139# continued work on the impress annotation feature 2009-09-03 20:35:31 +0200 cl r275771 : #i103139# continued work on the impress annotation feature 2009-09-01 18:17:55 +0200 cl r275680 : #i103139# continued work on the impress annotation feature 2009-09-01 18:15:08 +0200 cl r275678 : #i103139# continued work on the impress annotation feature 2009-09-01 18:13:38 +0200 cl r275677 : #i103139# continued work on the impress annotation feature 2009-08-18 12:35:42 +0200 cl r275089 : fixed merge error 2009-08-18 11:39:58 +0200 cl r275086 : CWS-TOOLING: rebase CWS impressnotes01 to trunk@275001 (milestone: DEV300:m55) 2009-07-30 13:45:10 +0200 cl r274481 : fixed merge errrors 2009-07-30 13:41:21 +0200 cl r274480 : fixed merge errrors 2009-07-30 13:39:40 +0200 cl r274478 : fixed merge errrors 2009-07-22 18:07:30 +0200 cl r274256 : CWS-TOOLING: rebase CWS impressnotes01 to trunk@273858 (milestone: DEV300:m52) 2009-07-21 17:21:31 +0200 cl r274208 : merging 2009-07-20 14:28:34 +0200 cl r274137 : #i103139# annotation support for impress 2009-07-20 14:28:04 +0200 cl r274136 : #i103139# annotation support for impress 2009-07-20 14:27:20 +0200 cl r274135 : #i103139# annotation support for impress 2009-07-20 14:21:17 +0200 cl r274134 : #i103139# annotation support for impress 2009-07-20 14:20:56 +0200 cl r274133 : #i103139# annotation support for impress 2009-07-20 14:20:09 +0200 cl r274132 : #i103139# annotation support for impress 2009-07-20 14:19:00 +0200 cl r274131 : #i103139# annotation support for impress 2009-07-20 14:17:50 +0200 cl r274130 : #i103139# annotation support for impress 2009-07-20 14:12:24 +0200 cl r274129 : #i103139# annotation support for impress 2009-07-20 13:52:03 +0200 cl r274128 : #i103139# annotation support for impress 2009-07-20 13:51:11 +0200 cl r274127 : #i103139# annotation support for impress 2009-07-20 13:48:59 +0200 cl r274126 : #i103139# annotation support for impress 2009-07-20 13:43:56 +0200 cl r274125 : #i103139# annotation support for impress 2009-07-20 13:31:55 +0200 cl r274123 : #i103139# annotation support for impress 2009-07-20 13:30:45 +0200 cl r274122 : #i103139# annotation support for impress
756 lines
22 KiB
C++
756 lines
22 KiB
C++
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: ConfigurationController.cxx,v $
|
|
* $Revision: 1.7.68.1 $
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include "precompiled_sd.hxx"
|
|
|
|
#include "framework/ConfigurationController.hxx"
|
|
|
|
#include "framework/Configuration.hxx"
|
|
#include "framework/FrameworkHelper.hxx"
|
|
#include "ConfigurationUpdater.hxx"
|
|
#include "ConfigurationControllerBroadcaster.hxx"
|
|
#include "ConfigurationTracer.hxx"
|
|
#include "GenericConfigurationChangeRequest.hxx"
|
|
#include "ResourceFactoryManager.hxx"
|
|
#include "UpdateRequest.hxx"
|
|
#include "ChangeRequestQueueProcessor.hxx"
|
|
#include "ConfigurationClassifier.hxx"
|
|
#include "ViewShellBase.hxx"
|
|
#include "UpdateLockManager.hxx"
|
|
#include "DrawController.hxx"
|
|
#include <com/sun/star/drawing/framework/XControllerManager.hpp>
|
|
#include <com/sun/star/util/XURLTransformer.hpp>
|
|
|
|
#include <comphelper/stl_types.hxx>
|
|
#include <vos/mutex.hxx>
|
|
#include <vcl/svapp.hxx>
|
|
|
|
using namespace ::com::sun::star;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::drawing::framework;
|
|
using rtl::OUString;
|
|
using ::sd::framework::FrameworkHelper;
|
|
|
|
#undef VERBOSE
|
|
#define VERBOSE 3
|
|
|
|
|
|
namespace sd { namespace framework {
|
|
|
|
Reference<XInterface> SAL_CALL ConfigurationController_createInstance (
|
|
const Reference<XComponentContext>& rxContext)
|
|
{
|
|
(void)rxContext;
|
|
return static_cast<XWeak*>(new ConfigurationController());
|
|
}
|
|
|
|
|
|
|
|
|
|
OUString ConfigurationController_getImplementationName (void) throw(RuntimeException)
|
|
{
|
|
return OUString(RTL_CONSTASCII_USTRINGPARAM(
|
|
"com.sun.star.comp.Draw.framework.configuration.ConfigurationController"));
|
|
}
|
|
|
|
|
|
|
|
|
|
Sequence<rtl::OUString> SAL_CALL ConfigurationController_getSupportedServiceNames (void)
|
|
throw (RuntimeException)
|
|
{
|
|
static const OUString sServiceName(OUString::createFromAscii(
|
|
"com.sun.star.drawing.framework.ConfigurationController"));
|
|
return Sequence<rtl::OUString>(&sServiceName, 1);
|
|
}
|
|
|
|
|
|
|
|
|
|
//----- ConfigurationController::Implementation -------------------------------
|
|
|
|
class ConfigurationController::Implementation
|
|
{
|
|
public:
|
|
Implementation (
|
|
ConfigurationController& rController,
|
|
const Reference<frame::XController>& rxController);
|
|
~Implementation (void);
|
|
|
|
void Initialize (const Reference<frame::XController>& rxController);
|
|
|
|
Reference<XControllerManager> mxControllerManager;
|
|
|
|
/** The Broadcaster class implements storing and calling of listeners.
|
|
*/
|
|
::boost::shared_ptr<ConfigurationControllerBroadcaster> mpBroadcaster;
|
|
|
|
/** The requested configuration which is modifed (asynchronously) by
|
|
calls to requestResourceActivation() and
|
|
requestResourceDeactivation(). The mpConfigurationUpdater makes the
|
|
current configuration reflect the content of this one.
|
|
*/
|
|
::com::sun::star::uno::Reference<
|
|
::com::sun::star::drawing::framework::XConfiguration> mxRequestedConfiguration;
|
|
|
|
ViewShellBase* mpBase;
|
|
|
|
bool mbIsInitialized;
|
|
|
|
::boost::shared_ptr<ResourceFactoryManager> mpResourceFactoryContainer;
|
|
|
|
::boost::shared_ptr<ConfigurationControllerResourceManager> mpResourceManager;
|
|
|
|
::boost::shared_ptr<ConfigurationUpdater> mpConfigurationUpdater;
|
|
|
|
/** The queue processor ownes the queue of configuration change request
|
|
objects and processes the objects.
|
|
*/
|
|
::boost::scoped_ptr<ChangeRequestQueueProcessor> mpQueueProcessor;
|
|
|
|
::boost::shared_ptr<ConfigurationUpdaterLock> mpConfigurationUpdaterLock;
|
|
|
|
sal_Int32 mnLockCount;
|
|
};
|
|
|
|
|
|
|
|
|
|
//===== ConfigurationController::Lock =========================================
|
|
|
|
ConfigurationController::Lock::Lock (const Reference<XConfigurationController>& rxController)
|
|
: mxController(rxController)
|
|
{
|
|
OSL_ASSERT(mxController.is());
|
|
|
|
if (mxController.is())
|
|
mxController->lock();
|
|
}
|
|
|
|
|
|
|
|
|
|
ConfigurationController::Lock::~Lock (void)
|
|
{
|
|
if (mxController.is())
|
|
mxController->unlock();
|
|
}
|
|
|
|
|
|
|
|
|
|
//===== ConfigurationController ===============================================
|
|
|
|
ConfigurationController::ConfigurationController (void) throw()
|
|
: ConfigurationControllerInterfaceBase(MutexOwner::maMutex),
|
|
mpImplementation(),
|
|
mbIsDisposed(false)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
ConfigurationController::~ConfigurationController (void) throw()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::disposing (void)
|
|
{
|
|
if (mpImplementation.get() == NULL)
|
|
return;
|
|
|
|
#if defined VERBOSE && VERBOSE>=1
|
|
OSL_TRACE("ConfigurationController::disposing\n");
|
|
OSL_TRACE(" requesting empty configuration\n");
|
|
#endif
|
|
// To destroy all resources an empty configuration is requested and then,
|
|
// synchronously, all resulting requests are processed.
|
|
mpImplementation->mpQueueProcessor->Clear();
|
|
restoreConfiguration(new Configuration(this,false));
|
|
mpImplementation->mpQueueProcessor->ProcessUntilEmpty();
|
|
#if defined VERBOSE && VERBOSE>=1
|
|
OSL_TRACE(" all requests processed\n");
|
|
#endif
|
|
|
|
// Now that all resources have been deactivated, mark the controller as
|
|
// disposed.
|
|
mbIsDisposed = true;
|
|
|
|
// Release the listeners.
|
|
lang::EventObject aEvent;
|
|
aEvent.Source = uno::Reference<uno::XInterface>((cppu::OWeakObject*)this);
|
|
|
|
{
|
|
const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
|
|
mpImplementation->mpBroadcaster->DisposeAndClear();
|
|
}
|
|
|
|
mpImplementation->mpQueueProcessor.reset();
|
|
mpImplementation->mxRequestedConfiguration = NULL;
|
|
mpImplementation.reset();
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConfigurationController::ProcessEvent (void)
|
|
{
|
|
if (mpImplementation.get() != NULL)
|
|
{
|
|
OSL_ASSERT(mpImplementation->mpQueueProcessor.get()!=NULL);
|
|
|
|
mpImplementation->mpQueueProcessor->ProcessOneEvent();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConfigurationController::RequestSynchronousUpdate (void)
|
|
{
|
|
if (mpImplementation.get() == NULL)
|
|
return;
|
|
if (mpImplementation->mpQueueProcessor.get() == 0)
|
|
return;
|
|
mpImplementation->mpQueueProcessor->ProcessUntilEmpty();
|
|
}
|
|
|
|
|
|
|
|
|
|
//----- XConfigurationControllerBroadcaster -----------------------------------
|
|
|
|
void SAL_CALL ConfigurationController::addConfigurationChangeListener (
|
|
const Reference<XConfigurationChangeListener>& rxListener,
|
|
const ::rtl::OUString& rsEventType,
|
|
const Any& rUserData)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
|
|
ThrowIfDisposed();
|
|
OSL_ASSERT(mpImplementation.get()!=NULL);
|
|
mpImplementation->mpBroadcaster->AddListener(rxListener, rsEventType, rUserData);
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::removeConfigurationChangeListener (
|
|
const Reference<XConfigurationChangeListener>& rxListener)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
|
|
ThrowIfDisposed();
|
|
mpImplementation->mpBroadcaster->RemoveListener(rxListener);
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::notifyEvent (
|
|
const ConfigurationChangeEvent& rEvent)
|
|
throw (RuntimeException)
|
|
{
|
|
ThrowIfDisposed();
|
|
mpImplementation->mpBroadcaster->NotifyListeners(rEvent);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//----- XConfigurationController ----------------------------------------------
|
|
|
|
void SAL_CALL ConfigurationController::lock (void)
|
|
throw (RuntimeException)
|
|
{
|
|
OSL_ASSERT(mpImplementation.get()!=NULL);
|
|
OSL_ASSERT(mpImplementation->mpConfigurationUpdater.get()!=NULL);
|
|
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
|
|
++mpImplementation->mnLockCount;
|
|
if (mpImplementation->mpConfigurationUpdaterLock.get()==NULL)
|
|
mpImplementation->mpConfigurationUpdaterLock
|
|
= mpImplementation->mpConfigurationUpdater->GetLock();
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::unlock (void)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
|
|
// Allow unlocking while the ConfigurationController is being disposed
|
|
// (but not when that is done and the controller is disposed.)
|
|
if (rBHelper.bDisposed)
|
|
ThrowIfDisposed();
|
|
|
|
OSL_ASSERT(mpImplementation->mnLockCount>0);
|
|
--mpImplementation->mnLockCount;
|
|
if (mpImplementation->mnLockCount == 0)
|
|
mpImplementation->mpConfigurationUpdaterLock.reset();
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::requestResourceActivation (
|
|
const Reference<XResourceId>& rxResourceId,
|
|
ResourceActivationMode eMode)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
// Check whether we are being disposed. This is handled differently
|
|
// then being completely disposed because the first thing disposing()
|
|
// does is to deactivate all remaining resources. This is done via
|
|
// regular methods which must not throw DisposedExceptions. Therefore
|
|
// we just return silently during that stage.
|
|
if (rBHelper.bInDispose)
|
|
{
|
|
#if defined VERBOSE && VERBOSE>=1
|
|
OSL_TRACE("ConfigurationController::requestResourceActivation(): ignoring %s\n",
|
|
OUStringToOString(
|
|
FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
#if defined VERBOSE && VERBOSE>=2
|
|
OSL_TRACE("ConfigurationController::requestResourceActivation() %s\n",
|
|
OUStringToOString(
|
|
FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
|
|
#endif
|
|
|
|
if (rxResourceId.is())
|
|
{
|
|
if (eMode == ResourceActivationMode_REPLACE)
|
|
{
|
|
// Get a list of the matching resources and create deactivation
|
|
// requests for them.
|
|
Sequence<Reference<XResourceId> > aResourceList (
|
|
mpImplementation->mxRequestedConfiguration->getResources(
|
|
rxResourceId->getAnchor(),
|
|
rxResourceId->getResourceTypePrefix(),
|
|
AnchorBindingMode_DIRECT));
|
|
|
|
for (sal_Int32 nIndex=0; nIndex<aResourceList.getLength(); ++nIndex)
|
|
{
|
|
// Do not request the deactivation of the resource for which
|
|
// this method was called. Doing it would not change the
|
|
// outcome but would result in unnecessary work.
|
|
if (rxResourceId->compareTo(aResourceList[nIndex]) == 0)
|
|
continue;
|
|
|
|
// Request the deactivation of a resource and all resources
|
|
// linked to it.
|
|
requestResourceDeactivation(aResourceList[nIndex]);
|
|
}
|
|
}
|
|
|
|
Reference<XConfigurationChangeRequest> xRequest(
|
|
new GenericConfigurationChangeRequest(
|
|
rxResourceId,
|
|
GenericConfigurationChangeRequest::Activation));
|
|
postChangeRequest(xRequest);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::requestResourceDeactivation (
|
|
const Reference<XResourceId>& rxResourceId)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
#if defined VERBOSE && VERBOSE>=2
|
|
OSL_TRACE("ConfigurationController::requestResourceDeactivation() %s\n",
|
|
OUStringToOString(
|
|
FrameworkHelper::ResourceIdToString(rxResourceId), RTL_TEXTENCODING_UTF8).getStr());
|
|
#endif
|
|
|
|
if (rxResourceId.is())
|
|
{
|
|
// Request deactivation of all resources linked to the specified one
|
|
// as well.
|
|
const Sequence<Reference<XResourceId> > aLinkedResources (
|
|
mpImplementation->mxRequestedConfiguration->getResources(
|
|
rxResourceId,
|
|
OUString(),
|
|
AnchorBindingMode_DIRECT));
|
|
const sal_Int32 nCount (aLinkedResources.getLength());
|
|
for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
|
|
{
|
|
// We do not add deactivation requests directly but call this
|
|
// method recursively, so that when one time there are resources
|
|
// linked to linked resources, these are handled correctly, too.
|
|
requestResourceDeactivation(aLinkedResources[nIndex]);
|
|
}
|
|
|
|
// Add a deactivation request for the specified resource.
|
|
Reference<XConfigurationChangeRequest> xRequest(
|
|
new GenericConfigurationChangeRequest(
|
|
rxResourceId,
|
|
GenericConfigurationChangeRequest::Deactivation));
|
|
postChangeRequest(xRequest);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
Reference<XResource> SAL_CALL ConfigurationController::getResource (
|
|
const Reference<XResourceId>& rxResourceId)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
ConfigurationControllerResourceManager::ResourceDescriptor aDescriptor (
|
|
mpImplementation->mpResourceManager->GetResource(rxResourceId));
|
|
return aDescriptor.mxResource;
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::update (void)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
if (mpImplementation->mpQueueProcessor->IsEmpty())
|
|
{
|
|
// The queue is empty. Add another request that does nothing but
|
|
// asynchronously trigger a request for an update.
|
|
mpImplementation->mpQueueProcessor->AddRequest(new UpdateRequest());
|
|
}
|
|
else
|
|
{
|
|
// The queue is not empty, so we rely on the queue processor to
|
|
// request an update automatically when the queue becomes empty.
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
sal_Bool SAL_CALL ConfigurationController::hasPendingRequests (void)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
return ! mpImplementation->mpQueueProcessor->IsEmpty();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::postChangeRequest (
|
|
const Reference<XConfigurationChangeRequest>& rxRequest)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
mpImplementation->mpQueueProcessor->AddRequest(rxRequest);
|
|
}
|
|
|
|
|
|
|
|
|
|
Reference<XConfiguration> SAL_CALL ConfigurationController::getRequestedConfiguration (void)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
if (mpImplementation->mxRequestedConfiguration.is())
|
|
return Reference<XConfiguration>(
|
|
mpImplementation->mxRequestedConfiguration->createClone(), UNO_QUERY);
|
|
else
|
|
return Reference<XConfiguration>();
|
|
}
|
|
|
|
|
|
|
|
|
|
Reference<XConfiguration> SAL_CALL ConfigurationController::getCurrentConfiguration (void)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
Reference<XConfiguration> xCurrentConfiguration(
|
|
mpImplementation->mpConfigurationUpdater->GetCurrentConfiguration());
|
|
if (xCurrentConfiguration.is())
|
|
return Reference<XConfiguration>(xCurrentConfiguration->createClone(), UNO_QUERY);
|
|
else
|
|
return Reference<XConfiguration>();
|
|
}
|
|
|
|
|
|
|
|
|
|
/** The given configuration is restored by generating the appropriate set of
|
|
activation and deactivation requests.
|
|
*/
|
|
void SAL_CALL ConfigurationController::restoreConfiguration (
|
|
const Reference<XConfiguration>& rxNewConfiguration)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
// We will probably be making a couple of activation and deactivation
|
|
// requests so lock the configuration controller and let it later update
|
|
// all changes at once.
|
|
::boost::shared_ptr<ConfigurationUpdaterLock> pLock (
|
|
mpImplementation->mpConfigurationUpdater->GetLock());
|
|
|
|
// Get lists of resources that are to be activated or deactivated.
|
|
Reference<XConfiguration> xCurrentConfiguration (mpImplementation->mxRequestedConfiguration);
|
|
#if defined VERBOSE && VERBOSE>=1
|
|
OSL_TRACE("ConfigurationController::restoreConfiguration(\n");
|
|
ConfigurationTracer::TraceConfiguration(rxNewConfiguration, "requested configuration");
|
|
ConfigurationTracer::TraceConfiguration(xCurrentConfiguration, "current configuration");
|
|
#endif
|
|
ConfigurationClassifier aClassifier (rxNewConfiguration, xCurrentConfiguration);
|
|
aClassifier.Partition();
|
|
#if defined VERBOSE && VERBOSE>=3
|
|
aClassifier.TraceResourceIdVector(
|
|
"requested but not current resources:\n", aClassifier.GetC1minusC2());
|
|
aClassifier.TraceResourceIdVector(
|
|
"current but not requested resources:\n", aClassifier.GetC2minusC1());
|
|
aClassifier.TraceResourceIdVector(
|
|
"requested and current resources:\n", aClassifier.GetC1andC2());
|
|
#endif
|
|
|
|
ConfigurationClassifier::ResourceIdVector::const_iterator iResource;
|
|
|
|
// Request the deactivation of resources that are not requested in the
|
|
// new configuration.
|
|
const ConfigurationClassifier::ResourceIdVector& rResourcesToDeactivate (
|
|
aClassifier.GetC2minusC1());
|
|
for (iResource=rResourcesToDeactivate.begin();
|
|
iResource!=rResourcesToDeactivate.end();
|
|
++iResource)
|
|
{
|
|
requestResourceDeactivation(*iResource);
|
|
}
|
|
|
|
// Request the activation of resources that are requested in the
|
|
// new configuration but are not part of the current configuration.
|
|
const ConfigurationClassifier::ResourceIdVector& rResourcesToActivate (
|
|
aClassifier.GetC1minusC2());
|
|
for (iResource=rResourcesToActivate.begin();
|
|
iResource!=rResourcesToActivate.end();
|
|
++iResource)
|
|
{
|
|
requestResourceActivation(*iResource, ResourceActivationMode_ADD);
|
|
}
|
|
|
|
pLock.reset();
|
|
}
|
|
|
|
|
|
|
|
|
|
//----- XResourceFactoryManager -----------------------------------------------
|
|
|
|
void SAL_CALL ConfigurationController::addResourceFactory(
|
|
const OUString& sResourceURL,
|
|
const Reference<XResourceFactory>& rxResourceFactory)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
mpImplementation->mpResourceFactoryContainer->AddFactory(sResourceURL, rxResourceFactory);
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::removeResourceFactoryForURL(
|
|
const OUString& sResourceURL)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
mpImplementation->mpResourceFactoryContainer->RemoveFactoryForURL(sResourceURL);
|
|
}
|
|
|
|
|
|
|
|
|
|
void SAL_CALL ConfigurationController::removeResourceFactoryForReference(
|
|
const Reference<XResourceFactory>& rxResourceFactory)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
mpImplementation->mpResourceFactoryContainer->RemoveFactoryForReference(rxResourceFactory);
|
|
}
|
|
|
|
|
|
|
|
|
|
Reference<XResourceFactory> SAL_CALL ConfigurationController::getResourceFactory (
|
|
const OUString& sResourceURL)
|
|
throw (RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
ThrowIfDisposed();
|
|
|
|
return mpImplementation->mpResourceFactoryContainer->GetFactory(sResourceURL);
|
|
}
|
|
|
|
|
|
|
|
|
|
//----- XInitialization -------------------------------------------------------
|
|
|
|
void SAL_CALL ConfigurationController::initialize (const Sequence<Any>& aArguments)
|
|
throw (Exception, RuntimeException)
|
|
{
|
|
::osl::MutexGuard aGuard (maMutex);
|
|
|
|
if (aArguments.getLength() == 1)
|
|
{
|
|
const ::vos::OGuard aSolarGuard (Application::GetSolarMutex());
|
|
|
|
mpImplementation.reset(new Implementation(
|
|
*this,
|
|
Reference<frame::XController>(aArguments[0], UNO_QUERY_THROW)));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void ConfigurationController::ThrowIfDisposed (void) const
|
|
throw (::com::sun::star::lang::DisposedException)
|
|
{
|
|
if (mbIsDisposed)
|
|
{
|
|
throw lang::DisposedException (
|
|
OUString(RTL_CONSTASCII_USTRINGPARAM(
|
|
"ConfigurationController object has already been disposed")),
|
|
const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
|
|
}
|
|
|
|
if (mpImplementation.get() == NULL)
|
|
{
|
|
OSL_ASSERT(mpImplementation.get() != NULL);
|
|
throw RuntimeException(
|
|
OUString(RTL_CONSTASCII_USTRINGPARAM(
|
|
"ConfigurationController not initialized")),
|
|
const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//===== ConfigurationController::Implementation ===============================
|
|
|
|
ConfigurationController::Implementation::Implementation (
|
|
ConfigurationController& rController,
|
|
const Reference<frame::XController>& rxController)
|
|
: mxControllerManager(rxController, UNO_QUERY_THROW),
|
|
mpBroadcaster(new ConfigurationControllerBroadcaster(&rController)),
|
|
mxRequestedConfiguration(new Configuration(&rController, true)),
|
|
mpBase(NULL),
|
|
mbIsInitialized(false),
|
|
mpResourceFactoryContainer(new ResourceFactoryManager(mxControllerManager)),
|
|
mpResourceManager(
|
|
new ConfigurationControllerResourceManager(mpResourceFactoryContainer,mpBroadcaster)),
|
|
mpConfigurationUpdater(
|
|
new ConfigurationUpdater(mpBroadcaster, mpResourceManager,mxControllerManager)),
|
|
mpQueueProcessor(new ChangeRequestQueueProcessor(&rController,mpConfigurationUpdater)),
|
|
mpConfigurationUpdaterLock(),
|
|
mnLockCount(0)
|
|
{
|
|
mpQueueProcessor->SetConfiguration(mxRequestedConfiguration);
|
|
}
|
|
|
|
|
|
|
|
|
|
void ConfigurationController::Implementation::Initialize (
|
|
const Reference<frame::XController>& rxController)
|
|
{
|
|
mxControllerManager = Reference<XControllerManager>(rxController, UNO_QUERY_THROW);
|
|
|
|
mpConfigurationUpdater->SetControllerManager(mxControllerManager);
|
|
|
|
// Tunnel through the controller to obtain a ViewShellBase.
|
|
Reference<lang::XUnoTunnel> xTunnel (rxController, UNO_QUERY_THROW);
|
|
if (xTunnel.is())
|
|
{
|
|
::sd::DrawController* pController = reinterpret_cast<sd::DrawController*>(
|
|
xTunnel->getSomething(sd::DrawController::getUnoTunnelId()));
|
|
if (pController != NULL)
|
|
mpBase = pController->GetViewShellBase();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
ConfigurationController::Implementation::~Implementation (void)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
} } // end of namespace sd::framework
|