/************************************************************** * * 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 "precompiled_sd.hxx" #include "MasterPageContainerProviders.hxx" #include "DrawDocShell.hxx" #include "drawdoc.hxx" #include "PreviewRenderer.hxx" #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; namespace sd { namespace sidebar { //===== 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) { DBG_UNHANDLED_EXCEPTION(); 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, sal_True)); pSet->Put (SfxBoolItem (SID_PREVIEW, sal_True)); if (pSfxApp->LoadTemplate (mxDocumentShell, sFileName, sal_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((sal_uInt16)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); } //===== 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::sidebar