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 
405d39f272SZheng Fan ContextChangeBroadcaster::ContextChangeBroadcaster (void)
415d39f272SZheng Fan     : msContextName(),
425d39f272SZheng Fan       mbIsContextActive(false)
435d39f272SZheng Fan {
445d39f272SZheng Fan }
455d39f272SZheng Fan 
465d39f272SZheng Fan 
475d39f272SZheng Fan 
485d39f272SZheng Fan ContextChangeBroadcaster::~ContextChangeBroadcaster (void)
495d39f272SZheng Fan {
505d39f272SZheng Fan }
515d39f272SZheng Fan 
525d39f272SZheng Fan 
535d39f272SZheng Fan 
545d39f272SZheng Fan 
555d39f272SZheng Fan void ContextChangeBroadcaster::Initialize (const ::rtl::OUString& rsContextName)
565d39f272SZheng Fan {
575d39f272SZheng Fan     OSL_ASSERT( ! mbIsContextActive);
585d39f272SZheng Fan 
595d39f272SZheng Fan     msContextName = rsContextName;
605d39f272SZheng Fan }
615d39f272SZheng Fan 
625d39f272SZheng Fan 
635d39f272SZheng Fan 
645d39f272SZheng Fan 
655d39f272SZheng Fan void ContextChangeBroadcaster::Activate (const cssu::Reference<css::frame::XFrame>& rxFrame)
665d39f272SZheng Fan {
675d39f272SZheng Fan     if (msContextName.getLength() > 0)
685d39f272SZheng Fan         BroadcastContextChange(rxFrame, GetModuleName(rxFrame), msContextName);
695d39f272SZheng Fan }
705d39f272SZheng Fan 
715d39f272SZheng Fan 
725d39f272SZheng Fan 
735d39f272SZheng Fan 
745d39f272SZheng Fan void ContextChangeBroadcaster::Deactivate (const cssu::Reference<css::frame::XFrame>& rxFrame)
755d39f272SZheng Fan {
765d39f272SZheng Fan     if (msContextName.getLength() > 0)
775d39f272SZheng Fan     {
785d39f272SZheng Fan         BroadcastContextChange(
795d39f272SZheng Fan             rxFrame,
805d39f272SZheng Fan             GetModuleName(rxFrame),
815d39f272SZheng Fan             EnumContext::GetContextName(EnumContext::Context_Default));
825d39f272SZheng Fan     }
835d39f272SZheng Fan }
845d39f272SZheng Fan 
855d39f272SZheng Fan 
865d39f272SZheng Fan 
875d39f272SZheng Fan 
885d39f272SZheng Fan void ContextChangeBroadcaster::BroadcastContextChange (
895d39f272SZheng Fan     const cssu::Reference<css::frame::XFrame>& rxFrame,
905d39f272SZheng Fan     const ::rtl::OUString& rsModuleName,
915d39f272SZheng Fan     const ::rtl::OUString& rsContextName)
925d39f272SZheng Fan {
935d39f272SZheng Fan     if (rsContextName.getLength() == 0)
945d39f272SZheng Fan         return;
955d39f272SZheng Fan 
96*83713eddSAndre Fischer     if ( ! rxFrame.is() || ! rxFrame->getController().is())
975d39f272SZheng Fan     {
98*83713eddSAndre Fischer         // Frame is (probably) being deleted.  Broadcasting context
99*83713eddSAndre Fischer         // changes is not necessary anymore.
1005d39f272SZheng Fan         return;
1015d39f272SZheng Fan     }
1025d39f272SZheng Fan 
1035d39f272SZheng Fan     const css::ui::ContextChangeEventObject aEvent(
1045d39f272SZheng Fan         rxFrame->getController(),
1055d39f272SZheng Fan         rsModuleName,
1065d39f272SZheng Fan         rsContextName);
1075d39f272SZheng Fan 
1085d39f272SZheng Fan     cssu::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer (
1095d39f272SZheng Fan         css::ui::ContextChangeEventMultiplexer::get(
1105d39f272SZheng Fan             ::comphelper::getProcessComponentContext()));
1115d39f272SZheng Fan     if (xMultiplexer.is())
1125d39f272SZheng Fan         xMultiplexer->broadcastContextChangeEvent(aEvent, rxFrame->getController());
1135d39f272SZheng Fan }
1145d39f272SZheng Fan 
1155d39f272SZheng Fan 
1165d39f272SZheng Fan 
1175d39f272SZheng Fan 
1185d39f272SZheng Fan OUString ContextChangeBroadcaster::GetModuleName (const cssu::Reference<css::frame::XFrame>& rxFrame)
1195d39f272SZheng Fan {
120*83713eddSAndre Fischer     if ( ! rxFrame.is() || ! rxFrame->getController().is())
121*83713eddSAndre Fischer         return OUString();
1225d39f272SZheng Fan     OUString sModuleName;
1235d39f272SZheng Fan     try
1245d39f272SZheng Fan     {
1255d39f272SZheng Fan         const ::comphelper::ComponentContext aContext (::comphelper::getProcessServiceFactory());
1265d39f272SZheng Fan         const Reference<frame::XModuleManager> xModuleManager (
1275d39f272SZheng Fan             aContext.createComponent("com.sun.star.frame.ModuleManager" ),
1285d39f272SZheng Fan             UNO_QUERY_THROW );
1295d39f272SZheng Fan         return xModuleManager->identify(rxFrame);
1305d39f272SZheng Fan     }
1315d39f272SZheng Fan     catch (const Exception&)
1325d39f272SZheng Fan     {
1335d39f272SZheng Fan         OSL_ENSURE(false, "can not determine module name");
1345d39f272SZheng Fan     }
1355d39f272SZheng Fan     return OUString();
1365d39f272SZheng Fan }
1375d39f272SZheng Fan 
1385d39f272SZheng Fan 
1395d39f272SZheng Fan 
1405d39f272SZheng Fan } } // end of namespace ::sd::sidebar
141