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