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