1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sdext.hxx"
26
27 #include "PresenterFrameworkObserver.hxx"
28 #include <com/sun/star/lang/IllegalArgumentException.hpp>
29 #include <boost/bind.hpp>
30
31 using namespace ::com::sun::star;
32 using namespace ::com::sun::star::uno;
33 using namespace ::com::sun::star::drawing::framework;
34
35 using ::rtl::OUString;
36
37 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
38
39 namespace sdext { namespace presenter {
40
PresenterFrameworkObserver(const css::uno::Reference<css::drawing::framework::XConfigurationController> & rxController,const OUString & rsEventName,const Predicate & rPredicate,const Action & rAction)41 PresenterFrameworkObserver::PresenterFrameworkObserver (
42 const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
43 const OUString& rsEventName,
44 const Predicate& rPredicate,
45 const Action& rAction)
46 : PresenterFrameworkObserverInterfaceBase(m_aMutex),
47 mxConfigurationController(rxController),
48 maPredicate(rPredicate),
49 maAction(rAction)
50 {
51 if ( ! mxConfigurationController.is())
52 throw lang::IllegalArgumentException();
53
54 if (mxConfigurationController->hasPendingRequests())
55 {
56 if (rsEventName.getLength() > 0)
57 {
58 mxConfigurationController->addConfigurationChangeListener(
59 this,
60 rsEventName,
61 Any());
62 }
63 mxConfigurationController->addConfigurationChangeListener(
64 this,
65 A2S("ConfigurationUpdateEnd"),
66 Any());
67 }
68 else
69 {
70 rAction(maPredicate());
71 }
72 }
73
74
75
76
~PresenterFrameworkObserver(void)77 PresenterFrameworkObserver::~PresenterFrameworkObserver (void)
78 {
79 }
80
81
82
83
RunOnResourceActivation(const css::uno::Reference<css::drawing::framework::XConfigurationController> & rxController,const css::uno::Reference<css::drawing::framework::XResourceId> & rxResourceId,const Action & rAction)84 void PresenterFrameworkObserver::RunOnResourceActivation (
85 const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
86 const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId,
87 const Action& rAction)
88 {
89 new PresenterFrameworkObserver(
90 rxController,
91 A2S("ResourceActivation"),
92 ::boost::bind(&PresenterFrameworkObserver::HasResource, rxController, rxResourceId),
93 rAction);
94 }
95
96
97
98
RunOnUpdateEnd(const css::uno::Reference<css::drawing::framework::XConfigurationController> & rxController,const Action & rAction)99 void PresenterFrameworkObserver::RunOnUpdateEnd (
100 const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
101 const Action& rAction)
102 {
103 new PresenterFrameworkObserver(
104 rxController,
105 OUString(),
106 &PresenterFrameworkObserver::True,
107 rAction);
108 }
109
110
111
112
HasResource(const css::uno::Reference<css::drawing::framework::XConfigurationController> & rxController,const css::uno::Reference<css::drawing::framework::XResourceId> & rxResourceId)113 bool PresenterFrameworkObserver::HasResource (
114 const css::uno::Reference<css::drawing::framework::XConfigurationController>&rxController,
115 const css::uno::Reference<css::drawing::framework::XResourceId>& rxResourceId)
116 {
117 return rxController.is() && rxController->getResource(rxResourceId).is();
118 }
119
120
121
122
True(void)123 bool PresenterFrameworkObserver::True (void)
124 {
125 return true;
126 }
127
128
129
130
False(void)131 bool PresenterFrameworkObserver::False (void)
132 {
133 return false;
134 }
135
136
137
138
disposing(void)139 void SAL_CALL PresenterFrameworkObserver::disposing (void)
140 {
141 if ( ! maAction.empty())
142 maAction(false);
143 Shutdown();
144 }
145
146
147
148
Shutdown(void)149 void PresenterFrameworkObserver::Shutdown (void)
150 {
151 maAction = Action();
152 maPredicate = Predicate();
153
154 if (mxConfigurationController != NULL)
155 {
156 mxConfigurationController->removeConfigurationChangeListener(this);
157 mxConfigurationController = NULL;
158 }
159 }
160
161
162
163
disposing(const lang::EventObject & rEvent)164 void SAL_CALL PresenterFrameworkObserver::disposing (const lang::EventObject& rEvent)
165 throw (RuntimeException)
166 {
167 if ( ! rEvent.Source.is())
168 return;
169
170 if (rEvent.Source == mxConfigurationController)
171 {
172 mxConfigurationController = NULL;
173 if ( ! maAction.empty())
174 maAction(false);
175 }
176 }
177
178
179
180
notifyConfigurationChange(const ConfigurationChangeEvent & rEvent)181 void SAL_CALL PresenterFrameworkObserver::notifyConfigurationChange (
182 const ConfigurationChangeEvent& rEvent)
183 throw (RuntimeException)
184 {
185 bool bDispose(false);
186
187 Action aAction (maAction);
188 Predicate aPredicate (maPredicate);
189 if (rEvent.Type.equals(A2S("ConfigurationUpdateEnd")))
190 {
191 Shutdown();
192 aAction(aPredicate);
193 bDispose = true;
194 }
195 else if (aPredicate())
196 {
197 Shutdown();
198 aAction(true);
199 bDispose = true;
200 }
201
202 if (bDispose)
203 {
204 maAction.clear();
205 dispose();
206 }
207 }
208
209 } } // end of namespace ::sdext::presenter
210