merge the formfield patch from ooo-build
[ooovba.git] / sfx2 / source / control / ctrlitem.cxx
blob71bfbbb5c0f12e2c93403c54291799f50ecf3760
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ctrlitem.cxx,v $
10 * $Revision: 1.13 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sfx2.hxx"
33 #include <svtools/itempool.hxx>
34 #ifndef GCC
35 #endif
37 #include <sfx2/ctrlitem.hxx>
38 #include <sfx2/bindings.hxx>
39 #include <sfx2/dispatch.hxx>
40 #include <sfx2/msgpool.hxx>
41 #include "statcach.hxx"
42 #include <sfx2/viewfrm.hxx>
44 //====================================================================
46 DBG_NAME(SfxControllerItem);
48 //--------------------------------------------------------------------
49 #ifdef DBG_UTIL
51 void SfxControllerItem::CheckConfigure_Impl( ULONG nType )
53 // echter Slot? (also kein Separator etc.)
54 if ( !nId )
55 return;
57 // ist die Id "uberhaupt in 'nType' konfigurierbar?
58 const SfxSlot *pSlot = SFX_SLOTPOOL().GetSlot(nId);
59 DBG_ASSERTWARNING( pSlot, "SfxControllerItem: binding not existing slot" );
60 if ( pSlot && !pSlot->IsMode(nType) )
62 DBG_WARNING( "SfxControllerItem: slot without ...Config-flag" );
63 DbgOutf( "SfxControllerItem: Config-flag missing at SID %5d",
64 pSlot->GetSlotId() );
68 #endif
70 //--------------------------------------------------------------------
72 // returns the next registered SfxControllerItem with the same id
74 SfxControllerItem* SfxControllerItem::GetItemLink()
76 DBG_MEMTEST();
77 DBG_CHKTHIS(SfxControllerItem, 0);
78 return pNext == this ? 0 : pNext;
81 //--------------------------------------------------------------------
83 // returns TRUE if this binding is really bound to a function
85 BOOL SfxControllerItem::IsBound() const
87 DBG_MEMTEST();
88 DBG_CHKTHIS(SfxControllerItem, 0);
89 return pNext != this;
92 //--------------------------------------------------------------------
94 // returns the associated function-id or 0 if none
96 // USHORT SfxControllerItem::GetId() const;
98 //====================================================================
100 // registeres with the id at the bindings
102 void SfxControllerItem::Bind( USHORT nNewId, SfxBindings *pBindinx )
104 DBG_MEMTEST();
105 DBG_CHKTHIS(SfxControllerItem, 0);
106 DBG_ASSERT(pBindings || pBindinx, "Keine Bindings");
108 if ( IsBound() ) {
109 DBG_ASSERT(pBindings, "Keine Bindings");
110 pBindings->Release(*this);
113 nId = nNewId;
114 pNext = 0;
116 if (pBindinx)
117 pBindings = pBindinx;
118 pBindings->Register(*this);
121 void SfxControllerItem::BindInternal_Impl( USHORT nNewId, SfxBindings *pBindinx )
123 DBG_MEMTEST();
124 DBG_CHKTHIS(SfxControllerItem, 0);
125 DBG_ASSERT(pBindings || pBindinx, "Keine Bindings");
127 if ( IsBound() ) {
128 DBG_ASSERT(pBindings, "Keine Bindings");
129 pBindings->Release(*this);
132 nId = nNewId;
133 pNext = 0;
135 if (pBindinx)
136 pBindings = pBindinx;
137 pBindings->RegisterInternal_Impl(*this);
141 //====================================================================
143 void SfxControllerItem::UnBind()
145 /* [Beschreibung]
147 "ost die Verbindung dieses SfxControllerItems mit der SfxBindings-Instanz,
148 an der es zur Zeit gebunden ist. Ab diesem Zeitpunkt erh"alt es keine
149 Statusbenachrichtigungen (<SfxControllerItem::StateChented()>) mehr.
152 [Querverweise]
154 <SfxControllerItem::ReBind()>
155 <SfxControllerItem::ClearCache()>
158 DBG_MEMTEST();
159 DBG_CHKTHIS(SfxControllerItem, 0);
160 DBG_ASSERT(pBindings, "Keine Bindings");
161 DBG_ASSERT( IsBound(), "unbindings unbound SfxControllerItem" );
163 pBindings->Release(*this);
164 pNext = this;
167 //====================================================================
169 void SfxControllerItem::ReBind()
171 /* [Beschreibung]
173 Binded dieses SfxControllerItem wieder an die SfxBindings-Instanz,
174 an der es zuletzt gebunden war. Ab diesem Zeitpunkt erh"alt es wieder
175 Statusbenachrichtigungen (<SfxControllerItem::StateChented()>).
178 [Querverweise]
180 <SfxControllerItem::UnBind()>
181 <SfxControllerItem::ClearCache()>
185 DBG_MEMTEST();
186 DBG_CHKTHIS(SfxControllerItem, 0);
187 DBG_ASSERT(pBindings, "Keine Bindings");
188 DBG_ASSERT( !IsBound(), "bindings rebound SfxControllerItem" );
190 pBindings->Register(*this);
193 //====================================================================
195 void SfxControllerItem::UpdateSlot()
197 /* [Beschreibung]
199 Holt den Status 'hart' neu.
201 [Querverweise]
203 <SfxControllerItem::ClearCache()>
207 DBG_MEMTEST();
208 DBG_CHKTHIS(SfxControllerItem, 0);
209 DBG_ASSERT(pBindings, "Keine Bindings");
211 pBindings->Update( GetId() );
214 //--------------------------------------------------------------------
216 void SfxControllerItem::ClearCache()
218 /* [Beschreibung]
220 "oscht den Status-Cache f"ur dieses SfxControllerItem. D.h. beim
221 n"achsten Status-Update wird das <SfxPoolItem> auf jeden Fall geschickt,
222 auch wenn zuvor dasselbe geschickt wurde. Dies wird ben"otigt, wenn
223 ein Controller umgeschaltet werden kann und sich diesen Status
224 selbst merkt.
227 [Beispiel]
229 Der Kombi-Controller f"ur das Einstellen des Fl"achentyps und der
230 konkreten Auspr"agung (Farbe blau oder Schraffur X) kann im Typ
231 umgestellt werden, wird jedoch dann bei der n"achsten Selektion
232 wieder benachrichtigt, auch wenn es dieselben Daten sind.
235 [Querverweise]
237 <SfxControllerItem::UnBind()>
238 <SfxControllerItem::ReBind()>
243 DBG_MEMTEST();
244 DBG_CHKTHIS(SfxControllerItem, 0);
245 DBG_ASSERT(pBindings, "Keine Bindings");
247 pBindings->ClearCache_Impl( GetId() );
250 //--------------------------------------------------------------------
252 // replaces the successor in the list of bindings of the same id
254 SfxControllerItem* SfxControllerItem::ChangeItemLink( SfxControllerItem* pNewLink )
256 DBG_MEMTEST();
257 DBG_CHKTHIS(SfxControllerItem, 0);
258 SfxControllerItem* pOldLink = pNext;
259 pNext = pNewLink;
260 return pOldLink == this ? 0 : pOldLink;
263 //--------------------------------------------------------------------
265 // changes the id of unbound functions (e.g. for sub-menu-ids)
267 void SfxControllerItem::SetId( USHORT nItemId )
269 DBG_MEMTEST();
270 DBG_CHKTHIS(SfxControllerItem, 0);
271 DBG_ASSERT( !IsBound(), "changing id of bound binding" );
272 nId = nItemId;
275 //--------------------------------------------------------------------
277 // creates a atomic item for a controller without registration
279 SfxControllerItem::SfxControllerItem():
280 nId(0),
281 pNext(this),
282 pBindings(0)
284 DBG_MEMTEST();
285 DBG_CTOR(SfxControllerItem, 0);
288 //--------------------------------------------------------------------
290 // creates a representation of the function nId and registeres it
292 SfxControllerItem::SfxControllerItem( USHORT nID, SfxBindings &rBindings ):
293 nId(nID),
294 pNext(this),
295 pBindings(&rBindings)
297 DBG_MEMTEST();
298 DBG_CTOR(SfxControllerItem, 0);
299 Bind(nId, &rBindings);
302 //--------------------------------------------------------------------
304 // unregisteres the item in the bindings
306 SfxControllerItem::~SfxControllerItem()
308 DBG_MEMTEST();
309 if ( IsBound() )
310 pBindings->Release(*this);
311 DBG_DTOR(SfxControllerItem, 0);
314 //--------------------------------------------------------------------
316 void SfxControllerItem::StateChanged
318 USHORT , // <SID> des ausl"osenden Slot
319 SfxItemState , // <SfxItemState> von 'pState'
320 const SfxPoolItem* // Slot-Status, ggf. 0 oder IsInvalidItem()
323 /* [Beschreibung]
325 Diese virtuelle Methode wird vom SFx gerufen, um <SfxControllerItem>s
326 dar"uber zu benachrichtigen, da\s sich der Status des Slots 'nSID'
327 ge"andert hat. Der neue Wert sowie der von diesem Wert ermittelte
328 Status wird als 'pState' bzw. 'eState' mitgegeben.
330 Der Status eines Slots kann sich "andern, wenn z.B. das MDI-Fenster
331 gewechselt wird oder der Slot explizit mit <SfxBindings::Invalidate()>
332 invalidiert wurde.
334 Achtung! Die Methode wird nicht gerufen, wenn der Slot ung"ultig wurde,
335 danach jedoch wieder denselben Wert angenommen hat.
337 Diese Basisklasse braucht nicht gerufen zu werden, weitere Zwischenstufen
338 jedoch (z.B. <SfxToolboxControl>) sollten gerufen werden.
342 DBG_MEMTEST();
343 DBG_CHKTHIS(SfxControllerItem, 0);
346 //--------------------------------------------------------------------
348 void SfxControllerItem::DeleteFloatingWindow()
350 DBG_MEMTEST();
351 DBG_CHKTHIS(SfxControllerItem, 0);
354 //--------------------------------------------------------------------
356 void SfxStatusForwarder::StateChanged
358 USHORT nSID, // <SID> des ausl"osenden Slot
359 SfxItemState eState, // <SfxItemState> von 'pState'
360 const SfxPoolItem* pState // Slot-Status, ggf. 0 oder IsInvalidItem()
364 pMaster->StateChanged( nSID, eState, pState );
367 //--------------------------------------------------------------------
369 SfxStatusForwarder::SfxStatusForwarder(
370 USHORT nSlotId,
371 SfxControllerItem& rMaster ):
372 SfxControllerItem( nSlotId, rMaster.GetBindings() ),
373 pMaster( &rMaster )
377 //--------------------------------------------------------------------
379 SfxItemState SfxControllerItem::GetItemState
381 const SfxPoolItem* pState /* Pointer auf das <SfxPoolItem>, dessen
382 Status erfragt werden soll. */
385 /* [Beschreibung]
387 Statische Methode zum Ermitteln des Status des SfxPoolItem-Pointers,
388 in der Methode <SfxControllerItem::StateChanged(const SfxPoolItem*)>
389 zu verwenden.
391 [R"uckgabewert]
393 SfxItemState SFX_ITEM_UNKNOWN
394 Enabled, aber keine weitere Statusinformation
395 verf"ugbar. Typisch f"ur <Slot>s, die allenfalls
396 zeitweise disabled sind, aber ihre Darstellung sonst
397 nicht "andern.
399 SFX_ITEM_DISABLED
400 Disabled und keine weiter Statusinformation
401 verf"ugbar. Alle anderen ggf. angezeigten Werte sollten
402 auf den Default zur"uckgesetzt werden.
404 SFX_ITEM_DONTCARE
405 Enabled aber es waren nur uneindeutige Werte
406 verf"ugbar (also keine, die abgefragt werden k"onnen).
408 SFX_ITEM_AVAILABLE
409 Enabled und mit verf"ugbarem Wert, der von 'pState'
410 erfragbar ist. Der Typ ist dabei im gesamten
411 Programm eindeutig und durch den Slot festgelegt.
415 return !pState
416 ? SFX_ITEM_DISABLED
417 : IsInvalidItem(pState)
418 ? SFX_ITEM_DONTCARE
419 : pState->ISA(SfxVoidItem) && !pState->Which()
420 ? SFX_ITEM_UNKNOWN
421 : SFX_ITEM_AVAILABLE;
424 //--------------------------------------------------------------------
426 SfxMapUnit SfxControllerItem::GetCoreMetric() const
428 /* [Beschreibung]
430 Holt vom zust"andigen Pool die Ma\seinheit ab, in der das Status-Item
431 vorliegt.
435 SfxStateCache *pCache = pBindings->GetStateCache( nId );
436 SfxDispatcher *pDispat = pBindings->GetDispatcher_Impl();
438 if ( !pDispat )
440 SfxViewFrame* pViewFrame = SfxViewFrame::Current();
441 if ( !pViewFrame )
442 SfxViewFrame::GetFirst();
443 if ( pViewFrame )
444 pDispat = pViewFrame->GetDispatcher();
447 if ( pDispat && pCache )
449 const SfxSlotServer *pServer = pCache->GetSlotServer( *pDispat );
450 if ( pServer )
452 SfxShell *pSh = pDispat->GetShell( pServer->GetShellLevel() );
453 SfxItemPool &rPool = pSh->GetPool();
454 USHORT nWhich = rPool.GetWhich( nId );
455 return rPool.GetMetric( nWhich );
459 DBG_WARNING( "W1: Can not find ItemPool!" );
460 return SFX_MAPUNIT_100TH_MM;
463 //------------------------------------------------------------------------
465 #ifdef _MSC_VER
466 #pragma optimize("g",off)
467 #endif