/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #include #include #include #include #include #include #include using namespace ::com::sun::star; namespace sd { namespace tools { SlotStateListener::SlotStateListener ( Link const & rCallback, const uno::Reference& rxDispatchProvider, const OUString& rSlotName) : SlotStateListenerInterfaceBase(maMutex), maCallback(), mxDispatchProviderWeak(nullptr) { SetCallback(rCallback); ConnectToDispatchProvider(rxDispatchProvider); ObserveSlot(rSlotName); } SlotStateListener::~SlotStateListener() { ReleaseListeners(); } void SlotStateListener::SetCallback (const Link& rCallback) { ThrowIfDisposed(); maCallback = rCallback; } void SlotStateListener::ConnectToDispatchProvider ( const uno::Reference& 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 OUString& rSlotName) { ThrowIfDisposed(); if (maCallback.IsSet()) { // Connect the state change listener. util::URL aURL (MakeURL(rSlotName)); uno::Reference xDispatch (GetDispatch(aURL)); if (xDispatch.is()) { maRegisteredURLList.push_back(aURL); xDispatch->addStatusListener(this,aURL); } } } void SlotStateListener::disposing() { ReleaseListeners(); mxDispatchProviderWeak = uno::WeakReference(nullptr); maCallback = Link(); } util::URL SlotStateListener::MakeURL (const OUString& rSlotName) { util::URL aURL; aURL.Complete = rSlotName; uno::Reference xTransformer(util::URLTransformer::create(::comphelper::getProcessComponentContext())); xTransformer->parseStrict(aURL); return aURL; } uno::Reference SlotStateListener::GetDispatch (const util::URL& rURL) const { uno::Reference xDispatch; uno::Reference xDispatchProvider (mxDispatchProviderWeak); if (xDispatchProvider.is()) xDispatch = xDispatchProvider->queryDispatch(rURL, OUString(), 0); return xDispatch; } void SlotStateListener::statusChanged ( const frame::FeatureStateEvent& rState) { ThrowIfDisposed(); OUString sSlotName (rState.FeatureURL.Complete); maCallback.Call(sSlotName); } void SlotStateListener::ReleaseListeners() { for (const auto& rURL : maRegisteredURLList) { uno::Reference xDispatch (GetDispatch(rURL)); if (xDispatch.is()) { xDispatch->removeStatusListener(this,rURL); } } } //===== lang::XEventListener ================================================ void SAL_CALL SlotStateListener::disposing ( const lang::EventObject& ) { } void SlotStateListener::ThrowIfDisposed() { if (rBHelper.bDisposed || rBHelper.bInDispose) { throw lang::DisposedException ("SlideSorterController object has already been disposed", static_cast(this)); } } } } // end of namespace ::sd::tools /* vim:set shiftwidth=4 softtabstop=4 expandtab: */