1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include <com/sun/star/beans/XPropertyState.hpp> 27 #include "PropertySetMerger.hxx" 28 29 using ::rtl::OUString; 30 31 using namespace ::com::sun::star; 32 using namespace ::com::sun::star::uno; 33 using namespace ::com::sun::star::beans; 34 using namespace ::com::sun::star::lang; 35 36 #ifndef _CPPUHELPER_IMPLBASE1_HXX_ 37 #include <cppuhelper/implbase3.hxx> 38 #endif 39 40 class SvXMLAttrContainerItem_Impl; 41 42 class PropertySetMergerImpl : public ::cppu::WeakAggImplHelper3< XPropertySet, XPropertyState, XPropertySetInfo > 43 { 44 private: 45 Reference< XPropertySet > mxPropSet1; 46 Reference< XPropertyState > mxPropSet1State; 47 Reference< XPropertySetInfo > mxPropSet1Info; 48 49 Reference< XPropertySet > mxPropSet2; 50 Reference< XPropertyState > mxPropSet2State; 51 Reference< XPropertySetInfo > mxPropSet2Info; 52 53 public: 54 PropertySetMergerImpl( const Reference< XPropertySet > rPropSet1, const Reference< XPropertySet > rPropSet2 ); 55 virtual ~PropertySetMergerImpl(); 56 57 // XPropertySet 58 virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(RuntimeException); 59 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException); 60 virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException); 61 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException); 62 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException); 63 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException); 64 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException); 65 66 // XPropertyState 67 virtual PropertyState SAL_CALL getPropertyState( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException); 68 virtual Sequence< PropertyState > SAL_CALL getPropertyStates( const Sequence< OUString >& aPropertyName ) throw(UnknownPropertyException, RuntimeException); 69 virtual void SAL_CALL setPropertyToDefault( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException); 70 virtual Any SAL_CALL getPropertyDefault( const OUString& aPropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException); 71 72 // XPropertySetInfo 73 virtual Sequence< Property > SAL_CALL getProperties( ) throw(RuntimeException); 74 virtual Property SAL_CALL getPropertyByName( const OUString& aName ) throw(UnknownPropertyException, RuntimeException); 75 virtual sal_Bool SAL_CALL hasPropertyByName( const OUString& Name ) throw(RuntimeException); 76 }; 77 78 // -------------------------------------------------------------------- 79 // Interface implementation 80 // -------------------------------------------------------------------- 81 82 PropertySetMergerImpl::PropertySetMergerImpl( Reference< XPropertySet > rPropSet1, Reference< XPropertySet > rPropSet2 ) 83 : mxPropSet1( rPropSet1 ) 84 , mxPropSet1State( rPropSet1, UNO_QUERY ) 85 , mxPropSet1Info( rPropSet1->getPropertySetInfo() ) 86 , mxPropSet2( rPropSet2 ) 87 , mxPropSet2State( rPropSet2, UNO_QUERY ) 88 , mxPropSet2Info( rPropSet2->getPropertySetInfo() ) 89 { 90 } 91 92 PropertySetMergerImpl::~PropertySetMergerImpl() 93 { 94 } 95 96 // XPropertySet 97 Reference< XPropertySetInfo > SAL_CALL PropertySetMergerImpl::getPropertySetInfo( ) throw(RuntimeException) 98 { 99 return this; 100 } 101 102 void SAL_CALL PropertySetMergerImpl::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException) 103 { 104 if( mxPropSet1Info->hasPropertyByName( aPropertyName ) ) 105 { 106 mxPropSet1->setPropertyValue( aPropertyName, aValue ); 107 } 108 else 109 { 110 mxPropSet2->setPropertyValue( aPropertyName, aValue ); 111 } 112 } 113 114 Any SAL_CALL PropertySetMergerImpl::getPropertyValue( const OUString& PropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) 115 { 116 if( mxPropSet1Info->hasPropertyByName( PropertyName ) ) 117 { 118 return mxPropSet1->getPropertyValue( PropertyName ); 119 } 120 else 121 { 122 return mxPropSet2->getPropertyValue( PropertyName ); 123 } 124 } 125 126 void SAL_CALL PropertySetMergerImpl::addPropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*xListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) 127 { 128 } 129 130 void SAL_CALL PropertySetMergerImpl::removePropertyChangeListener( const OUString& /*aPropertyName*/, const Reference< XPropertyChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) 131 { 132 } 133 134 void SAL_CALL PropertySetMergerImpl::addVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) 135 { 136 } 137 138 void SAL_CALL PropertySetMergerImpl::removeVetoableChangeListener( const OUString& /*PropertyName*/, const Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) 139 { 140 } 141 142 // XPropertyState 143 PropertyState SAL_CALL PropertySetMergerImpl::getPropertyState( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException) 144 { 145 if( mxPropSet1Info->hasPropertyByName( PropertyName ) ) 146 { 147 if( mxPropSet1State.is() ) 148 { 149 return mxPropSet1State->getPropertyState( PropertyName ); 150 } 151 else 152 { 153 return PropertyState_DIRECT_VALUE; 154 } 155 } 156 else 157 { 158 if( mxPropSet2State.is() ) 159 { 160 return mxPropSet2State->getPropertyState( PropertyName ); 161 } 162 else 163 { 164 return PropertyState_DIRECT_VALUE; 165 } 166 } 167 } 168 169 Sequence< PropertyState > SAL_CALL PropertySetMergerImpl::getPropertyStates( const Sequence< OUString >& aPropertyName ) throw(UnknownPropertyException, RuntimeException) 170 { 171 const sal_Int32 nCount = aPropertyName.getLength(); 172 Sequence< PropertyState > aPropStates( nCount ); 173 PropertyState* pPropStates = aPropStates.getArray(); 174 const OUString* pPropNames = aPropertyName.getConstArray(); 175 176 sal_Int32 nIndex; 177 for( nIndex = 0; nIndex < nCount; nIndex++ ) 178 *pPropStates++ = getPropertyState( *pPropNames++ ); 179 180 return aPropStates; 181 } 182 183 void SAL_CALL PropertySetMergerImpl::setPropertyToDefault( const OUString& PropertyName ) throw(UnknownPropertyException, RuntimeException) 184 { 185 if( mxPropSet1State.is() && mxPropSet1Info->hasPropertyByName( PropertyName ) ) 186 { 187 mxPropSet1State->setPropertyToDefault( PropertyName ); 188 } 189 else 190 { 191 if( mxPropSet2State.is() ) 192 { 193 mxPropSet2State->setPropertyToDefault( PropertyName ); 194 } 195 } 196 } 197 198 Any SAL_CALL PropertySetMergerImpl::getPropertyDefault( const OUString& aPropertyName ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException) 199 { 200 if( mxPropSet1State.is() && mxPropSet1Info->hasPropertyByName( aPropertyName ) ) 201 { 202 return mxPropSet1State->getPropertyDefault( aPropertyName ); 203 } 204 else 205 { 206 if( mxPropSet2State.is() ) 207 { 208 return mxPropSet2State->getPropertyDefault( aPropertyName ); 209 } 210 else 211 { 212 Any aAny; 213 return aAny; 214 } 215 } 216 } 217 218 // XPropertySetInfo 219 Sequence< Property > SAL_CALL PropertySetMergerImpl::getProperties() throw(RuntimeException) 220 { 221 Sequence< Property > aProps1( mxPropSet1Info->getProperties() ); 222 const Property* pProps1 = aProps1.getArray(); 223 const sal_Int32 nCount1 = aProps1.getLength(); 224 225 Sequence< Property > aProps2( mxPropSet1Info->getProperties() ); 226 const Property* pProps2 = aProps2.getArray(); 227 const sal_Int32 nCount2 = aProps2.getLength(); 228 229 Sequence< Property > aProperties( nCount1 + nCount2 ); 230 231 sal_Int32 nIndex; 232 233 Property* pProperties = aProperties.getArray(); 234 235 for( nIndex = 0; nIndex < nCount1; nIndex++ ) 236 *pProperties++ = *pProps1++; 237 238 for( nIndex = 0; nIndex < nCount2; nIndex++ ) 239 *pProperties++ = *pProps2++; 240 241 return aProperties; 242 } 243 244 Property SAL_CALL PropertySetMergerImpl::getPropertyByName( const OUString& aName ) throw(UnknownPropertyException, RuntimeException) 245 { 246 if( mxPropSet1Info->hasPropertyByName( aName ) ) 247 return mxPropSet1Info->getPropertyByName( aName ); 248 249 return mxPropSet2Info->getPropertyByName( aName ); 250 } 251 252 sal_Bool SAL_CALL PropertySetMergerImpl::hasPropertyByName( const OUString& Name ) throw(RuntimeException) 253 { 254 if(mxPropSet1Info->hasPropertyByName( Name ) ) 255 return sal_True; 256 257 return mxPropSet2Info->hasPropertyByName( Name ); 258 } 259 260 Reference< XPropertySet > PropertySetMerger_CreateInstance( Reference< XPropertySet > rPropSet1, Reference< XPropertySet > rPropSet2 ) throw() 261 { 262 return new PropertySetMergerImpl( rPropSet1, rPropSet2 ); 263 } 264