/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "oox/ppt/pptshape.hxx" #include "oox/core/xmlfilterbase.hxx" #include "oox/drawingml/textbody.hxx" #include #include #include #include #include #include #include "oox/ppt/slidepersist.hxx" using rtl::OUString; using namespace ::oox::core; using namespace ::oox::drawingml; using namespace ::com::sun::star; using namespace ::com::sun::star::awt; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::text; using namespace ::com::sun::star::drawing; namespace oox { namespace ppt { PPTShape::PPTShape( const oox::ppt::ShapeLocation eShapeLocation, const sal_Char* pServiceName ) : Shape( pServiceName ) , meShapeLocation( eShapeLocation ) , mbReferenced( sal_False ) { } PPTShape::~PPTShape() { } void PPTShape::addShape( oox::core::XmlFilterBase& rFilterBase, const SlidePersist& rSlidePersist, const oox::drawingml::Theme* pTheme, const Reference< XShapes >& rxShapes, const awt::Rectangle* pShapeRect, ::oox::drawingml::ShapeIdMap* pShapeMap ) { // only placeholder from layout are being inserted if ( mnSubType && ( meShapeLocation == Master ) ) return; try { rtl::OUString sServiceName( msServiceName ); if( sServiceName.getLength() ) { oox::drawingml::TextListStylePtr aMasterTextListStyle; Reference< lang::XMultiServiceFactory > xServiceFact( rFilterBase.getModel(), UNO_QUERY_THROW ); sal_Bool bClearText = sal_False; if ( sServiceName != OUString::createFromAscii( "com.sun.star.drawing.GraphicObjectShape" ) ) { switch( mnSubType ) { case XML_ctrTitle : case XML_title : { const rtl::OUString sTitleShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.TitleTextShape" ) ); sServiceName = sTitleShapeService; aMasterTextListStyle = rSlidePersist.getMasterPersist().get() ? rSlidePersist.getMasterPersist()->getTitleTextStyle() : rSlidePersist.getTitleTextStyle(); } break; case XML_subTitle : { if ( ( meShapeLocation == Master ) || ( meShapeLocation == Layout ) ) sServiceName = rtl::OUString(); else { const rtl::OUString sTitleShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.SubtitleShape" ) ); sServiceName = sTitleShapeService; aMasterTextListStyle = rSlidePersist.getMasterPersist().get() ? rSlidePersist.getMasterPersist()->getTitleTextStyle() : rSlidePersist.getTitleTextStyle(); } } break; case XML_obj : { const rtl::OUString sOutlinerShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.OutlinerShape" ) ); sServiceName = sOutlinerShapeService; aMasterTextListStyle = rSlidePersist.getMasterPersist().get() ? rSlidePersist.getMasterPersist()->getBodyTextStyle() : rSlidePersist.getBodyTextStyle(); } break; case XML_body : { const rtl::OUString sNotesShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.NotesShape" ) ); const rtl::OUString sOutlinerShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.OutlinerShape" ) ); if ( rSlidePersist.isNotesPage() ) { sServiceName = sNotesShapeService; aMasterTextListStyle = rSlidePersist.getMasterPersist().get() ? rSlidePersist.getMasterPersist()->getNotesTextStyle() : rSlidePersist.getNotesTextStyle(); } else { sServiceName = sOutlinerShapeService; aMasterTextListStyle = rSlidePersist.getMasterPersist().get() ? rSlidePersist.getMasterPersist()->getBodyTextStyle() : rSlidePersist.getBodyTextStyle(); } } break; case XML_dt : { const rtl::OUString sDateTimeShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.DateTimeShape" ) ); sServiceName = sDateTimeShapeService; bClearText = sal_True; } break; case XML_hdr : { const rtl::OUString sHeaderShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.HeaderShape" ) ); sServiceName = sHeaderShapeService; bClearText = sal_True; } break; case XML_ftr : { const rtl::OUString sFooterShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.FooterShape" ) ); sServiceName = sFooterShapeService; bClearText = sal_True; } break; case XML_sldNum : { const rtl::OUString sSlideNumberShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.SlideNumberShape" ) ); sServiceName = sSlideNumberShapeService; bClearText = sal_True; } break; case XML_sldImg : { const rtl::OUString sPageShapeService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.presentation.PageShape" ) ); sServiceName = sPageShapeService; } break; default: break; } } /* // use placeholder index if possible if( mnSubType && getSubTypeIndex() && rSlidePersist.getMasterPersist().get() ) { oox::drawingml::ShapePtr pPlaceholder = PPTShape::findPlaceholderByIndex( getSubTypeIndex(), rSlidePersist.getMasterPersist()->getShapes()->getChildren() ); if( pPlaceholder.get() && pPlaceholder->getTextBody() ) { TextListStylePtr pNewTextListStyle ( new TextListStyle() ); pNewTextListStyle->apply( pPlaceholder->getTextBody()->getTextListStyle() ); if( pPlaceholder->getMasterTextListStyle().get() ) pNewTextListStyle->apply( *pPlaceholder->getMasterTextListStyle() ); aMasterTextListStyle = pNewTextListStyle; } } */ if ( sServiceName.getLength() ) { if ( !aMasterTextListStyle.get() ) aMasterTextListStyle = rSlidePersist.getMasterPersist().get() ? rSlidePersist.getMasterPersist()->getOtherTextStyle() : rSlidePersist.getOtherTextStyle(); setMasterTextListStyle( aMasterTextListStyle ); Reference< XShape > xShape( createAndInsert( rFilterBase, sServiceName, pTheme, rxShapes, pShapeRect, bClearText ) ); if ( !rSlidePersist.isMasterPage() && rSlidePersist.getPage().is() && ( (sal_Int32)mnSubType == XML_title ) ) { try { rtl::OUString aTitleText; Reference< XTextRange > xText( xShape, UNO_QUERY_THROW ); aTitleText = xText->getString(); if ( aTitleText.getLength() && ( aTitleText.getLength() < 64 ) ) // just a magic value, but we don't want to set slide names which are too long { Reference< container::XNamed > xName( rSlidePersist.getPage(), UNO_QUERY_THROW ); xName->setName( aTitleText ); } } catch( uno::Exception& ) { } } if( pShapeMap && msId.getLength() ) { (*pShapeMap)[ msId ] = shared_from_this(); } // if this is a group shape, we have to add also each child shape Reference< XShapes > xShapes( xShape, UNO_QUERY ); if ( xShapes.is() ) addChildren( rFilterBase, *this, pTheme, xShapes, pShapeRect ? *pShapeRect : awt::Rectangle( maPosition.X, maPosition.Y, maSize.Width, maSize.Height ), pShapeMap ); } } } catch( const Exception& ) { } } void PPTShape::applyShapeReference( const oox::drawingml::Shape& rReferencedShape ) { Shape::applyShapeReference( rReferencedShape ); } oox::drawingml::ShapePtr PPTShape::findPlaceholder( const sal_Int32 nMasterPlaceholder, std::vector< oox::drawingml::ShapePtr >& rShapes ) { oox::drawingml::ShapePtr aShapePtr; std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() ); while( aRevIter != rShapes.rend() ) { if ( (*aRevIter)->getSubType() == nMasterPlaceholder ) { aShapePtr = *aRevIter; break; } std::vector< oox::drawingml::ShapePtr >& rChildren = (*aRevIter)->getChildren(); aShapePtr = findPlaceholder( nMasterPlaceholder, rChildren ); if ( aShapePtr.get() ) break; aRevIter++; } return aShapePtr; } oox::drawingml::ShapePtr PPTShape::findPlaceholderByIndex( const sal_Int32 nIdx, std::vector< oox::drawingml::ShapePtr >& rShapes ) { oox::drawingml::ShapePtr aShapePtr; std::vector< oox::drawingml::ShapePtr >::reverse_iterator aRevIter( rShapes.rbegin() ); while( aRevIter != rShapes.rend() ) { if ( (*aRevIter)->getSubTypeIndex() == nIdx ) { aShapePtr = *aRevIter; break; } std::vector< oox::drawingml::ShapePtr >& rChildren = (*aRevIter)->getChildren(); aShapePtr = findPlaceholderByIndex( nIdx, rChildren ); if ( aShapePtr.get() ) break; aRevIter++; } return aShapePtr; } // if nFirstPlaceholder can't be found, it will be searched for nSecondPlaceholder oox::drawingml::ShapePtr PPTShape::findPlaceholder( sal_Int32 nFirstPlaceholder, sal_Int32 nSecondPlaceholder, std::vector< oox::drawingml::ShapePtr >& rShapes ) { oox::drawingml::ShapePtr pPlaceholder = findPlaceholder( nFirstPlaceholder, rShapes ); return !nSecondPlaceholder || pPlaceholder.get() ? pPlaceholder : findPlaceholder( nSecondPlaceholder, rShapes ); } } }