1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_extensions.hxx"
26*b1cdbd2cSJim Jagielski #include "composeduiupdate.hxx"
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
29*b1cdbd2cSJim Jagielski #include <com/sun/star/inspection/XObjectInspectorUI.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/inspection/PropertyLineElement.hpp>
32*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
33*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
34*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <algorithm>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski //........................................................................
39*b1cdbd2cSJim Jagielski namespace pcr
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski //........................................................................
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski     /** === begin UNO using === **/
44*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Exception;
45*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::DisposedException;
46*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::NullPointerException;
47*b1cdbd2cSJim Jagielski     using ::com::sun::star::inspection::XPropertyHandler;
48*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Reference;
49*b1cdbd2cSJim Jagielski     using ::com::sun::star::inspection::XObjectInspectorUI;
50*b1cdbd2cSJim Jagielski     using ::com::sun::star::inspection::XPropertyControl;
51*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::RuntimeException;
52*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::NoSupportException;
53*b1cdbd2cSJim Jagielski     using ::com::sun::star::inspection::XPropertyControlObserver;
54*b1cdbd2cSJim Jagielski     /** === end UNO using === **/
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski     namespace PropertyLineElement = ::com::sun::star::inspection::PropertyLineElement;
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski     //====================================================================
59*b1cdbd2cSJim Jagielski 	//= helper
60*b1cdbd2cSJim Jagielski 	//====================================================================
61*b1cdbd2cSJim Jagielski     namespace
62*b1cdbd2cSJim Jagielski     {
63*b1cdbd2cSJim Jagielski         struct HandlerLess : public ::std::binary_function  <	Reference< XPropertyHandler >
64*b1cdbd2cSJim Jagielski 									                        ,   Reference< XPropertyHandler >
65*b1cdbd2cSJim Jagielski 									                        ,	bool
66*b1cdbd2cSJim Jagielski                                                             >
67*b1cdbd2cSJim Jagielski         {
operator ()pcr::__anon445aa6110111::HandlerLess68*b1cdbd2cSJim Jagielski 	        bool operator()( const Reference< XPropertyHandler >& lhs, const Reference< XPropertyHandler >& rhs) const
69*b1cdbd2cSJim Jagielski 	        {
70*b1cdbd2cSJim Jagielski 		        return lhs.get() < rhs.get();
71*b1cdbd2cSJim Jagielski             }
72*b1cdbd2cSJim Jagielski         };
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski         //================================================================
75*b1cdbd2cSJim Jagielski         typedef ::std::set< ::rtl::OUString >       StringBag;
76*b1cdbd2cSJim Jagielski         typedef ::std::map< sal_Int16, StringBag >  MapIntToStringBag;
77*b1cdbd2cSJim Jagielski     }
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     //====================================================================
80*b1cdbd2cSJim Jagielski 	//= callbacks for CachedInspectorUI
81*b1cdbd2cSJim Jagielski 	//====================================================================
82*b1cdbd2cSJim Jagielski     typedef void (ComposedPropertyUIUpdate::*FNotifySingleUIChange)();
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     //====================================================================
85*b1cdbd2cSJim Jagielski 	//= CachedInspectorUI
86*b1cdbd2cSJim Jagielski 	//====================================================================
87*b1cdbd2cSJim Jagielski     typedef ::cppu::WeakImplHelper1 <   ::com::sun::star::inspection::XObjectInspectorUI
88*b1cdbd2cSJim Jagielski                                     >   CachedInspectorUI_Base;
89*b1cdbd2cSJim Jagielski     struct CachedInspectorUI : public CachedInspectorUI_Base
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski     private:
92*b1cdbd2cSJim Jagielski         ::osl::Mutex            m_aMutex;
93*b1cdbd2cSJim Jagielski         oslInterlockedCount     m_refCount;
94*b1cdbd2cSJim Jagielski         bool                    m_bDisposed;
95*b1cdbd2cSJim Jagielski         ComposedPropertyUIUpdate&
96*b1cdbd2cSJim Jagielski                                 m_rMaster;
97*b1cdbd2cSJim Jagielski         FNotifySingleUIChange   m_pUIChangeNotification;
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski         // enablePropertyUI cache
100*b1cdbd2cSJim Jagielski         StringBag               aEnabledProperties;
101*b1cdbd2cSJim Jagielski         StringBag               aDisabledProperties;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski         // show/hidePropertyUI cache
104*b1cdbd2cSJim Jagielski         StringBag               aShownProperties;
105*b1cdbd2cSJim Jagielski         StringBag               aHiddenProperties;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski         // rebuildPropertyUI cache
108*b1cdbd2cSJim Jagielski         StringBag               aRebuiltProperties;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski         // showCategory cache
111*b1cdbd2cSJim Jagielski         StringBag               aShownCategories;
112*b1cdbd2cSJim Jagielski         StringBag               aHiddenCategories;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski         // enablePropertyUIElements cache
115*b1cdbd2cSJim Jagielski         MapIntToStringBag       aEnabledElements;
116*b1cdbd2cSJim Jagielski         MapIntToStringBag       aDisabledElements;
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     public:
119*b1cdbd2cSJim Jagielski         typedef StringBag& (CachedInspectorUI::*FGetStringBag)();
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         // enablePropertyUI cache
getEnabledPropertiespcr::CachedInspectorUI122*b1cdbd2cSJim Jagielski         StringBag&  getEnabledProperties()          { return aEnabledProperties; }
getDisabledPropertiespcr::CachedInspectorUI123*b1cdbd2cSJim Jagielski         StringBag&  getDisabledProperties()         { return aDisabledProperties; }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         // show/hidePropertyUI cache
getShownPropertiespcr::CachedInspectorUI126*b1cdbd2cSJim Jagielski         StringBag&  getShownProperties()            { return aShownProperties; }
getHiddenPropertiespcr::CachedInspectorUI127*b1cdbd2cSJim Jagielski         StringBag&  getHiddenProperties()           { return aHiddenProperties; }
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski         // rebuildPropertyUI cache
getRebuiltPropertiespcr::CachedInspectorUI130*b1cdbd2cSJim Jagielski         StringBag&  getRebuiltProperties()          { return aRebuiltProperties; }
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski         // showCategory cache
getShownCategoriespcr::CachedInspectorUI133*b1cdbd2cSJim Jagielski         StringBag&  getShownCategories()            { return aShownCategories; }
getHiddenCategoriespcr::CachedInspectorUI134*b1cdbd2cSJim Jagielski         StringBag&  getHiddenCategories()           { return aHiddenCategories; }
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski         // enablePropertyUIElements
getEnabledInputControlspcr::CachedInspectorUI137*b1cdbd2cSJim Jagielski         StringBag&  getEnabledInputControls()       { return aEnabledElements[ PropertyLineElement::InputControl ]; }
getDisabledInputControlspcr::CachedInspectorUI138*b1cdbd2cSJim Jagielski         StringBag&  getDisabledInputControls()      { return aDisabledElements[ PropertyLineElement::InputControl ]; }
getEnabledPrimaryButtonspcr::CachedInspectorUI139*b1cdbd2cSJim Jagielski         StringBag&  getEnabledPrimaryButtons()      { return aEnabledElements[ PropertyLineElement::PrimaryButton ]; }
getDisabledPrimaryButtonspcr::CachedInspectorUI140*b1cdbd2cSJim Jagielski         StringBag&  getDisabledPrimaryButtons()     { return aDisabledElements[ PropertyLineElement::PrimaryButton ]; }
getEnabledSecondaryButtonspcr::CachedInspectorUI141*b1cdbd2cSJim Jagielski         StringBag&  getEnabledSecondaryButtons()    { return aEnabledElements[ PropertyLineElement::SecondaryButton ]; }
getDisabledSecondaryButtonspcr::CachedInspectorUI142*b1cdbd2cSJim Jagielski         StringBag&  getDisabledSecondaryButtons()   { return aDisabledElements[ PropertyLineElement::SecondaryButton ]; }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski     public:
145*b1cdbd2cSJim Jagielski         CachedInspectorUI( ComposedPropertyUIUpdate& _rMaster, FNotifySingleUIChange _pUIChangeNotification );
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski         /// disposes the instance
148*b1cdbd2cSJim Jagielski         void dispose();
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski         // XObjectInspectorUI overridables
151*b1cdbd2cSJim Jagielski         virtual void SAL_CALL enablePropertyUI( const ::rtl::OUString& _rPropertyName, ::sal_Bool _bEnable ) throw (RuntimeException);
152*b1cdbd2cSJim Jagielski         virtual void SAL_CALL enablePropertyUIElements( const ::rtl::OUString& _rPropertyName, ::sal_Int16 _nElements, ::sal_Bool _bEnable ) throw (RuntimeException);
153*b1cdbd2cSJim Jagielski         virtual void SAL_CALL rebuildPropertyUI( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException);
154*b1cdbd2cSJim Jagielski         virtual void SAL_CALL showPropertyUI( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException);
155*b1cdbd2cSJim Jagielski         virtual void SAL_CALL hidePropertyUI( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException);
156*b1cdbd2cSJim Jagielski         virtual void SAL_CALL showCategory( const ::rtl::OUString& _rCategory, ::sal_Bool _bShow ) throw (RuntimeException);
157*b1cdbd2cSJim Jagielski         virtual Reference< XPropertyControl > SAL_CALL getPropertyControl( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException);
158*b1cdbd2cSJim Jagielski         virtual void SAL_CALL registerControlObserver( const Reference< XPropertyControlObserver >& Observer ) throw (RuntimeException);
159*b1cdbd2cSJim Jagielski         virtual void SAL_CALL revokeControlObserver( const Reference< XPropertyControlObserver >& Observer ) throw (RuntimeException);
160*b1cdbd2cSJim Jagielski         virtual void SAL_CALL setHelpSectionText( const ::rtl::OUString& _HelpText ) throw (NoSupportException, RuntimeException);
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski         // UNOCompatibleNonUNOReference overridables
163*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL acquire() throw();
164*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL release() throw();
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski     protected:
167*b1cdbd2cSJim Jagielski         ~CachedInspectorUI();
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski         /// determines whether the instance is already disposed
isDisposedpcr::CachedInspectorUI170*b1cdbd2cSJim Jagielski         inline bool isDisposed() const { return m_bDisposed; }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski         /// throws an exception if the component is already disposed
173*b1cdbd2cSJim Jagielski         void checkDisposed() const;
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     private:
176*b1cdbd2cSJim Jagielski         void    impl_markElementEnabledOrDisabled( const ::rtl::OUString& _rPropertyName, sal_Int16 _nElementIdOrZero, sal_Bool _bEnable );
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski         /** calls <member>m_pUIChangeNotification</member> at <member>m_rMaster</member>
179*b1cdbd2cSJim Jagielski         */
180*b1cdbd2cSJim Jagielski         void    impl_notifySingleUIChange() const;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski     private:
183*b1cdbd2cSJim Jagielski         CachedInspectorUI( const CachedInspectorUI& );              // never implemented
184*b1cdbd2cSJim Jagielski         CachedInspectorUI& operator=( const CachedInspectorUI& );   // never implemented
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski     private:
187*b1cdbd2cSJim Jagielski         class MethodGuard;
188*b1cdbd2cSJim Jagielski         friend class MethodGuard;
189*b1cdbd2cSJim Jagielski         class MethodGuard : public ::osl::MutexGuard
190*b1cdbd2cSJim Jagielski         {
191*b1cdbd2cSJim Jagielski         public:
MethodGuard(CachedInspectorUI & rInstance)192*b1cdbd2cSJim Jagielski             MethodGuard( CachedInspectorUI& rInstance )
193*b1cdbd2cSJim Jagielski                 : ::osl::MutexGuard( rInstance.m_aMutex )
194*b1cdbd2cSJim Jagielski             {
195*b1cdbd2cSJim Jagielski                 rInstance.checkDisposed();
196*b1cdbd2cSJim Jagielski             }
197*b1cdbd2cSJim Jagielski         };
198*b1cdbd2cSJim Jagielski     };
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
CachedInspectorUI(ComposedPropertyUIUpdate & _rMaster,FNotifySingleUIChange _pUIChangeNotification)201*b1cdbd2cSJim Jagielski     CachedInspectorUI::CachedInspectorUI( ComposedPropertyUIUpdate& _rMaster, FNotifySingleUIChange _pUIChangeNotification )
202*b1cdbd2cSJim Jagielski         :m_refCount( 0 )
203*b1cdbd2cSJim Jagielski         ,m_bDisposed( false )
204*b1cdbd2cSJim Jagielski         ,m_rMaster( _rMaster )
205*b1cdbd2cSJim Jagielski         ,m_pUIChangeNotification( _pUIChangeNotification )
206*b1cdbd2cSJim Jagielski     {
207*b1cdbd2cSJim Jagielski     }
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
~CachedInspectorUI()210*b1cdbd2cSJim Jagielski     CachedInspectorUI::~CachedInspectorUI()
211*b1cdbd2cSJim Jagielski     {
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
dispose()215*b1cdbd2cSJim Jagielski     void CachedInspectorUI::dispose()
216*b1cdbd2cSJim Jagielski     {
217*b1cdbd2cSJim Jagielski         ::osl::MutexGuard aGuard( m_aMutex );
218*b1cdbd2cSJim Jagielski         m_bDisposed = true;
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski         clearContainer( aEnabledProperties );
221*b1cdbd2cSJim Jagielski         clearContainer( aDisabledProperties );
222*b1cdbd2cSJim Jagielski         clearContainer( aRebuiltProperties );
223*b1cdbd2cSJim Jagielski         clearContainer( aShownProperties );
224*b1cdbd2cSJim Jagielski         clearContainer( aHiddenProperties );
225*b1cdbd2cSJim Jagielski         clearContainer( aShownCategories );
226*b1cdbd2cSJim Jagielski         clearContainer( aHiddenCategories );
227*b1cdbd2cSJim Jagielski         clearContainer( aEnabledElements );
228*b1cdbd2cSJim Jagielski         clearContainer( aDisabledElements );
229*b1cdbd2cSJim Jagielski     }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
acquire()232*b1cdbd2cSJim Jagielski     void SAL_CALL CachedInspectorUI::acquire() throw()
233*b1cdbd2cSJim Jagielski     {
234*b1cdbd2cSJim Jagielski         osl_incrementInterlockedCount( &m_refCount );
235*b1cdbd2cSJim Jagielski     }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
release()238*b1cdbd2cSJim Jagielski     void SAL_CALL CachedInspectorUI::release() throw()
239*b1cdbd2cSJim Jagielski     {
240*b1cdbd2cSJim Jagielski         if ( 0 == osl_decrementInterlockedCount( &m_refCount ) )
241*b1cdbd2cSJim Jagielski             delete this;
242*b1cdbd2cSJim Jagielski     }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
checkDisposed() const246*b1cdbd2cSJim Jagielski     void CachedInspectorUI::checkDisposed() const
247*b1cdbd2cSJim Jagielski     {
248*b1cdbd2cSJim Jagielski         if ( isDisposed() )
249*b1cdbd2cSJim Jagielski             throw DisposedException();
250*b1cdbd2cSJim Jagielski     }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
253*b1cdbd2cSJim Jagielski     namespace
254*b1cdbd2cSJim Jagielski     {
lcl_markStringKeyPositiveOrNegative(const::rtl::OUString & _rKeyName,StringBag & _rPositives,StringBag & _rNegatives,sal_Bool _bMarkPositive)255*b1cdbd2cSJim Jagielski         void lcl_markStringKeyPositiveOrNegative( const ::rtl::OUString& _rKeyName, StringBag& _rPositives, StringBag& _rNegatives, sal_Bool _bMarkPositive )
256*b1cdbd2cSJim Jagielski         {
257*b1cdbd2cSJim Jagielski             if ( _bMarkPositive )
258*b1cdbd2cSJim Jagielski             {
259*b1cdbd2cSJim Jagielski                 _rPositives.insert( _rKeyName );
260*b1cdbd2cSJim Jagielski                 // if the same key has been remember as in the "negative" list before, clear this information, since it's overruled
261*b1cdbd2cSJim Jagielski                 _rNegatives.erase( _rKeyName );
262*b1cdbd2cSJim Jagielski             }
263*b1cdbd2cSJim Jagielski             else
264*b1cdbd2cSJim Jagielski                 _rNegatives.insert( _rKeyName );
265*b1cdbd2cSJim Jagielski         }
266*b1cdbd2cSJim Jagielski     }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
enablePropertyUI(const::rtl::OUString & _rPropertyName,sal_Bool _bEnable)269*b1cdbd2cSJim Jagielski     void CachedInspectorUI::enablePropertyUI( const ::rtl::OUString& _rPropertyName, sal_Bool _bEnable ) throw (RuntimeException)
270*b1cdbd2cSJim Jagielski     {
271*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
272*b1cdbd2cSJim Jagielski         if ( !m_rMaster.shouldContinuePropertyHandling( _rPropertyName ) )
273*b1cdbd2cSJim Jagielski             return;
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski         lcl_markStringKeyPositiveOrNegative( _rPropertyName, aEnabledProperties, aDisabledProperties, _bEnable );
276*b1cdbd2cSJim Jagielski         impl_notifySingleUIChange();
277*b1cdbd2cSJim Jagielski     }
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
impl_markElementEnabledOrDisabled(const::rtl::OUString & _rPropertyName,sal_Int16 _nElementIdOrZero,sal_Bool _bEnable)280*b1cdbd2cSJim Jagielski     void CachedInspectorUI::impl_markElementEnabledOrDisabled( const ::rtl::OUString& _rPropertyName, sal_Int16 _nElementIdOrZero, sal_Bool _bEnable )
281*b1cdbd2cSJim Jagielski     {
282*b1cdbd2cSJim Jagielski         if ( _nElementIdOrZero == 0 )
283*b1cdbd2cSJim Jagielski             return;
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski         lcl_markStringKeyPositiveOrNegative(
286*b1cdbd2cSJim Jagielski             _rPropertyName,
287*b1cdbd2cSJim Jagielski             aEnabledElements[ _nElementIdOrZero ],
288*b1cdbd2cSJim Jagielski             aDisabledElements[ _nElementIdOrZero ],
289*b1cdbd2cSJim Jagielski             _bEnable
290*b1cdbd2cSJim Jagielski         );
291*b1cdbd2cSJim Jagielski     }
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
impl_notifySingleUIChange() const294*b1cdbd2cSJim Jagielski     void CachedInspectorUI::impl_notifySingleUIChange() const
295*b1cdbd2cSJim Jagielski     {
296*b1cdbd2cSJim Jagielski         (m_rMaster.*m_pUIChangeNotification)();
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
enablePropertyUIElements(const::rtl::OUString & _rPropertyName,sal_Int16 _nElements,sal_Bool _bEnable)300*b1cdbd2cSJim Jagielski     void CachedInspectorUI::enablePropertyUIElements( const ::rtl::OUString& _rPropertyName, sal_Int16 _nElements, sal_Bool _bEnable ) throw (RuntimeException)
301*b1cdbd2cSJim Jagielski     {
302*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
303*b1cdbd2cSJim Jagielski         if ( !m_rMaster.shouldContinuePropertyHandling( _rPropertyName ) )
304*b1cdbd2cSJim Jagielski             return;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski         impl_markElementEnabledOrDisabled( _rPropertyName, _nElements & PropertyLineElement::InputControl,    _bEnable );
307*b1cdbd2cSJim Jagielski         impl_markElementEnabledOrDisabled( _rPropertyName, _nElements & PropertyLineElement::PrimaryButton,   _bEnable );
308*b1cdbd2cSJim Jagielski         impl_markElementEnabledOrDisabled( _rPropertyName, _nElements & PropertyLineElement::SecondaryButton, _bEnable );
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski         impl_notifySingleUIChange();
311*b1cdbd2cSJim Jagielski     }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
rebuildPropertyUI(const::rtl::OUString & _rPropertyName)314*b1cdbd2cSJim Jagielski     void CachedInspectorUI::rebuildPropertyUI( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException)
315*b1cdbd2cSJim Jagielski     {
316*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
317*b1cdbd2cSJim Jagielski         if ( !m_rMaster.shouldContinuePropertyHandling( _rPropertyName ) )
318*b1cdbd2cSJim Jagielski             return;
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski         aRebuiltProperties.insert( _rPropertyName );
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski         impl_notifySingleUIChange();
323*b1cdbd2cSJim Jagielski     }
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
showPropertyUI(const::rtl::OUString & _rPropertyName)326*b1cdbd2cSJim Jagielski     void CachedInspectorUI::showPropertyUI( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException)
327*b1cdbd2cSJim Jagielski     {
328*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
329*b1cdbd2cSJim Jagielski         if ( !m_rMaster.shouldContinuePropertyHandling( _rPropertyName ) )
330*b1cdbd2cSJim Jagielski             return;
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski         aShownProperties.insert( _rPropertyName );
333*b1cdbd2cSJim Jagielski         // if the same category has been hidden before, clear this information, since it's overruled
334*b1cdbd2cSJim Jagielski         aHiddenProperties.erase( _rPropertyName );
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski         impl_notifySingleUIChange();
337*b1cdbd2cSJim Jagielski     }
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
hidePropertyUI(const::rtl::OUString & _rPropertyName)340*b1cdbd2cSJim Jagielski     void CachedInspectorUI::hidePropertyUI( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException)
341*b1cdbd2cSJim Jagielski     {
342*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
343*b1cdbd2cSJim Jagielski         if ( !m_rMaster.shouldContinuePropertyHandling( _rPropertyName ) )
344*b1cdbd2cSJim Jagielski             return;
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski         aHiddenProperties.insert( _rPropertyName );
347*b1cdbd2cSJim Jagielski         impl_notifySingleUIChange();
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
showCategory(const::rtl::OUString & _rCategory,sal_Bool _bShow)351*b1cdbd2cSJim Jagielski     void CachedInspectorUI::showCategory( const ::rtl::OUString& _rCategory, sal_Bool _bShow ) throw (RuntimeException)
352*b1cdbd2cSJim Jagielski     {
353*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski         lcl_markStringKeyPositiveOrNegative( _rCategory, aShownCategories, aHiddenCategories, _bShow );
356*b1cdbd2cSJim Jagielski         impl_notifySingleUIChange();
357*b1cdbd2cSJim Jagielski     }
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
getPropertyControl(const::rtl::OUString & _rPropertyName)360*b1cdbd2cSJim Jagielski     Reference< XPropertyControl > SAL_CALL CachedInspectorUI::getPropertyControl( const ::rtl::OUString& _rPropertyName ) throw (RuntimeException)
361*b1cdbd2cSJim Jagielski     {
362*b1cdbd2cSJim Jagielski         MethodGuard aGuard( *this );
363*b1cdbd2cSJim Jagielski         if ( !m_rMaster.shouldContinuePropertyHandling( _rPropertyName ) )
364*b1cdbd2cSJim Jagielski             return Reference< XPropertyControl >();
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski         return m_rMaster.getDelegatorUI()->getPropertyControl( _rPropertyName );
367*b1cdbd2cSJim Jagielski     }
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
registerControlObserver(const Reference<XPropertyControlObserver> & _Observer)370*b1cdbd2cSJim Jagielski     void SAL_CALL CachedInspectorUI::registerControlObserver( const Reference< XPropertyControlObserver >& _Observer ) throw (RuntimeException)
371*b1cdbd2cSJim Jagielski     {
372*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "CachedInspectorUI::registerControlObserver: not expected to be called!" );
373*b1cdbd2cSJim Jagielski             // CachedInspectorUI is used as context for the controls, and we don't expect them to
374*b1cdbd2cSJim Jagielski             // register listeners themself
375*b1cdbd2cSJim Jagielski         m_rMaster.getDelegatorUI()->registerControlObserver( _Observer );
376*b1cdbd2cSJim Jagielski     }
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
revokeControlObserver(const Reference<XPropertyControlObserver> & _Observer)379*b1cdbd2cSJim Jagielski     void SAL_CALL CachedInspectorUI::revokeControlObserver( const Reference< XPropertyControlObserver >& _Observer ) throw (RuntimeException)
380*b1cdbd2cSJim Jagielski     {
381*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "CachedInspectorUI::revokeControlObserver: not expected to be called!" );
382*b1cdbd2cSJim Jagielski             // CachedInspectorUI is used as context for the controls, and we don't expect them to
383*b1cdbd2cSJim Jagielski             // register listeners themself
384*b1cdbd2cSJim Jagielski         m_rMaster.getDelegatorUI()->revokeControlObserver( _Observer );
385*b1cdbd2cSJim Jagielski     }
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
setHelpSectionText(const::rtl::OUString & _HelpText)388*b1cdbd2cSJim Jagielski     void SAL_CALL CachedInspectorUI::setHelpSectionText( const ::rtl::OUString& _HelpText ) throw (NoSupportException, RuntimeException)
389*b1cdbd2cSJim Jagielski     {
390*b1cdbd2cSJim Jagielski         m_rMaster.getDelegatorUI()->setHelpSectionText( _HelpText );
391*b1cdbd2cSJim Jagielski     }
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski     //====================================================================
394*b1cdbd2cSJim Jagielski 	//= HandlerMap
395*b1cdbd2cSJim Jagielski 	//====================================================================
396*b1cdbd2cSJim Jagielski     typedef ::std::map  <   Reference< XPropertyHandler >
397*b1cdbd2cSJim Jagielski                         ,   ::rtl::Reference< CachedInspectorUI >
398*b1cdbd2cSJim Jagielski                         ,   HandlerLess
399*b1cdbd2cSJim Jagielski                         >   ImplMapHandlerToUI;
400*b1cdbd2cSJim Jagielski     struct MapHandlerToUI
401*b1cdbd2cSJim Jagielski     {
402*b1cdbd2cSJim Jagielski         ImplMapHandlerToUI aHandlers;
403*b1cdbd2cSJim Jagielski     };
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski     //====================================================================
406*b1cdbd2cSJim Jagielski 	//= ComposedPropertyUIUpdate
407*b1cdbd2cSJim Jagielski 	//====================================================================
408*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
ComposedPropertyUIUpdate(const Reference<XObjectInspectorUI> & _rxDelegatorUI,IPropertyExistenceCheck * _pPropertyCheck)409*b1cdbd2cSJim Jagielski     ComposedPropertyUIUpdate::ComposedPropertyUIUpdate( const Reference< XObjectInspectorUI >& _rxDelegatorUI,
410*b1cdbd2cSJim Jagielski         IPropertyExistenceCheck* _pPropertyCheck )
411*b1cdbd2cSJim Jagielski         :m_pCollectedUIs( new MapHandlerToUI )
412*b1cdbd2cSJim Jagielski         ,m_xDelegatorUI( _rxDelegatorUI )
413*b1cdbd2cSJim Jagielski         ,m_nSuspendCounter( 0 )
414*b1cdbd2cSJim Jagielski         ,m_pPropertyCheck( _pPropertyCheck )
415*b1cdbd2cSJim Jagielski     {
416*b1cdbd2cSJim Jagielski         if ( !m_xDelegatorUI.is() )
417*b1cdbd2cSJim Jagielski             throw NullPointerException();
418*b1cdbd2cSJim Jagielski     }
419*b1cdbd2cSJim Jagielski 
420*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
~ComposedPropertyUIUpdate()421*b1cdbd2cSJim Jagielski     ComposedPropertyUIUpdate::~ComposedPropertyUIUpdate( )
422*b1cdbd2cSJim Jagielski     {
423*b1cdbd2cSJim Jagielski     }
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
getUIForPropertyHandler(const Reference<XPropertyHandler> & _rxHandler)426*b1cdbd2cSJim Jagielski     Reference< XObjectInspectorUI > ComposedPropertyUIUpdate::getUIForPropertyHandler( const Reference< XPropertyHandler >& _rxHandler )
427*b1cdbd2cSJim Jagielski     {
428*b1cdbd2cSJim Jagielski         impl_checkDisposed();
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski         ::rtl::Reference< CachedInspectorUI >& rUI = m_pCollectedUIs->aHandlers[ _rxHandler ];
431*b1cdbd2cSJim Jagielski         if ( !rUI.is() )
432*b1cdbd2cSJim Jagielski             rUI = new CachedInspectorUI( *this, &ComposedPropertyUIUpdate::callback_inspectorUIChanged_throw );
433*b1cdbd2cSJim Jagielski         return rUI.get();
434*b1cdbd2cSJim Jagielski     }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
437*b1cdbd2cSJim Jagielski     namespace
438*b1cdbd2cSJim Jagielski     {
439*b1cdbd2cSJim Jagielski         //============================================================
440*b1cdbd2cSJim Jagielski 	    //= StringBagCollector
441*b1cdbd2cSJim Jagielski 	    //============================================================
442*b1cdbd2cSJim Jagielski         /** an STL-compatible structure which collects strings from a CachedInspectorUI instances
443*b1cdbd2cSJim Jagielski         */
444*b1cdbd2cSJim Jagielski         struct StringBagCollector : public ::std::unary_function< ImplMapHandlerToUI::value_type, void >
445*b1cdbd2cSJim Jagielski         {
446*b1cdbd2cSJim Jagielski         private:
447*b1cdbd2cSJim Jagielski             StringBag&                      m_rBag;
448*b1cdbd2cSJim Jagielski             CachedInspectorUI::FGetStringBag  m_pGetter;
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski         public:
StringBagCollectorpcr::__anon445aa6110311::StringBagCollector451*b1cdbd2cSJim Jagielski             StringBagCollector( StringBag& _rBag, CachedInspectorUI::FGetStringBag _pGetter ) :m_rBag( _rBag ), m_pGetter( _pGetter ) { }
452*b1cdbd2cSJim Jagielski 
operator ()pcr::__anon445aa6110311::StringBagCollector453*b1cdbd2cSJim Jagielski             void operator()( const ImplMapHandlerToUI::value_type& _rUI )
454*b1cdbd2cSJim Jagielski             {
455*b1cdbd2cSJim Jagielski                 StringBag& rBag( ((_rUI.second.get())->*m_pGetter)() );
456*b1cdbd2cSJim Jagielski                 m_rBag.insert( rBag.begin(), rBag.end() );
457*b1cdbd2cSJim Jagielski             }
458*b1cdbd2cSJim Jagielski 
collectAllpcr::__anon445aa6110311::StringBagCollector459*b1cdbd2cSJim Jagielski             static void collectAll( StringBag& _rAll, const ImplMapHandlerToUI& _rMap, CachedInspectorUI::FGetStringBag _pGetter )
460*b1cdbd2cSJim Jagielski             {
461*b1cdbd2cSJim Jagielski                 ::std::for_each( _rMap.begin(), _rMap.end(), StringBagCollector( _rAll, _pGetter ) );
462*b1cdbd2cSJim Jagielski             }
463*b1cdbd2cSJim Jagielski         };
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski         //============================================================
466*b1cdbd2cSJim Jagielski 	    //= StringBagClearer
467*b1cdbd2cSJim Jagielski 	    //============================================================
468*b1cdbd2cSJim Jagielski         /** an STL-compatible structure which cleans a certain string bag in a CachedInspectorUI instances
469*b1cdbd2cSJim Jagielski         */
470*b1cdbd2cSJim Jagielski         struct StringBagClearer : public ::std::unary_function< ImplMapHandlerToUI::value_type, void >
471*b1cdbd2cSJim Jagielski         {
472*b1cdbd2cSJim Jagielski         private:
473*b1cdbd2cSJim Jagielski             CachedInspectorUI::FGetStringBag  m_pGetter;
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski         public:
StringBagClearerpcr::__anon445aa6110311::StringBagClearer476*b1cdbd2cSJim Jagielski             StringBagClearer( CachedInspectorUI::FGetStringBag _pGetter ) :m_pGetter( _pGetter ) { }
477*b1cdbd2cSJim Jagielski 
operator ()pcr::__anon445aa6110311::StringBagClearer478*b1cdbd2cSJim Jagielski             void operator()( const ImplMapHandlerToUI::value_type& _rUI )
479*b1cdbd2cSJim Jagielski             {
480*b1cdbd2cSJim Jagielski                 clearContainer( ((_rUI.second.get())->*m_pGetter)() );
481*b1cdbd2cSJim Jagielski             }
482*b1cdbd2cSJim Jagielski 
clearAllpcr::__anon445aa6110311::StringBagClearer483*b1cdbd2cSJim Jagielski             static void clearAll( const ImplMapHandlerToUI& _rMap, CachedInspectorUI::FGetStringBag _pGetter )
484*b1cdbd2cSJim Jagielski             {
485*b1cdbd2cSJim Jagielski                 ::std::for_each( _rMap.begin(), _rMap.end(), StringBagClearer( _pGetter ) );
486*b1cdbd2cSJim Jagielski             }
487*b1cdbd2cSJim Jagielski         };
488*b1cdbd2cSJim Jagielski 
489*b1cdbd2cSJim Jagielski         //============================================================
490*b1cdbd2cSJim Jagielski 	    //= FPropertyUISetter
491*b1cdbd2cSJim Jagielski 	    //============================================================
492*b1cdbd2cSJim Jagielski         /** a typedef for a ->XObjectInspectorUI member function taking a string
493*b1cdbd2cSJim Jagielski         */
494*b1cdbd2cSJim Jagielski         typedef void ( SAL_CALL XObjectInspectorUI::*FPropertyUISetter )( const ::rtl::OUString& );
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski         //============================================================
497*b1cdbd2cSJim Jagielski 	    //= PropertyUIOperator
498*b1cdbd2cSJim Jagielski 	    //============================================================
499*b1cdbd2cSJim Jagielski         /** an STL-compatible struct which calls a certain member method (taking a string) at a
500*b1cdbd2cSJim Jagielski             given ->XObjectInspectorUI instance
501*b1cdbd2cSJim Jagielski         */
502*b1cdbd2cSJim Jagielski         struct PropertyUIOperator : public ::std::unary_function< ::rtl::OUString, void >
503*b1cdbd2cSJim Jagielski         {
504*b1cdbd2cSJim Jagielski         private:
505*b1cdbd2cSJim Jagielski             Reference< XObjectInspectorUI > m_xUpdater;
506*b1cdbd2cSJim Jagielski             FPropertyUISetter               m_pSetter;
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski         public:
PropertyUIOperatorpcr::__anon445aa6110311::PropertyUIOperator509*b1cdbd2cSJim Jagielski             PropertyUIOperator( const Reference< XObjectInspectorUI >& _rxInspectorUI, FPropertyUISetter _pSetter )
510*b1cdbd2cSJim Jagielski                 :m_xUpdater( _rxInspectorUI )
511*b1cdbd2cSJim Jagielski                 ,m_pSetter( _pSetter )
512*b1cdbd2cSJim Jagielski             {
513*b1cdbd2cSJim Jagielski             }
514*b1cdbd2cSJim Jagielski 
operator ()pcr::__anon445aa6110311::PropertyUIOperator515*b1cdbd2cSJim Jagielski             void operator()( const ::rtl::OUString& _rPropertyName )
516*b1cdbd2cSJim Jagielski             {
517*b1cdbd2cSJim Jagielski                 ((m_xUpdater.get())->*m_pSetter)( _rPropertyName );
518*b1cdbd2cSJim Jagielski             }
519*b1cdbd2cSJim Jagielski 
forEachpcr::__anon445aa6110311::PropertyUIOperator520*b1cdbd2cSJim Jagielski             static void forEach( const StringBag& _rProperties, const Reference< XObjectInspectorUI >& _rxDelegatorUI, FPropertyUISetter _pSetter )
521*b1cdbd2cSJim Jagielski             {
522*b1cdbd2cSJim Jagielski                 ::std::for_each( _rProperties.begin(), _rProperties.end(), PropertyUIOperator( _rxDelegatorUI, _pSetter ) );
523*b1cdbd2cSJim Jagielski             }
524*b1cdbd2cSJim Jagielski         };
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski         //============================================================
527*b1cdbd2cSJim Jagielski 	    //= IStringKeyBooleanUIUpdate
528*b1cdbd2cSJim Jagielski 	    //============================================================
529*b1cdbd2cSJim Jagielski         /** an interface which encapsulates access to a single aspect of the ->XObjectInspectorUI,
530*b1cdbd2cSJim Jagielski             where this aspect is given by a string key, and has a boolean value.
531*b1cdbd2cSJim Jagielski         */
532*b1cdbd2cSJim Jagielski         class IStringKeyBooleanUIUpdate
533*b1cdbd2cSJim Jagielski         {
534*b1cdbd2cSJim Jagielski         public:
535*b1cdbd2cSJim Jagielski             virtual void updateUIForKey( const ::rtl::OUString& _rKey, sal_Bool _bFlag ) const = 0;
536*b1cdbd2cSJim Jagielski 
~IStringKeyBooleanUIUpdate()537*b1cdbd2cSJim Jagielski             virtual ~IStringKeyBooleanUIUpdate() { }
538*b1cdbd2cSJim Jagielski         };
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski         //============================================================
541*b1cdbd2cSJim Jagielski 	    //= FPropertyUIFlagSetter
542*b1cdbd2cSJim Jagielski 	    //============================================================
543*b1cdbd2cSJim Jagielski         /** an implementation of the ->IStringKeyBooleanUIUpdate interface which,
544*b1cdbd2cSJim Jagielski             for a fixed ->XObjectInspectorUI instance and a fixed UI element (->PropertyLineElement),
545*b1cdbd2cSJim Jagielski             updates this element for a given property with a given boolean flag
546*b1cdbd2cSJim Jagielski             (->XObjectInspectorUI::enablePropertyUIElements)
547*b1cdbd2cSJim Jagielski         */
548*b1cdbd2cSJim Jagielski         class EnablePropertyUIElement : public IStringKeyBooleanUIUpdate
549*b1cdbd2cSJim Jagielski         {
550*b1cdbd2cSJim Jagielski         private:
551*b1cdbd2cSJim Jagielski             Reference< XObjectInspectorUI > m_xUIUpdate;
552*b1cdbd2cSJim Jagielski             sal_Int16                       m_nElement;
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski         public:
EnablePropertyUIElement(const Reference<XObjectInspectorUI> & _rxUIUpdate,sal_Int16 _nElement)555*b1cdbd2cSJim Jagielski             EnablePropertyUIElement( const Reference< XObjectInspectorUI >& _rxUIUpdate, sal_Int16 _nElement )
556*b1cdbd2cSJim Jagielski                 :m_xUIUpdate( _rxUIUpdate )
557*b1cdbd2cSJim Jagielski                 ,m_nElement( _nElement )
558*b1cdbd2cSJim Jagielski             {
559*b1cdbd2cSJim Jagielski             }
560*b1cdbd2cSJim Jagielski             // IStringKeyBooleanUIUpdate
561*b1cdbd2cSJim Jagielski             virtual void updateUIForKey( const ::rtl::OUString& _rKey, sal_Bool _bFlag ) const;
562*b1cdbd2cSJim Jagielski         };
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski         //............................................................
updateUIForKey(const::rtl::OUString & _rKey,sal_Bool _bFlag) const565*b1cdbd2cSJim Jagielski         void EnablePropertyUIElement::updateUIForKey( const ::rtl::OUString& _rKey, sal_Bool _bFlag ) const
566*b1cdbd2cSJim Jagielski         {
567*b1cdbd2cSJim Jagielski             m_xUIUpdate->enablePropertyUIElements( _rKey, m_nElement, _bFlag );
568*b1cdbd2cSJim Jagielski         }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski         //============================================================
571*b1cdbd2cSJim Jagielski 	    //= FPropertyUIFlagSetter
572*b1cdbd2cSJim Jagielski 	    //============================================================
573*b1cdbd2cSJim Jagielski         /** a ->XObjectInspectorUI method taking a string and a boolean
574*b1cdbd2cSJim Jagielski         */
575*b1cdbd2cSJim Jagielski         typedef void ( SAL_CALL XObjectInspectorUI::*FPropertyUIFlagSetter )( const ::rtl::OUString&, sal_Bool );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski         //============================================================
578*b1cdbd2cSJim Jagielski 	    //= DefaultStringKeyBooleanUIUpdate
579*b1cdbd2cSJim Jagielski 	    //============================================================
580*b1cdbd2cSJim Jagielski         /** an implementaiton of the ->IStringKeyBooleanUIUpdate interface which calls
581*b1cdbd2cSJim Jagielski             am arbitrary ->XObjectInspectorUI method taking a string and a boolean flag
582*b1cdbd2cSJim Jagielski         */
583*b1cdbd2cSJim Jagielski         class DefaultStringKeyBooleanUIUpdate : public IStringKeyBooleanUIUpdate
584*b1cdbd2cSJim Jagielski         {
585*b1cdbd2cSJim Jagielski         private:
586*b1cdbd2cSJim Jagielski             Reference< XObjectInspectorUI > m_xUIUpdate;
587*b1cdbd2cSJim Jagielski             FPropertyUIFlagSetter           m_pSetter;
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski         public:
590*b1cdbd2cSJim Jagielski             DefaultStringKeyBooleanUIUpdate( const Reference< XObjectInspectorUI >& _rxUIUpdate, FPropertyUIFlagSetter _pSetter );
591*b1cdbd2cSJim Jagielski             // IStringKeyBooleanUIUpdate
592*b1cdbd2cSJim Jagielski             virtual void updateUIForKey( const ::rtl::OUString& _rKey, sal_Bool _bFlag ) const;
593*b1cdbd2cSJim Jagielski         };
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski         //............................................................
DefaultStringKeyBooleanUIUpdate(const Reference<XObjectInspectorUI> & _rxUIUpdate,FPropertyUIFlagSetter _pSetter)596*b1cdbd2cSJim Jagielski         DefaultStringKeyBooleanUIUpdate::DefaultStringKeyBooleanUIUpdate( const Reference< XObjectInspectorUI >& _rxUIUpdate, FPropertyUIFlagSetter _pSetter )
597*b1cdbd2cSJim Jagielski             :m_xUIUpdate( _rxUIUpdate )
598*b1cdbd2cSJim Jagielski             ,m_pSetter( _pSetter )
599*b1cdbd2cSJim Jagielski         {
600*b1cdbd2cSJim Jagielski         }
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski         //............................................................
updateUIForKey(const::rtl::OUString & _rKey,sal_Bool _bFlag) const603*b1cdbd2cSJim Jagielski         void DefaultStringKeyBooleanUIUpdate::updateUIForKey( const ::rtl::OUString& _rKey, sal_Bool _bFlag ) const
604*b1cdbd2cSJim Jagielski         {
605*b1cdbd2cSJim Jagielski             ((m_xUIUpdate.get())->*m_pSetter)( _rKey, _bFlag );
606*b1cdbd2cSJim Jagielski         }
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski         //============================================================
609*b1cdbd2cSJim Jagielski 	    //= BooleanUIAspectUpdate
610*b1cdbd2cSJim Jagielski 	    //============================================================
611*b1cdbd2cSJim Jagielski         /** an STL-compatible structure which applies a ->IStringKeyBooleanUIUpdate::updateUIForKey
612*b1cdbd2cSJim Jagielski             operation with a fixed boolean value, for a given string value
613*b1cdbd2cSJim Jagielski         */
614*b1cdbd2cSJim Jagielski         struct BooleanUIAspectUpdate : public ::std::unary_function< ::rtl::OUString, void >
615*b1cdbd2cSJim Jagielski         {
616*b1cdbd2cSJim Jagielski         private:
617*b1cdbd2cSJim Jagielski             const IStringKeyBooleanUIUpdate&    m_rUpdater;
618*b1cdbd2cSJim Jagielski             sal_Bool                            m_bFlag;
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski         public:
BooleanUIAspectUpdatepcr::__anon445aa6110311::BooleanUIAspectUpdate621*b1cdbd2cSJim Jagielski             BooleanUIAspectUpdate( const IStringKeyBooleanUIUpdate& _rUpdater, sal_Bool _bFlag )
622*b1cdbd2cSJim Jagielski                 :m_rUpdater( _rUpdater )
623*b1cdbd2cSJim Jagielski                 ,m_bFlag( _bFlag )
624*b1cdbd2cSJim Jagielski             {
625*b1cdbd2cSJim Jagielski             }
626*b1cdbd2cSJim Jagielski 
operator ()pcr::__anon445aa6110311::BooleanUIAspectUpdate627*b1cdbd2cSJim Jagielski             void operator()( const ::rtl::OUString& _rPropertyName )
628*b1cdbd2cSJim Jagielski             {
629*b1cdbd2cSJim Jagielski                 m_rUpdater.updateUIForKey( _rPropertyName, m_bFlag );
630*b1cdbd2cSJim Jagielski             }
631*b1cdbd2cSJim Jagielski 
forEachpcr::__anon445aa6110311::BooleanUIAspectUpdate632*b1cdbd2cSJim Jagielski             static void forEach( const StringBag& _rProperties, const IStringKeyBooleanUIUpdate& _rUpdater, sal_Bool _bFlag )
633*b1cdbd2cSJim Jagielski             {
634*b1cdbd2cSJim Jagielski                 ::std::for_each( _rProperties.begin(), _rProperties.end(), BooleanUIAspectUpdate( _rUpdater, _bFlag ) );
635*b1cdbd2cSJim Jagielski             }
636*b1cdbd2cSJim Jagielski         };
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski         //============================================================
639*b1cdbd2cSJim Jagielski 	    //= BooleanUIAspectUpdate
640*b1cdbd2cSJim Jagielski 	    //============================================================
641*b1cdbd2cSJim Jagielski         /** an STL-compatible structure subtracting a given string from a fixed ->StringBag
642*b1cdbd2cSJim Jagielski         */
643*b1cdbd2cSJim Jagielski         struct StringBagComplement : public ::std::unary_function< ::rtl::OUString, void >
644*b1cdbd2cSJim Jagielski         {
645*b1cdbd2cSJim Jagielski         private:
646*b1cdbd2cSJim Jagielski             StringBag&  m_rMinuend;
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski         public:
StringBagComplementpcr::__anon445aa6110311::StringBagComplement649*b1cdbd2cSJim Jagielski             StringBagComplement( StringBag& _rMinuend ) :m_rMinuend( _rMinuend ) { }
650*b1cdbd2cSJim Jagielski 
operator ()pcr::__anon445aa6110311::StringBagComplement651*b1cdbd2cSJim Jagielski             void operator()( const ::rtl::OUString& _rPropertyToSubtract )
652*b1cdbd2cSJim Jagielski             {
653*b1cdbd2cSJim Jagielski                 m_rMinuend.erase( _rPropertyToSubtract );
654*b1cdbd2cSJim Jagielski             }
655*b1cdbd2cSJim Jagielski 
subtractpcr::__anon445aa6110311::StringBagComplement656*b1cdbd2cSJim Jagielski             static void subtract( StringBag& _rMinuend, const StringBag& _rSubtrahend )
657*b1cdbd2cSJim Jagielski             {
658*b1cdbd2cSJim Jagielski                 ::std::for_each( _rSubtrahend.begin(), _rSubtrahend.end(), StringBagComplement( _rMinuend ) );
659*b1cdbd2cSJim Jagielski             }
660*b1cdbd2cSJim Jagielski         };
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski         //============================================================
663*b1cdbd2cSJim Jagielski 	    //= BooleanUIAspectUpdate
664*b1cdbd2cSJim Jagielski 	    //============================================================
lcl_fireUIStateFlag(const IStringKeyBooleanUIUpdate & _rUIUpdate,const ImplMapHandlerToUI & _rHandlerUIs,CachedInspectorUI::FGetStringBag _pGetPositives,CachedInspectorUI::FGetStringBag _pGetNegatives)665*b1cdbd2cSJim Jagielski         void lcl_fireUIStateFlag(
666*b1cdbd2cSJim Jagielski                 const IStringKeyBooleanUIUpdate& _rUIUpdate,
667*b1cdbd2cSJim Jagielski                 const ImplMapHandlerToUI& _rHandlerUIs,
668*b1cdbd2cSJim Jagielski                 CachedInspectorUI::FGetStringBag _pGetPositives,
669*b1cdbd2cSJim Jagielski                 CachedInspectorUI::FGetStringBag _pGetNegatives
670*b1cdbd2cSJim Jagielski             )
671*b1cdbd2cSJim Jagielski         {
672*b1cdbd2cSJim Jagielski             // all strings which are in the "positive" list of one handler
673*b1cdbd2cSJim Jagielski             StringBag aAllPositives;
674*b1cdbd2cSJim Jagielski             StringBagCollector::collectAll( aAllPositives, _rHandlerUIs, _pGetPositives );
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski             // all strings which are in the "negative" list of one handler
677*b1cdbd2cSJim Jagielski             StringBag aAllNegatives;
678*b1cdbd2cSJim Jagielski             StringBagCollector::collectAll( aAllNegatives, _rHandlerUIs, _pGetNegatives );
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski             // propagate the "negative" flags to the delegator UI
681*b1cdbd2cSJim Jagielski             BooleanUIAspectUpdate::forEach( aAllNegatives, _rUIUpdate, sal_False );
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski             // propagate the "positive" flags to the delegator UI, for all elements where _no_
684*b1cdbd2cSJim Jagielski             // "negative" flag exists
685*b1cdbd2cSJim Jagielski             StringBagComplement::subtract( aAllPositives, aAllNegatives );
686*b1cdbd2cSJim Jagielski             BooleanUIAspectUpdate::forEach( aAllPositives, _rUIUpdate, sal_True );
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski             // the "positive" request can be cleared no, only negative requests
689*b1cdbd2cSJim Jagielski             // (such as "disable a property" or "hide a category") need to be preserved for the next round
690*b1cdbd2cSJim Jagielski             StringBagClearer::clearAll( _rHandlerUIs, _pGetPositives );
691*b1cdbd2cSJim Jagielski         }
692*b1cdbd2cSJim Jagielski     }
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
impl_fireEnablePropertyUI_throw()695*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_fireEnablePropertyUI_throw()
696*b1cdbd2cSJim Jagielski     {
697*b1cdbd2cSJim Jagielski         lcl_fireUIStateFlag(
698*b1cdbd2cSJim Jagielski             DefaultStringKeyBooleanUIUpdate( m_xDelegatorUI, &XObjectInspectorUI::enablePropertyUI ),
699*b1cdbd2cSJim Jagielski             m_pCollectedUIs->aHandlers,
700*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getEnabledProperties,
701*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getDisabledProperties
702*b1cdbd2cSJim Jagielski         );
703*b1cdbd2cSJim Jagielski     }
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
impl_fireRebuildPropertyUI_throw()706*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_fireRebuildPropertyUI_throw()
707*b1cdbd2cSJim Jagielski     {
708*b1cdbd2cSJim Jagielski         // collect all properties for which a rebuild request has been made
709*b1cdbd2cSJim Jagielski         StringBag aAllRebuilt;
710*b1cdbd2cSJim Jagielski         StringBagCollector::collectAll( aAllRebuilt, m_pCollectedUIs->aHandlers, &CachedInspectorUI::getRebuiltProperties );
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski         // rebuild all those properties
713*b1cdbd2cSJim Jagielski         PropertyUIOperator::forEach( aAllRebuilt, m_xDelegatorUI, &XObjectInspectorUI::rebuildPropertyUI );
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski         // clear the "properties to rebuild" at all handlers, since the request has been fulfilled now.
716*b1cdbd2cSJim Jagielski         StringBagClearer::clearAll( m_pCollectedUIs->aHandlers, &CachedInspectorUI::getRebuiltProperties );
717*b1cdbd2cSJim Jagielski     }
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
impl_fireShowHidePropertyUI_throw()720*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_fireShowHidePropertyUI_throw()
721*b1cdbd2cSJim Jagielski     {
722*b1cdbd2cSJim Jagielski         // all properties which have been shown by at least one handler
723*b1cdbd2cSJim Jagielski         StringBag aAllShown;
724*b1cdbd2cSJim Jagielski         StringBagCollector::collectAll( aAllShown, m_pCollectedUIs->aHandlers, &CachedInspectorUI::getShownProperties );
725*b1cdbd2cSJim Jagielski         // all properties which have been hidden by at least one handler
726*b1cdbd2cSJim Jagielski         StringBag aAllHidden;
727*b1cdbd2cSJim Jagielski         StringBagCollector::collectAll( aAllHidden, m_pCollectedUIs->aHandlers, &CachedInspectorUI::getHiddenProperties );
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski         // hide properties as necessary
730*b1cdbd2cSJim Jagielski         PropertyUIOperator::forEach( aAllHidden, m_xDelegatorUI, &XObjectInspectorUI::hidePropertyUI );
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski         // for those properties which are hidden, ignore all "show" requests which other handlers might have had
733*b1cdbd2cSJim Jagielski         StringBagComplement::subtract( aAllShown, aAllHidden );
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski         // show properties
736*b1cdbd2cSJim Jagielski         PropertyUIOperator::forEach( aAllShown, m_xDelegatorUI, &XObjectInspectorUI::showPropertyUI );
737*b1cdbd2cSJim Jagielski     }
738*b1cdbd2cSJim Jagielski 
739*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
impl_fireShowCategory_throw()740*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_fireShowCategory_throw()
741*b1cdbd2cSJim Jagielski     {
742*b1cdbd2cSJim Jagielski         lcl_fireUIStateFlag(
743*b1cdbd2cSJim Jagielski             DefaultStringKeyBooleanUIUpdate( m_xDelegatorUI, &XObjectInspectorUI::showCategory ),
744*b1cdbd2cSJim Jagielski             m_pCollectedUIs->aHandlers,
745*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getShownCategories,
746*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getHiddenCategories
747*b1cdbd2cSJim Jagielski         );
748*b1cdbd2cSJim Jagielski     }
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
impl_fireEnablePropertyUIElements_throw()751*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_fireEnablePropertyUIElements_throw()
752*b1cdbd2cSJim Jagielski     {
753*b1cdbd2cSJim Jagielski         lcl_fireUIStateFlag(
754*b1cdbd2cSJim Jagielski             EnablePropertyUIElement( m_xDelegatorUI, PropertyLineElement::InputControl ),
755*b1cdbd2cSJim Jagielski             m_pCollectedUIs->aHandlers,
756*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getEnabledInputControls,
757*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getDisabledInputControls
758*b1cdbd2cSJim Jagielski         );
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski         lcl_fireUIStateFlag(
761*b1cdbd2cSJim Jagielski             EnablePropertyUIElement( m_xDelegatorUI, PropertyLineElement::PrimaryButton ),
762*b1cdbd2cSJim Jagielski             m_pCollectedUIs->aHandlers,
763*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getEnabledPrimaryButtons,
764*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getDisabledPrimaryButtons
765*b1cdbd2cSJim Jagielski         );
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski         lcl_fireUIStateFlag(
768*b1cdbd2cSJim Jagielski             EnablePropertyUIElement( m_xDelegatorUI, PropertyLineElement::SecondaryButton ),
769*b1cdbd2cSJim Jagielski             m_pCollectedUIs->aHandlers,
770*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getEnabledSecondaryButtons,
771*b1cdbd2cSJim Jagielski             &CachedInspectorUI::getDisabledSecondaryButtons
772*b1cdbd2cSJim Jagielski         );
773*b1cdbd2cSJim Jagielski     }
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
impl_fireAll_throw()776*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_fireAll_throw()
777*b1cdbd2cSJim Jagielski     {
778*b1cdbd2cSJim Jagielski         OSL_PRECOND( !impl_isDisposed(), "ComposedPropertyUIUpdate::impl_fireAll_throw: already disposed, this will crash!" );
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski         impl_fireEnablePropertyUI_throw();
781*b1cdbd2cSJim Jagielski         impl_fireShowHidePropertyUI_throw();
782*b1cdbd2cSJim Jagielski         impl_fireRebuildPropertyUI_throw();
783*b1cdbd2cSJim Jagielski         impl_fireShowCategory_throw();
784*b1cdbd2cSJim Jagielski         impl_fireEnablePropertyUIElements_throw();
785*b1cdbd2cSJim Jagielski     }
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
suspendAutoFire()788*b1cdbd2cSJim Jagielski     void SAL_CALL ComposedPropertyUIUpdate::suspendAutoFire()
789*b1cdbd2cSJim Jagielski     {
790*b1cdbd2cSJim Jagielski         impl_checkDisposed();
791*b1cdbd2cSJim Jagielski         osl_incrementInterlockedCount( &m_nSuspendCounter );
792*b1cdbd2cSJim Jagielski     }
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
resumeAutoFire()795*b1cdbd2cSJim Jagielski     void SAL_CALL ComposedPropertyUIUpdate::resumeAutoFire()
796*b1cdbd2cSJim Jagielski     {
797*b1cdbd2cSJim Jagielski         impl_checkDisposed();
798*b1cdbd2cSJim Jagielski         if ( 0 == osl_decrementInterlockedCount( &m_nSuspendCounter ) )
799*b1cdbd2cSJim Jagielski             impl_fireAll_throw();
800*b1cdbd2cSJim Jagielski     }
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
impl_checkDisposed() const803*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::impl_checkDisposed() const
804*b1cdbd2cSJim Jagielski     {
805*b1cdbd2cSJim Jagielski         if ( impl_isDisposed() )
806*b1cdbd2cSJim Jagielski             throw DisposedException();
807*b1cdbd2cSJim Jagielski     }
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
callback_inspectorUIChanged_throw()810*b1cdbd2cSJim Jagielski     void ComposedPropertyUIUpdate::callback_inspectorUIChanged_throw()
811*b1cdbd2cSJim Jagielski     {
812*b1cdbd2cSJim Jagielski         if ( 0 == m_nSuspendCounter )
813*b1cdbd2cSJim Jagielski             impl_fireAll_throw();
814*b1cdbd2cSJim Jagielski     }
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 	//----------------------------------------------------------------
getDelegatorUI() const817*b1cdbd2cSJim Jagielski     Reference< XObjectInspectorUI > ComposedPropertyUIUpdate::getDelegatorUI() const
818*b1cdbd2cSJim Jagielski     {
819*b1cdbd2cSJim Jagielski         impl_checkDisposed();
820*b1cdbd2cSJim Jagielski         return m_xDelegatorUI;
821*b1cdbd2cSJim Jagielski     }
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
dispose()824*b1cdbd2cSJim Jagielski     void SAL_CALL ComposedPropertyUIUpdate::dispose()
825*b1cdbd2cSJim Jagielski     {
826*b1cdbd2cSJim Jagielski         if ( impl_isDisposed() )
827*b1cdbd2cSJim Jagielski             return;
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski         OSL_ENSURE( m_nSuspendCounter == 0, "ComposedPropertyUIUpdate::dispose: still suspended, the changes will be lost!" );
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski         for ( ImplMapHandlerToUI::const_iterator singleUI = m_pCollectedUIs->aHandlers.begin();
832*b1cdbd2cSJim Jagielski               singleUI != m_pCollectedUIs->aHandlers.end();
833*b1cdbd2cSJim Jagielski               ++singleUI
834*b1cdbd2cSJim Jagielski             )
835*b1cdbd2cSJim Jagielski         {
836*b1cdbd2cSJim Jagielski             singleUI->second->dispose();
837*b1cdbd2cSJim Jagielski         }
838*b1cdbd2cSJim Jagielski         m_pCollectedUIs.reset();
839*b1cdbd2cSJim Jagielski         m_xDelegatorUI.set( NULL );
840*b1cdbd2cSJim Jagielski     }
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski     //----------------------------------------------------------------
shouldContinuePropertyHandling(const::rtl::OUString & _rName) const843*b1cdbd2cSJim Jagielski     bool ComposedPropertyUIUpdate::shouldContinuePropertyHandling( const ::rtl::OUString& _rName ) const
844*b1cdbd2cSJim Jagielski     {
845*b1cdbd2cSJim Jagielski         if ( !m_pPropertyCheck )
846*b1cdbd2cSJim Jagielski             return true;
847*b1cdbd2cSJim Jagielski         if ( m_pPropertyCheck->hasPropertyByName( _rName ) )
848*b1cdbd2cSJim Jagielski             return true;
849*b1cdbd2cSJim Jagielski         return false;
850*b1cdbd2cSJim Jagielski     }
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski //........................................................................
853*b1cdbd2cSJim Jagielski } // namespace pcr
854*b1cdbd2cSJim Jagielski //........................................................................
855*b1cdbd2cSJim Jagielski 
856