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