1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ctrlitem.cxx,v $
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>
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 //--------------------------------------------------------------------
51 void SfxControllerItem::CheckConfigure_Impl( ULONG nType
)
53 // echter Slot? (also kein Separator etc.)
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",
70 //--------------------------------------------------------------------
72 // returns the next registered SfxControllerItem with the same id
74 SfxControllerItem
* SfxControllerItem::GetItemLink()
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
88 DBG_CHKTHIS(SfxControllerItem
, 0);
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
)
105 DBG_CHKTHIS(SfxControllerItem
, 0);
106 DBG_ASSERT(pBindings
|| pBindinx
, "Keine Bindings");
109 DBG_ASSERT(pBindings
, "Keine Bindings");
110 pBindings
->Release(*this);
117 pBindings
= pBindinx
;
118 pBindings
->Register(*this);
121 void SfxControllerItem::BindInternal_Impl( USHORT nNewId
, SfxBindings
*pBindinx
)
124 DBG_CHKTHIS(SfxControllerItem
, 0);
125 DBG_ASSERT(pBindings
|| pBindinx
, "Keine Bindings");
128 DBG_ASSERT(pBindings
, "Keine Bindings");
129 pBindings
->Release(*this);
136 pBindings
= pBindinx
;
137 pBindings
->RegisterInternal_Impl(*this);
141 //====================================================================
143 void SfxControllerItem::UnBind()
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.
154 <SfxControllerItem::ReBind()>
155 <SfxControllerItem::ClearCache()>
159 DBG_CHKTHIS(SfxControllerItem
, 0);
160 DBG_ASSERT(pBindings
, "Keine Bindings");
161 DBG_ASSERT( IsBound(), "unbindings unbound SfxControllerItem" );
163 pBindings
->Release(*this);
167 //====================================================================
169 void SfxControllerItem::ReBind()
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()>).
180 <SfxControllerItem::UnBind()>
181 <SfxControllerItem::ClearCache()>
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()
199 Holt den Status 'hart' neu.
203 <SfxControllerItem::ClearCache()>
208 DBG_CHKTHIS(SfxControllerItem
, 0);
209 DBG_ASSERT(pBindings
, "Keine Bindings");
211 pBindings
->Update( GetId() );
214 //--------------------------------------------------------------------
216 void SfxControllerItem::ClearCache()
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
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.
237 <SfxControllerItem::UnBind()>
238 <SfxControllerItem::ReBind()>
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
)
257 DBG_CHKTHIS(SfxControllerItem
, 0);
258 SfxControllerItem
* pOldLink
= pNext
;
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
)
270 DBG_CHKTHIS(SfxControllerItem
, 0);
271 DBG_ASSERT( !IsBound(), "changing id of bound binding" );
275 //--------------------------------------------------------------------
277 // creates a atomic item for a controller without registration
279 SfxControllerItem::SfxControllerItem():
285 DBG_CTOR(SfxControllerItem
, 0);
288 //--------------------------------------------------------------------
290 // creates a representation of the function nId and registeres it
292 SfxControllerItem::SfxControllerItem( USHORT nID
, SfxBindings
&rBindings
):
295 pBindings(&rBindings
)
298 DBG_CTOR(SfxControllerItem
, 0);
299 Bind(nId
, &rBindings
);
302 //--------------------------------------------------------------------
304 // unregisteres the item in the bindings
306 SfxControllerItem::~SfxControllerItem()
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()
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()>
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.
343 DBG_CHKTHIS(SfxControllerItem
, 0);
346 //--------------------------------------------------------------------
348 void SfxControllerItem::DeleteFloatingWindow()
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(
371 SfxControllerItem
& rMaster
):
372 SfxControllerItem( nSlotId
, rMaster
.GetBindings() ),
377 //--------------------------------------------------------------------
379 SfxItemState
SfxControllerItem::GetItemState
381 const SfxPoolItem
* pState
/* Pointer auf das <SfxPoolItem>, dessen
382 Status erfragt werden soll. */
387 Statische Methode zum Ermitteln des Status des SfxPoolItem-Pointers,
388 in der Methode <SfxControllerItem::StateChanged(const SfxPoolItem*)>
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
400 Disabled und keine weiter Statusinformation
401 verf"ugbar. Alle anderen ggf. angezeigten Werte sollten
402 auf den Default zur"uckgesetzt werden.
405 Enabled aber es waren nur uneindeutige Werte
406 verf"ugbar (also keine, die abgefragt werden k"onnen).
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.
417 : IsInvalidItem(pState
)
419 : pState
->ISA(SfxVoidItem
) && !pState
->Which()
421 : SFX_ITEM_AVAILABLE
;
424 //--------------------------------------------------------------------
426 SfxMapUnit
SfxControllerItem::GetCoreMetric() const
430 Holt vom zust"andigen Pool die Ma\seinheit ab, in der das Status-Item
435 SfxStateCache
*pCache
= pBindings
->GetStateCache( nId
);
436 SfxDispatcher
*pDispat
= pBindings
->GetDispatcher_Impl();
440 SfxViewFrame
* pViewFrame
= SfxViewFrame::Current();
442 SfxViewFrame::GetFirst();
444 pDispat
= pViewFrame
->GetDispatcher();
447 if ( pDispat
&& pCache
)
449 const SfxSlotServer
*pServer
= pCache
->GetSlotServer( *pDispat
);
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 //------------------------------------------------------------------------
466 #pragma optimize("g",off)