1*5d39f272SZheng Fan /************************************************************** 2*5d39f272SZheng Fan * 3*5d39f272SZheng Fan * Licensed to the Apache Software Foundation (ASF) under one 4*5d39f272SZheng Fan * or more contributor license agreements. See the NOTICE file 5*5d39f272SZheng Fan * distributed with this work for additional information 6*5d39f272SZheng Fan * regarding copyright ownership. The ASF licenses this file 7*5d39f272SZheng Fan * to you under the Apache License, Version 2.0 (the 8*5d39f272SZheng Fan * "License"); you may not use this file except in compliance 9*5d39f272SZheng Fan * with the License. You may obtain a copy of the License at 10*5d39f272SZheng Fan * 11*5d39f272SZheng Fan * http://www.apache.org/licenses/LICENSE-2.0 12*5d39f272SZheng Fan * 13*5d39f272SZheng Fan * Unless required by applicable law or agreed to in writing, 14*5d39f272SZheng Fan * software distributed under the License is distributed on an 15*5d39f272SZheng Fan * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5d39f272SZheng Fan * KIND, either express or implied. See the License for the 17*5d39f272SZheng Fan * specific language governing permissions and limitations 18*5d39f272SZheng Fan * under the License. 19*5d39f272SZheng Fan * 20*5d39f272SZheng Fan *************************************************************/ 21*5d39f272SZheng Fan 22*5d39f272SZheng Fan #include "precompiled_sfx2.hxx" 23*5d39f272SZheng Fan 24*5d39f272SZheng Fan #include "sfx2/sidebar/ContextChangeBroadcaster.hxx" 25*5d39f272SZheng Fan #include "sfx2/sidebar/EnumContext.hxx" 26*5d39f272SZheng Fan #include <com/sun/star/ui/ContextChangeEventObject.hpp> 27*5d39f272SZheng Fan #include <com/sun/star/ui/ContextChangeEventMultiplexer.hpp> 28*5d39f272SZheng Fan #include <com/sun/star/frame/XModuleManager.hpp> 29*5d39f272SZheng Fan #include <comphelper/componentcontext.hxx> 30*5d39f272SZheng Fan #include <comphelper/processfactory.hxx> 31*5d39f272SZheng Fan 32*5d39f272SZheng Fan 33*5d39f272SZheng Fan using ::rtl::OUString; 34*5d39f272SZheng Fan using namespace css; 35*5d39f272SZheng Fan using namespace cssu; 36*5d39f272SZheng Fan 37*5d39f272SZheng Fan namespace sfx2 { namespace sidebar { 38*5d39f272SZheng Fan 39*5d39f272SZheng Fan 40*5d39f272SZheng Fan ContextChangeBroadcaster::ContextChangeBroadcaster (void) 41*5d39f272SZheng Fan : msContextName(), 42*5d39f272SZheng Fan mbIsContextActive(false) 43*5d39f272SZheng Fan { 44*5d39f272SZheng Fan } 45*5d39f272SZheng Fan 46*5d39f272SZheng Fan 47*5d39f272SZheng Fan 48*5d39f272SZheng Fan ContextChangeBroadcaster::~ContextChangeBroadcaster (void) 49*5d39f272SZheng Fan { 50*5d39f272SZheng Fan } 51*5d39f272SZheng Fan 52*5d39f272SZheng Fan 53*5d39f272SZheng Fan 54*5d39f272SZheng Fan 55*5d39f272SZheng Fan void ContextChangeBroadcaster::Initialize (const ::rtl::OUString& rsContextName) 56*5d39f272SZheng Fan { 57*5d39f272SZheng Fan OSL_ASSERT( ! mbIsContextActive); 58*5d39f272SZheng Fan 59*5d39f272SZheng Fan msContextName = rsContextName; 60*5d39f272SZheng Fan } 61*5d39f272SZheng Fan 62*5d39f272SZheng Fan 63*5d39f272SZheng Fan 64*5d39f272SZheng Fan 65*5d39f272SZheng Fan void ContextChangeBroadcaster::Activate (const cssu::Reference<css::frame::XFrame>& rxFrame) 66*5d39f272SZheng Fan { 67*5d39f272SZheng Fan if (msContextName.getLength() > 0) 68*5d39f272SZheng Fan BroadcastContextChange(rxFrame, GetModuleName(rxFrame), msContextName); 69*5d39f272SZheng Fan } 70*5d39f272SZheng Fan 71*5d39f272SZheng Fan 72*5d39f272SZheng Fan 73*5d39f272SZheng Fan 74*5d39f272SZheng Fan void ContextChangeBroadcaster::Deactivate (const cssu::Reference<css::frame::XFrame>& rxFrame) 75*5d39f272SZheng Fan { 76*5d39f272SZheng Fan if (msContextName.getLength() > 0) 77*5d39f272SZheng Fan { 78*5d39f272SZheng Fan BroadcastContextChange( 79*5d39f272SZheng Fan rxFrame, 80*5d39f272SZheng Fan GetModuleName(rxFrame), 81*5d39f272SZheng Fan EnumContext::GetContextName(EnumContext::Context_Default)); 82*5d39f272SZheng Fan } 83*5d39f272SZheng Fan } 84*5d39f272SZheng Fan 85*5d39f272SZheng Fan 86*5d39f272SZheng Fan 87*5d39f272SZheng Fan 88*5d39f272SZheng Fan void ContextChangeBroadcaster::BroadcastContextChange ( 89*5d39f272SZheng Fan const cssu::Reference<css::frame::XFrame>& rxFrame, 90*5d39f272SZheng Fan const ::rtl::OUString& rsModuleName, 91*5d39f272SZheng Fan const ::rtl::OUString& rsContextName) 92*5d39f272SZheng Fan { 93*5d39f272SZheng Fan if (rsContextName.getLength() == 0) 94*5d39f272SZheng Fan return; 95*5d39f272SZheng Fan 96*5d39f272SZheng Fan if ( ! rxFrame.is()) 97*5d39f272SZheng Fan { 98*5d39f272SZheng Fan OSL_ENSURE(false, "Activate called with invalid frame"); 99*5d39f272SZheng Fan return; 100*5d39f272SZheng Fan } 101*5d39f272SZheng Fan 102*5d39f272SZheng Fan const css::ui::ContextChangeEventObject aEvent( 103*5d39f272SZheng Fan rxFrame->getController(), 104*5d39f272SZheng Fan rsModuleName, 105*5d39f272SZheng Fan rsContextName); 106*5d39f272SZheng Fan 107*5d39f272SZheng Fan cssu::Reference<css::ui::XContextChangeEventMultiplexer> xMultiplexer ( 108*5d39f272SZheng Fan css::ui::ContextChangeEventMultiplexer::get( 109*5d39f272SZheng Fan ::comphelper::getProcessComponentContext())); 110*5d39f272SZheng Fan if (xMultiplexer.is()) 111*5d39f272SZheng Fan xMultiplexer->broadcastContextChangeEvent(aEvent, rxFrame->getController()); 112*5d39f272SZheng Fan } 113*5d39f272SZheng Fan 114*5d39f272SZheng Fan 115*5d39f272SZheng Fan 116*5d39f272SZheng Fan 117*5d39f272SZheng Fan OUString ContextChangeBroadcaster::GetModuleName (const cssu::Reference<css::frame::XFrame>& rxFrame) 118*5d39f272SZheng Fan { 119*5d39f272SZheng Fan OUString sModuleName; 120*5d39f272SZheng Fan try 121*5d39f272SZheng Fan { 122*5d39f272SZheng Fan const ::comphelper::ComponentContext aContext (::comphelper::getProcessServiceFactory()); 123*5d39f272SZheng Fan const Reference<frame::XModuleManager> xModuleManager ( 124*5d39f272SZheng Fan aContext.createComponent("com.sun.star.frame.ModuleManager" ), 125*5d39f272SZheng Fan UNO_QUERY_THROW ); 126*5d39f272SZheng Fan return xModuleManager->identify(rxFrame); 127*5d39f272SZheng Fan } 128*5d39f272SZheng Fan catch (const Exception&) 129*5d39f272SZheng Fan { 130*5d39f272SZheng Fan OSL_ENSURE(false, "can not determine module name"); 131*5d39f272SZheng Fan } 132*5d39f272SZheng Fan return OUString(); 133*5d39f272SZheng Fan } 134*5d39f272SZheng Fan 135*5d39f272SZheng Fan 136*5d39f272SZheng Fan 137*5d39f272SZheng Fan } } // end of namespace ::sd::sidebar 138