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>
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 //--------------------------------------------------------------------
48 void SfxControllerItem::CheckConfigure_Impl( sal_uIntPtr nType
)
50 // echter Slot? (also kein Separator etc.)
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",
67 //--------------------------------------------------------------------
69 // returns the next registered SfxControllerItem with the same id
71 SfxControllerItem
* SfxControllerItem::GetItemLink()
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
85 DBG_CHKTHIS(SfxControllerItem
, 0);
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
)
102 DBG_CHKTHIS(SfxControllerItem
, 0);
103 DBG_ASSERT(pBindings
|| pBindinx
, "Keine Bindings");
106 DBG_ASSERT(pBindings
, "Keine Bindings");
107 pBindings
->Release(*this);
114 pBindings
= pBindinx
;
115 pBindings
->Register(*this);
118 void SfxControllerItem::BindInternal_Impl( sal_uInt16 nNewId
, SfxBindings
*pBindinx
)
121 DBG_CHKTHIS(SfxControllerItem
, 0);
122 DBG_ASSERT(pBindings
|| pBindinx
, "Keine Bindings");
125 DBG_ASSERT(pBindings
, "Keine Bindings");
126 pBindings
->Release(*this);
133 pBindings
= pBindinx
;
134 pBindings
->RegisterInternal_Impl(*this);
138 //====================================================================
140 void SfxControllerItem::UnBind()
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.
151 <SfxControllerItem::ReBind()>
152 <SfxControllerItem::ClearCache()>
156 DBG_CHKTHIS(SfxControllerItem
, 0);
157 DBG_ASSERT(pBindings
, "Keine Bindings");
158 DBG_ASSERT( IsBound(), "unbindings unbound SfxControllerItem" );
160 pBindings
->Release(*this);
164 //====================================================================
166 void SfxControllerItem::ReBind()
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()>).
177 <SfxControllerItem::UnBind()>
178 <SfxControllerItem::ClearCache()>
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()
196 Holt den Status 'hart' neu.
200 <SfxControllerItem::ClearCache()>
205 DBG_CHKTHIS(SfxControllerItem
, 0);
206 DBG_ASSERT(pBindings
, "Keine Bindings");
208 pBindings
->Update( GetId() );
211 //--------------------------------------------------------------------
213 void SfxControllerItem::ClearCache()
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
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.
234 <SfxControllerItem::UnBind()>
235 <SfxControllerItem::ReBind()>
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
)
254 DBG_CHKTHIS(SfxControllerItem
, 0);
255 SfxControllerItem
* pOldLink
= pNext
;
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
)
267 DBG_CHKTHIS(SfxControllerItem
, 0);
268 DBG_ASSERT( !IsBound(), "changing id of bound binding" );
272 //--------------------------------------------------------------------
274 // creates a atomic item for a controller without registration
276 SfxControllerItem::SfxControllerItem():
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
):
292 pBindings(&rBindings
)
295 DBG_CTOR(SfxControllerItem
, 0);
296 Bind(nId
, &rBindings
);
299 //--------------------------------------------------------------------
301 // unregisteres the item in the bindings
303 SfxControllerItem::~SfxControllerItem()
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()
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()>
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.
340 DBG_CHKTHIS(SfxControllerItem
, 0);
343 //--------------------------------------------------------------------
345 void SfxControllerItem::DeleteFloatingWindow()
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(
368 SfxControllerItem
& rMaster
):
369 SfxControllerItem( nSlotId
, rMaster
.GetBindings() ),
374 //--------------------------------------------------------------------
376 SfxItemState
SfxControllerItem::GetItemState
378 const SfxPoolItem
* pState
/* Pointer auf das <SfxPoolItem>, dessen
379 Status erfragt werden soll. */
384 Statische Methode zum Ermitteln des Status des SfxPoolItem-Pointers,
385 in der Methode <SfxControllerItem::StateChanged(const SfxPoolItem*)>
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
397 Disabled und keine weiter Statusinformation
398 verf"ugbar. Alle anderen ggf. angezeigten Werte sollten
399 auf den Default zur"uckgesetzt werden.
402 Enabled aber es waren nur uneindeutige Werte
403 verf"ugbar (also keine, die abgefragt werden k"onnen).
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.
414 : IsInvalidItem(pState
)
416 : pState
->ISA(SfxVoidItem
) && !pState
->Which()
418 : SFX_ITEM_AVAILABLE
;
421 //--------------------------------------------------------------------
423 SfxMapUnit
SfxControllerItem::GetCoreMetric() const
427 Holt vom zust"andigen Pool die Ma\seinheit ab, in der das Status-Item
432 SfxStateCache
*pCache
= pBindings
->GetStateCache( nId
);
433 SfxDispatcher
*pDispat
= pBindings
->GetDispatcher_Impl();
437 SfxViewFrame
* pViewFrame
= SfxViewFrame::Current();
439 SfxViewFrame::GetFirst();
441 pDispat
= pViewFrame
->GetDispatcher();
444 if ( pDispat
&& pCache
)
446 const SfxSlotServer
*pServer
= pCache
->GetSlotServer( *pDispat
);
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 //------------------------------------------------------------------------
463 #pragma optimize("g",off)