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_svx.hxx" 26 #include <svx/sdasitm.hxx> 27 #include <svx/svdattr.hxx> 28 29 using namespace ::std; 30 using namespace com::sun::star; 31 32 SdrCustomShapeEngineItem::SdrCustomShapeEngineItem() 33 : SfxStringItem( SDRATTR_CUSTOMSHAPE_ENGINE, String() ) 34 {} 35 SdrCustomShapeEngineItem::SdrCustomShapeEngineItem( const String& rVal ) 36 : SfxStringItem( SDRATTR_CUSTOMSHAPE_ENGINE, rVal ) 37 {} 38 39 SdrCustomShapeDataItem::SdrCustomShapeDataItem() 40 : SfxStringItem( SDRATTR_CUSTOMSHAPE_DATA, String() ) 41 {} 42 SdrCustomShapeDataItem::SdrCustomShapeDataItem( const String& rVal ) 43 : SfxStringItem( SDRATTR_CUSTOMSHAPE_DATA, rVal ) 44 {} 45 46 TYPEINIT1_FACTORY( SdrCustomShapeGeometryItem, SfxPoolItem , new SdrCustomShapeGeometryItem); 47 SdrCustomShapeGeometryItem::SdrCustomShapeGeometryItem() 48 : SfxPoolItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) 49 {} 50 SdrCustomShapeGeometryItem::SdrCustomShapeGeometryItem( const uno::Sequence< beans::PropertyValue >& rVal ) 51 : SfxPoolItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) 52 { 53 sal_Int32 i, j; 54 aPropSeq = rVal; 55 56 // hashing property values 57 // beans::PropertyValue* pPropValues = aPropSeq.getArray(); 58 // const rtl::OUString* pPtr = NULL; 59 for ( i = 0; i < aPropSeq.getLength(); i++ ) 60 { 61 beans::PropertyValue& rPropVal = aPropSeq[ i ]; 62 aPropHashMap[ rPropVal.Name ] = i; 63 if ( rPropVal.Value.getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 64 { 65 uno::Sequence< beans::PropertyValue >& rPropSeq = *( uno::Sequence< beans::PropertyValue >*)rPropVal.Value.getValue(); 66 for ( j = 0; j < rPropSeq.getLength(); j++ ) 67 { 68 beans::PropertyValue& rPropVal2 = rPropSeq[ j ]; 69 aPropPairHashMap[ PropertyPair( rPropVal.Name, rPropVal2.Name ) ] = j; 70 } 71 } 72 } 73 } 74 75 com::sun::star::uno::Any* SdrCustomShapeGeometryItem::GetPropertyValueByName( const rtl::OUString& rPropName ) 76 { 77 com::sun::star::uno::Any* pRet = NULL; 78 PropertyHashMap::iterator aHashIter( aPropHashMap.find( rPropName ) ); 79 if ( aHashIter != aPropHashMap.end() ) 80 pRet = &aPropSeq[ (*aHashIter).second ].Value; 81 return pRet; 82 } 83 84 com::sun::star::uno::Any* SdrCustomShapeGeometryItem::GetPropertyValueByName( const rtl::OUString& rSequenceName, const rtl::OUString& rPropName ) 85 { 86 com::sun::star::uno::Any* pRet = NULL; 87 com::sun::star::uno::Any* pSeqAny = GetPropertyValueByName( rSequenceName ); 88 if ( pSeqAny ) 89 { 90 if ( pSeqAny->getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 91 { 92 PropertyPairHashMap::iterator aHashIter( aPropPairHashMap.find( PropertyPair( rSequenceName, rPropName ) ) ); 93 if ( aHashIter != aPropPairHashMap.end() ) 94 { 95 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 96 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pSeqAny->getValue()); 97 pRet = &rSecSequence[ (*aHashIter).second ].Value; 98 } 99 } 100 } 101 return pRet; 102 } 103 104 void SdrCustomShapeGeometryItem::SetPropertyValue( const com::sun::star::beans::PropertyValue& rPropVal ) 105 { 106 com::sun::star::uno::Any* pAny = GetPropertyValueByName( rPropVal.Name ); 107 if ( pAny ) 108 { // property is already available 109 sal_Int32 i; 110 if ( pAny->getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 111 { // old property is a sequence->each entry has to be removed from the HashPairMap 112 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 113 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pAny->getValue()); 114 for ( i = 0; i < rSecSequence.getLength(); i++ ) 115 { 116 PropertyPairHashMap::iterator aHashIter( aPropPairHashMap.find( PropertyPair( rPropVal.Name, rSecSequence[ i ].Name ) ) ); 117 if ( aHashIter != aPropPairHashMap.end() ) 118 aPropPairHashMap.erase( aHashIter ); 119 } 120 } 121 *pAny = rPropVal.Value; 122 if ( rPropVal.Value.getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 123 { // the new property is a sequence->each entry has to be inserted into the HashPairMap 124 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 125 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pAny->getValue()); 126 for ( i = 0; i < rSecSequence.getLength(); i++ ) 127 { 128 beans::PropertyValue& rPropVal2 = rSecSequence[ i ]; 129 aPropPairHashMap[ PropertyPair( rPropVal.Name, rPropVal2.Name ) ] = i; 130 } 131 } 132 } 133 else 134 { // its a new property 135 sal_uInt32 nIndex = aPropSeq.getLength(); 136 aPropSeq.realloc( nIndex + 1 ); 137 aPropSeq[ nIndex ] = rPropVal ; 138 139 aPropHashMap[ rPropVal.Name ] = nIndex; 140 } 141 } 142 143 void SdrCustomShapeGeometryItem::SetPropertyValue( const rtl::OUString& rSequenceName, const com::sun::star::beans::PropertyValue& rPropVal ) 144 { 145 com::sun::star::uno::Any* pAny = GetPropertyValueByName( rSequenceName, rPropVal.Name ); 146 if ( pAny ) // just replacing 147 *pAny = rPropVal.Value; 148 else 149 { 150 com::sun::star::uno::Any* pSeqAny = GetPropertyValueByName( rSequenceName ); 151 if( pSeqAny == NULL ) 152 { 153 ::com::sun::star::uno::Sequence < beans::PropertyValue > aSeq; 154 beans::PropertyValue aValue; 155 aValue.Name = rSequenceName; 156 aValue.Value = ::com::sun::star::uno::makeAny( aSeq ); 157 158 sal_uInt32 nIndex = aPropSeq.getLength(); 159 aPropSeq.realloc( nIndex + 1 ); 160 aPropSeq[ nIndex ] = aValue; 161 aPropHashMap[ rSequenceName ] = nIndex; 162 163 pSeqAny = &aPropSeq[ nIndex ].Value; 164 } 165 166 DBG_ASSERT( pSeqAny, "SdrCustomShapeGeometryItem::SetPropertyValue() - No Value??" ); 167 168 if( pSeqAny ) 169 { 170 if ( pSeqAny->getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 171 { 172 PropertyPairHashMap::iterator aHashIter( aPropPairHashMap.find( PropertyPair( rSequenceName, rPropVal.Name ) ) ); 173 if ( aHashIter != aPropPairHashMap.end() ) 174 { 175 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 176 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pSeqAny->getValue()); 177 rSecSequence[ (*aHashIter).second ].Value = rPropVal.Value; 178 } 179 else 180 { 181 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 182 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pSeqAny->getValue()); 183 184 sal_Int32 nCount = rSecSequence.getLength(); 185 rSecSequence.realloc( nCount + 1 ); 186 rSecSequence[ nCount ] = rPropVal; 187 188 aPropPairHashMap[ PropertyPair( rSequenceName, rPropVal.Name ) ] = nCount; 189 } 190 } 191 } 192 } 193 } 194 195 void SdrCustomShapeGeometryItem::ClearPropertyValue( const rtl::OUString& rPropName ) 196 { 197 if ( aPropSeq.getLength() ) 198 { 199 PropertyHashMap::iterator aHashIter( aPropHashMap.find( rPropName ) ); 200 if ( aHashIter != aPropHashMap.end() ) 201 { 202 com::sun::star::uno::Any* pSeqAny = &aPropSeq[ (*aHashIter).second ].Value; 203 if ( pSeqAny ) 204 { 205 if ( pSeqAny->getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 206 { 207 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 208 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pSeqAny->getValue()); 209 210 sal_Int32 i; 211 for ( i = 0; i < rSecSequence.getLength(); i++ ) 212 { 213 PropertyPairHashMap::iterator _aHashIter( aPropPairHashMap.find( PropertyPair( rPropName, rSecSequence[ i ].Name ) ) ); 214 if ( _aHashIter != aPropPairHashMap.end() ) 215 aPropPairHashMap.erase( _aHashIter ); // removing property from pair hashmap 216 } 217 } 218 } 219 sal_Int32 nLength = aPropSeq.getLength(); 220 if ( nLength ) 221 { 222 sal_Int32 nIndex = (*aHashIter).second; 223 if ( nIndex != ( nLength - 1 ) ) // resizing sequence 224 { 225 PropertyHashMap::iterator aHashIter2( aPropHashMap.find( aPropSeq[ nLength - 1 ].Name ) ); 226 (*aHashIter2).second = nIndex; 227 aPropSeq[ (*aHashIter).second ] = aPropSeq[ aPropSeq.getLength() - 1 ]; 228 } 229 aPropSeq.realloc( aPropSeq.getLength() - 1 ); 230 } 231 aPropHashMap.erase( aHashIter ); // removing property from hashmap 232 } 233 } 234 } 235 236 void SdrCustomShapeGeometryItem::ClearPropertyValue( const rtl::OUString& rSequenceName, const rtl::OUString& rPropName ) 237 { 238 com::sun::star::uno::Any* pSeqAny = GetPropertyValueByName( rSequenceName ); 239 if ( pSeqAny ) 240 { 241 if ( pSeqAny->getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < beans::PropertyValue >*)0) ) 242 { 243 PropertyPairHashMap::iterator aHashIter( aPropPairHashMap.find( PropertyPair( rSequenceName, rPropName ) ) ); 244 if ( aHashIter != aPropPairHashMap.end() ) 245 { 246 ::com::sun::star::uno::Sequence < beans::PropertyValue >& rSecSequence = 247 *((::com::sun::star::uno::Sequence < beans::PropertyValue >*)pSeqAny->getValue()); 248 249 sal_Int32 nLength = rSecSequence.getLength(); 250 if ( nLength ) 251 { 252 sal_Int32 nIndex = (*aHashIter).second; 253 if ( nIndex != ( nLength - 1 ) ) // resizing sequence 254 { 255 PropertyPairHashMap::iterator aHashIter2( aPropPairHashMap.find( PropertyPair( rSequenceName, rSecSequence[ nLength - 1 ].Name ) ) ); 256 (*aHashIter2).second = nIndex; 257 rSecSequence[ nIndex ] = rSecSequence[ nLength - 1 ]; 258 } 259 rSecSequence.realloc( aPropSeq.getLength() - 1 ); 260 } 261 aPropPairHashMap.erase( aHashIter ); 262 } 263 } 264 } 265 } 266 267 SdrCustomShapeGeometryItem::~SdrCustomShapeGeometryItem() 268 { 269 } 270 SdrCustomShapeGeometryItem::SdrCustomShapeGeometryItem( SvStream& /*rIn*/, sal_uInt16 nVersion ): 271 SfxPoolItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) 272 { 273 if ( nVersion ) 274 { 275 276 } 277 } 278 int __EXPORT SdrCustomShapeGeometryItem::operator==( const SfxPoolItem& rCmp ) const 279 { 280 int bRet = SfxPoolItem::operator==( rCmp ); 281 if ( bRet ) 282 bRet = ((SdrCustomShapeGeometryItem&)rCmp).aPropSeq == aPropSeq; 283 return bRet; 284 } 285 286 SfxItemPresentation __EXPORT SdrCustomShapeGeometryItem::GetPresentation( 287 SfxItemPresentation ePresentation, SfxMapUnit /*eCoreMetric*/, 288 SfxMapUnit /*ePresentationMetric*/, XubString &rText, const IntlWrapper *) const 289 { 290 rText += sal_Unicode( ' ' ); 291 if ( ePresentation == SFX_ITEM_PRESENTATION_COMPLETE ) 292 { 293 XubString aStr; 294 // SdrItemPool::TakeItemName( Which(), aStr ); 295 aStr += sal_Unicode( ' ' ); 296 rText.Insert( aStr, 0 ); 297 } 298 return ePresentation; 299 } 300 301 SfxPoolItem* __EXPORT SdrCustomShapeGeometryItem::Create( SvStream& rIn, sal_uInt16 nItemVersion ) const 302 { 303 return new SdrCustomShapeGeometryItem( rIn, nItemVersion ); 304 } 305 306 SvStream& __EXPORT SdrCustomShapeGeometryItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const 307 { 308 if ( nItemVersion ) 309 { 310 311 } 312 return rOut; 313 } 314 315 SfxPoolItem* __EXPORT SdrCustomShapeGeometryItem::Clone( SfxItemPool * /*pPool*/ ) const 316 { 317 SdrCustomShapeGeometryItem* pItem = new SdrCustomShapeGeometryItem( GetGeometry() ); 318 // SdrCustomShapeGeometryItem* pItem = new SdrCustomShapeGeometryItem( *this ); 319 320 /* 321 for ( i = 0; i < GetCount(); i++ ) 322 { 323 const SdrCustomShapeAdjustmentValue& rVal = GetValue( i ); 324 pItem->SetValue( i, rVal ); 325 } 326 */ 327 return pItem; 328 } 329 330 #ifdef SDR_ISPOOLABLE 331 int __EXPORT SdrCustomShapeGeometryItem::IsPoolable() const 332 { 333 sal_uInt16 nId=Which(); 334 return nId < SDRATTR_NOTPERSIST_FIRST || nId > SDRATTR_NOTPERSIST_LAST; 335 } 336 #endif 337 sal_uInt16 SdrCustomShapeGeometryItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/ ) const 338 { 339 return 1; 340 } 341 sal_Bool SdrCustomShapeGeometryItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const 342 { 343 rVal <<= aPropSeq; 344 return sal_True; 345 } 346 sal_Bool SdrCustomShapeGeometryItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) 347 { 348 if ( ! ( rVal >>= aPropSeq ) ) 349 return sal_False; 350 else 351 return sal_True; 352 } 353 const uno::Sequence< beans::PropertyValue >& SdrCustomShapeGeometryItem::GetGeometry() const 354 { 355 return aPropSeq; 356 } 357 /* 358 const uno::Any* GetValueByName( const rtl::OUString& rProperty ) const 359 { 360 361 } 362 */ 363 SdrCustomShapeReplacementURLItem::SdrCustomShapeReplacementURLItem() 364 : SfxStringItem( SDRATTR_CUSTOMSHAPE_REPLACEMENT_URL, String() ) 365 {} 366 SdrCustomShapeReplacementURLItem::SdrCustomShapeReplacementURLItem( const String& rVal ) 367 : SfxStringItem( SDRATTR_CUSTOMSHAPE_REPLACEMENT_URL, rVal ) 368 {} 369 370