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