LibreOffice Module sd (master) 1
MasterPageDescriptor.cxx
Go to the documentation of this file.
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#include <memory>
23
24#include "DocumentHelper.hxx"
25#include <PreviewRenderer.hxx>
26#include <sdpage.hxx>
27#include <tools/urlobj.hxx>
28#include <sal/log.hxx>
29#include <utility>
30
31namespace sd::sidebar {
32
33//===== MasterPageDescriptor ==================================================
34
37 const sal_Int32 nTemplateIndex,
38 std::u16string_view rsURL,
39 OUString sPageName,
40 OUString sStyleName,
41 const bool bIsPrecious,
42 std::shared_ptr<PageObjectProvider> pPageObjectProvider,
43 std::shared_ptr<PreviewProvider> pPreviewProvider)
44 : maToken(MasterPageContainer::NIL_TOKEN),
45 meOrigin(eOrigin),
46 msURL(INetURLObject(rsURL).GetMainURL(INetURLObject::DecodeMechanism::Unambiguous)),
47 msPageName(std::move(sPageName)),
48 msStyleName(std::move(sStyleName)),
49 mbIsPrecious(bIsPrecious),
50 mpMasterPage(nullptr),
51 mpSlide(nullptr),
52 mpPreviewProvider(std::move(pPreviewProvider)),
53 mpPageObjectProvider(std::move(pPageObjectProvider)),
54 mnTemplateIndex(nTemplateIndex),
55 meURLClassification(URLCLASS_UNDETERMINED),
56 mnUseCount(0)
57{
58}
59
61{
62 maToken = aToken;
63}
64
66{
67 if (eSize == MasterPageContainer::SMALL)
68 return maSmallPreview;
69 else
70 return maLargePreview;
71}
72
73::std::unique_ptr<std::vector<MasterPageContainerChangeEvent::EventType> >
75 const MasterPageDescriptor& rDescriptor)
76{
77 bool bDataChanged (false);
78 bool bIndexChanged (false);
79 bool bPreviewChanged (false);
80
83 {
84 meOrigin = rDescriptor.meOrigin;
85 bIndexChanged = true;
86 }
87
88 if (msURL.isEmpty() && !rDescriptor.msURL.isEmpty())
89 {
90 msURL = rDescriptor.msURL;
91 bDataChanged = true;
92 }
93
94 if (msPageName.isEmpty() && !rDescriptor.msPageName.isEmpty())
95 {
96 msPageName = rDescriptor.msPageName;
97 bDataChanged = true;
98 }
99
100 if (msStyleName.isEmpty() && !rDescriptor.msStyleName.isEmpty())
101 {
102 msStyleName = rDescriptor.msStyleName;
103 bDataChanged = true;
104 }
105
106 if (mpPageObjectProvider == nullptr && rDescriptor.mpPageObjectProvider != nullptr)
107 {
109 bDataChanged = true;
110 }
111
112 if (mpPreviewProvider == nullptr && rDescriptor.mpPreviewProvider != nullptr)
113 {
115 bPreviewChanged = true;
116 }
117
118 if (mnTemplateIndex<0 && rDescriptor.mnTemplateIndex>=0)
119 {
120 mnTemplateIndex = rDescriptor.mnTemplateIndex;
121 bIndexChanged = true;
122 }
123
124 // Prepare the list of event types that will be returned.
125 ::std::unique_ptr<std::vector<MasterPageContainerChangeEvent::EventType> > pResult;
126 if (bDataChanged || bIndexChanged || bPreviewChanged)
127 {
128 pResult.reset(new std::vector<MasterPageContainerChangeEvent::EventType>);
129 if (bDataChanged)
131 if (bIndexChanged)
133 if (bPreviewChanged)
135 }
136
137 return pResult;
138}
139
141 sal_Int32 nCostThreshold,
142 SdDrawDocument* pDocument)
143{
144 int nModified = 0;
145
146 // Update the page object when that is not yet known.
147 if (mpMasterPage == nullptr && mpPageObjectProvider != nullptr
148 && (nCostThreshold < 0 || mpPageObjectProvider->GetCostIndex() <= nCostThreshold))
149 {
150 // Note that pDocument may be NULL.
151
152 SdPage* pPage = (*mpPageObjectProvider)(pDocument);
154 {
155 mpMasterPage = pPage;
156 if (mpMasterPage != nullptr)
158 }
159 else
160 {
161 // Master pages from templates are copied into the local document.
162 if (pDocument != nullptr)
165 }
166
167 if (mpMasterPage != nullptr)
168 {
169 // Update page name and style name.
170 if (msPageName.isEmpty())
173
174 // Delete an existing substitution. The next request for a preview
175 // will create the real one.
178 mpPreviewProvider = std::make_shared<PagePreviewProvider>();
179 }
180 else
181 {
182 SAL_WARN( "sd", "UpdatePageObject: master page is NULL");
183 return -1;
184 }
185
186 nModified = 1;
187 }
188
189 return nModified;
190}
191
193 sal_Int32 nCostThreshold,
194 const Size& rSmallSize,
195 const Size& rLargeSize,
196 ::sd::PreviewRenderer& rRenderer)
197{
198 bool bModified (false);
199
200 // Update the preview when that is not yet known.
201 if (maLargePreview.GetSizePixel().Width() == 0 && mpPreviewProvider != nullptr
202 && (nCostThreshold < 0 || mpPreviewProvider->GetCostIndex() <= nCostThreshold))
203 {
204 SdPage* pPage = mpSlide;
205 if (pPage == nullptr)
206 {
207 pPage = mpMasterPage;
208 }
209 //TODO: Notify LOOL of preview updates.
210 maLargePreview = (*mpPreviewProvider)(
211 rLargeSize.Width(),
212 pPage,
213 rRenderer);
215 {
216 // Create the small preview by scaling the large one down.
217 maSmallPreview = rRenderer.ScaleBitmap(
219 rSmallSize.Width());
220 // The large preview may not have the desired width. Scale it
221 // accordingly.
222 if (maLargePreview.GetSizePixel().Width() != rLargeSize.Width())
223 maLargePreview = rRenderer.ScaleBitmap(
225 rLargeSize.Width());
226 bModified = true;
227 }
228 }
229
230 return bModified;
231}
232
234{
236 {
237 if (msURL.isEmpty())
239 else if (msURL.indexOf("presnt")>=0)
240 {
242 }
243 else if (msURL.indexOf("layout")>=0)
244 {
246 }
247 else if (msURL.indexOf("educate")>=0)
248 {
250 }
251 else
252 {
254 }
255 }
256
257 return meURLClassification;
258}
259
260//===== URLComparator =========================================================
261
263 : msURL(std::move(sURL))
264{
265}
266
268 const SharedMasterPageDescriptor& rDescriptor)
269{
270 if (!rDescriptor)
271 return false;
272 else
273 return rDescriptor->msURL == msURL;
274}
275
276// ===== StyleNameComparator ==================================================
277
279 : msStyleName(std::move(sStyleName))
280{
281}
282
284 const SharedMasterPageDescriptor& rDescriptor)
285{
286 if (!rDescriptor)
287 return false;
288 else
289 return rDescriptor->msStyleName == msStyleName;
290}
291
292//===== PageObjectComparator ==================================================
293
295 : mpMasterPage(pPageObject)
296{
297}
298
300 const SharedMasterPageDescriptor& rDescriptor)
301{
302 if (!rDescriptor)
303 return false;
304 else
305 return rDescriptor->mpMasterPage==mpMasterPage;
306}
307
308//===== AllComparator =========================================================
309
311 : mpDescriptor(std::move(aDescriptor))
312{
313}
314
316{
317 if (!rDescriptor)
318 return false;
319 else
320 {
321 // Take URL, page name, style name, and page object into account
322 // when comparing two descriptors. When two descriptors are
323 // identical in any of these values then there are thought of as
324 // equivalent. Only the Origin has to be the same in both
325 // descriptors.
326 return mpDescriptor->meOrigin == rDescriptor->meOrigin
327 && ((!mpDescriptor->msURL.isEmpty() && mpDescriptor->msURL == rDescriptor->msURL)
328 || (!mpDescriptor->msPageName.isEmpty()
329 && mpDescriptor->msPageName == rDescriptor->msPageName)
330 || (!mpDescriptor->msStyleName.isEmpty()
331 && mpDescriptor->msStyleName == rDescriptor->msStyleName)
332 || (mpDescriptor->mpMasterPage != nullptr
333 && mpDescriptor->mpMasterPage == rDescriptor->mpMasterPage)
334 || (mpDescriptor->mpPageObjectProvider != nullptr
335 && rDescriptor->mpPageObjectProvider != nullptr
336 && mpDescriptor->mpPageObjectProvider == rDescriptor->mpPageObjectProvider));
337 }
338}
339
340} // end of namespace sd::sidebar
341
342/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
OUString msStyleName
BitmapEx GetBitmapEx() const
Size GetSizePixel() const
const OUString & GetName() const
Definition: sdpage.cxx:2505
void SetPrecious(const bool bIsPrecious)
Set the "precious" flag to the given value.
Definition: sdpage.cxx:3112
constexpr tools::Long Width() const
Image ScaleBitmap(const BitmapEx &rBitmap, int nWidth)
Scale the given bitmap by keeping its aspect ratio to the desired width.
static SdPage * CopyMasterPageToLocalDocument(SdDrawDocument &rTargetDocument, SdPage *pMasterPage)
Return a copy of the given master page in the given document.
static SdPage * GetSlideForMasterPage(SdPage const *pMasterPage)
Return and, when not yet present, create a slide that uses the given master page.
This container manages the master pages used by the MasterPagesSelector controls.
Origin
Each entry of the container is either the first page of a template document or is a master page of an...
bool operator()(const SharedMasterPageDescriptor &rDescriptor)
AllComparator(SharedMasterPageDescriptor aDescriptor)
bool operator()(const SharedMasterPageDescriptor &rDescriptor)
bool operator()(const SharedMasterPageDescriptor &rDescriptor)
bool operator()(const SharedMasterPageDescriptor &rDescriptor)
A collection of data that is stored for every master page in the MasterpageContainer.
void SetToken(MasterPageContainer::Token aToken)
MasterPageContainer::Origin meOrigin
A rough specification of the origin of the master page.
Image maSmallPreview
A small (the default size) preview of the master page.
MasterPageDescriptor(MasterPageContainer::Origin eOrigin, const sal_Int32 nTemplateIndex, std::u16string_view rURL, OUString sPageName, OUString sStyleName, const bool bIsPrecious, std::shared_ptr< PageObjectProvider > pPageObjectProvider, std::shared_ptr< PreviewProvider > pPreviewProvider)
sal_Int32 mnTemplateIndex
This index represents the order in which templates are provided via the TemplateScanner.
OUString msPageName
Taken from the title of the template file.
Image maLargePreview
A large preview of the master page.
::std::unique_ptr< std::vector< MasterPageContainerChangeEvent::EventType > > Update(const MasterPageDescriptor &rDescriptor)
Update the called MasterPageDescriptor object with values from the given one.
OUString msStyleName
Taken from the master page object.
SdPage * mpMasterPage
The actual master page.
MasterPageContainer::Token maToken
The Token under which the MasterPageContainer gives access to the object.
bool UpdatePreview(sal_Int32 nCostThreshold, const Size &rSmallSize, const Size &rLargeSize, ::sd::PreviewRenderer &rRenderer)
Use the PreviewProvider to get access to a preview of the master page.
std::shared_ptr< PageObjectProvider > mpPageObjectProvider
The master page provider.
std::shared_ptr< PreviewProvider > mpPreviewProvider
The preview provider.
const Image & GetPreview(MasterPageContainer::PreviewSize ePreviewSize) const
This convenience method returns either a small or a large preview, depending on the given size specif...
OUString msURL
The URL is not empty for master pages loaded from a template document.
SdPage * mpSlide
A slide that uses the master page.
int UpdatePageObject(sal_Int32 nCostThreshold, SdDrawDocument *pDocument)
Use the PageObjectProvider to get access to the master page object.
#define SAL_WARN(area, stream)
std::shared_ptr< MasterPageDescriptor > SharedMasterPageDescriptor
sal_uInt32 mnUseCount