LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/toolpanel/controls - MasterPageContainerProviders.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 112 0.0 %
Date: 2012-12-27 Functions: 0 21 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include "MasterPageContainerProviders.hxx"
      22             : 
      23             : #include "DrawDocShell.hxx"
      24             : #include "drawdoc.hxx"
      25             : #include "PreviewRenderer.hxx"
      26             : #include <comphelper/processfactory.hxx>
      27             : #include <sfx2/app.hxx>
      28             : #include <sfx2/sfxsids.hrc>
      29             : #include <unotools/ucbstreamhelper.hxx>
      30             : #include <vcl/image.hxx>
      31             : #include <vcl/pngread.hxx>
      32             : #include <com/sun/star/embed/ElementModes.hpp>
      33             : #include <com/sun/star/embed/StorageFactory.hpp>
      34             : #include <tools/diagnose_ex.h>
      35             : 
      36             : using namespace ::com::sun::star;
      37             : using namespace ::com::sun::star::uno;
      38             : using namespace ::sd::toolpanel::controls;
      39             : 
      40             : 
      41             : namespace sd { namespace toolpanel { namespace controls {
      42             : 
      43             : 
      44             : //===== PagePreviewProvider ===================================================
      45             : 
      46           0 : PagePreviewProvider::PagePreviewProvider (void)
      47             : {
      48           0 : }
      49             : 
      50             : 
      51             : 
      52             : 
      53           0 : Image PagePreviewProvider::operator () (
      54             :     int nWidth,
      55             :     SdPage* pPage,
      56             :     ::sd::PreviewRenderer& rRenderer)
      57             : {
      58           0 :     Image aPreview;
      59             : 
      60           0 :     if (pPage != NULL)
      61             :     {
      62             :         // Use the given renderer to create a preview of the given page
      63             :         // object.
      64             :         aPreview = rRenderer.RenderPage(
      65             :             pPage,
      66             :             nWidth,
      67             :             rtl::OUString(),
      68           0 :             false);
      69             :     }
      70             : 
      71           0 :     return aPreview;
      72             : }
      73             : 
      74             : 
      75             : 
      76             : 
      77           0 : int PagePreviewProvider::GetCostIndex (void)
      78             : {
      79           0 :     return 5;
      80             : }
      81             : 
      82             : 
      83             : 
      84             : 
      85           0 : bool PagePreviewProvider::NeedsPageObject (void)
      86             : {
      87           0 :     return true;
      88             : }
      89             : 
      90             : 
      91             : 
      92             : 
      93             : //===== TemplatePreviewProvider ===============================================
      94             : 
      95           0 : TemplatePreviewProvider::TemplatePreviewProvider (const ::rtl::OUString& rsURL)
      96           0 :     : msURL(rsURL)
      97             : {
      98           0 : }
      99             : 
     100             : 
     101             : 
     102             : 
     103           0 : Image TemplatePreviewProvider::operator() (
     104             :     int nWidth,
     105             :     SdPage* pPage,
     106             :     ::sd::PreviewRenderer& rRenderer)
     107             : {
     108             :     // Unused parameters.
     109             :     (void)nWidth;
     110             :     (void)pPage;
     111             :     (void)rRenderer;
     112             : 
     113             :     // Load the thumbnail from a template document.
     114           0 :     uno::Reference<io::XInputStream> xIStream;
     115             : 
     116           0 :     uno::Reference< uno::XComponentContext > xContext(::comphelper::getProcessComponentContext());
     117             :     try
     118             :     {
     119           0 :         uno::Reference<lang::XSingleServiceFactory> xStorageFactory = embed::StorageFactory::create(xContext);
     120             : 
     121           0 :         uno::Sequence<uno::Any> aArgs (2);
     122           0 :         aArgs[0] <<= msURL;
     123           0 :         aArgs[1] <<= embed::ElementModes::READ;
     124             :         uno::Reference<embed::XStorage> xDocStorage (
     125           0 :             xStorageFactory->createInstanceWithArguments(aArgs),
     126           0 :             uno::UNO_QUERY);
     127             : 
     128             :         try
     129             :         {
     130           0 :             if (xDocStorage.is())
     131             :             {
     132             :                 uno::Reference<embed::XStorage> xStorage (
     133           0 :                     xDocStorage->openStorageElement(
     134             :                         "Thumbnails",
     135           0 :                         embed::ElementModes::READ));
     136           0 :                 if (xStorage.is())
     137             :                 {
     138             :                     uno::Reference<io::XStream> xThumbnailCopy (
     139           0 :                         xStorage->cloneStreamElement("thumbnail.png"));
     140           0 :                     if (xThumbnailCopy.is())
     141           0 :                         xIStream = xThumbnailCopy->getInputStream();
     142           0 :                 }
     143             :             }
     144             :         }
     145           0 :         catch (const uno::Exception& rException)
     146             :         {
     147             :             OSL_TRACE (
     148             :                 "caught exception while trying to access Thumbnail/thumbnail.png of %s: %s",
     149             :                 ::rtl::OUStringToOString(msURL,
     150             :                     RTL_TEXTENCODING_UTF8).getStr(),
     151             :                 ::rtl::OUStringToOString(rException.Message,
     152             :                     RTL_TEXTENCODING_UTF8).getStr());
     153             :         }
     154             : 
     155             :         try
     156             :         {
     157             :             // An (older) implementation had a bug - The storage
     158             :             // name was "Thumbnail" instead of "Thumbnails".  The
     159             :             // old name is still used as fallback but this code can
     160             :             // be removed soon.
     161           0 :             if ( ! xIStream.is())
     162             :             {
     163             :                 uno::Reference<embed::XStorage> xStorage (
     164           0 :                     xDocStorage->openStorageElement( "Thumbnail",
     165           0 :                         embed::ElementModes::READ));
     166           0 :                 if (xStorage.is())
     167             :                 {
     168             :                     uno::Reference<io::XStream> xThumbnailCopy (
     169           0 :                         xStorage->cloneStreamElement("thumbnail.png"));
     170           0 :                     if (xThumbnailCopy.is())
     171           0 :                         xIStream = xThumbnailCopy->getInputStream();
     172           0 :                 }
     173             :             }
     174             :         }
     175           0 :         catch (const uno::Exception& rException)
     176             :         {
     177             :             OSL_TRACE (
     178             :                 "caught exception while trying to access Thumbnails/thumbnail.png of %s: %s",
     179             :                 ::rtl::OUStringToOString(msURL,
     180             :                     RTL_TEXTENCODING_UTF8).getStr(),
     181             :                 ::rtl::OUStringToOString(rException.Message,
     182             :                     RTL_TEXTENCODING_UTF8).getStr());
     183           0 :         }
     184             :     }
     185           0 :     catch (const uno::Exception& rException)
     186             :     {
     187             :         OSL_TRACE (
     188             :             "caught exception while trying to access tuhmbnail of %s: %s",
     189             :             ::rtl::OUStringToOString(msURL,
     190             :                 RTL_TEXTENCODING_UTF8).getStr(),
     191             :             ::rtl::OUStringToOString(rException.Message,
     192             :                 RTL_TEXTENCODING_UTF8).getStr());
     193             :     }
     194             : 
     195             :     // Extract the image from the stream.
     196           0 :     BitmapEx aThumbnail;
     197           0 :     if (xIStream.is())
     198             :     {
     199             :         ::std::auto_ptr<SvStream> pStream (
     200           0 :             ::utl::UcbStreamHelper::CreateStream (xIStream));
     201           0 :         ::vcl::PNGReader aReader (*pStream);
     202           0 :         aThumbnail = aReader.Read ();
     203             :     }
     204             : 
     205             :     // Note that the preview is returned without scaling it to the desired
     206             :     // width.  This gives the caller the chance to take advantage of a
     207             :     // possibly larger resolution then was asked for.
     208           0 :     return aThumbnail;
     209             : }
     210             : 
     211             : 
     212             : 
     213             : 
     214           0 : int TemplatePreviewProvider::GetCostIndex (void)
     215             : {
     216           0 :     return 10;
     217             : }
     218             : 
     219             : 
     220             : 
     221             : 
     222           0 : bool TemplatePreviewProvider::NeedsPageObject (void)
     223             : {
     224           0 :     return false;
     225             : }
     226             : 
     227             : 
     228             : 
     229             : 
     230             : //===== TemplatePageObjectProvider =============================================
     231             : 
     232           0 : TemplatePageObjectProvider::TemplatePageObjectProvider (const ::rtl::OUString& rsURL)
     233             :     : msURL(rsURL),
     234           0 :       mxDocumentShell()
     235             : {
     236           0 : }
     237             : 
     238             : 
     239             : 
     240             : 
     241           0 : SdPage* TemplatePageObjectProvider::operator() (SdDrawDocument* pContainerDocument)
     242             : {
     243             :     // Unused parameters.
     244             :     (void)pContainerDocument;
     245             : 
     246           0 :     SdPage* pPage = NULL;
     247             : 
     248           0 :     mxDocumentShell = NULL;
     249           0 :     ::sd::DrawDocShell* pDocumentShell = NULL;
     250             :     try
     251             :     {
     252             :         // Load the template document and return its first page.
     253           0 :         pDocumentShell = LoadDocument (msURL);
     254           0 :         if (pDocumentShell != NULL)
     255             :         {
     256           0 :             SdDrawDocument* pDocument = pDocumentShell->GetDoc();
     257           0 :             if (pDocument != NULL)
     258             :             {
     259           0 :                 pPage = pDocument->GetMasterSdPage(0, PK_STANDARD);
     260             :                 // In order to make the newly loaded master page deletable
     261             :                 // when copied into documents it is marked as no "precious".
     262             :                 // When it is modified then it is marked as "precious".
     263           0 :                 if (pPage != NULL)
     264           0 :                     pPage->SetPrecious(false);
     265             :             }
     266             :         }
     267             :     }
     268           0 :     catch (const uno::RuntimeException&)
     269             :     {
     270             :         DBG_UNHANDLED_EXCEPTION();
     271           0 :         pPage = NULL;
     272             :     }
     273             : 
     274           0 :     return pPage;
     275             : }
     276             : 
     277             : 
     278             : 
     279             : 
     280           0 : ::sd::DrawDocShell* TemplatePageObjectProvider::LoadDocument (const ::rtl::OUString& sFileName)
     281             : {
     282           0 :     SfxApplication* pSfxApp = SFX_APP();
     283           0 :     SfxItemSet* pSet = new SfxAllItemSet (pSfxApp->GetPool());
     284           0 :     pSet->Put (SfxBoolItem (SID_TEMPLATE, sal_True));
     285           0 :     pSet->Put (SfxBoolItem (SID_PREVIEW, sal_True));
     286           0 :     if (pSfxApp->LoadTemplate (mxDocumentShell, sFileName, sal_True, pSet))
     287             :     {
     288           0 :         mxDocumentShell = NULL;
     289             :     }
     290           0 :     SfxObjectShell* pShell = mxDocumentShell;
     291           0 :     return PTR_CAST(::sd::DrawDocShell,pShell);
     292             : }
     293             : 
     294             : 
     295             : 
     296             : 
     297           0 : int TemplatePageObjectProvider::GetCostIndex (void)
     298             : {
     299           0 :     return 20;
     300             : }
     301             : 
     302             : 
     303             : 
     304             : 
     305           0 : bool TemplatePageObjectProvider::operator== (const PageObjectProvider& rProvider)
     306             : {
     307             :     const TemplatePageObjectProvider* pTemplatePageObjectProvider
     308           0 :         = dynamic_cast<const TemplatePageObjectProvider*>(&rProvider);
     309           0 :     if (pTemplatePageObjectProvider != NULL)
     310           0 :         return (msURL == pTemplatePageObjectProvider->msURL);
     311             :     else
     312           0 :         return false;
     313             : }
     314             : 
     315             : 
     316             : 
     317             : 
     318             : //===== DefaultPageObjectProvider ==============================================
     319             : 
     320           0 : DefaultPageObjectProvider::DefaultPageObjectProvider (void)
     321             : {
     322           0 : }
     323             : 
     324             : 
     325             : 
     326             : 
     327           0 : SdPage* DefaultPageObjectProvider::operator () (SdDrawDocument* pContainerDocument)
     328             : {
     329           0 :     SdPage* pLocalMasterPage = NULL;
     330           0 :     if (pContainerDocument != NULL)
     331             :     {
     332           0 :         sal_Int32 nIndex (0);
     333           0 :         SdPage* pLocalSlide = pContainerDocument->GetSdPage((sal_uInt16)nIndex, PK_STANDARD);
     334           0 :         if (pLocalSlide!=NULL && pLocalSlide->TRG_HasMasterPage())
     335           0 :             pLocalMasterPage = dynamic_cast<SdPage*>(&pLocalSlide->TRG_GetMasterPage());
     336             :     }
     337             : 
     338             :     if (pLocalMasterPage == NULL)
     339             :     {
     340             :         DBG_ASSERT(false, "can not create master page for slide");
     341             :     }
     342             : 
     343           0 :     return pLocalMasterPage;
     344             : }
     345             : 
     346             : 
     347             : 
     348             : 
     349           0 : int DefaultPageObjectProvider::GetCostIndex (void)
     350             : {
     351           0 :     return 15;
     352             : }
     353             : 
     354             : 
     355             : 
     356             : 
     357           0 : bool DefaultPageObjectProvider::operator== (const PageObjectProvider& rProvider)
     358             : {
     359           0 :     return (dynamic_cast<const DefaultPageObjectProvider*>(&rProvider) != NULL);
     360             : }
     361             : 
     362             : 
     363             : 
     364             : 
     365             : //===== ExistingPageProvider ==================================================
     366             : 
     367           0 : ExistingPageProvider::ExistingPageProvider (SdPage* pPage)
     368           0 :     : mpPage(pPage)
     369             : {
     370           0 : }
     371             : 
     372             : 
     373             : 
     374             : 
     375           0 : SdPage* ExistingPageProvider::operator() (SdDrawDocument* pDocument)
     376             : {
     377             :     (void)pDocument; // Unused parameter.
     378             : 
     379           0 :     return mpPage;
     380             : }
     381             : 
     382             : 
     383             : 
     384             : 
     385           0 : int ExistingPageProvider::GetCostIndex (void)
     386             : {
     387           0 :     return 0;
     388             : }
     389             : 
     390             : 
     391             : 
     392             : 
     393           0 : bool ExistingPageProvider::operator== (const PageObjectProvider& rProvider)
     394             : {
     395             :     const ExistingPageProvider* pExistingPageProvider
     396           0 :         = dynamic_cast<const ExistingPageProvider*>(&rProvider);
     397           0 :     if (pExistingPageProvider != NULL)
     398           0 :         return (mpPage == pExistingPageProvider->mpPage);
     399             :     else
     400           0 :         return false;
     401             : }
     402             : 
     403             : 
     404             : } } } // end of namespace ::sd::toolpanel::controls
     405             : 
     406             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10