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 <com/sun/star/xml/sax/FastToken.hpp> 25 #include <com/sun/star/drawing/LineStyle.hpp> 26 #include <com/sun/star/beans/XMultiPropertySet.hpp> 27 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 28 #include <com/sun/star/container/XNamed.hpp> 29 30 #include "oox/helper/attributelist.hxx" 31 #include "oox/ppt/pptshape.hxx" 32 #include "oox/ppt/pptshapecontext.hxx" 33 #include "oox/ppt/pptshapepropertiescontext.hxx" 34 #include "oox/ppt/slidepersist.hxx" 35 #include "oox/drawingml/shapestylecontext.hxx" 36 #include "oox/drawingml/fillpropertiesgroupcontext.hxx" 37 #include "oox/drawingml/lineproperties.hxx" 38 #include "oox/drawingml/drawingmltypes.hxx" 39 #include "oox/drawingml/customshapegeometry.hxx" 40 #include "oox/drawingml/textbodycontext.hxx" 41 42 using rtl::OUString; 43 using namespace oox::core; 44 using namespace ::com::sun::star; 45 using namespace ::com::sun::star::uno; 46 using namespace ::com::sun::star::drawing; 47 using namespace ::com::sun::star::beans; 48 using namespace ::com::sun::star::text; 49 using namespace ::com::sun::star::xml::sax; 50 51 namespace oox { namespace ppt { 52 53 // CT_Shape 54 PPTShapeContext::PPTShapeContext( ContextHandler& rParent, const SlidePersistPtr pSlidePersistPtr, oox::drawingml::ShapePtr pMasterShapePtr, oox::drawingml::ShapePtr pShapePtr ) 55 : oox::drawingml::ShapeContext( rParent, pMasterShapePtr, pShapePtr ) 56 , mpSlidePersistPtr( pSlidePersistPtr ) 57 { 58 } 59 60 oox::drawingml::ShapePtr findPlaceholder( const sal_Int32 nMasterPlaceholder, sal_Int32 nSubTypeIndex, std::vector< oox::drawingml::ShapePtr >& rShapes ) 61 { 62 oox::drawingml::ShapePtr aShapePtr; 63 std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() ); 64 while( aRevIter != rShapes.rend() ) 65 { 66 if ( (*aRevIter)->getSubType() == nMasterPlaceholder ) 67 { 68 if ( ( nSubTypeIndex == -1 ) || ( nSubTypeIndex == (*aRevIter)->getSubTypeIndex() ) ) 69 { 70 aShapePtr = *aRevIter; 71 break; 72 } 73 } 74 std::vector< oox::drawingml::ShapePtr >& rChildren = (*aRevIter)->getChildren(); 75 aShapePtr = findPlaceholder( nMasterPlaceholder, nSubTypeIndex, rChildren ); 76 if ( aShapePtr.get() ) 77 break; 78 aRevIter++; 79 } 80 return aShapePtr; 81 } 82 83 // if nFirstPlaceholder can't be found, it will be searched for nSecondPlaceholder 84 oox::drawingml::ShapePtr findPlaceholder( sal_Int32 nFirstPlaceholder, sal_Int32 nSecondPlaceholder, 85 sal_Int32 nSubTypeIndex, std::vector< oox::drawingml::ShapePtr >& rShapes ) 86 { 87 oox::drawingml::ShapePtr pPlaceholder = findPlaceholder( nFirstPlaceholder, nSubTypeIndex, rShapes ); 88 return !nSecondPlaceholder || pPlaceholder.get() ? pPlaceholder : findPlaceholder( nSecondPlaceholder, nSubTypeIndex, rShapes ); 89 } 90 91 Reference< XFastContextHandler > PPTShapeContext::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException) 92 { 93 Reference< XFastContextHandler > xRet; 94 95 switch( aElementToken ) 96 { 97 // nvSpPr CT_ShapeNonVisual begin 98 // case PPT_TOKEN( drElemPr ): 99 // break; 100 case PPT_TOKEN( cNvPr ): 101 { 102 AttributeList aAttribs( xAttribs ); 103 mpShapePtr->setHidden( aAttribs.getBool( XML_hidden, false ) ); 104 mpShapePtr->setId( xAttribs->getOptionalValue( XML_id ) ); 105 mpShapePtr->setName( xAttribs->getOptionalValue( XML_name ) ); 106 break; 107 } 108 case PPT_TOKEN( ph ): 109 { 110 sal_Int32 nSubType( xAttribs->getOptionalValueToken( XML_type, XML_obj ) ); 111 mpShapePtr->setSubType( nSubType ); 112 mpShapePtr->setSubTypeIndex( xAttribs->getOptionalValue( XML_idx ).toInt32() ); 113 if ( nSubType ) 114 { 115 PPTShape* pPPTShapePtr = dynamic_cast< PPTShape* >( mpShapePtr.get() ); 116 if ( pPPTShapePtr ) 117 { 118 oox::ppt::ShapeLocation eShapeLocation = pPPTShapePtr->getShapeLocation(); 119 if ( ( eShapeLocation == Slide ) || ( eShapeLocation == Layout ) ) 120 { 121 // inheriting properties from placeholder objects by cloning shape 122 sal_Int32 nFirstPlaceholder = 0; 123 sal_Int32 nSecondPlaceholder = 0; 124 switch( nSubType ) 125 { 126 case XML_ctrTitle : // slide/layout 127 nFirstPlaceholder = XML_ctrTitle; 128 nSecondPlaceholder = XML_title; 129 break; 130 131 case XML_subTitle : // slide/layout 132 nFirstPlaceholder = XML_subTitle; 133 nSecondPlaceholder = XML_title; 134 break; 135 136 case XML_obj : // slide/layout 137 nFirstPlaceholder = XML_obj; 138 nSecondPlaceholder = XML_body; 139 break; 140 141 case XML_dt : // slide/layout/master/notes/notesmaster/handoutmaster 142 case XML_sldNum : // slide/layout/master/notes/notesmaster/handoutmaster 143 case XML_ftr : // slide/layout/master/notes/notesmaster/handoutmaster 144 case XML_hdr : // notes/notesmaster/handoutmaster 145 case XML_body : // slide/layout/master/notes/notesmaster 146 case XML_title : // slide/layout/master/ 147 case XML_chart : // slide/layout 148 case XML_tbl : // slide/layout 149 case XML_clipArt : // slide/layout 150 case XML_dgm : // slide/layout 151 case XML_media : // slide/layout 152 case XML_sldImg : // notes/notesmaster 153 case XML_pic : // slide/layout 154 nFirstPlaceholder = nSubType; 155 default: 156 break; 157 } 158 if ( nFirstPlaceholder ) 159 { 160 oox::drawingml::ShapePtr pPlaceholder; 161 if ( eShapeLocation == Layout ) // for layout objects the referenced object can be found within the same shape tree 162 pPlaceholder = findPlaceholder( nFirstPlaceholder, nSecondPlaceholder, -1, mpSlidePersistPtr->getShapes()->getChildren() ); 163 else if ( eShapeLocation == Slide ) // normal slide shapes have to search within the corresponding master tree for referenced objects 164 { 165 SlidePersistPtr pMasterPersist( mpSlidePersistPtr->getMasterPersist() ); 166 if ( pMasterPersist.get() ) 167 pPlaceholder = findPlaceholder( nFirstPlaceholder, nSecondPlaceholder, 168 pPPTShapePtr->getSubTypeIndex(), pMasterPersist->getShapes()->getChildren() ); 169 } 170 if ( pPlaceholder.get() ) 171 { 172 mpShapePtr->applyShapeReference( *pPlaceholder.get() ); 173 PPTShape* pPPTShape = dynamic_cast< PPTShape* >( pPlaceholder.get() ); 174 if ( pPPTShape ) 175 pPPTShape->setReferenced( sal_True ); 176 } 177 } 178 } 179 } 180 181 } 182 break; 183 } 184 185 // nvSpPr CT_ShapeNonVisual end 186 187 case PPT_TOKEN( spPr ): 188 xRet = new PPTShapePropertiesContext( *this, *mpShapePtr ); 189 break; 190 191 case PPT_TOKEN( style ): 192 xRet = new oox::drawingml::ShapeStyleContext( *this, *mpShapePtr ); 193 break; 194 195 case PPT_TOKEN( txBody ): 196 { 197 oox::drawingml::TextBodyPtr xTextBody( new oox::drawingml::TextBody ); 198 xTextBody->getTextProperties().maPropertyMap[ PROP_FontIndependentLineSpacing ] <<= static_cast< sal_Bool >( sal_True ); 199 mpShapePtr->setTextBody( xTextBody ); 200 xRet = new oox::drawingml::TextBodyContext( *this, *xTextBody ); 201 break; 202 } 203 } 204 205 if( !xRet.is() ) 206 xRet.set( this ); 207 208 return xRet; 209 } 210 211 212 } } 213