15d39f272SZheng Fan /**************************************************************
25d39f272SZheng Fan *
35d39f272SZheng Fan * Licensed to the Apache Software Foundation (ASF) under one
45d39f272SZheng Fan * or more contributor license agreements. See the NOTICE file
55d39f272SZheng Fan * distributed with this work for additional information
65d39f272SZheng Fan * regarding copyright ownership. The ASF licenses this file
75d39f272SZheng Fan * to you under the Apache License, Version 2.0 (the
85d39f272SZheng Fan * "License"); you may not use this file except in compliance
95d39f272SZheng Fan * with the License. You may obtain a copy of the License at
105d39f272SZheng Fan *
115d39f272SZheng Fan * http://www.apache.org/licenses/LICENSE-2.0
125d39f272SZheng Fan *
135d39f272SZheng Fan * Unless required by applicable law or agreed to in writing,
145d39f272SZheng Fan * software distributed under the License is distributed on an
155d39f272SZheng Fan * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165d39f272SZheng Fan * KIND, either express or implied. See the License for the
175d39f272SZheng Fan * specific language governing permissions and limitations
185d39f272SZheng Fan * under the License.
195d39f272SZheng Fan *
205d39f272SZheng Fan *************************************************************/
215d39f272SZheng Fan
225d39f272SZheng Fan #include "precompiled_sfx2.hxx"
235d39f272SZheng Fan
245d39f272SZheng Fan #include "sfx2/sidebar/ContextChangeBroadcaster.hxx"
255d39f272SZheng Fan #include "sfx2/sidebar/EnumContext.hxx"
265d39f272SZheng Fan #include <com/sun/star/ui/ContextChangeEventObject.hpp>
275d39f272SZheng Fan #include <com/sun/star/ui/ContextChangeEventMultiplexer.hpp>
285d39f272SZheng Fan #include <com/sun/star/frame/XModuleManager.hpp>
295d39f272SZheng Fan #include <comphelper/componentcontext.hxx>
305d39f272SZheng Fan #include <comphelper/processfactory.hxx>
315d39f272SZheng Fan
325d39f272SZheng Fan
335d39f272SZheng Fan using ::rtl::OUString;
345d39f272SZheng Fan using namespace css;
355d39f272SZheng Fan using namespace cssu;
365d39f272SZheng Fan
375d39f272SZheng Fan namespace sfx2 { namespace sidebar {
385d39f272SZheng Fan
395d39f272SZheng Fan
ContextChangeBroadcaster(void)405d39f272SZheng Fan ContextChangeBroadcaster::ContextChangeBroadcaster (void)
415d39f272SZheng Fan : msContextName(),
42*8a5c5726SAndre Fischer mbIsContextActive(false),
43*8a5c5726SAndre Fischer mbIsBroadcasterEnabled(true)
445d39f272SZheng Fan {
455d39f272SZheng Fan }
465d39f272SZheng Fan
475d39f272SZheng Fan
485d39f272SZheng Fan
~ContextChangeBroadcaster(void)495d39f272SZheng Fan ContextChangeBroadcaster::~ContextChangeBroadcaster (void)
505d39f272SZheng Fan {
515d39f272SZheng Fan }
525d39f272SZheng Fan
535d39f272SZheng Fan
545d39f272SZheng Fan
555d39f272SZheng Fan
Initialize(const::rtl::OUString & rsContextName)565d39f272SZheng Fan void ContextChangeBroadcaster::Initialize (const ::rtl::OUString& rsContextName)
575d39f272SZheng Fan {
585d39f272SZheng Fan OSL_ASSERT( ! mbIsContextActive);
595d39f272SZheng Fan
605d39f272SZheng Fan msContextName = rsContextName;
615d39f272SZheng Fan }
625d39f272SZheng Fan
635d39f272SZheng Fan
645d39f272SZheng Fan
655d39f272SZheng Fan
Activate(const cssu::Reference<css::frame::XFrame> & rxFrame)665d39f272SZheng Fan void ContextChangeBroadcaster::Activate (const cssu::Reference<css::frame::XFrame>& rxFrame)
675d39f272SZheng Fan {
685d39f272SZheng Fan if (msContextName.getLength() > 0)
695d39f272SZheng Fan BroadcastContextChange(rxFrame, GetModuleName(rxFrame), msContextName);
705d39f272SZheng Fan }
715d39f272SZheng Fan
725d39f272SZheng Fan
735d39f272SZheng Fan
745d39f272SZheng Fan
Deactivate(const cssu::Reference<css::frame::XFrame> & rxFrame)755d39f272SZheng Fan void ContextChangeBroadcaster::Deactivate (const cssu::Reference<css::frame::XFrame>& rxFrame)
765d39f272SZheng Fan {
775d39f272SZheng Fan if (msContextName.getLength() > 0)
785d39f272SZheng Fan {
795d39f272SZheng Fan BroadcastContextChange(
805d39f272SZheng Fan rxFrame,
815d39f272SZheng Fan GetModuleName(rxFrame),
825d39f272SZheng Fan EnumContext::GetContextName(EnumContext::Context_Default));
835d39f272SZheng Fan }
845d39f272SZheng Fan }
855d39f272SZheng Fan
865d39f272SZheng Fan
875d39f272SZheng Fan
885d39f272SZheng Fan
SetBroadcasterEnabled(const bool bIsEnabled)89*8a5c5726SAndre Fischer bool ContextChangeBroadcaster::SetBroadcasterEnabled (const bool bIsEnabled)
90*8a5c5726SAndre Fischer {
91*8a5c5726SAndre Fischer const bool bWasEnabled (mbIsBroadcasterEnabled);
92*8a5c5726SAndre Fischer mbIsBroadcasterEnabled = bIsEnabled;
93*8a5c5726SAndre Fischer return bWasEnabled;
94*8a5c5726SAndre Fischer }
95*8a5c5726SAndre Fischer
96*8a5c5726SAndre Fischer
97*8a5c5726SAndre Fischer
98*8a5c5726SAndre Fischer
BroadcastContextChange(const cssu::Reference<css::frame::XFrame> & rxFrame,const::rtl::OUString & rsModuleName,const::rtl::OUString & rsContextName)995d39f272SZheng Fan void ContextChangeBroadcaster::BroadcastContextChange (
1005d39f272SZheng Fan const cssu::Reference<css::frame::XFrame>& rxFrame,
1015d39f272SZheng Fan const ::rtl::OUString& rsModuleName,
1025d39f272SZheng Fan const ::rtl::OUString& rsContextName)
1035d39f272SZheng Fan {
104*8a5c5726SAndre Fischer if ( ! mbIsBroadcasterEnabled)
105*8a5c5726SAndre Fischer return;
106*8a5c5726SAndre Fischer
1075d39f272SZheng Fan if (rsContextName.getLength() == 0)
1085d39f272SZheng Fan return;
1095d39f272SZheng Fan
11083713eddSAndre Fischer if ( ! rxFrame.is() || ! rxFrame->getController().is())
1115d39f272SZheng Fan {
11283713eddSAndre Fischer // Frame is (probably) being deleted. Broadcasting context
11383713eddSAndre Fischer // changes is not necessary anymore.
1145d39f272SZheng Fan return;
1155d39f272SZheng Fan }
1165d39f272SZheng Fan
1175d39f272SZheng Fan const css::ui::ContextChangeEventObject aEvent(
1185d39f272SZheng Fan rxFrame->getController(),
1195d39f272SZheng Fan rsModuleName,
1205d39f272SZheng Fan rsContextName);
1215d39f272SZheng Fan
1225d39f272SZheng Fan cssu::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer (
1235d39f272SZheng Fan css::ui::ContextChangeEventMultiplexer::get(
1245d39f272SZheng Fan ::comphelper::getProcessComponentContext()));
1255d39f272SZheng Fan if (xMultiplexer.is())
1265d39f272SZheng Fan xMultiplexer->broadcastContextChangeEvent(aEvent, rxFrame->getController());
1275d39f272SZheng Fan }
1285d39f272SZheng Fan
1295d39f272SZheng Fan
1305d39f272SZheng Fan
1315d39f272SZheng Fan
GetModuleName(const cssu::Reference<css::frame::XFrame> & rxFrame)1325d39f272SZheng Fan OUString ContextChangeBroadcaster::GetModuleName (const cssu::Reference<css::frame::XFrame>& rxFrame)
1335d39f272SZheng Fan {
13483713eddSAndre Fischer if ( ! rxFrame.is() || ! rxFrame->getController().is())
13583713eddSAndre Fischer return OUString();
1365d39f272SZheng Fan OUString sModuleName;
1375d39f272SZheng Fan try
1385d39f272SZheng Fan {
1395d39f272SZheng Fan const ::comphelper::ComponentContext aContext (::comphelper::getProcessServiceFactory());
1405d39f272SZheng Fan const Reference<frame::XModuleManager> xModuleManager (
1415d39f272SZheng Fan aContext.createComponent("com.sun.star.frame.ModuleManager" ),
1425d39f272SZheng Fan UNO_QUERY_THROW );
1435d39f272SZheng Fan return xModuleManager->identify(rxFrame);
1445d39f272SZheng Fan }
1455d39f272SZheng Fan catch (const Exception&)
1465d39f272SZheng Fan {
1475d39f272SZheng Fan OSL_ENSURE(false, "can not determine module name");
1485d39f272SZheng Fan }
1495d39f272SZheng Fan return OUString();
1505d39f272SZheng Fan }
1515d39f272SZheng Fan
1525d39f272SZheng Fan
1535d39f272SZheng Fan
1545d39f272SZheng Fan } } // end of namespace ::sd::sidebar
155