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 "MasterPageDescriptor.hxx"
22 :
23 : #include "DocumentHelper.hxx"
24 : #include "sdpage.hxx"
25 : #include <tools/urlobj.hxx>
26 :
27 : namespace sd { namespace toolpanel { namespace controls {
28 :
29 :
30 : //===== MasterPageDescriptor ==================================================
31 :
32 0 : MasterPageDescriptor::MasterPageDescriptor (
33 : MasterPageContainer::Origin eOrigin,
34 : const sal_Int32 nTemplateIndex,
35 : const String& rsURL,
36 : const String& rsPageName,
37 : const String& rsStyleName,
38 : const bool bIsPrecious,
39 : const ::boost::shared_ptr<PageObjectProvider>& rpPageObjectProvider,
40 : const ::boost::shared_ptr<PreviewProvider>& rpPreviewProvider)
41 : : maToken(MasterPageContainer::NIL_TOKEN),
42 : meOrigin(eOrigin),
43 : msURL(INetURLObject(rsURL).GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS)),
44 : msPageName(rsPageName),
45 : msStyleName(rsStyleName),
46 : mbIsPrecious(bIsPrecious),
47 : mpMasterPage(NULL),
48 : mpSlide(NULL),
49 : maSmallPreview(),
50 : maLargePreview(),
51 : mpPreviewProvider(rpPreviewProvider),
52 : mpPageObjectProvider(rpPageObjectProvider),
53 : mnTemplateIndex(nTemplateIndex),
54 : meURLClassification(URLCLASS_UNDETERMINED),
55 0 : mnUseCount(0)
56 : {
57 0 : }
58 :
59 :
60 :
61 :
62 0 : MasterPageDescriptor::MasterPageDescriptor (const MasterPageDescriptor& rDescriptor)
63 : : maToken(rDescriptor.maToken),
64 : meOrigin(rDescriptor.meOrigin),
65 : msURL(rDescriptor.msURL),
66 : msPageName(rDescriptor.msPageName),
67 : msStyleName(rDescriptor.msStyleName),
68 : mbIsPrecious(rDescriptor.mbIsPrecious),
69 : mpMasterPage(rDescriptor.mpMasterPage),
70 : mpSlide(rDescriptor.mpSlide),
71 : maSmallPreview(rDescriptor.maSmallPreview),
72 : maLargePreview(rDescriptor.maLargePreview),
73 : mpPreviewProvider(rDescriptor.mpPreviewProvider),
74 : mpPageObjectProvider(rDescriptor.mpPageObjectProvider),
75 : mnTemplateIndex(rDescriptor.mnTemplateIndex),
76 : meURLClassification(rDescriptor.meURLClassification),
77 0 : mnUseCount(rDescriptor.mnUseCount)
78 : {
79 0 : }
80 :
81 :
82 :
83 :
84 0 : MasterPageDescriptor::~MasterPageDescriptor (void)
85 : {
86 0 : }
87 :
88 :
89 :
90 :
91 0 : void MasterPageDescriptor::SetToken (MasterPageContainer::Token aToken)
92 : {
93 0 : maToken = aToken;
94 0 : }
95 :
96 :
97 :
98 :
99 0 : Image MasterPageDescriptor::GetPreview (MasterPageContainer::PreviewSize eSize) const
100 : {
101 0 : if (eSize == MasterPageContainer::SMALL)
102 0 : return maSmallPreview;
103 : else
104 0 : return maLargePreview;
105 : }
106 :
107 :
108 :
109 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
110 : ::std::auto_ptr<std::vector<MasterPageContainerChangeEvent::EventType> >
111 0 : MasterPageDescriptor::Update (
112 : const MasterPageDescriptor& rDescriptor)
113 : {
114 0 : bool bDataChanged (false);
115 0 : bool bIndexChanged (false);
116 0 : bool bPreviewChanged (false);
117 :
118 0 : if (meOrigin==MasterPageContainer::UNKNOWN
119 : && rDescriptor.meOrigin!=MasterPageContainer::UNKNOWN)
120 : {
121 0 : meOrigin = rDescriptor.meOrigin;
122 0 : bIndexChanged = true;
123 : }
124 :
125 0 : if (msURL.isEmpty() && !rDescriptor.msURL.isEmpty())
126 : {
127 0 : msURL = rDescriptor.msURL;
128 0 : bDataChanged = true;
129 : }
130 :
131 0 : if (msPageName.isEmpty() && !rDescriptor.msPageName.isEmpty())
132 : {
133 0 : msPageName = rDescriptor.msPageName;
134 0 : bDataChanged = true;
135 : }
136 :
137 0 : if (msStyleName.isEmpty() && !rDescriptor.msStyleName.isEmpty())
138 : {
139 0 : msStyleName = rDescriptor.msStyleName;
140 0 : bDataChanged = true;
141 : }
142 :
143 0 : if (mpPageObjectProvider.get()==NULL && rDescriptor.mpPageObjectProvider.get()!=NULL)
144 : {
145 0 : mpPageObjectProvider = rDescriptor.mpPageObjectProvider;
146 0 : bDataChanged = true;
147 : }
148 :
149 0 : if (mpPreviewProvider.get()==NULL && rDescriptor.mpPreviewProvider.get()!=NULL)
150 : {
151 0 : mpPreviewProvider = rDescriptor.mpPreviewProvider;
152 0 : bPreviewChanged = true;
153 : }
154 :
155 0 : if (mnTemplateIndex<0 && rDescriptor.mnTemplateIndex>=0)
156 : {
157 0 : mnTemplateIndex = rDescriptor.mnTemplateIndex;
158 0 : bIndexChanged = true;
159 : }
160 :
161 : // Prepare the list of event types that will be returned.
162 0 : ::std::auto_ptr<std::vector<MasterPageContainerChangeEvent::EventType> > pResult;
163 0 : if (bDataChanged || bIndexChanged || bPreviewChanged)
164 : {
165 0 : pResult.reset(new std::vector<MasterPageContainerChangeEvent::EventType>());
166 0 : if (bDataChanged)
167 0 : pResult->push_back(MasterPageContainerChangeEvent::DATA_CHANGED);
168 0 : if (bIndexChanged)
169 0 : pResult->push_back(MasterPageContainerChangeEvent::INDEX_CHANGED);
170 0 : if (bPreviewChanged)
171 0 : pResult->push_back(MasterPageContainerChangeEvent::PREVIEW_CHANGED);
172 : }
173 :
174 0 : return pResult;
175 : }
176 : SAL_WNODEPRECATED_DECLARATIONS_POP
177 :
178 :
179 :
180 0 : int MasterPageDescriptor::UpdatePageObject (
181 : sal_Int32 nCostThreshold,
182 : SdDrawDocument* pDocument)
183 : {
184 0 : int nModified = 0;
185 :
186 : // Update the page object when that is not yet known.
187 0 : if (mpMasterPage == NULL
188 0 : && mpPageObjectProvider.get()!=NULL
189 0 : && (nCostThreshold<0 || mpPageObjectProvider->GetCostIndex()<=nCostThreshold))
190 : {
191 : // Note that pDocument may be NULL.
192 :
193 0 : SdPage* pPage = (*mpPageObjectProvider)(pDocument);
194 0 : if (meOrigin == MasterPageContainer::MASTERPAGE)
195 : {
196 0 : mpMasterPage = pPage;
197 0 : if (mpMasterPage != NULL)
198 0 : mpMasterPage->SetPrecious(mbIsPrecious);
199 : }
200 : else
201 : {
202 : // Master pages from templates are copied into the local document.
203 0 : if (pDocument != NULL)
204 0 : mpMasterPage = DocumentHelper::CopyMasterPageToLocalDocument(*pDocument,pPage);
205 0 : mpSlide = DocumentHelper::GetSlideForMasterPage(mpMasterPage);
206 : }
207 :
208 0 : if (mpMasterPage != NULL)
209 : {
210 : // Update page name and style name.
211 0 : if (msPageName.isEmpty())
212 0 : msPageName = mpMasterPage->GetName();
213 0 : msStyleName = mpMasterPage->GetName();
214 :
215 : // Delete an existing substitution. The next request for a preview
216 : // will create the real one.
217 0 : maSmallPreview = Image();
218 0 : maLargePreview = Image();
219 0 : mpPreviewProvider = ::boost::shared_ptr<PreviewProvider>(new PagePreviewProvider());
220 : }
221 : else
222 : {
223 : DBG_ASSERT(false, "UpdatePageObject: master page is NULL");
224 0 : return -1;
225 : }
226 :
227 0 : nModified = 1;
228 : }
229 :
230 0 : return nModified;
231 : }
232 :
233 :
234 :
235 :
236 0 : bool MasterPageDescriptor::UpdatePreview (
237 : sal_Int32 nCostThreshold,
238 : const Size& rSmallSize,
239 : const Size& rLargeSize,
240 : ::sd::PreviewRenderer& rRenderer)
241 : {
242 0 : bool bModified (false);
243 :
244 : // Update the preview when that is not yet known.
245 0 : if (maLargePreview.GetSizePixel().Width()==0
246 0 : && mpPreviewProvider.get()!=NULL
247 0 : && (nCostThreshold<0 || mpPreviewProvider->GetCostIndex()<=nCostThreshold))
248 : {
249 0 : SdPage* pPage = mpSlide;
250 0 : if (pPage == NULL)
251 : {
252 0 : pPage = mpMasterPage;
253 : }
254 0 : maLargePreview = (*mpPreviewProvider)(
255 0 : rLargeSize.Width(),
256 : pPage,
257 0 : rRenderer);
258 0 : if (maLargePreview.GetSizePixel().Width() > 0)
259 : {
260 : // Create the small preview by scaling the large one down.
261 : maSmallPreview = rRenderer.ScaleBitmap(
262 : maLargePreview.GetBitmapEx(),
263 0 : rSmallSize.Width());
264 : // The large preview may not have the desired width. Scale it
265 : // accrodingly.
266 0 : if (maLargePreview.GetSizePixel().Width() != rLargeSize.Width())
267 : maLargePreview = rRenderer.ScaleBitmap(
268 : maLargePreview.GetBitmapEx(),
269 0 : rLargeSize.Width());
270 0 : bModified = true;
271 : }
272 : }
273 :
274 0 : return bModified;
275 : }
276 :
277 :
278 :
279 :
280 0 : MasterPageDescriptor::URLClassification MasterPageDescriptor::GetURLClassification (void)
281 : {
282 0 : if (meURLClassification == URLCLASS_UNDETERMINED)
283 : {
284 0 : if (msURL.isEmpty())
285 0 : meURLClassification = URLCLASS_UNKNOWN;
286 0 : else if (msURL.indexOf("presnt")>=0)
287 : {
288 0 : meURLClassification = URLCLASS_PRESENTATION;
289 : }
290 0 : else if (msURL.indexOf("layout")>=0)
291 : {
292 0 : meURLClassification = URLCLASS_LAYOUT;
293 : }
294 0 : else if (msURL.indexOf("educate")>=0)
295 : {
296 0 : meURLClassification = URLCLASS_OTHER;
297 : }
298 : else
299 : {
300 0 : meURLClassification = URLCLASS_USER;
301 : }
302 : }
303 :
304 0 : return meURLClassification;
305 : }
306 :
307 :
308 :
309 : //===== URLComparator =========================================================
310 :
311 0 : MasterPageDescriptor::URLComparator::URLComparator (const ::rtl::OUString& sURL)
312 0 : : msURL(sURL)
313 : {
314 0 : }
315 :
316 :
317 :
318 :
319 0 : bool MasterPageDescriptor::URLComparator::operator() (
320 : const SharedMasterPageDescriptor& rDescriptor)
321 : {
322 0 : if (rDescriptor.get() == NULL)
323 0 : return false;
324 : else
325 0 : return rDescriptor->msURL.equals(msURL);
326 : }
327 :
328 :
329 :
330 :
331 : // ===== StyleNameComparator ==================================================
332 :
333 0 : MasterPageDescriptor::StyleNameComparator::StyleNameComparator (const ::rtl::OUString& sStyleName)
334 0 : : msStyleName(sStyleName)
335 : {
336 0 : }
337 :
338 :
339 :
340 :
341 0 : bool MasterPageDescriptor::StyleNameComparator::operator() (
342 : const SharedMasterPageDescriptor& rDescriptor)
343 : {
344 0 : if (rDescriptor.get() == NULL)
345 0 : return false;
346 : else
347 0 : return rDescriptor->msStyleName.equals(msStyleName);
348 : }
349 :
350 :
351 :
352 :
353 : //===== PageObjectComparator ==================================================
354 :
355 0 : MasterPageDescriptor::PageObjectComparator::PageObjectComparator (const SdPage* pPageObject)
356 0 : : mpMasterPage(pPageObject)
357 : {
358 0 : }
359 :
360 :
361 :
362 :
363 0 : bool MasterPageDescriptor::PageObjectComparator::operator() (
364 : const SharedMasterPageDescriptor& rDescriptor)
365 : {
366 0 : if (rDescriptor.get() == NULL)
367 0 : return false;
368 : else
369 0 : return rDescriptor->mpMasterPage==mpMasterPage;
370 : }
371 :
372 :
373 :
374 :
375 : //===== AllComparator =========================================================
376 :
377 0 : MasterPageDescriptor::AllComparator::AllComparator(const SharedMasterPageDescriptor& rDescriptor)
378 0 : : mpDescriptor(rDescriptor)
379 : {
380 0 : }
381 :
382 :
383 :
384 :
385 0 : bool MasterPageDescriptor::AllComparator::operator() (const SharedMasterPageDescriptor&rDescriptor)
386 : {
387 0 : if (rDescriptor.get() == NULL)
388 0 : return false;
389 : else
390 : {
391 : // Take URL, page name, style name, and page object into account
392 : // when comparing two descriptors. When two descriptors are
393 : // identical in any of these values then their are thought of as
394 : // equivalent. Only the Origin has to be the same in both
395 : // descriptors.
396 : return
397 0 : mpDescriptor->meOrigin == rDescriptor->meOrigin
398 : && (
399 0 : (!mpDescriptor->msURL.isEmpty()
400 0 : && mpDescriptor->msURL.equals(rDescriptor->msURL))
401 0 : || (!mpDescriptor->msPageName.isEmpty()
402 0 : && mpDescriptor->msPageName.equals(rDescriptor->msPageName))
403 0 : || (!mpDescriptor->msStyleName.isEmpty()
404 0 : && mpDescriptor->msStyleName.equals(rDescriptor->msStyleName))
405 0 : || (mpDescriptor->mpMasterPage!=NULL
406 0 : && mpDescriptor->mpMasterPage==rDescriptor->mpMasterPage)
407 0 : || (mpDescriptor->mpPageObjectProvider.get()!=NULL
408 0 : && rDescriptor->mpPageObjectProvider.get()!=NULL
409 0 : && mpDescriptor->mpPageObjectProvider==rDescriptor->mpPageObjectProvider));
410 : }
411 : }
412 :
413 :
414 : } } } // end of namespace ::sd::toolpanel::controls
415 :
416 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|