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