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 #include "oox/vml/vmlshapecontainer.hxx" 25 26 #include "oox/vml/vmldrawing.hxx" 27 #include "oox/vml/vmlshape.hxx" 28 29 namespace oox { 30 namespace vml { 31 32 // ============================================================================ 33 34 using namespace ::com::sun::star::awt; 35 using namespace ::com::sun::star::drawing; 36 using namespace ::com::sun::star::uno; 37 38 using ::rtl::OUString; 39 40 // ============================================================================ 41 42 namespace { 43 44 template< typename ShapeType > 45 void lclMapShapesById( RefMap< OUString, ShapeType >& orMap, const RefVector< ShapeType >& rVector ) 46 { 47 for( typename RefVector< ShapeType >::const_iterator aIt = rVector.begin(), aEnd = rVector.end(); aIt != aEnd; ++aIt ) 48 { 49 const OUString& rShapeId = (*aIt)->getShapeId(); 50 OSL_ENSURE( rShapeId.getLength() > 0, "lclMapShapesById - missing shape identifier" ); 51 if( rShapeId.getLength() > 0 ) 52 { 53 OSL_ENSURE( orMap.find( rShapeId ) == orMap.end(), "lclMapShapesById - shape identifier already used" ); 54 orMap[ rShapeId ] = *aIt; 55 } 56 } 57 } 58 59 } // namespace 60 61 // ============================================================================ 62 63 ShapeContainer::ShapeContainer( Drawing& rDrawing ) : 64 mrDrawing( rDrawing ) 65 { 66 } 67 68 ShapeContainer::~ShapeContainer() 69 { 70 } 71 72 ShapeType& ShapeContainer::createShapeType() 73 { 74 ::boost::shared_ptr< ShapeType > xShape( new ShapeType( mrDrawing ) ); 75 maTypes.push_back( xShape ); 76 return *xShape; 77 } 78 79 void ShapeContainer::finalizeFragmentImport() 80 { 81 // map all shape templates by shape identifier 82 lclMapShapesById( maTypesById, maTypes ); 83 // map all shapes by shape identifier 84 lclMapShapesById( maShapesById, maShapes ); 85 /* process all shapes (map all children templates/shapes in group shapes, 86 resolve template references in all shapes) */ 87 maShapes.forEachMem( &ShapeBase::finalizeFragmentImport ); 88 } 89 90 const ShapeType* ShapeContainer::getShapeTypeById( const OUString& rShapeId, bool bDeep ) const 91 { 92 // search in own shape template list 93 if( const ShapeType* pType = maTypesById.get( rShapeId ).get() ) 94 return pType; 95 // search deep in child shapes 96 if( bDeep ) 97 for( ShapeVector::const_iterator aVIt = maShapes.begin(), aVEnd = maShapes.end(); aVIt != aVEnd; ++aVIt ) 98 if( const ShapeType* pType = (*aVIt)->getChildTypeById( rShapeId ) ) 99 return pType; 100 return 0; 101 } 102 103 const ShapeBase* ShapeContainer::getShapeById( const OUString& rShapeId, bool bDeep ) const 104 { 105 // search in own shape list 106 if( const ShapeBase* pShape = maShapesById.get( rShapeId ).get() ) 107 return pShape; 108 // search deep in child shapes 109 if( bDeep ) 110 for( ShapeVector::const_iterator aVIt = maShapes.begin(), aVEnd = maShapes.end(); aVIt != aVEnd; ++aVIt ) 111 if( const ShapeBase* pShape = (*aVIt)->getChildById( rShapeId ) ) 112 return pShape; 113 return 0; 114 } 115 116 const ShapeBase* ShapeContainer::getFirstShape() const 117 { 118 OSL_ENSURE( mrDrawing.getType() == VMLDRAWING_WORD, "ShapeContainer::getFirstShape - illegal call, Word filter only" ); 119 OSL_ENSURE( maShapes.size() == 1, "ShapeContainer::getFirstShape - single shape expected" ); 120 return maShapes.get( 0 ).get(); 121 } 122 123 void ShapeContainer::convertAndInsert( const Reference< XShapes >& rxShapes, const ShapeParentAnchor* pParentAnchor ) const 124 { 125 for( ShapeVector::const_iterator aIt = maShapes.begin(), aEnd = maShapes.end(); aIt != aEnd; ++aIt ) 126 (*aIt)->convertAndInsert( rxShapes, pParentAnchor ); 127 } 128 129 // ============================================================================ 130 131 } // namespace vml 132 } // namespace oox 133