| /************************************************************** |
| * |
| * 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/timenode.hxx" |
| #include "oox/ppt/pptshape.hxx" |
| #include "oox/ppt/slidepersist.hxx" |
| #include "oox/drawingml/fillproperties.hxx" |
| #include "oox/drawingml/shapepropertymap.hxx" |
| #include "oox/helper/propertyset.hxx" |
| #include "oox/vml/vmldrawing.hxx" |
| #include "oox/core/xmlfilterbase.hxx" |
| |
| #include <com/sun/star/style/XStyle.hpp> |
| #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> |
| #include <com/sun/star/container/XNamed.hpp> |
| #include <com/sun/star/beans/XMultiPropertySet.hpp> |
| #include <com/sun/star/animations/XAnimationNodeSupplier.hpp> |
| |
| using namespace ::com::sun::star; |
| using namespace ::oox::core; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::drawing; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::animations; |
| |
| namespace oox { namespace ppt { |
| |
| SlidePersist::SlidePersist( XmlFilterBase& rFilter, sal_Bool bMaster, sal_Bool bNotes, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& rxPage, |
| oox::drawingml::ShapePtr pShapesPtr, const drawingml::TextListStylePtr & pDefaultTextStyle ) |
| : mpDrawingPtr( new oox::vml::Drawing( rFilter, rxPage, oox::vml::VMLDRAWING_POWERPOINT ) ) |
| , mxPage( rxPage ) |
| , maShapesPtr( pShapesPtr ) |
| , mnLayoutValueToken( 0 ) |
| , mbMaster( bMaster ) |
| , mbNotes ( bNotes ) |
| , maDefaultTextStylePtr( pDefaultTextStyle ) |
| , maTitleTextStylePtr( new oox::drawingml::TextListStyle ) |
| , maBodyTextStylePtr( new oox::drawingml::TextListStyle ) |
| , maNotesTextStylePtr( new oox::drawingml::TextListStyle ) |
| , maOtherTextStylePtr( new oox::drawingml::TextListStyle ) |
| { |
| if ( pDefaultTextStyle ) |
| { |
| /* |
| maTitleTextStylePtr->apply( *pDefaultTextStyle.get() ); |
| maBodyTextStylePtr->apply( *pDefaultTextStyle.get() ); |
| maNotesTextStylePtr->apply( *pDefaultTextStyle.get() ); |
| */ |
| maOtherTextStylePtr->apply( *pDefaultTextStyle.get() ); |
| } |
| } |
| |
| SlidePersist::~SlidePersist() |
| { |
| |
| } |
| |
| sal_Int16 SlidePersist::getLayoutFromValueToken() |
| { |
| sal_Int16 nLayout = 20; // 20 == blanc (so many magic numbers :-( the description at com.sun.star.presentation.DrawPage.Layout does not help) |
| switch( mnLayoutValueToken ) |
| { |
| case XML_blank: nLayout = 20; break; |
| case XML_chart: nLayout = 2; break; |
| case XML_chartAndTx: nLayout = 7; break; |
| case XML_clipArtAndTx: nLayout = 9; break; |
| case XML_clipArtAndVertTx: nLayout = 24; break; |
| case XML_fourObj: nLayout = 18; break; |
| case XML_obj: nLayout = 11; break; |
| case XML_objAndTx: nLayout = 13; break; |
| case XML_objOverTx: nLayout = 14; break; |
| case XML_tbl: nLayout = 8; break; |
| case XML_title: nLayout = 0; break; |
| case XML_titleOnly: nLayout = 19; break; |
| case XML_twoObj: |
| case XML_twoColTx: nLayout = 3; break; |
| case XML_twoObjAndTx: nLayout = 15; break; |
| case XML_twoObjOverTx: nLayout = 16; break; |
| case XML_tx: nLayout = 1; break; |
| case XML_txAndChart: nLayout = 4; break; |
| case XML_txAndClipArt: nLayout = 6; break; |
| case XML_txAndMedia: nLayout = 6; break; |
| case XML_txAndObj: nLayout = 10; break; |
| case XML_txAndTwoObj: nLayout = 12; break; |
| case XML_txOverObj: nLayout = 17; break; |
| case XML_vertTitleAndTx: nLayout = 22; break; |
| case XML_vertTitleAndTxOverChart: nLayout = 21; break; |
| case XML_vertTx: nLayout = 23; break; |
| |
| case XML_twoTxTwoObj: |
| case XML_twoObjAndObj: |
| case XML_objTx: |
| case XML_picTx: |
| case XML_secHead: |
| case XML_objOnly: |
| case XML_objAndTwoObj: |
| case XML_mediaAndTx: |
| case XML_dgm: |
| case XML_cust: |
| default: |
| nLayout = 20; |
| } |
| return nLayout; |
| } |
| |
| void SlidePersist::createXShapes( XmlFilterBase& rFilterBase ) |
| { |
| applyTextStyles( rFilterBase ); |
| |
| Reference< XShapes > xShapes( getPage(), UNO_QUERY ); |
| |
| std::vector< oox::drawingml::ShapePtr >& rShapes( maShapesPtr->getChildren() ); |
| std::vector< oox::drawingml::ShapePtr >::iterator aShapesIter( rShapes.begin() ); |
| while( aShapesIter != rShapes.end() ) |
| { |
| std::vector< oox::drawingml::ShapePtr >& rChildren( (*aShapesIter++)->getChildren() ); |
| std::vector< oox::drawingml::ShapePtr >::iterator aChildIter( rChildren.begin() ); |
| while( aChildIter != rChildren.end() ) |
| { |
| PPTShape* pPPTShape = dynamic_cast< PPTShape* >( (*aChildIter).get() ); |
| if ( pPPTShape ) |
| pPPTShape->addShape( rFilterBase, *this, getTheme().get(), xShapes, 0, &getShapeMap() ); |
| else |
| (*aChildIter)->addShape( rFilterBase, getTheme().get(), xShapes, 0, &getShapeMap() ); |
| aChildIter++; |
| } |
| } |
| |
| Reference< XAnimationNodeSupplier > xNodeSupplier( getPage(), UNO_QUERY); |
| if( xNodeSupplier.is() ) |
| { |
| Reference< XAnimationNode > xNode( xNodeSupplier->getAnimationNode() ); |
| if( xNode.is() && !maTimeNodeList.empty() ) |
| { |
| SlidePersistPtr pSlidePtr( shared_from_this() ); |
| TimeNodePtr pNode(maTimeNodeList.front()); |
| OSL_ENSURE( pNode, "pNode" ); |
| |
| pNode->setNode( rFilterBase, xNode, pSlidePtr ); |
| } |
| } |
| } |
| |
| void SlidePersist::createBackground( const XmlFilterBase& rFilterBase ) |
| { |
| if ( mpBackgroundPropertiesPtr ) |
| { |
| sal_Int32 nPhClr = maBackgroundColor.isUsed() ? |
| maBackgroundColor.getColor( rFilterBase.getGraphicHelper() ) : API_RGB_TRANSPARENT; |
| |
| ::oox::drawingml::ShapePropertyMap aPropMap( rFilterBase.getModelObjectHelper() ); |
| mpBackgroundPropertiesPtr->pushToPropMap( aPropMap, rFilterBase.getGraphicHelper(), 0, nPhClr ); |
| PropertySet( mxPage ).setProperty( PROP_Background, aPropMap.makePropertySet() ); |
| } |
| } |
| |
| void setTextStyle( Reference< beans::XPropertySet >& rxPropSet, const XmlFilterBase& rFilter, |
| oox::drawingml::TextListStylePtr& pTextListStylePtr, int nLevel ) |
| { |
| ::oox::drawingml::TextParagraphPropertiesPtr pTextParagraphPropertiesPtr( pTextListStylePtr->getListStyle()[ nLevel ] ); |
| if( !bool(pTextParagraphPropertiesPtr) ) |
| { |
| // no properties. return |
| return; |
| } |
| |
| PropertyMap& rTextParagraphPropertyMap( pTextParagraphPropertiesPtr->getTextParagraphPropertyMap() ); |
| |
| PropertySet aPropSet( rxPropSet ); |
| aPropSet.setProperties( rTextParagraphPropertyMap ); |
| pTextParagraphPropertiesPtr->getTextCharacterProperties().pushToPropSet( aPropSet, rFilter ); |
| } |
| |
| void SlidePersist::applyTextStyles( const XmlFilterBase& rFilterBase ) |
| { |
| if ( mbMaster ) |
| { |
| try |
| { |
| Reference< style::XStyleFamiliesSupplier > aXStyleFamiliesSupplier( rFilterBase.getModel(), UNO_QUERY_THROW ); |
| Reference< container::XNameAccess > aXNameAccess( aXStyleFamiliesSupplier->getStyleFamilies() ); |
| Reference< container::XNamed > aXNamed( mxPage, UNO_QUERY_THROW ); |
| |
| if ( aXNameAccess.is() && aXNamed.is() ) |
| { |
| oox::drawingml::TextListStylePtr pTextListStylePtr; |
| rtl::OUString aStyle; |
| rtl::OUString aFamily; |
| |
| const rtl::OUString sOutline( RTL_CONSTASCII_USTRINGPARAM( "outline1" ) ); |
| const rtl::OUString sTitle( RTL_CONSTASCII_USTRINGPARAM( "title" ) ); |
| const rtl::OUString sStandard( RTL_CONSTASCII_USTRINGPARAM( "standard" ) ); |
| const rtl::OUString sSubtitle( RTL_CONSTASCII_USTRINGPARAM( "subtitle" ) ); |
| |
| for( int i = 0; i < 4; i++ ) // todo: aggregation of bodystyle (subtitle) |
| { |
| switch( i ) |
| { |
| case 0 : // title style |
| { |
| pTextListStylePtr = maTitleTextStylePtr; |
| aStyle = sTitle; |
| aFamily= aXNamed->getName(); |
| break; |
| } |
| case 1 : // body style |
| { |
| pTextListStylePtr = maBodyTextStylePtr; |
| aStyle = sOutline; |
| aFamily= aXNamed->getName(); |
| break; |
| } |
| case 3 : // notes style |
| { |
| pTextListStylePtr = maNotesTextStylePtr; |
| aStyle = sTitle; |
| aFamily= aXNamed->getName(); |
| break; |
| } |
| case 4 : // standard style |
| { |
| pTextListStylePtr = maOtherTextStylePtr; |
| aStyle = sStandard; |
| aFamily = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "graphics" ) ); |
| break; |
| } |
| case 5 : // subtitle |
| { |
| pTextListStylePtr = maBodyTextStylePtr; |
| aStyle = sSubtitle; |
| aFamily = aXNamed->getName(); |
| break; |
| } |
| } |
| Reference< container::XNameAccess > xFamilies; |
| if ( aXNameAccess->hasByName( aFamily ) ) |
| { |
| if( aXNameAccess->getByName( aFamily ) >>= xFamilies ) |
| { |
| if ( xFamilies->hasByName( aStyle ) ) |
| { |
| Reference< style::XStyle > aXStyle; |
| if ( xFamilies->getByName( aStyle ) >>= aXStyle ) |
| { |
| Reference< beans::XPropertySet > xPropSet( aXStyle, UNO_QUERY_THROW ); |
| setTextStyle( xPropSet, rFilterBase, maDefaultTextStylePtr, 0 ); |
| setTextStyle( xPropSet, rFilterBase, pTextListStylePtr, 0 ); |
| if ( i == 1 /* BodyStyle */ ) |
| { |
| for ( int nLevel = 1; nLevel < 5; nLevel++ ) |
| { |
| { |
| sal_Char pOutline[ 9 ] = "outline1"; |
| pOutline[ 7 ] = static_cast< sal_Char >( '0' + nLevel ); |
| rtl::OUString sOutlineStyle( rtl::OUString::createFromAscii( pOutline ) ); |
| if ( xFamilies->hasByName( sOutlineStyle ) ) |
| { |
| xFamilies->getByName( sOutlineStyle ) >>= aXStyle; |
| if( aXStyle.is() ) |
| xPropSet = Reference< beans::XPropertySet >( aXStyle, UNO_QUERY_THROW ); |
| } |
| } |
| setTextStyle( xPropSet, rFilterBase, maDefaultTextStylePtr, nLevel ); |
| setTextStyle( xPropSet, rFilterBase, pTextListStylePtr, nLevel ); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| catch( Exception& ) |
| { |
| } |
| } |
| } |
| |
| } } |
| |