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