xref: /AOO41X/main/oox/source/ppt/presentationfragmenthandler.cxx (revision 32f3c4fa18fe9172620c9d9308f23e1818a6047c)
1cdf0e10cSrcweir /*************************************************************************
2cdf0e10cSrcweir  *
3cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4cdf0e10cSrcweir  *
5cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6cdf0e10cSrcweir  *
7cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8cdf0e10cSrcweir  *
9cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10cdf0e10cSrcweir  *
11cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14cdf0e10cSrcweir  *
15cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20cdf0e10cSrcweir  *
21cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25cdf0e10cSrcweir  *
26cdf0e10cSrcweir  ************************************************************************/
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "comphelper/anytostring.hxx"
29cdf0e10cSrcweir #include "cppuhelper/exc_hlp.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
32cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPages.hpp>
33cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
34cdf0e10cSrcweir #include <com/sun/star/drawing/XMasterPageTarget.hpp>
35cdf0e10cSrcweir #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
36cdf0e10cSrcweir #include <com/sun/star/style/XStyle.hpp>
37cdf0e10cSrcweir #include <com/sun/star/presentation/XPresentationPage.hpp>
38cdf0e10cSrcweir #include <com/sun/star/task/XStatusIndicator.hpp>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include "oox/drawingml/theme.hxx"
41cdf0e10cSrcweir #include "oox/drawingml/drawingmltypes.hxx"
42cdf0e10cSrcweir #include "oox/drawingml/themefragmenthandler.hxx"
43cdf0e10cSrcweir #include "oox/drawingml/textliststylecontext.hxx"
44cdf0e10cSrcweir #include "oox/ppt/pptshape.hxx"
45cdf0e10cSrcweir #include "oox/ppt/presentationfragmenthandler.hxx"
46cdf0e10cSrcweir #include "oox/ppt/slidefragmenthandler.hxx"
47cdf0e10cSrcweir #include "oox/ppt/layoutfragmenthandler.hxx"
48cdf0e10cSrcweir #include "oox/ppt/pptimport.hxx"
49cdf0e10cSrcweir 
50cdf0e10cSrcweir using rtl::OUString;
51cdf0e10cSrcweir using namespace ::com::sun::star;
52cdf0e10cSrcweir using namespace ::oox::core;
53cdf0e10cSrcweir using namespace ::oox::drawingml;
54cdf0e10cSrcweir using namespace ::com::sun::star::uno;
55cdf0e10cSrcweir using namespace ::com::sun::star::beans;
56cdf0e10cSrcweir using namespace ::com::sun::star::drawing;
57cdf0e10cSrcweir using namespace ::com::sun::star::presentation;
58cdf0e10cSrcweir using namespace ::com::sun::star::xml::sax;
59cdf0e10cSrcweir 
60cdf0e10cSrcweir namespace oox { namespace ppt {
61cdf0e10cSrcweir 
62cdf0e10cSrcweir PresentationFragmentHandler::PresentationFragmentHandler( XmlFilterBase& rFilter, const OUString& rFragmentPath ) throw()
63cdf0e10cSrcweir : FragmentHandler( rFilter, rFragmentPath )
64cdf0e10cSrcweir , mpTextListStyle( new TextListStyle )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir 	TextParagraphPropertiesVector& rParagraphDefaulsVector( mpTextListStyle->getListStyle() );
67cdf0e10cSrcweir 	TextParagraphPropertiesVector::iterator aParagraphDefaultIter( rParagraphDefaulsVector.begin() );
68cdf0e10cSrcweir 	while( aParagraphDefaultIter != rParagraphDefaulsVector.end() )
69cdf0e10cSrcweir 	{
70cdf0e10cSrcweir 		// ppt is having zero bottom margin per default, whereas OOo is 0,5cm,
71cdf0e10cSrcweir 		// so this attribute needs to be set always
72cdf0e10cSrcweir 		(*aParagraphDefaultIter++)->getParaBottomMargin() = TextSpacing( 0 );
73cdf0e10cSrcweir 	}
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir PresentationFragmentHandler::~PresentationFragmentHandler() throw()
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 
79cdf0e10cSrcweir }
80cdf0e10cSrcweir void PresentationFragmentHandler::startDocument() throw (SAXException, RuntimeException)
81cdf0e10cSrcweir {
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
84cdf0e10cSrcweir void ResolveTextFields( XmlFilterBase& rFilter )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir 	const oox::core::TextFieldStack& rTextFields = rFilter.getTextFieldStack();
87cdf0e10cSrcweir 	if ( rTextFields.size() )
88cdf0e10cSrcweir 	{
89cdf0e10cSrcweir 		Reference< frame::XModel > xModel( rFilter.getModel() );
90cdf0e10cSrcweir 		oox::core::TextFieldStack::const_iterator aIter( rTextFields.begin() );
91cdf0e10cSrcweir 		while( aIter != rTextFields.end() )
92cdf0e10cSrcweir 		{
93cdf0e10cSrcweir 	        const OUString sURL = CREATE_OUSTRING( "URL" );
94cdf0e10cSrcweir 			Reference< drawing::XDrawPagesSupplier > xDPS( xModel, uno::UNO_QUERY_THROW );
95cdf0e10cSrcweir 			Reference< drawing::XDrawPages > xDrawPages( xDPS->getDrawPages(), uno::UNO_QUERY_THROW );
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 			const oox::core::TextField& rTextField( *aIter++ );
98cdf0e10cSrcweir 			Reference< XPropertySet > xPropSet( rTextField.xTextField, UNO_QUERY );
99cdf0e10cSrcweir 	        Reference< XPropertySetInfo > xPropSetInfo( xPropSet->getPropertySetInfo() );
100cdf0e10cSrcweir 			if ( xPropSetInfo->hasPropertyByName( sURL ) )
101cdf0e10cSrcweir 			{
102cdf0e10cSrcweir 				rtl::OUString aURL;
103cdf0e10cSrcweir 				if ( xPropSet->getPropertyValue( sURL ) >>= aURL )
104cdf0e10cSrcweir 				{
105cdf0e10cSrcweir 					const OUString sSlide = CREATE_OUSTRING( "#Slide " );
106cdf0e10cSrcweir 					const OUString sNotes = CREATE_OUSTRING( "#Notes " );
107cdf0e10cSrcweir 					sal_Bool bNotes = sal_False;
108cdf0e10cSrcweir 					sal_Int32 nPageNumber = 0;
109cdf0e10cSrcweir 					if ( aURL.match( sSlide ) )
110cdf0e10cSrcweir 						nPageNumber = aURL.copy( sSlide.getLength() ).toInt32();
111cdf0e10cSrcweir 					else if ( aURL.match( sNotes ) )
112cdf0e10cSrcweir 					{
113cdf0e10cSrcweir 						nPageNumber = aURL.copy( sNotes.getLength() ).toInt32();
114cdf0e10cSrcweir 						bNotes = sal_True;
115cdf0e10cSrcweir 					}
116cdf0e10cSrcweir 					if ( nPageNumber )
117cdf0e10cSrcweir 					{
118cdf0e10cSrcweir 						try
119cdf0e10cSrcweir 						{
120cdf0e10cSrcweir 							Reference< XDrawPage > xDrawPage;
121cdf0e10cSrcweir 							xDrawPages->getByIndex( nPageNumber - 1 ) >>= xDrawPage;
122cdf0e10cSrcweir 							if ( bNotes )
123cdf0e10cSrcweir 							{
124cdf0e10cSrcweir 								Reference< ::com::sun::star::presentation::XPresentationPage > xPresentationPage( xDrawPage, UNO_QUERY_THROW );
125cdf0e10cSrcweir 					            xDrawPage = xPresentationPage->getNotesPage();
126cdf0e10cSrcweir 							}
127cdf0e10cSrcweir 							Reference< container::XNamed > xNamed( xDrawPage, UNO_QUERY_THROW );
128cdf0e10cSrcweir 							aURL = CREATE_OUSTRING( "#" ).concat( xNamed->getName() );
129cdf0e10cSrcweir 							xPropSet->setPropertyValue( sURL, Any( aURL ) );
130cdf0e10cSrcweir 							Reference< text::XTextContent > xContent( rTextField.xTextField, UNO_QUERY);
131cdf0e10cSrcweir 							Reference< text::XTextRange > xTextRange( rTextField.xTextCursor, UNO_QUERY );
132cdf0e10cSrcweir 							rTextField.xText->insertTextContent( xTextRange, xContent, sal_True );
133cdf0e10cSrcweir 						}
134cdf0e10cSrcweir 						catch( uno::Exception& )
135cdf0e10cSrcweir 						{
136cdf0e10cSrcweir 						}
137cdf0e10cSrcweir 					}
138cdf0e10cSrcweir 				}
139cdf0e10cSrcweir 			}
140cdf0e10cSrcweir 		}
141cdf0e10cSrcweir 	}
142cdf0e10cSrcweir }
143cdf0e10cSrcweir 
144cdf0e10cSrcweir void PresentationFragmentHandler::endDocument() throw (SAXException, RuntimeException)
145cdf0e10cSrcweir {
146cdf0e10cSrcweir 	// todo: localized progress bar text
147cdf0e10cSrcweir 	const Reference< task::XStatusIndicator >& rxStatusIndicator( getFilter().getStatusIndicator() );
148cdf0e10cSrcweir 	if ( rxStatusIndicator.is() )
149cdf0e10cSrcweir 		rxStatusIndicator->start( rtl::OUString(), 10000 );
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	try
152cdf0e10cSrcweir 	{
153cdf0e10cSrcweir         PowerPointImport& rFilter = dynamic_cast< PowerPointImport& >( getFilter() );
154cdf0e10cSrcweir 
155cdf0e10cSrcweir         Reference< frame::XModel > xModel( rFilter.getModel() );
156cdf0e10cSrcweir 		Reference< drawing::XDrawPage > xSlide;
157cdf0e10cSrcweir 		sal_uInt32 nSlide;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 		// importing slide pages and its corresponding notes page
160cdf0e10cSrcweir 		Reference< drawing::XDrawPagesSupplier > xDPS( xModel, uno::UNO_QUERY_THROW );
161cdf0e10cSrcweir 		Reference< drawing::XDrawPages > xDrawPages( xDPS->getDrawPages(), uno::UNO_QUERY_THROW );
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 		for( nSlide = 0; nSlide < maSlidesVector.size(); nSlide++ )
164cdf0e10cSrcweir 		{
165cdf0e10cSrcweir 			if ( rxStatusIndicator.is() )
166cdf0e10cSrcweir 				rxStatusIndicator->setValue( ( nSlide * 10000 ) / maSlidesVector.size() );
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 			if( nSlide == 0 )
169cdf0e10cSrcweir 				xDrawPages->getByIndex( 0 ) >>= xSlide;
170cdf0e10cSrcweir 			else
171cdf0e10cSrcweir 				xSlide = xDrawPages->insertNewByIndex( nSlide );
172cdf0e10cSrcweir 
173cdf0e10cSrcweir             OUString aSlideFragmentPath = getFragmentPathFromRelId( maSlidesVector[ nSlide ] );
174cdf0e10cSrcweir             if( aSlideFragmentPath.getLength() > 0 )
175cdf0e10cSrcweir 			{
176*32f3c4faSEike Rathke 				rtl::OUString aMasterFragmentPath;
177cdf0e10cSrcweir 				SlidePersistPtr pMasterPersistPtr;
178cdf0e10cSrcweir                 SlidePersistPtr pSlidePersistPtr( new SlidePersist( rFilter, sal_False, sal_False, xSlide,
179cdf0e10cSrcweir 									ShapePtr( new PPTShape( Slide, "com.sun.star.drawing.GroupShape" ) ), mpTextListStyle ) );
180cdf0e10cSrcweir 
181cdf0e10cSrcweir                 FragmentHandlerRef xSlideFragmentHandler( new SlideFragmentHandler( rFilter, aSlideFragmentPath, pSlidePersistPtr, Slide ) );
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 				// importing the corresponding masterpage/layout
184cdf0e10cSrcweir                 OUString aLayoutFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "slideLayout" ) );
185cdf0e10cSrcweir                 if ( aLayoutFragmentPath.getLength() > 0 )
186cdf0e10cSrcweir 				{
187cdf0e10cSrcweir 					// importing layout
188cdf0e10cSrcweir                     RelationsRef xLayoutRelations = rFilter.importRelations( aLayoutFragmentPath );
189*32f3c4faSEike Rathke                     aMasterFragmentPath = xLayoutRelations->getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "slideMaster" ) );
190cdf0e10cSrcweir                     if( aMasterFragmentPath.getLength() )
191cdf0e10cSrcweir                     {
192cdf0e10cSrcweir                         // check if the corresponding masterpage+layout has already been imported
193cdf0e10cSrcweir                         std::vector< SlidePersistPtr >& rMasterPages( rFilter.getMasterPages() );
194cdf0e10cSrcweir                         std::vector< SlidePersistPtr >::iterator aIter( rMasterPages.begin() );
195cdf0e10cSrcweir                         while( aIter != rMasterPages.end() )
196cdf0e10cSrcweir                         {
197cdf0e10cSrcweir                             if ( ( (*aIter)->getPath() == aMasterFragmentPath ) && ( (*aIter)->getLayoutPath() == aLayoutFragmentPath ) )
198cdf0e10cSrcweir                             {
199cdf0e10cSrcweir                                 pMasterPersistPtr = *aIter;
200cdf0e10cSrcweir                                 break;
201cdf0e10cSrcweir                             }
202cdf0e10cSrcweir                             aIter++;
203cdf0e10cSrcweir                         }
204*32f3c4faSEike Rathke 					}
205*32f3c4faSEike Rathke 				}
206*32f3c4faSEike Rathke 
207*32f3c4faSEike Rathke                 if ( !pMasterPersistPtr.get() )
208cdf0e10cSrcweir                 {   // masterpersist not found, we have to load it
209cdf0e10cSrcweir                     Reference< drawing::XDrawPage > xMasterPage;
210cdf0e10cSrcweir                     Reference< drawing::XMasterPagesSupplier > xMPS( xModel, uno::UNO_QUERY_THROW );
211cdf0e10cSrcweir                     Reference< drawing::XDrawPages > xMasterPages( xMPS->getMasterPages(), uno::UNO_QUERY_THROW );
212cdf0e10cSrcweir 
213cdf0e10cSrcweir                     if( !(rFilter.getMasterPages().size() ))
214cdf0e10cSrcweir                         xMasterPages->getByIndex( 0 ) >>= xMasterPage;
215cdf0e10cSrcweir                     else
216cdf0e10cSrcweir                         xMasterPage = xMasterPages->insertNewByIndex( xMasterPages->getCount() );
217cdf0e10cSrcweir 
218cdf0e10cSrcweir                     pMasterPersistPtr = SlidePersistPtr( new SlidePersist( rFilter, sal_True, sal_False, xMasterPage,
219cdf0e10cSrcweir                         ShapePtr( new PPTShape( Master, "com.sun.star.drawing.GroupShape" ) ), mpTextListStyle ) );
220cdf0e10cSrcweir                     pMasterPersistPtr->setLayoutPath( aLayoutFragmentPath );
221cdf0e10cSrcweir                     rFilter.getMasterPages().push_back( pMasterPersistPtr );
222cdf0e10cSrcweir                     rFilter.setActualSlidePersist( pMasterPersistPtr );
223*32f3c4faSEike Rathke 
224cdf0e10cSrcweir                     FragmentHandlerRef xMasterFragmentHandler( new SlideFragmentHandler( rFilter, aMasterFragmentPath, pMasterPersistPtr, Master ) );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir                     // set the correct theme
227cdf0e10cSrcweir                     OUString aThemeFragmentPath = xMasterFragmentHandler->getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "theme" ) );
228cdf0e10cSrcweir                     if( aThemeFragmentPath.getLength() > 0 )
229cdf0e10cSrcweir                     {
230cdf0e10cSrcweir                         std::map< OUString, oox::drawingml::ThemePtr >& rThemes( rFilter.getThemes() );
231cdf0e10cSrcweir                         std::map< OUString, oox::drawingml::ThemePtr >::iterator aIter2( rThemes.find( aThemeFragmentPath ) );
232cdf0e10cSrcweir                         if( aIter2 == rThemes.end() )
233cdf0e10cSrcweir                         {
234cdf0e10cSrcweir                             oox::drawingml::ThemePtr pThemePtr( new oox::drawingml::Theme() );
235cdf0e10cSrcweir                             pMasterPersistPtr->setTheme( pThemePtr );
236cdf0e10cSrcweir                             rFilter.importFragment( new ThemeFragmentHandler( rFilter, aThemeFragmentPath, *pThemePtr ) );
237cdf0e10cSrcweir                             rThemes[ aThemeFragmentPath ] = pThemePtr;
238cdf0e10cSrcweir                         }
239cdf0e10cSrcweir                         else
240cdf0e10cSrcweir                         {
241cdf0e10cSrcweir                             pMasterPersistPtr->setTheme( (*aIter2).second );
242cdf0e10cSrcweir                         }
243cdf0e10cSrcweir                     }
244cdf0e10cSrcweir                     importSlide( xMasterFragmentHandler, pMasterPersistPtr );
245cdf0e10cSrcweir                     rFilter.importFragment( new LayoutFragmentHandler( rFilter, aLayoutFragmentPath, pMasterPersistPtr ) );
246cdf0e10cSrcweir                     pMasterPersistPtr->createBackground( rFilter );
247cdf0e10cSrcweir                     pMasterPersistPtr->createXShapes( rFilter );
248cdf0e10cSrcweir                 }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 				// importing slide page
251cdf0e10cSrcweir 				pSlidePersistPtr->setMasterPersist( pMasterPersistPtr );
252cdf0e10cSrcweir 				pSlidePersistPtr->setTheme( pMasterPersistPtr->getTheme() );
253cdf0e10cSrcweir 				Reference< drawing::XMasterPageTarget > xMasterPageTarget( pSlidePersistPtr->getPage(), UNO_QUERY );
254cdf0e10cSrcweir 				if( xMasterPageTarget.is() )
255cdf0e10cSrcweir 					xMasterPageTarget->setMasterPage( pMasterPersistPtr->getPage() );
256cdf0e10cSrcweir                 rFilter.getDrawPages().push_back( pSlidePersistPtr );
257cdf0e10cSrcweir                 rFilter.setActualSlidePersist( pSlidePersistPtr );
258cdf0e10cSrcweir                 importSlide( xSlideFragmentHandler, pSlidePersistPtr );
259cdf0e10cSrcweir                 pSlidePersistPtr->createBackground( rFilter );
260cdf0e10cSrcweir                 pSlidePersistPtr->createXShapes( rFilter );
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 				// now importing the notes page
263cdf0e10cSrcweir                 OUString aNotesFragmentPath = xSlideFragmentHandler->getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "notesSlide" ) );
264cdf0e10cSrcweir                 if( aNotesFragmentPath.getLength() > 0 )
265cdf0e10cSrcweir                 {
266cdf0e10cSrcweir 					Reference< XPresentationPage > xPresentationPage( xSlide, UNO_QUERY );
267cdf0e10cSrcweir 					if ( xPresentationPage.is() )
268cdf0e10cSrcweir 					{
269cdf0e10cSrcweir 						Reference< XDrawPage > xNotesPage( xPresentationPage->getNotesPage() );
270cdf0e10cSrcweir 						if ( xNotesPage.is() )
271cdf0e10cSrcweir 						{
272cdf0e10cSrcweir                             SlidePersistPtr pNotesPersistPtr( new SlidePersist( rFilter, sal_False, sal_True, xNotesPage,
273cdf0e10cSrcweir 								ShapePtr( new PPTShape( Slide, "com.sun.star.drawing.GroupShape" ) ), mpTextListStyle ) );
274cdf0e10cSrcweir                             FragmentHandlerRef xNotesFragmentHandler( new SlideFragmentHandler( getFilter(), aNotesFragmentPath, pNotesPersistPtr, Slide ) );
275cdf0e10cSrcweir                             rFilter.getNotesPages().push_back( pNotesPersistPtr );
276cdf0e10cSrcweir                             rFilter.setActualSlidePersist( pNotesPersistPtr );
277cdf0e10cSrcweir                             importSlide( xNotesFragmentHandler, pNotesPersistPtr );
278cdf0e10cSrcweir                             pNotesPersistPtr->createBackground( rFilter );
279cdf0e10cSrcweir                             pNotesPersistPtr->createXShapes( rFilter );
280cdf0e10cSrcweir 						}
281cdf0e10cSrcweir 					}
282cdf0e10cSrcweir 				}
283cdf0e10cSrcweir 			}
284cdf0e10cSrcweir 		}
285cdf0e10cSrcweir 		ResolveTextFields( rFilter );
286cdf0e10cSrcweir 	}
287cdf0e10cSrcweir 	catch( uno::Exception& )
288cdf0e10cSrcweir 	{
289cdf0e10cSrcweir         OSL_ENSURE( false,
290cdf0e10cSrcweir 			(rtl::OString("oox::ppt::PresentationFragmentHandler::EndDocument(), "
291cdf0e10cSrcweir 					"exception caught: ") +
292cdf0e10cSrcweir 			rtl::OUStringToOString(
293cdf0e10cSrcweir 				comphelper::anyToString( cppu::getCaughtException() ),
294cdf0e10cSrcweir 				RTL_TEXTENCODING_UTF8 )).getStr() );
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 	}
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	// todo	error handling;
299cdf0e10cSrcweir 	if ( rxStatusIndicator.is() )
300cdf0e10cSrcweir 		rxStatusIndicator->end();
301cdf0e10cSrcweir }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir // CT_Presentation
304cdf0e10cSrcweir Reference< XFastContextHandler > PresentationFragmentHandler::createFastChildContext( sal_Int32 aElementToken, const Reference< XFastAttributeList >& xAttribs ) throw (SAXException, RuntimeException)
305cdf0e10cSrcweir {
306cdf0e10cSrcweir 	Reference< XFastContextHandler > xRet;
307cdf0e10cSrcweir 	switch( aElementToken )
308cdf0e10cSrcweir 	{
309cdf0e10cSrcweir 	case PPT_TOKEN( presentation ):
310cdf0e10cSrcweir 	case PPT_TOKEN( sldMasterIdLst ):
311cdf0e10cSrcweir 	case PPT_TOKEN( notesMasterIdLst ):
312cdf0e10cSrcweir 	case PPT_TOKEN( sldIdLst ):
313cdf0e10cSrcweir 		break;
314cdf0e10cSrcweir 	case PPT_TOKEN( sldMasterId ):
315cdf0e10cSrcweir 		maSlideMasterVector.push_back( xAttribs->getOptionalValue( R_TOKEN( id ) ) );
316cdf0e10cSrcweir 		break;
317cdf0e10cSrcweir 	case PPT_TOKEN( sldId ):
318cdf0e10cSrcweir 		maSlidesVector.push_back( xAttribs->getOptionalValue( R_TOKEN( id ) ) );
319cdf0e10cSrcweir 		break;
320cdf0e10cSrcweir 	case PPT_TOKEN( notesMasterId ):
321cdf0e10cSrcweir 		maNotesMasterVector.push_back( xAttribs->getOptionalValue(R_TOKEN( id ) ) );
322cdf0e10cSrcweir 		break;
323cdf0e10cSrcweir 	case PPT_TOKEN( sldSz ):
324cdf0e10cSrcweir 		maSlideSize = GetSize2D( xAttribs );
325cdf0e10cSrcweir 		break;
326cdf0e10cSrcweir 	case PPT_TOKEN( notesSz ):
327cdf0e10cSrcweir 		maNotesSize = GetSize2D( xAttribs );
328cdf0e10cSrcweir 		break;
329cdf0e10cSrcweir 	case PPT_TOKEN( custShowLst ):
330cdf0e10cSrcweir         xRet.set( new CustomShowListContext( *this, maCustomShowList ) );
331cdf0e10cSrcweir 		break;
332cdf0e10cSrcweir 	case PPT_TOKEN( defaultTextStyle ):
333cdf0e10cSrcweir         xRet.set( new TextListStyleContext( *this, *mpTextListStyle ) );
334cdf0e10cSrcweir 		break;
335cdf0e10cSrcweir 	}
336cdf0e10cSrcweir 	if ( !xRet.is() )
337cdf0e10cSrcweir         xRet = getFastContextHandler();
338cdf0e10cSrcweir 	return xRet;
339cdf0e10cSrcweir }
340cdf0e10cSrcweir 
341cdf0e10cSrcweir bool PresentationFragmentHandler::importSlide( const FragmentHandlerRef& rxSlideFragmentHandler,
342cdf0e10cSrcweir         const SlidePersistPtr pSlidePersistPtr )
343cdf0e10cSrcweir {
344cdf0e10cSrcweir 	Reference< drawing::XDrawPage > xSlide( pSlidePersistPtr->getPage() );
345cdf0e10cSrcweir 	SlidePersistPtr pMasterPersistPtr( pSlidePersistPtr->getMasterPersist() );
346cdf0e10cSrcweir 	if ( pMasterPersistPtr.get() )
347cdf0e10cSrcweir 	{
348cdf0e10cSrcweir         const OUString sLayout = CREATE_OUSTRING( "Layout" );
349cdf0e10cSrcweir 		uno::Reference< beans::XPropertySet > xSet( xSlide, uno::UNO_QUERY_THROW );
350cdf0e10cSrcweir 		xSet->setPropertyValue(	sLayout, Any( pMasterPersistPtr->getLayoutFromValueToken() ) );
351cdf0e10cSrcweir 	}
352cdf0e10cSrcweir 	while( xSlide->getCount() )
353cdf0e10cSrcweir 	{
354cdf0e10cSrcweir 		Reference< drawing::XShape > xShape;
355cdf0e10cSrcweir 		xSlide->getByIndex(0) >>= xShape;
356cdf0e10cSrcweir 		xSlide->remove( xShape );
357cdf0e10cSrcweir 	}
358cdf0e10cSrcweir 
359cdf0e10cSrcweir 	Reference< XPropertySet > xPropertySet( xSlide, UNO_QUERY );
360cdf0e10cSrcweir 	if ( xPropertySet.is() )
361cdf0e10cSrcweir 	{
362cdf0e10cSrcweir         static const OUString sWidth = CREATE_OUSTRING( "Width" );
363cdf0e10cSrcweir         static const OUString sHeight = CREATE_OUSTRING( "Height" );
364cdf0e10cSrcweir 		awt::Size& rPageSize( pSlidePersistPtr->isNotesPage() ? maNotesSize : maSlideSize );
365cdf0e10cSrcweir 		xPropertySet->setPropertyValue( sWidth, Any( rPageSize.Width ) );
366cdf0e10cSrcweir 		xPropertySet->setPropertyValue( sHeight, Any( rPageSize.Height ) );
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 		oox::ppt::HeaderFooter aHeaderFooter( pSlidePersistPtr->getHeaderFooter() );
369cdf0e10cSrcweir 		if ( !pSlidePersistPtr->isMasterPage() )
370cdf0e10cSrcweir 			aHeaderFooter.mbSlideNumber = aHeaderFooter.mbHeader = aHeaderFooter.mbFooter = aHeaderFooter.mbDateTime = sal_False;
371cdf0e10cSrcweir 		try
372cdf0e10cSrcweir 		{
373cdf0e10cSrcweir 			static const OUString sIsHeaderVisible = CREATE_OUSTRING( "IsHeaderVisible" );
374cdf0e10cSrcweir 			static const OUString sIsFooterVisible = CREATE_OUSTRING( "IsFooterVisible" );
375cdf0e10cSrcweir 			static const OUString sIsDateTimeVisible = CREATE_OUSTRING( "IsDateTimeVisible" );
376cdf0e10cSrcweir 			static const OUString sIsPageNumberVisible = CREATE_OUSTRING( "IsPageNumberVisible" );
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 			if ( pSlidePersistPtr->isNotesPage() )
379cdf0e10cSrcweir 				xPropertySet->setPropertyValue( sIsHeaderVisible, Any( aHeaderFooter.mbHeader ) );
380cdf0e10cSrcweir 			xPropertySet->setPropertyValue( sIsFooterVisible, Any( aHeaderFooter.mbFooter ) );
381cdf0e10cSrcweir 			xPropertySet->setPropertyValue( sIsDateTimeVisible, Any( aHeaderFooter.mbDateTime ) );
382cdf0e10cSrcweir 			xPropertySet->setPropertyValue( sIsPageNumberVisible, Any( aHeaderFooter.mbSlideNumber ) );
383cdf0e10cSrcweir 		}
384cdf0e10cSrcweir 		catch( uno::Exception& )
385cdf0e10cSrcweir 		{
386cdf0e10cSrcweir 		}
387cdf0e10cSrcweir 	}
388cdf0e10cSrcweir     pSlidePersistPtr->setPath( rxSlideFragmentHandler->getFragmentPath() );
389cdf0e10cSrcweir     return getFilter().importFragment( rxSlideFragmentHandler );
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
392cdf0e10cSrcweir } }
393cdf0e10cSrcweir 
394