Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <svl/itempool.hxx>
21 : :
22 : : #include <sfx2/ctrlitem.hxx>
23 : : #include <sfx2/bindings.hxx>
24 : : #include <sfx2/dispatch.hxx>
25 : : #include <sfx2/msgpool.hxx>
26 : : #include "statcach.hxx"
27 : : #include <sfx2/viewfrm.hxx>
28 : :
29 : : //====================================================================
30 : :
31 : : DBG_NAME(SfxControllerItem);
32 : :
33 : : //--------------------------------------------------------------------
34 : : #ifdef DBG_UTIL
35 : :
36 : : void SfxControllerItem::CheckConfigure_Impl( sal_uIntPtr nType )
37 : : {
38 : : // Real Slot? (i.e. no Separator etc.)
39 : : if ( !nId )
40 : : return;
41 : :
42 : : // is the ID configurable at all in 'nType'?
43 : : const SfxSlot *pSlot = SFX_SLOTPOOL().GetSlot(nId);
44 : : DBG_ASSERTWARNING( pSlot, "SfxControllerItem: binding not existing slot" );
45 : : if ( pSlot && !pSlot->IsMode(nType) )
46 : : {
47 : : DBG_WARNING( "SfxControllerItem: slot without ...Config-flag" );
48 : : DbgOutf( "SfxControllerItem: Config-flag missing at SID %5d",
49 : : pSlot->GetSlotId() );
50 : : }
51 : : }
52 : :
53 : : #endif
54 : :
55 : : //--------------------------------------------------------------------
56 : : // returns the next registered SfxControllerItem with the same id
57 : :
58 : 114510 : SfxControllerItem* SfxControllerItem::GetItemLink()
59 : : {
60 : : DBG_CHKTHIS(SfxControllerItem, 0);
61 [ + - ]: 114510 : return pNext == this ? 0 : pNext;
62 : : }
63 : :
64 : : //--------------------------------------------------------------------
65 : : // returns sal_True if this binding is really bound to a function
66 : :
67 : 365666 : sal_Bool SfxControllerItem::IsBound() const
68 : : {
69 : : DBG_CHKTHIS(SfxControllerItem, 0);
70 : 365666 : return pNext != this;
71 : : }
72 : :
73 : : //====================================================================
74 : : // registeres with the id at the bindings
75 : :
76 : 29854 : void SfxControllerItem::Bind( sal_uInt16 nNewId, SfxBindings *pBindinx )
77 : : {
78 : : DBG_CHKTHIS(SfxControllerItem, 0);
79 : : DBG_ASSERT(pBindings || pBindinx, "No Bindings");
80 : :
81 [ - + ]: 29854 : if ( IsBound() ) {
82 : : DBG_ASSERT(pBindings, "No Bindings");
83 : 0 : pBindings->Release(*this);
84 : : }
85 : :
86 : 29854 : nId = nNewId;
87 : 29854 : pNext = 0;
88 : :
89 [ + - ]: 29854 : if (pBindinx)
90 : 29854 : pBindings = pBindinx;
91 : 29854 : pBindings->Register(*this);
92 : 29854 : }
93 : :
94 : 102819 : void SfxControllerItem::BindInternal_Impl( sal_uInt16 nNewId, SfxBindings *pBindinx )
95 : : {
96 : : DBG_CHKTHIS(SfxControllerItem, 0);
97 : : DBG_ASSERT(pBindings || pBindinx, "No Bindings");
98 : :
99 [ - + ]: 102819 : if ( IsBound() ) {
100 : : DBG_ASSERT(pBindings, "No Bindings");
101 : 0 : pBindings->Release(*this);
102 : : }
103 : :
104 : 102819 : nId = nNewId;
105 : 102819 : pNext = 0;
106 : :
107 [ + - ]: 102819 : if (pBindinx)
108 : 102819 : pBindings = pBindinx;
109 : 102819 : pBindings->RegisterInternal_Impl(*this);
110 : 102819 : }
111 : :
112 : :
113 : : //====================================================================
114 : :
115 : 157267 : void SfxControllerItem::UnBind()
116 : :
117 : : /* [Description]
118 : :
119 : : Unbinds the connection of this SfxControllerItems with the SfxBindings
120 : : instance with which it to time is bound. From this time on it does not
121 : : receive any status notifications (<SfxControllerItem::StateChented()>)
122 : : anymore.
123 : :
124 : : [Cross-reference]
125 : :
126 : : <SfxControllerItem::ReBind()>
127 : : <SfxControllerItem::ClearCache()>
128 : : */
129 : : {
130 : : DBG_CHKTHIS(SfxControllerItem, 0);
131 : : DBG_ASSERT(pBindings, "No Bindings");
132 : : DBG_ASSERT( IsBound(), "unbindings unbound SfxControllerItem" );
133 : :
134 : 157267 : pBindings->Release(*this);
135 : 157267 : pNext = this;
136 : 157267 : }
137 : :
138 : : //====================================================================
139 : :
140 : 27624 : void SfxControllerItem::ReBind()
141 : :
142 : : /* [Description]
143 : :
144 : : Binds this SfxControllerItem with the SfxBindings instance again,
145 : : with which it was last bound. From this time on it does receive status
146 : : notifications (<SfxControllerItem::StateChented()>) again.
147 : :
148 : : [Cross-reference]
149 : :
150 : : <SfxControllerItem::UnBind()>
151 : : <SfxControllerItem::ClearCache()>
152 : : */
153 : :
154 : : {
155 : : DBG_CHKTHIS(SfxControllerItem, 0);
156 : : DBG_ASSERT(pBindings, "No Bindings");
157 : : DBG_ASSERT( !IsBound(), "bindings rebound SfxControllerItem" );
158 : :
159 : 27624 : pBindings->Register(*this);
160 : 27624 : }
161 : :
162 : : //--------------------------------------------------------------------
163 : :
164 : 0 : void SfxControllerItem::ClearCache()
165 : :
166 : : /* [Description]
167 : :
168 : : Clears the cache status for this SfxControllerItem. That is by the next
169 : : status update is the <SfxPoolItem> sent in any case, even if the same was
170 : : sent before. This is needed if a controller can be switched on and note
171 : : that status themselves.
172 : :
173 : : [Example]
174 : :
175 : : The combined controller for adjusting the surface type and the concrete
176 : : expression (blue color, or hatching X) can be changed in type, but is then
177 : : notified of the next selection again, even if it the same data.
178 : :
179 : : [Cross-reference]
180 : :
181 : : <SfxControllerItem::UnBind()>
182 : : <SfxControllerItem::ReBind()>
183 : : */
184 : :
185 : :
186 : : {
187 : : DBG_CHKTHIS(SfxControllerItem, 0);
188 : : DBG_ASSERT(pBindings, "No Bindings");
189 : :
190 : 0 : pBindings->ClearCache_Impl( GetId() );
191 : 0 : }
192 : :
193 : : //--------------------------------------------------------------------
194 : : // replaces the successor in the list of bindings of the same id
195 : :
196 : 71276 : SfxControllerItem* SfxControllerItem::ChangeItemLink( SfxControllerItem* pNewLink )
197 : : {
198 : : DBG_CHKTHIS(SfxControllerItem, 0);
199 : 71276 : SfxControllerItem* pOldLink = pNext;
200 : 71276 : pNext = pNewLink;
201 [ + + ]: 71276 : return pOldLink == this ? 0 : pOldLink;
202 : : }
203 : :
204 : : //--------------------------------------------------------------------
205 : : // changes the id of unbound functions (e.g. for sub-menu-ids)
206 : :
207 : 103133 : void SfxControllerItem::SetId( sal_uInt16 nItemId )
208 : : {
209 : : DBG_CHKTHIS(SfxControllerItem, 0);
210 : : DBG_ASSERT( !IsBound(), "changing id of bound binding" );
211 : 103133 : nId = nItemId;
212 : 103133 : }
213 : :
214 : : //--------------------------------------------------------------------
215 : :
216 : : // creates a atomic item for a controller without registration.
217 : :
218 : 103133 : SfxControllerItem::SfxControllerItem():
219 : : nId(0),
220 : : pNext(this),
221 : 103133 : pBindings(0)
222 : : {
223 : : DBG_CTOR(SfxControllerItem, 0);
224 : 103133 : }
225 : :
226 : : //--------------------------------------------------------------------
227 : : // creates a representation of the function nId and registeres it
228 : :
229 : 29854 : SfxControllerItem::SfxControllerItem( sal_uInt16 nID, SfxBindings &rBindings ):
230 : : nId(nID),
231 : : pNext(this),
232 : 29854 : pBindings(&rBindings)
233 : : {
234 : : DBG_CTOR(SfxControllerItem, 0);
235 : 29854 : Bind(nId, &rBindings);
236 : 29854 : }
237 : :
238 : : //--------------------------------------------------------------------
239 : : // unregisteres the item in the bindings
240 : :
241 : 130047 : SfxControllerItem::~SfxControllerItem()
242 : : {
243 [ + + ]: 130047 : if ( IsBound() )
244 : 1830 : pBindings->Release(*this);
245 : : DBG_DTOR(SfxControllerItem, 0);
246 [ - + ]: 130047 : }
247 : :
248 : : //--------------------------------------------------------------------
249 : :
250 : 14 : void SfxControllerItem::StateChanged
251 : : (
252 : : sal_uInt16, // <SID> of the triggering slot
253 : : SfxItemState, // <SfxItemState> of 'pState'
254 : : const SfxPoolItem* // Slot-Status, NULL or IsInvalidItem()
255 : : )
256 : :
257 : : /* [Description]
258 : :
259 : : This virtual method is called by the SFx to inform the <SfxControllerItem>s
260 : : is about that state of the slots 'NSID' has changed. The new value and the
261 : : value determined by this status is given as 'pState' or 'eState'.
262 : :
263 : : The status of a slot may change, for example when the MDI window is
264 : : switched or when the slot was invalidated explicitly with
265 : : <SfxBindings::Invalidate()>.
266 : :
267 : : Achtung! Die Methode wird nicht gerufen, wenn der Slot ung"ultig wurde,
268 : : danach jedoch wieder denselben Wert angenommen hat.
269 : :
270 : : Beware! The method is not called when the slot is invalid, however
271 : : has again assumed the same value.
272 : :
273 : : This base class need not be called, further interim steps however
274 : : (eg <SfxToolboxControl> ) should be called.
275 : : */
276 : :
277 : : {
278 : : DBG_CHKTHIS(SfxControllerItem, 0);
279 : 14 : }
280 : :
281 : : //--------------------------------------------------------------------
282 : :
283 : 29752 : void SfxControllerItem::DeleteFloatingWindow()
284 : : {
285 : : DBG_CHKTHIS(SfxControllerItem, 0);
286 : 29752 : }
287 : :
288 : : //--------------------------------------------------------------------
289 : :
290 : 0 : void SfxStatusForwarder::StateChanged
291 : : (
292 : : sal_uInt16 nSID, // <SID> of the triggering slot
293 : : SfxItemState eState, // <SfxItemState> of 'pState'
294 : : const SfxPoolItem* pState // Slot-Status, NULL or IsInvalidItem()
295 : : )
296 : :
297 : : {
298 : 0 : pMaster->StateChanged( nSID, eState, pState );
299 : 0 : }
300 : :
301 : : //--------------------------------------------------------------------
302 : :
303 : 0 : SfxStatusForwarder::SfxStatusForwarder(
304 : : sal_uInt16 nSlotId,
305 : : SfxControllerItem& rMaster ):
306 : 0 : SfxControllerItem( nSlotId, rMaster.GetBindings() ),
307 : 0 : pMaster( &rMaster )
308 : : {
309 : 0 : }
310 : :
311 : : //--------------------------------------------------------------------
312 : :
313 : 542 : SfxItemState SfxControllerItem::GetItemState
314 : : (
315 : : const SfxPoolItem* pState /* Pointer to <SfxPoolItem>, which
316 : : Status should be queried. */
317 : : )
318 : :
319 : : /* [Description]
320 : :
321 : : Static method to determine the status of the SfxPoolItem-Pointers, to be
322 : : used in the method <SfxControllerItem::StateChanged(const SfxPoolItem*)>
323 : :
324 : : [Return value]
325 : :
326 : : SfxItemState SFX_ITEM_UNKNOWN
327 : : Enabled, but no further status information available.
328 : : Typical for <Slot>s, which anyway are sometimes
329 : : disabled, but otherwise do not change their appearance.
330 : :
331 : : SFX_ITEM_DISABLED
332 : : Disabled and no further status information available.
333 : : All other values that may appear should be reset to
334 : : default.
335 : :
336 : : SFX_ITEM_DONTCARE
337 : : Enabled but there were only ambiguous values available
338 : : (i.e. non that can be queried).
339 : :
340 : : SFX_ITEM_AVAILABLE
341 : : Enabled and with available values, which are queried
342 : : by 'pState'. The Type is thus clearly defined in the
343 : : entire Program and specified through the Slot.
344 : : */
345 : :
346 : : {
347 : : return !pState
348 : : ? SFX_ITEM_DISABLED
349 : 542 : : IsInvalidItem(pState)
350 : : ? SFX_ITEM_DONTCARE
351 : 542 : : pState->ISA(SfxVoidItem) && !pState->Which()
352 : : ? SFX_ITEM_UNKNOWN
353 [ + - + - : 1626 : : SFX_ITEM_AVAILABLE;
- + # # ]
354 : : }
355 : :
356 : : //------------------------------------------------------------------------
357 : :
358 : : #ifdef _MSC_VER
359 : : #pragma optimize("g",off)
360 : : #endif
361 : :
362 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|