merged tag ooo/DEV300_m102
[LibreOffice.git] / sfx2 / source / control / ctrlitem.cxx
blobe90b680ffa13a4e8f1752da16008ff1d66392244
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sfx2.hxx"
30 #include <svl/itempool.hxx>
31 #ifndef GCC
32 #endif
34 #include <sfx2/ctrlitem.hxx>
35 #include <sfx2/bindings.hxx>
36 #include <sfx2/dispatch.hxx>
37 #include <sfx2/msgpool.hxx>
38 #include "statcach.hxx"
39 #include <sfx2/viewfrm.hxx>
41 //====================================================================
43 DBG_NAME(SfxControllerItem);
45 //--------------------------------------------------------------------
46 #ifdef DBG_UTIL
48 void SfxControllerItem::CheckConfigure_Impl( sal_uIntPtr nType )
50 // echter Slot? (also kein Separator etc.)
51 if ( !nId )
52 return;
54 // ist die Id "uberhaupt in 'nType' konfigurierbar?
55 const SfxSlot *pSlot = SFX_SLOTPOOL().GetSlot(nId);
56 DBG_ASSERTWARNING( pSlot, "SfxControllerItem: binding not existing slot" );
57 if ( pSlot && !pSlot->IsMode(nType) )
59 DBG_WARNING( "SfxControllerItem: slot without ...Config-flag" );
60 DbgOutf( "SfxControllerItem: Config-flag missing at SID %5d",
61 pSlot->GetSlotId() );
65 #endif
67 //--------------------------------------------------------------------
69 // returns the next registered SfxControllerItem with the same id
71 SfxControllerItem* SfxControllerItem::GetItemLink()
73 DBG_MEMTEST();
74 DBG_CHKTHIS(SfxControllerItem, 0);
75 return pNext == this ? 0 : pNext;
78 //--------------------------------------------------------------------
80 // returns sal_True if this binding is really bound to a function
82 sal_Bool SfxControllerItem::IsBound() const
84 DBG_MEMTEST();
85 DBG_CHKTHIS(SfxControllerItem, 0);
86 return pNext != this;
89 //--------------------------------------------------------------------
91 // returns the associated function-id or 0 if none
93 // sal_uInt16 SfxControllerItem::GetId() const;
95 //====================================================================
97 // registeres with the id at the bindings
99 void SfxControllerItem::Bind( sal_uInt16 nNewId, SfxBindings *pBindinx )
101 DBG_MEMTEST();
102 DBG_CHKTHIS(SfxControllerItem, 0);
103 DBG_ASSERT(pBindings || pBindinx, "Keine Bindings");
105 if ( IsBound() ) {
106 DBG_ASSERT(pBindings, "Keine Bindings");
107 pBindings->Release(*this);
110 nId = nNewId;
111 pNext = 0;
113 if (pBindinx)
114 pBindings = pBindinx;
115 pBindings->Register(*this);
118 void SfxControllerItem::BindInternal_Impl( sal_uInt16 nNewId, SfxBindings *pBindinx )
120 DBG_MEMTEST();
121 DBG_CHKTHIS(SfxControllerItem, 0);
122 DBG_ASSERT(pBindings || pBindinx, "Keine Bindings");
124 if ( IsBound() ) {
125 DBG_ASSERT(pBindings, "Keine Bindings");
126 pBindings->Release(*this);
129 nId = nNewId;
130 pNext = 0;
132 if (pBindinx)
133 pBindings = pBindinx;
134 pBindings->RegisterInternal_Impl(*this);
138 //====================================================================
140 void SfxControllerItem::UnBind()
142 /* [Beschreibung]
144 "ost die Verbindung dieses SfxControllerItems mit der SfxBindings-Instanz,
145 an der es zur Zeit gebunden ist. Ab diesem Zeitpunkt erh"alt es keine
146 Statusbenachrichtigungen (<SfxControllerItem::StateChented()>) mehr.
149 [Querverweise]
151 <SfxControllerItem::ReBind()>
152 <SfxControllerItem::ClearCache()>
155 DBG_MEMTEST();
156 DBG_CHKTHIS(SfxControllerItem, 0);
157 DBG_ASSERT(pBindings, "Keine Bindings");
158 DBG_ASSERT( IsBound(), "unbindings unbound SfxControllerItem" );
160 pBindings->Release(*this);
161 pNext = this;
164 //====================================================================
166 void SfxControllerItem::ReBind()
168 /* [Beschreibung]
170 Binded dieses SfxControllerItem wieder an die SfxBindings-Instanz,
171 an der es zuletzt gebunden war. Ab diesem Zeitpunkt erh"alt es wieder
172 Statusbenachrichtigungen (<SfxControllerItem::StateChented()>).
175 [Querverweise]
177 <SfxControllerItem::UnBind()>
178 <SfxControllerItem::ClearCache()>
182 DBG_MEMTEST();
183 DBG_CHKTHIS(SfxControllerItem, 0);
184 DBG_ASSERT(pBindings, "Keine Bindings");
185 DBG_ASSERT( !IsBound(), "bindings rebound SfxControllerItem" );
187 pBindings->Register(*this);
190 //====================================================================
192 void SfxControllerItem::UpdateSlot()
194 /* [Beschreibung]
196 Holt den Status 'hart' neu.
198 [Querverweise]
200 <SfxControllerItem::ClearCache()>
204 DBG_MEMTEST();
205 DBG_CHKTHIS(SfxControllerItem, 0);
206 DBG_ASSERT(pBindings, "Keine Bindings");
208 pBindings->Update( GetId() );
211 //--------------------------------------------------------------------
213 void SfxControllerItem::ClearCache()
215 /* [Beschreibung]
217 "oscht den Status-Cache f"ur dieses SfxControllerItem. D.h. beim
218 n"achsten Status-Update wird das <SfxPoolItem> auf jeden Fall geschickt,
219 auch wenn zuvor dasselbe geschickt wurde. Dies wird ben"otigt, wenn
220 ein Controller umgeschaltet werden kann und sich diesen Status
221 selbst merkt.
224 [Beispiel]
226 Der Kombi-Controller f"ur das Einstellen des Fl"achentyps und der
227 konkreten Auspr"agung (Farbe blau oder Schraffur X) kann im Typ
228 umgestellt werden, wird jedoch dann bei der n"achsten Selektion
229 wieder benachrichtigt, auch wenn es dieselben Daten sind.
232 [Querverweise]
234 <SfxControllerItem::UnBind()>
235 <SfxControllerItem::ReBind()>
240 DBG_MEMTEST();
241 DBG_CHKTHIS(SfxControllerItem, 0);
242 DBG_ASSERT(pBindings, "Keine Bindings");
244 pBindings->ClearCache_Impl( GetId() );
247 //--------------------------------------------------------------------
249 // replaces the successor in the list of bindings of the same id
251 SfxControllerItem* SfxControllerItem::ChangeItemLink( SfxControllerItem* pNewLink )
253 DBG_MEMTEST();
254 DBG_CHKTHIS(SfxControllerItem, 0);
255 SfxControllerItem* pOldLink = pNext;
256 pNext = pNewLink;
257 return pOldLink == this ? 0 : pOldLink;
260 //--------------------------------------------------------------------
262 // changes the id of unbound functions (e.g. for sub-menu-ids)
264 void SfxControllerItem::SetId( sal_uInt16 nItemId )
266 DBG_MEMTEST();
267 DBG_CHKTHIS(SfxControllerItem, 0);
268 DBG_ASSERT( !IsBound(), "changing id of bound binding" );
269 nId = nItemId;
272 //--------------------------------------------------------------------
274 // creates a atomic item for a controller without registration
276 SfxControllerItem::SfxControllerItem():
277 nId(0),
278 pNext(this),
279 pBindings(0)
281 DBG_MEMTEST();
282 DBG_CTOR(SfxControllerItem, 0);
285 //--------------------------------------------------------------------
287 // creates a representation of the function nId and registeres it
289 SfxControllerItem::SfxControllerItem( sal_uInt16 nID, SfxBindings &rBindings ):
290 nId(nID),
291 pNext(this),
292 pBindings(&rBindings)
294 DBG_MEMTEST();
295 DBG_CTOR(SfxControllerItem, 0);
296 Bind(nId, &rBindings);
299 //--------------------------------------------------------------------
301 // unregisteres the item in the bindings
303 SfxControllerItem::~SfxControllerItem()
305 DBG_MEMTEST();
306 if ( IsBound() )
307 pBindings->Release(*this);
308 DBG_DTOR(SfxControllerItem, 0);
311 //--------------------------------------------------------------------
313 void SfxControllerItem::StateChanged
315 sal_uInt16 , // <SID> des ausl"osenden Slot
316 SfxItemState , // <SfxItemState> von 'pState'
317 const SfxPoolItem* // Slot-Status, ggf. 0 oder IsInvalidItem()
320 /* [Beschreibung]
322 Diese virtuelle Methode wird vom SFx gerufen, um <SfxControllerItem>s
323 dar"uber zu benachrichtigen, da\s sich der Status des Slots 'nSID'
324 ge"andert hat. Der neue Wert sowie der von diesem Wert ermittelte
325 Status wird als 'pState' bzw. 'eState' mitgegeben.
327 Der Status eines Slots kann sich "andern, wenn z.B. das MDI-Fenster
328 gewechselt wird oder der Slot explizit mit <SfxBindings::Invalidate()>
329 invalidiert wurde.
331 Achtung! Die Methode wird nicht gerufen, wenn der Slot ung"ultig wurde,
332 danach jedoch wieder denselben Wert angenommen hat.
334 Diese Basisklasse braucht nicht gerufen zu werden, weitere Zwischenstufen
335 jedoch (z.B. <SfxToolboxControl>) sollten gerufen werden.
339 DBG_MEMTEST();
340 DBG_CHKTHIS(SfxControllerItem, 0);
343 //--------------------------------------------------------------------
345 void SfxControllerItem::DeleteFloatingWindow()
347 DBG_MEMTEST();
348 DBG_CHKTHIS(SfxControllerItem, 0);
351 //--------------------------------------------------------------------
353 void SfxStatusForwarder::StateChanged
355 sal_uInt16 nSID, // <SID> des ausl"osenden Slot
356 SfxItemState eState, // <SfxItemState> von 'pState'
357 const SfxPoolItem* pState // Slot-Status, ggf. 0 oder IsInvalidItem()
361 pMaster->StateChanged( nSID, eState, pState );
364 //--------------------------------------------------------------------
366 SfxStatusForwarder::SfxStatusForwarder(
367 sal_uInt16 nSlotId,
368 SfxControllerItem& rMaster ):
369 SfxControllerItem( nSlotId, rMaster.GetBindings() ),
370 pMaster( &rMaster )
374 //--------------------------------------------------------------------
376 SfxItemState SfxControllerItem::GetItemState
378 const SfxPoolItem* pState /* Pointer auf das <SfxPoolItem>, dessen
379 Status erfragt werden soll. */
382 /* [Beschreibung]
384 Statische Methode zum Ermitteln des Status des SfxPoolItem-Pointers,
385 in der Methode <SfxControllerItem::StateChanged(const SfxPoolItem*)>
386 zu verwenden.
388 [R"uckgabewert]
390 SfxItemState SFX_ITEM_UNKNOWN
391 Enabled, aber keine weitere Statusinformation
392 verf"ugbar. Typisch f"ur <Slot>s, die allenfalls
393 zeitweise disabled sind, aber ihre Darstellung sonst
394 nicht "andern.
396 SFX_ITEM_DISABLED
397 Disabled und keine weiter Statusinformation
398 verf"ugbar. Alle anderen ggf. angezeigten Werte sollten
399 auf den Default zur"uckgesetzt werden.
401 SFX_ITEM_DONTCARE
402 Enabled aber es waren nur uneindeutige Werte
403 verf"ugbar (also keine, die abgefragt werden k"onnen).
405 SFX_ITEM_AVAILABLE
406 Enabled und mit verf"ugbarem Wert, der von 'pState'
407 erfragbar ist. Der Typ ist dabei im gesamten
408 Programm eindeutig und durch den Slot festgelegt.
412 return !pState
413 ? SFX_ITEM_DISABLED
414 : IsInvalidItem(pState)
415 ? SFX_ITEM_DONTCARE
416 : pState->ISA(SfxVoidItem) && !pState->Which()
417 ? SFX_ITEM_UNKNOWN
418 : SFX_ITEM_AVAILABLE;
421 //--------------------------------------------------------------------
423 SfxMapUnit SfxControllerItem::GetCoreMetric() const
425 /* [Beschreibung]
427 Holt vom zust"andigen Pool die Ma\seinheit ab, in der das Status-Item
428 vorliegt.
432 SfxStateCache *pCache = pBindings->GetStateCache( nId );
433 SfxDispatcher *pDispat = pBindings->GetDispatcher_Impl();
435 if ( !pDispat )
437 SfxViewFrame* pViewFrame = SfxViewFrame::Current();
438 if ( !pViewFrame )
439 SfxViewFrame::GetFirst();
440 if ( pViewFrame )
441 pDispat = pViewFrame->GetDispatcher();
444 if ( pDispat && pCache )
446 const SfxSlotServer *pServer = pCache->GetSlotServer( *pDispat );
447 if ( pServer )
449 SfxShell *pSh = pDispat->GetShell( pServer->GetShellLevel() );
450 SfxItemPool &rPool = pSh->GetPool();
451 sal_uInt16 nWhich = rPool.GetWhich( nId );
452 return rPool.GetMetric( nWhich );
456 DBG_WARNING( "W1: Can not find ItemPool!" );
457 return SFX_MAPUNIT_100TH_MM;
460 //------------------------------------------------------------------------
462 #ifdef _MSC_VER
463 #pragma optimize("g",off)
464 #endif