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: */
|