/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: MasterPageContainerProviders.cxx,v $ * $Revision: 1.5 $ * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" #include "MasterPageContainerProviders.hxx" #include "DrawDocShell.hxx" #include "drawdoc.hxx" #include "PreviewRenderer.hxx" #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::sd::toolpanel::controls; namespace sd { namespace toolpanel { namespace controls { //===== PagePreviewProvider =================================================== PagePreviewProvider::PagePreviewProvider (void) { } Image PagePreviewProvider::operator () ( int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) { Image aPreview; if (pPage != NULL) { // Use the given renderer to create a preview of the given page // object. aPreview = rRenderer.RenderPage( pPage, nWidth, String::CreateFromAscii(""), false); } return aPreview; } int PagePreviewProvider::GetCostIndex (void) { return 5; } bool PagePreviewProvider::NeedsPageObject (void) { return true; } //===== TemplatePreviewProvider =============================================== TemplatePreviewProvider::TemplatePreviewProvider (const ::rtl::OUString& rsURL) : msURL(rsURL) { } Image TemplatePreviewProvider::operator() ( int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) { // Unused parameters. (void)nWidth; (void)pPage; (void)rRenderer; // Load the thumbnail from a template document. uno::Reference xIStream; uno::Reference< lang::XMultiServiceFactory > xServiceManager ( ::comphelper::getProcessServiceFactory()); if (xServiceManager.is()) { try { uno::Reference xStorageFactory( xServiceManager->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.embed.StorageFactory")), uno::UNO_QUERY); if (xStorageFactory.is()) { uno::Sequence aArgs (2); aArgs[0] <<= msURL; aArgs[1] <<= embed::ElementModes::READ; uno::Reference xDocStorage ( xStorageFactory->createInstanceWithArguments(aArgs), uno::UNO_QUERY); try { if (xDocStorage.is()) { uno::Reference xStorage ( xDocStorage->openStorageElement( ::rtl::OUString::createFromAscii("Thumbnails"), embed::ElementModes::READ)); if (xStorage.is()) { uno::Reference xThumbnailCopy ( xStorage->cloneStreamElement( ::rtl::OUString::createFromAscii( "thumbnail.png"))); if (xThumbnailCopy.is()) xIStream = xThumbnailCopy->getInputStream(); } } } catch (uno::Exception& rException) { OSL_TRACE ( "caught exception while trying to access Thumbnail/thumbnail.png of %s: %s", ::rtl::OUStringToOString(msURL, RTL_TEXTENCODING_UTF8).getStr(), ::rtl::OUStringToOString(rException.Message, RTL_TEXTENCODING_UTF8).getStr()); } try { // An (older) implementation had a bug - The storage // name was "Thumbnail" instead of "Thumbnails". The // old name is still used as fallback but this code can // be removed soon. if ( ! xIStream.is()) { uno::Reference xStorage ( xDocStorage->openStorageElement( ::rtl::OUString::createFromAscii("Thumbnail"), embed::ElementModes::READ)); if (xStorage.is()) { uno::Reference xThumbnailCopy ( xStorage->cloneStreamElement( ::rtl::OUString::createFromAscii( "thumbnail.png"))); if (xThumbnailCopy.is()) xIStream = xThumbnailCopy->getInputStream(); } } } catch (uno::Exception& rException) { OSL_TRACE ( "caught exception while trying to access Thumbnails/thumbnail.png of %s: %s", ::rtl::OUStringToOString(msURL, RTL_TEXTENCODING_UTF8).getStr(), ::rtl::OUStringToOString(rException.Message, RTL_TEXTENCODING_UTF8).getStr()); } } } catch (uno::Exception& rException) { OSL_TRACE ( "caught exception while trying to access tuhmbnail of %s: %s", ::rtl::OUStringToOString(msURL, RTL_TEXTENCODING_UTF8).getStr(), ::rtl::OUStringToOString(rException.Message, RTL_TEXTENCODING_UTF8).getStr()); } } // Extract the image from the stream. BitmapEx aThumbnail; if (xIStream.is()) { ::std::auto_ptr pStream ( ::utl::UcbStreamHelper::CreateStream (xIStream)); ::vcl::PNGReader aReader (*pStream); aThumbnail = aReader.Read (); } // Note that the preview is returned without scaling it to the desired // width. This gives the caller the chance to take advantage of a // possibly larger resolution then was asked for. return aThumbnail; } int TemplatePreviewProvider::GetCostIndex (void) { return 10; } bool TemplatePreviewProvider::NeedsPageObject (void) { return false; } //===== TemplatePageObjectProvider ============================================= TemplatePageObjectProvider::TemplatePageObjectProvider (const ::rtl::OUString& rsURL) : msURL(rsURL), mxDocumentShell() { } SdPage* TemplatePageObjectProvider::operator() (SdDrawDocument* pContainerDocument) { // Unused parameters. (void)pContainerDocument; SdPage* pPage = NULL; mxDocumentShell = NULL; ::sd::DrawDocShell* pDocumentShell = NULL; try { // Load the template document and return its first page. pDocumentShell = LoadDocument (msURL); if (pDocumentShell != NULL) { SdDrawDocument* pDocument = pDocumentShell->GetDoc(); if (pDocument != NULL) { pPage = pDocument->GetMasterSdPage(0, PK_STANDARD); // In order to make the newly loaded master page deletable // when copied into documents it is marked as no "precious". // When it is modified then it is marked as "precious". if (pPage != NULL) pPage->SetPrecious(false); } } } catch (uno::RuntimeException) { OSL_TRACE ("caught exception while loading page from template file"); pPage = NULL; } return pPage; } ::sd::DrawDocShell* TemplatePageObjectProvider::LoadDocument (const ::rtl::OUString& sFileName) { SfxApplication* pSfxApp = SFX_APP(); SfxItemSet* pSet = new SfxAllItemSet (pSfxApp->GetPool()); pSet->Put (SfxBoolItem (SID_TEMPLATE, TRUE)); pSet->Put (SfxBoolItem (SID_PREVIEW, TRUE)); if (pSfxApp->LoadTemplate (mxDocumentShell, sFileName, TRUE, pSet)) { mxDocumentShell = NULL; } SfxObjectShell* pShell = mxDocumentShell; return PTR_CAST(::sd::DrawDocShell,pShell); } int TemplatePageObjectProvider::GetCostIndex (void) { return 20; } bool TemplatePageObjectProvider::operator== (const PageObjectProvider& rProvider) { const TemplatePageObjectProvider* pTemplatePageObjectProvider = dynamic_cast(&rProvider); if (pTemplatePageObjectProvider != NULL) return (msURL == pTemplatePageObjectProvider->msURL); else return false; } //===== DefaultPageObjectProvider ============================================== DefaultPageObjectProvider::DefaultPageObjectProvider (void) { } SdPage* DefaultPageObjectProvider::operator () (SdDrawDocument* pContainerDocument) { SdPage* pLocalMasterPage = NULL; if (pContainerDocument != NULL) { sal_Int32 nIndex (0); SdPage* pLocalSlide = pContainerDocument->GetSdPage((USHORT)nIndex, PK_STANDARD); if (pLocalSlide!=NULL && pLocalSlide->TRG_HasMasterPage()) pLocalMasterPage = dynamic_cast(&pLocalSlide->TRG_GetMasterPage()); } if (pLocalMasterPage == NULL) { DBG_ASSERT(false, "can not create master page for slide"); } return pLocalMasterPage; } int DefaultPageObjectProvider::GetCostIndex (void) { return 15; } bool DefaultPageObjectProvider::operator== (const PageObjectProvider& rProvider) { return (dynamic_cast(&rProvider) != NULL); } //===== DefaultPagePreviewProvider ============================================ DefaultPagePreviewProvider::DefaultPagePreviewProvider (void) { } Image DefaultPagePreviewProvider::operator() ( int nWidth, SdPage* pPage, ::sd::PreviewRenderer& rRenderer) { // Unused parameters. (void)nWidth; (void)pPage; (void)rRenderer; return Image(); } int DefaultPagePreviewProvider::GetCostIndex (void) { return 0; } bool DefaultPagePreviewProvider::NeedsPageObject (void) { return false; } //===== ExistingPageProvider ================================================== ExistingPageProvider::ExistingPageProvider (SdPage* pPage) : mpPage(pPage) { } SdPage* ExistingPageProvider::operator() (SdDrawDocument* pDocument) { (void)pDocument; // Unused parameter. return mpPage; } int ExistingPageProvider::GetCostIndex (void) { return 0; } bool ExistingPageProvider::operator== (const PageObjectProvider& rProvider) { const ExistingPageProvider* pExistingPageProvider = dynamic_cast(&rProvider); if (pExistingPageProvider != NULL) return (mpPage == pExistingPageProvider->mpPage); else return false; } } } } // end of namespace ::sd::toolpanel::controls