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 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sdext.hxx" 26 27 #include "PresenterBitmapContainer.hxx" 28 #include "PresenterConfigurationAccess.hxx" 29 30 #include <com/sun/star/deployment/XPackageInformationProvider.hpp> 31 #include <com/sun/star/drawing/XPresenterHelper.hpp> 32 #include <com/sun/star/lang/XMultiComponentFactory.hpp> 33 #include <com/sun/star/rendering/CompositeOperation.hpp> 34 #include <com/sun/star/rendering/XIntegerBitmap.hpp> 35 #include <boost/bind.hpp> 36 #include <map> 37 38 using namespace ::com::sun::star; 39 using namespace ::com::sun::star::uno; 40 using namespace ::std; 41 using ::rtl::OUString; 42 43 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString))) 44 45 46 namespace sdext { namespace presenter { 47 48 namespace { 49 static OUString gsNameProperty (A2S("Name")); 50 static OUString gsNormalFileNameProperty (A2S("NormalFileName")); 51 static OUString gsMouseOverFileNameProperty (A2S("MouseOverFileName")); 52 static OUString gsButtonDownFileNameProperty (A2S("ButtonDownFileName")); 53 static OUString gsDisabledFileNameProperty (A2S("DisabledFileName")); 54 static OUString gsMaskFileNameProperty (A2S("MaskFileName")); 55 static OUString gsXOffsetProperty (A2S("XOffset")); 56 static OUString gsYOffsetProperty (A2S("YOffset")); 57 static OUString gsXHotSpotProperty (A2S("XHotSpot")); 58 static OUString gsYHotSpotProperty (A2S("YHotSpot")); 59 static OUString gsReplacementColorProperty (A2S("ReplacementColor")); 60 static OUString gsHorizontalTexturingModeProperty (A2S("HorizontalTexturingMode")); 61 static OUString gsVerticalTexturingModeProperty (A2S("VerticalTexturingMode")); 62 } 63 64 //===== PresenterBitmapContainer ============================================== 65 66 PresenterBitmapContainer::PresenterBitmapContainer ( 67 const ::rtl::OUString& rsConfigurationBase, 68 const ::boost::shared_ptr<PresenterBitmapContainer>& rpParentContainer, 69 const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext, 70 const css::uno::Reference<css::rendering::XCanvas>& rxCanvas, 71 const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper) 72 : mpParentContainer(rpParentContainer), 73 maIconContainer(), 74 mxCanvas(rxCanvas), 75 mxPresenterHelper(rxPresenterHelper) 76 { 77 Initialize(rxComponentContext); 78 79 // Get access to the configuration. 80 PresenterConfigurationAccess aConfiguration ( 81 rxComponentContext, 82 A2S("org.openoffice.Office.PresenterScreen"), 83 PresenterConfigurationAccess::READ_ONLY); 84 Reference<container::XNameAccess> xBitmapList ( 85 aConfiguration.GetConfigurationNode(rsConfigurationBase), 86 UNO_QUERY_THROW); 87 88 LoadBitmaps(xBitmapList); 89 } 90 91 92 93 94 95 PresenterBitmapContainer::PresenterBitmapContainer ( 96 const css::uno::Reference<css::container::XNameAccess>& rxRootNode, 97 const ::boost::shared_ptr<PresenterBitmapContainer>& rpParentContainer, 98 const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext, 99 const css::uno::Reference<css::rendering::XCanvas>& rxCanvas, 100 const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper) 101 : mpParentContainer(rpParentContainer), 102 maIconContainer(), 103 mxCanvas(rxCanvas), 104 mxPresenterHelper(rxPresenterHelper) 105 { 106 Initialize(rxComponentContext); 107 108 LoadBitmaps(rxRootNode); 109 } 110 111 112 113 114 void PresenterBitmapContainer::Initialize ( 115 const css::uno::Reference<css::uno::XComponentContext>& rxComponentContext) 116 { 117 if ( ! mxPresenterHelper.is()) 118 { 119 // Create an object that is able to load the bitmaps in a format that is 120 // supported by the canvas. 121 Reference<lang::XMultiComponentFactory> xFactory ( 122 rxComponentContext->getServiceManager(), UNO_QUERY); 123 if ( ! xFactory.is()) 124 return; 125 mxPresenterHelper = Reference<drawing::XPresenterHelper>( 126 xFactory->createInstanceWithContext( 127 A2S("com.sun.star.drawing.PresenterHelper"), 128 rxComponentContext), 129 UNO_QUERY_THROW); 130 } 131 } 132 133 134 135 136 PresenterBitmapContainer::~PresenterBitmapContainer (void) 137 { 138 maIconContainer.clear(); 139 } 140 141 142 143 144 SharedBitmapDescriptor PresenterBitmapContainer::GetBitmap ( 145 const OUString& rsName) const 146 { 147 BitmapContainer::const_iterator iSet (maIconContainer.find(rsName)); 148 if (iSet != maIconContainer.end()) 149 return iSet->second; 150 else if (mpParentContainer.get() != NULL) 151 return mpParentContainer->GetBitmap(rsName); 152 else 153 return SharedBitmapDescriptor(); 154 } 155 156 157 158 159 void PresenterBitmapContainer::LoadBitmaps ( 160 const css::uno::Reference<css::container::XNameAccess>& rxBitmapList) 161 { 162 if ( ! mxCanvas.is()) 163 return; 164 165 if ( ! rxBitmapList.is()) 166 return; 167 168 try 169 { 170 // Load all button bitmaps. 171 if (rxBitmapList.is()) 172 { 173 PresenterConfigurationAccess::ForAll( 174 rxBitmapList, 175 ::boost::bind(&PresenterBitmapContainer::ProcessBitmap, this, _1, _2)); 176 } 177 } 178 catch (Exception&) 179 { 180 OSL_ASSERT(false); 181 } 182 } 183 184 185 186 187 SharedBitmapDescriptor PresenterBitmapContainer::LoadBitmap ( 188 const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode, 189 const ::rtl::OUString& rsPath, 190 const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper, 191 const css::uno::Reference<css::rendering::XCanvas>& rxCanvas, 192 const SharedBitmapDescriptor& rpDefault) 193 { 194 SharedBitmapDescriptor pBitmap; 195 196 if (rxNode.is()) 197 { 198 try 199 { 200 Reference<beans::XPropertySet> xBitmapProperties ( 201 PresenterConfigurationAccess::GetConfigurationNode(rxNode, rsPath), 202 UNO_QUERY); 203 if (xBitmapProperties.is()) 204 pBitmap = LoadBitmap( 205 xBitmapProperties, 206 rxPresenterHelper, 207 rxCanvas, 208 rpDefault); 209 } 210 catch (Exception&) 211 { 212 OSL_ASSERT(false); 213 } 214 } 215 216 return pBitmap; 217 } 218 219 220 221 222 void PresenterBitmapContainer::ProcessBitmap ( 223 const OUString& rsKey, 224 const Reference<beans::XPropertySet>& rxProperties) 225 { 226 OUString sName; 227 if ( ! (PresenterConfigurationAccess::GetProperty(rxProperties, gsNameProperty) >>= sName)) 228 sName = rsKey; 229 230 maIconContainer[sName] = LoadBitmap( 231 rxProperties, 232 mxPresenterHelper, 233 mxCanvas, 234 SharedBitmapDescriptor()); 235 } 236 237 238 239 240 SharedBitmapDescriptor PresenterBitmapContainer::LoadBitmap ( 241 const Reference<beans::XPropertySet>& rxProperties, 242 const css::uno::Reference<css::drawing::XPresenterHelper>& rxPresenterHelper, 243 const css::uno::Reference<css::rendering::XCanvas>& rxCanvas, 244 const SharedBitmapDescriptor& rpDefault) 245 { 246 OSL_ASSERT(rxCanvas.is()); 247 OSL_ASSERT(rxPresenterHelper.is()); 248 249 SharedBitmapDescriptor pBitmap (new BitmapDescriptor(rpDefault)); 250 251 if ( ! rxProperties.is()) 252 return pBitmap; 253 254 OUString sFileName; 255 256 // Load bitmaps. 257 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsNormalFileNameProperty) >>= sFileName) 258 try 259 { 260 pBitmap->SetBitmap( 261 BitmapDescriptor::Normal, 262 rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); 263 } 264 catch (Exception&) 265 {} 266 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsMouseOverFileNameProperty) >>= sFileName) 267 try 268 { 269 pBitmap->SetBitmap( 270 BitmapDescriptor::MouseOver, 271 rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); 272 } 273 catch (Exception&) 274 {} 275 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsButtonDownFileNameProperty) >>= sFileName) 276 try 277 { 278 pBitmap->SetBitmap( 279 BitmapDescriptor::ButtonDown, 280 rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); 281 } 282 catch (Exception&) 283 {} 284 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsDisabledFileNameProperty) >>= sFileName) 285 try 286 { 287 pBitmap->SetBitmap( 288 BitmapDescriptor::Disabled, 289 rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); 290 } 291 catch (Exception&) 292 {} 293 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsMaskFileNameProperty) >>= sFileName) 294 try 295 { 296 pBitmap->SetBitmap( 297 BitmapDescriptor::Mask, 298 rxPresenterHelper->loadBitmap(sFileName, rxCanvas)); 299 } 300 catch (Exception&) 301 {} 302 303 304 PresenterConfigurationAccess::GetProperty(rxProperties, gsXOffsetProperty) >>= pBitmap->mnXOffset; 305 PresenterConfigurationAccess::GetProperty(rxProperties, gsYOffsetProperty) >>= pBitmap->mnYOffset; 306 307 PresenterConfigurationAccess::GetProperty(rxProperties, gsXHotSpotProperty) >>= pBitmap->mnXHotSpot; 308 PresenterConfigurationAccess::GetProperty(rxProperties, gsYHotSpotProperty) >>= pBitmap->mnYHotSpot; 309 310 PresenterConfigurationAccess::GetProperty(rxProperties, gsReplacementColorProperty) >>= pBitmap->maReplacementColor; 311 312 OUString sTexturingMode; 313 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsHorizontalTexturingModeProperty) >>= sTexturingMode) 314 pBitmap->meHorizontalTexturingMode = StringToTexturingMode(sTexturingMode); 315 if (PresenterConfigurationAccess::GetProperty(rxProperties, gsVerticalTexturingModeProperty) >>= sTexturingMode) 316 pBitmap->meVerticalTexturingMode = StringToTexturingMode(sTexturingMode); 317 318 return pBitmap; 319 } 320 321 322 323 324 PresenterBitmapContainer::BitmapDescriptor::TexturingMode 325 PresenterBitmapContainer::StringToTexturingMode (const OUString& rsTexturingMode) 326 { 327 if (rsTexturingMode == A2S("Once")) 328 return PresenterBitmapContainer::BitmapDescriptor::Once; 329 else if (rsTexturingMode == A2S("Repeat")) 330 return PresenterBitmapContainer::BitmapDescriptor::Repeat; 331 else if (rsTexturingMode == A2S("Stretch")) 332 return PresenterBitmapContainer::BitmapDescriptor::Stretch; 333 else 334 return PresenterBitmapContainer::BitmapDescriptor::Once; 335 } 336 337 338 339 340 //===== PresenterBitmapContainer::BitmapSet =================================== 341 342 PresenterBitmapContainer::BitmapDescriptor::BitmapDescriptor (void) 343 : mnWidth(0), 344 mnHeight(0), 345 mnXOffset(0), 346 mnYOffset(0), 347 mnXHotSpot(0), 348 mnYHotSpot(0), 349 maReplacementColor(0x00000000), 350 meHorizontalTexturingMode(Once), 351 meVerticalTexturingMode(Once), 352 mxNormalBitmap(), 353 mxMouseOverBitmap(), 354 mxButtonDownBitmap(), 355 mxDisabledBitmap(), 356 mxMaskBitmap() 357 { 358 } 359 360 361 362 363 PresenterBitmapContainer::BitmapDescriptor::BitmapDescriptor ( 364 const ::boost::shared_ptr<PresenterBitmapContainer::BitmapDescriptor>& rpDefault) 365 : mnWidth(0), 366 mnHeight(0), 367 mnXOffset(0), 368 mnYOffset(0), 369 mnXHotSpot(0), 370 mnYHotSpot(0), 371 maReplacementColor(0x00000000), 372 meHorizontalTexturingMode(Once), 373 meVerticalTexturingMode(Once), 374 mxNormalBitmap(), 375 mxMouseOverBitmap(), 376 mxButtonDownBitmap(), 377 mxDisabledBitmap(), 378 mxMaskBitmap() 379 { 380 if (rpDefault.get() != NULL) 381 { 382 mnWidth = rpDefault->mnWidth; 383 mnHeight = rpDefault->mnHeight; 384 mnXOffset = rpDefault->mnXOffset; 385 mnYOffset = rpDefault->mnYOffset; 386 mnXHotSpot = rpDefault->mnXHotSpot; 387 mnYHotSpot = rpDefault->mnYHotSpot; 388 maReplacementColor = rpDefault->maReplacementColor; 389 meHorizontalTexturingMode = rpDefault->meHorizontalTexturingMode; 390 meVerticalTexturingMode = rpDefault->meVerticalTexturingMode; 391 mxNormalBitmap = rpDefault->mxNormalBitmap; 392 mxMouseOverBitmap = rpDefault->mxMouseOverBitmap; 393 mxButtonDownBitmap = rpDefault->mxButtonDownBitmap; 394 mxDisabledBitmap = rpDefault->mxDisabledBitmap; 395 mxMaskBitmap = rpDefault->mxMaskBitmap; 396 } 397 } 398 399 400 css::uno::Reference<css::rendering::XBitmap> 401 PresenterBitmapContainer::BitmapDescriptor::GetNormalBitmap (void) const 402 { 403 return mxNormalBitmap; 404 } 405 406 407 408 409 css::uno::Reference<css::rendering::XBitmap> 410 PresenterBitmapContainer::BitmapDescriptor::GetBitmap ( 411 const Mode eMode, 412 const bool bMissingDefaultsToNormal) const 413 { 414 switch (eMode) 415 { 416 case Normal: 417 default: 418 return mxNormalBitmap; 419 420 case MouseOver: 421 if (mxMouseOverBitmap.is()) 422 return mxMouseOverBitmap; 423 else if (bMissingDefaultsToNormal) 424 return mxNormalBitmap; 425 426 case ButtonDown: 427 if (mxButtonDownBitmap.is()) 428 return mxButtonDownBitmap; 429 else if (bMissingDefaultsToNormal) 430 return mxNormalBitmap; 431 432 case Disabled: 433 if (mxDisabledBitmap.is()) 434 return mxDisabledBitmap; 435 else if (bMissingDefaultsToNormal) 436 return mxNormalBitmap; 437 438 case Mask: 439 return mxMaskBitmap; 440 } 441 return NULL; 442 } 443 444 445 446 447 void PresenterBitmapContainer::BitmapDescriptor::SetBitmap ( 448 const Mode eMode, 449 const css::uno::Reference<css::rendering::XBitmap>& rxBitmap) 450 { 451 switch (eMode) 452 { 453 case Normal: 454 default: 455 mxNormalBitmap = rxBitmap; 456 if (mxNormalBitmap.is()) 457 { 458 const geometry::IntegerSize2D aSize (mxNormalBitmap->getSize()); 459 mnWidth = aSize.Width; 460 mnHeight = aSize.Height; 461 } 462 break; 463 464 case MouseOver: 465 mxMouseOverBitmap = rxBitmap; 466 break; 467 468 case ButtonDown: 469 mxButtonDownBitmap = rxBitmap; 470 break; 471 472 case Disabled: 473 mxDisabledBitmap = rxBitmap; 474 break; 475 476 case Mask: 477 mxMaskBitmap = rxBitmap; 478 break; 479 } 480 } 481 482 483 484 485 } } // end of namespace ::sdext::presenter 486