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