blob: 36b5d35f341146f6409793b4738f7648bdc1cf40 [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_sd.hxx"
#include "tools/SlotStateListener.hxx"
#include <com/sun/star/frame/XStatusListener.hpp>
#include <com/sun/star/frame/XDispatchProvider.hpp>
#ifndef _COM_SUN_STAR_FRAME_XDISPATCHP_HPP_
#include <com/sun/star/frame/XDispatch.hpp>
#endif
#include <com/sun/star/util/XURLTransformer.hpp>
#include <com/sun/star/beans/PropertyChangeEvent.hpp>
#include <comphelper/processfactory.hxx>
using namespace ::com::sun::star;
using namespace ::rtl;
namespace sd { namespace tools {
SlotStateListener::SlotStateListener (
Link& rCallback,
const uno::Reference<frame::XDispatchProvider>& rxDispatchProvider,
const ::rtl::OUString& rSlotName)
: SlotStateListenerInterfaceBase(maMutex),
maCallback(),
mxDispatchProviderWeak(NULL)
{
SetCallback(rCallback);
ConnectToDispatchProvider(rxDispatchProvider);
ObserveSlot(rSlotName);
}
SlotStateListener::~SlotStateListener (void)
{
ReleaseListeners();
}
void SlotStateListener::SetCallback (const Link& rCallback)
{
ThrowIfDisposed();
maCallback = rCallback;
}
void SlotStateListener::ConnectToDispatchProvider (
const uno::Reference<frame::XDispatchProvider>& rxDispatchProvider)
{
ThrowIfDisposed();
// When we are listening to state changes of slots of another frame then
// release these listeners first.
if ( ! maRegisteredURLList.empty())
ReleaseListeners();
mxDispatchProviderWeak = rxDispatchProvider;
}
void SlotStateListener::ObserveSlot (const ::rtl::OUString& rSlotName)
{
ThrowIfDisposed();
if (maCallback.IsSet())
{
// Connect the state change listener.
util::URL aURL (MakeURL(rSlotName));
uno::Reference<frame::XDispatch> xDispatch (GetDispatch(aURL));
if (xDispatch.is())
{
maRegisteredURLList.push_back(aURL);
xDispatch->addStatusListener(this,aURL);
}
}
}
void SlotStateListener::disposing (void)
{
ReleaseListeners();
mxDispatchProviderWeak = uno::WeakReference<frame::XDispatchProvider>(NULL);
maCallback = Link();
}
util::URL SlotStateListener::MakeURL (const OUString& rSlotName) const
{
util::URL aURL;
aURL.Complete = rSlotName;
uno::Reference<lang::XMultiServiceFactory> xServiceManager (
::comphelper::getProcessServiceFactory());
if (xServiceManager.is())
{
uno::Reference<util::XURLTransformer> xTransformer(xServiceManager->createInstance(
OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.URLTransformer"))),
uno::UNO_QUERY);
if (xTransformer.is())
xTransformer->parseStrict(aURL);
}
return aURL;
}
uno::Reference<frame::XDispatch>
SlotStateListener::GetDispatch (const util::URL& rURL) const
{
uno::Reference<frame::XDispatch> xDispatch;
uno::Reference<frame::XDispatchProvider> xDispatchProvider (mxDispatchProviderWeak);
if (xDispatchProvider.is())
xDispatch = xDispatchProvider->queryDispatch(rURL, OUString(), 0);
return xDispatch;
}
void SlotStateListener::statusChanged (
const frame::FeatureStateEvent& rState)
throw (uno::RuntimeException)
{
ThrowIfDisposed();
OUString sSlotName (rState.FeatureURL.Complete);
if (maCallback.IsSet())
maCallback.Call(&sSlotName);
}
void SlotStateListener::ReleaseListeners (void)
{
if ( ! maRegisteredURLList.empty())
{
RegisteredURLList::iterator iURL (maRegisteredURLList.begin());
RegisteredURLList::iterator iEnd (maRegisteredURLList.end());
for (; iURL!=iEnd; ++iURL)
{
uno::Reference<frame::XDispatch> xDispatch (GetDispatch(*iURL));
if (xDispatch.is())
{
xDispatch->removeStatusListener(this,*iURL);
}
}
}
}
//===== lang::XEventListener ================================================
void SAL_CALL SlotStateListener::disposing (
const lang::EventObject& )
throw (uno::RuntimeException)
{
}
void SlotStateListener::ThrowIfDisposed (void)
throw (lang::DisposedException)
{
if (rBHelper.bDisposed || rBHelper.bInDispose)
{
throw lang::DisposedException (
OUString(RTL_CONSTASCII_USTRINGPARAM(
"SlideSorterController object has already been disposed")),
static_cast<uno::XWeak*>(this));
}
}
} } // end of namespace ::sd::tools