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_sfx2.hxx" 23 24 #include "sfx2/sidebar/Theme.hxx" 25 #include "Paint.hxx" 26 #include "SidebarResource.hxx" 27 #include "Tools.hxx" 28 29 #include <tools/svborder.hxx> 30 #include <tools/rc.hxx> 31 #include <vcl/svapp.hxx> 32 33 using namespace css; 34 using namespace cssu; 35 36 37 namespace sfx2 { namespace sidebar { 38 39 ::rtl::Reference<Theme> Theme::mpInstance; 40 41 42 43 44 Theme& Theme::GetCurrentTheme (void) 45 { 46 if ( ! mpInstance.is()) 47 { 48 mpInstance.set(new Theme()); 49 mpInstance->InitializeTheme(); 50 } 51 return *mpInstance; 52 } 53 54 55 56 57 Theme::Theme (void) 58 : ThemeInterfaceBase(m_aMutex), 59 maImages(), 60 maColors(), 61 maPaints(), 62 maIntegers(), 63 maBooleans(), 64 mbIsHighContrastMode(Application::GetSettings().GetStyleSettings().GetHighContrastMode()), 65 mbIsHighContrastModeSetManually(false), 66 maPropertyNameToIdMap(), 67 maPropertyIdToNameMap(), 68 maRawValues(), 69 maChangeListeners(), 70 maVetoableListeners() 71 72 { 73 SetupPropertyMaps(); 74 } 75 76 77 78 79 Theme::~Theme (void) 80 { 81 } 82 83 84 85 86 Image Theme::GetImage (const ThemeItem eItem) 87 { 88 const PropertyType eType (GetPropertyType(eItem)); 89 OSL_ASSERT(eType==PT_Image); 90 const sal_Int32 nIndex (GetIndex(eItem, eType)); 91 const Theme& rTheme (GetCurrentTheme()); 92 return rTheme.maImages[nIndex]; 93 } 94 95 96 97 98 Color Theme::GetColor (const ThemeItem eItem) 99 { 100 const PropertyType eType (GetPropertyType(eItem)); 101 OSL_ASSERT(eType==PT_Color || eType==PT_Paint); 102 const sal_Int32 nIndex (GetIndex(eItem, eType)); 103 const Theme& rTheme (GetCurrentTheme()); 104 if (eType == PT_Color) 105 return rTheme.maColors[nIndex]; 106 else if (eType == PT_Paint) 107 return rTheme.maPaints[nIndex].GetColor(); 108 else 109 return COL_WHITE; 110 } 111 112 113 114 115 const Paint& Theme::GetPaint (const ThemeItem eItem) 116 { 117 const PropertyType eType (GetPropertyType(eItem)); 118 OSL_ASSERT(eType==PT_Paint); 119 const sal_Int32 nIndex (GetIndex(eItem, eType)); 120 const Theme& rTheme (GetCurrentTheme()); 121 return rTheme.maPaints[nIndex]; 122 } 123 124 125 126 127 const Wallpaper Theme::GetWallpaper (const ThemeItem eItem) 128 { 129 return GetPaint(eItem).GetWallpaper(); 130 } 131 132 133 134 135 sal_Int32 Theme::GetInteger (const ThemeItem eItem) 136 { 137 const PropertyType eType (GetPropertyType(eItem)); 138 OSL_ASSERT(eType==PT_Integer); 139 const sal_Int32 nIndex (GetIndex(eItem, eType)); 140 const Theme& rTheme (GetCurrentTheme()); 141 return rTheme.maIntegers[nIndex]; 142 } 143 144 145 146 147 bool Theme::GetBoolean (const ThemeItem eItem) 148 { 149 const PropertyType eType (GetPropertyType(eItem)); 150 OSL_ASSERT(eType==PT_Boolean); 151 const sal_Int32 nIndex (GetIndex(eItem, eType)); 152 const Theme& rTheme (GetCurrentTheme()); 153 return rTheme.maBooleans[nIndex]; 154 } 155 156 157 158 159 Rectangle Theme::GetRectangle (const ThemeItem eItem) 160 { 161 const PropertyType eType (GetPropertyType(eItem)); 162 OSL_ASSERT(eType==PT_Rectangle); 163 const sal_Int32 nIndex (GetIndex(eItem, eType)); 164 const Theme& rTheme (GetCurrentTheme()); 165 return rTheme.maRectangles[nIndex]; 166 } 167 168 169 170 171 bool Theme::IsHighContrastMode (void) 172 { 173 const Theme& rTheme (GetCurrentTheme()); 174 return rTheme.mbIsHighContrastMode; 175 } 176 177 178 179 180 void Theme::HandleDataChange (void) 181 { 182 Theme& rTheme (GetCurrentTheme()); 183 184 if ( ! rTheme.mbIsHighContrastModeSetManually) 185 { 186 // Do not modify mbIsHighContrastMode when it was manually set. 187 GetCurrentTheme().mbIsHighContrastMode = Application::GetSettings().GetStyleSettings().GetHighContrastMode(); 188 rTheme.maRawValues[Bool_IsHighContrastModeActive] = Any(GetCurrentTheme().mbIsHighContrastMode); 189 } 190 191 GetCurrentTheme().UpdateTheme(); 192 } 193 194 195 196 197 void Theme::InitializeTheme (void) 198 { 199 setPropertyValue( 200 maPropertyIdToNameMap[Bool_UseSymphonyIcons], 201 Any(true)); 202 setPropertyValue( 203 maPropertyIdToNameMap[Bool_UseSystemColors], 204 Any(false)); 205 } 206 207 208 209 210 void Theme::UpdateTheme (void) 211 { 212 SidebarResource aLocalResource; 213 214 try 215 { 216 const StyleSettings& rStyle (Application::GetSettings().GetStyleSettings()); 217 const bool bUseSystemColors (GetBoolean(Bool_UseSystemColors)); 218 219 #define Alternatives(n,hc,sys) (mbIsHighContrastMode ? hc : (bUseSystemColors ? sys : n)) 220 221 const Color aBaseBackgroundColor (rStyle.GetDialogColor()); 222 Color aBorderColor (aBaseBackgroundColor); 223 aBorderColor.DecreaseLuminance(15); 224 Color aSecondColor (aBaseBackgroundColor); 225 aSecondColor.DecreaseLuminance(15); 226 227 setPropertyValue( 228 maPropertyIdToNameMap[Paint_DeckBackground], 229 Any(sal_Int32(rStyle.GetMenuColor().GetRGBColor()))); 230 231 setPropertyValue( 232 maPropertyIdToNameMap[Paint_DeckTitleBarBackground], 233 Any(sal_Int32(aBaseBackgroundColor.GetRGBColor()))); 234 setPropertyValue( 235 maPropertyIdToNameMap[Int_DeckLeftPadding], 236 Any(sal_Int32(2))); 237 setPropertyValue( 238 maPropertyIdToNameMap[Int_DeckTopPadding], 239 Any(sal_Int32(2))); 240 setPropertyValue( 241 maPropertyIdToNameMap[Int_DeckRightPadding], 242 Any(sal_Int32(2))); 243 setPropertyValue( 244 maPropertyIdToNameMap[Int_DeckBottomPadding], 245 Any(sal_Int32(2))); 246 setPropertyValue( 247 maPropertyIdToNameMap[Int_DeckBorderSize], 248 Any(sal_Int32(1))); 249 setPropertyValue( 250 maPropertyIdToNameMap[Int_DeckSeparatorHeight], 251 Any(sal_Int32(1))); 252 setPropertyValue( 253 maPropertyIdToNameMap[Color_DeckTitleFont], 254 Any(sal_Int32(rStyle.GetFontColor().GetRGBColor()))); 255 setPropertyValue( 256 maPropertyIdToNameMap[Int_DeckTitleBarHeight], 257 Any(sal_Int32(Alternatives( 258 26, 259 26, 260 rStyle.GetFloatTitleHeight())))); 261 setPropertyValue( 262 maPropertyIdToNameMap[Paint_PanelBackground], 263 Any(sal_Int32(rStyle.GetDialogColor().GetRGBColor()))); 264 // Any(sal_Int32(mbIsHighContrastMode ? 0x000000 : 265 // 0xffffff))); 266 267 setPropertyValue( 268 maPropertyIdToNameMap[Paint_PanelTitleBarBackground], 269 Any(Tools::VclToAwtGradient(Gradient( 270 GRADIENT_LINEAR, 271 aSecondColor.GetRGBColor(), 272 aBaseBackgroundColor.GetRGBColor() 273 )))); 274 setPropertyValue( 275 maPropertyIdToNameMap[Color_PanelTitleFont], 276 Any(sal_Int32(mbIsHighContrastMode ? 0x00ff00 : 0x262626))); 277 setPropertyValue( 278 maPropertyIdToNameMap[Int_PanelTitleBarHeight], 279 Any(sal_Int32(Alternatives( 280 26, 281 26, 282 rStyle.GetTitleHeight())))); 283 setPropertyValue( 284 maPropertyIdToNameMap[Paint_TabBarBackground], 285 Any(sal_Int32(aBaseBackgroundColor.GetRGBColor()))); 286 setPropertyValue( 287 maPropertyIdToNameMap[Int_TabBarLeftPadding], 288 Any(sal_Int32(2))); 289 setPropertyValue( 290 maPropertyIdToNameMap[Int_TabBarTopPadding], 291 Any(sal_Int32(2))); 292 setPropertyValue( 293 maPropertyIdToNameMap[Int_TabBarRightPadding], 294 Any(sal_Int32(2))); 295 setPropertyValue( 296 maPropertyIdToNameMap[Int_TabBarBottomPadding], 297 Any(sal_Int32(2))); 298 299 setPropertyValue( 300 maPropertyIdToNameMap[Int_TabMenuPadding], 301 Any(sal_Int32(6))); 302 setPropertyValue( 303 maPropertyIdToNameMap[Color_TabMenuSeparator], 304 Any(sal_Int32(aBorderColor.GetRGBColor()))); 305 setPropertyValue( 306 maPropertyIdToNameMap[Int_TabMenuSeparatorPadding], 307 Any(sal_Int32(7))); 308 309 setPropertyValue( 310 maPropertyIdToNameMap[Int_TabItemWidth], 311 Any(sal_Int32(32))); 312 setPropertyValue( 313 maPropertyIdToNameMap[Int_TabItemHeight], 314 Any(sal_Int32(32))); 315 setPropertyValue( 316 maPropertyIdToNameMap[Color_TabItemBorder], 317 Any(sal_Int32(rStyle.GetActiveBorderColor().GetRGBColor()))); 318 // mbIsHighContrastMode ? 0x00ff00 : 0xbfbfbf))); 319 320 setPropertyValue( 321 maPropertyIdToNameMap[Paint_DropDownBackground], 322 Any(sal_Int32(aBaseBackgroundColor.GetRGBColor()))); 323 setPropertyValue( 324 maPropertyIdToNameMap[Color_DropDownBorder], 325 Any(sal_Int32(rStyle.GetActiveBorderColor().GetRGBColor()))); 326 327 setPropertyValue( 328 maPropertyIdToNameMap[Color_Highlight], 329 Any(sal_Int32(rStyle.GetHighlightColor().GetRGBColor()))); 330 setPropertyValue( 331 maPropertyIdToNameMap[Color_HighlightText], 332 Any(sal_Int32(rStyle.GetHighlightTextColor().GetRGBColor()))); 333 334 setPropertyValue( 335 maPropertyIdToNameMap[Paint_TabItemBackgroundNormal], 336 Any()); 337 setPropertyValue( 338 maPropertyIdToNameMap[Paint_TabItemBackgroundHighlight], 339 Any(sal_Int32(rStyle.GetActiveTabColor().GetRGBColor()))); 340 // mbIsHighContrastMode ? 0x000000 : 0x00ffffff))); 341 342 setPropertyValue( 343 maPropertyIdToNameMap[Paint_HorizontalBorder], 344 Any(sal_Int32(aBorderColor.GetRGBColor()))); 345 // mbIsHighContrastMode ? 0x00ff00 : 0xe4e4e4))); 346 setPropertyValue( 347 maPropertyIdToNameMap[Paint_VerticalBorder], 348 Any(sal_Int32(aBorderColor.GetRGBColor()))); 349 // mbIsHighContrastMode ? 0x00ff00 : 0xe4e4e4))); 350 351 setPropertyValue( 352 maPropertyIdToNameMap[Image_Grip], 353 Any( 354 mbIsHighContrastMode 355 ? A2S("private:graphicrepository/sfx2/res/grip_hc.png") 356 : A2S("private:graphicrepository/sfx2/res/grip.png"))); 357 setPropertyValue( 358 maPropertyIdToNameMap[Image_Expand], 359 Any( 360 mbIsHighContrastMode 361 ? A2S("private:graphicrepository/svtools/res/triangle_right_hc.png") 362 : A2S("private:graphicrepository/svtools/res/triangle_right.png"))); 363 // ? A2S("private:graphicrepository/res/plus_sch.png") 364 // : A2S("private:graphicrepository/res/plus.png"))); 365 setPropertyValue( 366 maPropertyIdToNameMap[Image_Collapse], 367 Any( 368 mbIsHighContrastMode 369 ? A2S("private:graphicrepository/svtools/res/triangle_down_hc.png") 370 : A2S("private:graphicrepository/svtools/res/triangle_down.png"))); 371 // ? A2S("private:graphicrepository/res/minus_sch.png") 372 // : A2S("private:graphicrepository/res/minus.png"))); 373 setPropertyValue( 374 maPropertyIdToNameMap[Image_TabBarMenu], 375 Any( 376 mbIsHighContrastMode 377 ? A2S("private:graphicrepository/sfx2/res/menu_hc.png") 378 : A2S("private:graphicrepository/sfx2/res/menu.png"))); 379 setPropertyValue( 380 maPropertyIdToNameMap[Image_PanelMenu], 381 Any( 382 mbIsHighContrastMode 383 ? A2S("private:graphicrepository/res/imh30823.png") 384 : A2S("private:graphicrepository/res/im30823.png"))); 385 setPropertyValue( 386 maPropertyIdToNameMap[Image_Closer], 387 Any(A2S("private:graphicrepository/sfx2/res/closedoc.png"))); 388 setPropertyValue( 389 maPropertyIdToNameMap[Image_ToolBoxItemSeparator], 390 Any( 391 A2S("private:graphicrepository/sfx2/res/separator.png"))); 392 393 // ToolBox 394 395 /* 396 // Separator style 397 setPropertyValue( 398 maPropertyIdToNameMap[Paint_ToolBoxBackground], 399 Any(sal_Int32(rStyle.GetMenuColor().GetRGBColor()))); 400 setPropertyValue( 401 maPropertyIdToNameMap[Paint_ToolBoxBorderTopLeft], 402 Any()); 403 setPropertyValue( 404 maPropertyIdToNameMap[Paint_ToolBoxBorderCenterCorners], 405 Any()); 406 setPropertyValue( 407 maPropertyIdToNameMap[Paint_ToolBoxBorderBottomRight], 408 Any()); 409 setPropertyValue( 410 maPropertyIdToNameMap[Rect_ToolBoxPadding], 411 Any(awt::Rectangle(2,2,2,2))); 412 setPropertyValue( 413 maPropertyIdToNameMap[Rect_ToolBoxBorder], 414 Any(awt::Rectangle(0,0,0,0))); 415 setPropertyValue( 416 maPropertyIdToNameMap[Bool_UseToolBoxItemSeparator], 417 Any(true)); 418 419 */ 420 421 // Gradient style 422 setPropertyValue( 423 maPropertyIdToNameMap[Paint_ToolBoxBackground], 424 Any(Tools::VclToAwtGradient(Gradient( 425 GRADIENT_LINEAR, 426 Color(0xf2f2f2), 427 Color(0xfefefe) 428 )))); 429 setPropertyValue( 430 maPropertyIdToNameMap[Paint_ToolBoxBorderTopLeft], 431 mbIsHighContrastMode 432 ? Any(util::Color(sal_uInt32(0x00ff00))) 433 : Any(util::Color(sal_uInt32(0xf2f2f2)))); 434 setPropertyValue( 435 maPropertyIdToNameMap[Paint_ToolBoxBorderCenterCorners], 436 mbIsHighContrastMode 437 ? Any(util::Color(sal_uInt32(0x00ff00))) 438 : Any(util::Color(sal_uInt32(0xf2f2f2)))); 439 setPropertyValue( 440 maPropertyIdToNameMap[Paint_ToolBoxBorderBottomRight], 441 mbIsHighContrastMode 442 ? Any(util::Color(sal_uInt32(0x00ff00))) 443 : Any(util::Color(sal_uInt32(0xf2f2f2)))); 444 setPropertyValue( 445 maPropertyIdToNameMap[Rect_ToolBoxPadding], 446 Any(awt::Rectangle(2,2,2,2))); 447 setPropertyValue( 448 maPropertyIdToNameMap[Rect_ToolBoxBorder], 449 Any(awt::Rectangle(1,1,1,1))); 450 setPropertyValue( 451 maPropertyIdToNameMap[Bool_UseToolBoxItemSeparator], 452 Any(false)); 453 } 454 catch(beans::UnknownPropertyException& rException) 455 { 456 OSL_TRACE("unknown property: %s", 457 OUStringToOString( 458 rException.Message, 459 RTL_TEXTENCODING_ASCII_US).getStr()); 460 OSL_ASSERT(false); 461 } 462 } 463 464 465 466 467 void SAL_CALL Theme::disposing (void) 468 { 469 ChangeListeners aListeners; 470 maChangeListeners.swap(aListeners); 471 472 const lang::EventObject aEvent (static_cast<XWeak*>(this)); 473 474 for (ChangeListeners::const_iterator 475 iContainer(maChangeListeners.begin()), 476 iContainerEnd(maChangeListeners.end()); 477 iContainerEnd!=iContainerEnd; 478 ++iContainerEnd) 479 { 480 for (ChangeListenerContainer::const_iterator 481 iListener(iContainer->second.begin()), 482 iEnd(iContainer->second.end()); 483 iListener!=iEnd; 484 ++iListener) 485 { 486 try 487 { 488 (*iListener)->disposing(aEvent); 489 } 490 catch(const Exception&) 491 { 492 } 493 } 494 } 495 } 496 497 498 499 500 Reference<beans::XPropertySet> Theme::GetPropertySet (void) 501 { 502 return Reference<beans::XPropertySet>(static_cast<XWeak*>(&GetCurrentTheme()), UNO_QUERY); 503 } 504 505 506 507 508 Reference<beans::XPropertySetInfo> SAL_CALL Theme::getPropertySetInfo (void) 509 throw(cssu::RuntimeException) 510 { 511 return Reference<beans::XPropertySetInfo>(this); 512 } 513 514 515 516 517 void SAL_CALL Theme::setPropertyValue ( 518 const ::rtl::OUString& rsPropertyName, 519 const cssu::Any& rValue) 520 throw(cssu::RuntimeException) 521 { 522 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 523 if (iId == maPropertyNameToIdMap.end()) 524 throw beans::UnknownPropertyException(rsPropertyName, NULL); 525 526 const PropertyType eType (GetPropertyType(iId->second)); 527 if (eType == PT_Invalid) 528 throw beans::UnknownPropertyException(rsPropertyName, NULL); 529 530 const ThemeItem eItem (iId->second); 531 532 if (rValue == maRawValues[eItem]) 533 { 534 // Value is not different from the one in the property 535 // set => nothing to do. 536 return; 537 } 538 539 const Any aOldValue (maRawValues[eItem]); 540 541 const beans::PropertyChangeEvent aEvent( 542 static_cast<XWeak*>(this), 543 rsPropertyName, 544 sal_False, 545 eItem, 546 aOldValue, 547 rValue); 548 549 if (DoVetoableListenersVeto(GetVetoableListeners(__AnyItem, false), aEvent)) 550 return; 551 if (DoVetoableListenersVeto(GetVetoableListeners(eItem, false), aEvent)) 552 return; 553 554 maRawValues[eItem] = rValue; 555 ProcessNewValue(rValue, eItem, eType); 556 557 BroadcastPropertyChange(GetChangeListeners(__AnyItem, false), aEvent); 558 BroadcastPropertyChange(GetChangeListeners(eItem, false), aEvent); 559 } 560 561 562 563 564 Any SAL_CALL Theme::getPropertyValue ( 565 const ::rtl::OUString& rsPropertyName) 566 throw(css::beans::UnknownPropertyException, 567 css::lang::WrappedTargetException, 568 cssu::RuntimeException) 569 { 570 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 571 if (iId == maPropertyNameToIdMap.end()) 572 throw beans::UnknownPropertyException(); 573 574 const PropertyType eType (GetPropertyType(iId->second)); 575 if (eType == PT_Invalid) 576 throw beans::UnknownPropertyException(); 577 578 const ThemeItem eItem (iId->second); 579 580 return maRawValues[eItem]; 581 } 582 583 584 585 586 void SAL_CALL Theme::addPropertyChangeListener( 587 const ::rtl::OUString& rsPropertyName, 588 const cssu::Reference<css::beans::XPropertyChangeListener>& rxListener) 589 throw(css::beans::UnknownPropertyException, 590 css::lang::WrappedTargetException, 591 cssu::RuntimeException) 592 { 593 ThemeItem eItem (__AnyItem); 594 if (rsPropertyName.getLength() > 0) 595 { 596 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 597 if (iId == maPropertyNameToIdMap.end()) 598 throw beans::UnknownPropertyException(); 599 600 const PropertyType eType (GetPropertyType(iId->second)); 601 if (eType == PT_Invalid) 602 throw beans::UnknownPropertyException(); 603 604 eItem = iId->second; 605 } 606 ChangeListenerContainer* pListeners = GetChangeListeners(eItem, true); 607 if (pListeners != NULL) 608 pListeners->push_back(rxListener); 609 } 610 611 612 613 614 void SAL_CALL Theme::removePropertyChangeListener( 615 const ::rtl::OUString& rsPropertyName, 616 const cssu::Reference<css::beans::XPropertyChangeListener>& rxListener) 617 throw(css::beans::UnknownPropertyException, 618 css::lang::WrappedTargetException, 619 cssu::RuntimeException) 620 { 621 ThemeItem eItem (__AnyItem); 622 if (rsPropertyName.getLength() > 0) 623 { 624 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 625 if (iId == maPropertyNameToIdMap.end()) 626 throw beans::UnknownPropertyException(); 627 628 const PropertyType eType (GetPropertyType(iId->second)); 629 if (eType == PT_Invalid) 630 throw beans::UnknownPropertyException(); 631 632 eItem = iId->second; 633 } 634 ChangeListenerContainer* pContainer = GetChangeListeners(eItem, false); 635 if (pContainer != NULL) 636 { 637 ChangeListenerContainer::iterator iListener (::std::find(pContainer->begin(), pContainer->end(), rxListener)); 638 if (iListener != pContainer->end()) 639 { 640 pContainer->erase(iListener); 641 642 // Remove the listener container when empty. 643 if (pContainer->empty()) 644 maChangeListeners.erase(eItem); 645 } 646 } 647 } 648 649 650 651 652 void SAL_CALL Theme::addVetoableChangeListener( 653 const ::rtl::OUString& rsPropertyName, 654 const cssu::Reference<css::beans::XVetoableChangeListener>& rxListener) 655 throw(css::beans::UnknownPropertyException, 656 css::lang::WrappedTargetException, 657 cssu::RuntimeException) 658 { 659 ThemeItem eItem (__AnyItem); 660 if (rsPropertyName.getLength() > 0) 661 { 662 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 663 if (iId == maPropertyNameToIdMap.end()) 664 throw beans::UnknownPropertyException(); 665 666 const PropertyType eType (GetPropertyType(iId->second)); 667 if (eType == PT_Invalid) 668 throw beans::UnknownPropertyException(); 669 670 eItem = iId->second; 671 } 672 VetoableListenerContainer* pListeners = GetVetoableListeners(eItem, true); 673 if (pListeners != NULL) 674 pListeners->push_back(rxListener); 675 } 676 677 678 679 680 void SAL_CALL Theme::removeVetoableChangeListener( 681 const ::rtl::OUString& rsPropertyName, 682 const cssu::Reference<css::beans::XVetoableChangeListener>& rxListener) 683 throw(css::beans::UnknownPropertyException, 684 css::lang::WrappedTargetException, 685 cssu::RuntimeException) 686 { 687 ThemeItem eItem (__AnyItem); 688 if (rsPropertyName.getLength() > 0) 689 { 690 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 691 if (iId == maPropertyNameToIdMap.end()) 692 throw beans::UnknownPropertyException(); 693 694 const PropertyType eType (GetPropertyType(iId->second)); 695 if (eType == PT_Invalid) 696 throw beans::UnknownPropertyException(); 697 698 eItem = iId->second; 699 } 700 VetoableListenerContainer* pContainer = GetVetoableListeners(eItem, false); 701 if (pContainer != NULL) 702 { 703 VetoableListenerContainer::iterator iListener (::std::find(pContainer->begin(), pContainer->end(), rxListener)); 704 if (iListener != pContainer->end()) 705 { 706 pContainer->erase(iListener); 707 // Remove container when empty. 708 if (pContainer->empty()) 709 maVetoableListeners.erase(eItem); 710 } 711 } 712 } 713 714 715 716 717 cssu::Sequence<css::beans::Property> SAL_CALL Theme::getProperties (void) 718 throw(cssu::RuntimeException) 719 { 720 ::std::vector<beans::Property> aProperties; 721 722 for (sal_Int32 nItem(__Begin),nEnd(__End); nItem!=nEnd; ++nItem) 723 { 724 const ThemeItem eItem (static_cast<ThemeItem>(nItem)); 725 const PropertyType eType (GetPropertyType(eItem)); 726 if (eType == PT_Invalid) 727 continue; 728 729 const beans::Property aProperty( 730 maPropertyIdToNameMap[eItem], 731 eItem, 732 GetCppuType(eType), 733 0); 734 aProperties.push_back(aProperty); 735 } 736 737 return cssu::Sequence<css::beans::Property>( 738 &aProperties.front(), 739 aProperties.size()); 740 } 741 742 743 744 745 beans::Property SAL_CALL Theme::getPropertyByName (const ::rtl::OUString& rsPropertyName) 746 throw(css::beans::UnknownPropertyException, 747 cssu::RuntimeException) 748 { 749 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 750 if (iId == maPropertyNameToIdMap.end()) 751 throw beans::UnknownPropertyException(); 752 753 const PropertyType eType (GetPropertyType(iId->second)); 754 if (eType == PT_Invalid) 755 throw beans::UnknownPropertyException(); 756 757 const ThemeItem eItem (iId->second); 758 759 return beans::Property( 760 rsPropertyName, 761 eItem, 762 GetCppuType(eType), 763 0); 764 } 765 766 767 768 769 sal_Bool SAL_CALL Theme::hasPropertyByName (const ::rtl::OUString& rsPropertyName) 770 throw(cssu::RuntimeException) 771 { 772 PropertyNameToIdMap::const_iterator iId (maPropertyNameToIdMap.find(rsPropertyName)); 773 if (iId == maPropertyNameToIdMap.end()) 774 return sal_False; 775 776 const PropertyType eType (GetPropertyType(iId->second)); 777 if (eType == PT_Invalid) 778 return sal_False; 779 780 return sal_True; 781 } 782 783 784 785 786 void Theme::SetupPropertyMaps (void) 787 { 788 maPropertyIdToNameMap.resize(__Post_Rect); 789 maImages.resize(__Image_Color - __Pre_Image - 1); 790 maColors.resize(__Color_Paint - __Image_Color - 1); 791 maPaints.resize(__Paint_Int - __Color_Paint - 1); 792 maIntegers.resize(__Int_Bool - __Paint_Int - 1); 793 maBooleans.resize(__Bool_Rect - __Int_Bool - 1); 794 maRectangles.resize(__Post_Rect - __Bool_Rect - 1); 795 796 #define AddEntry(e) maPropertyNameToIdMap[A2S(#e)]=e; maPropertyIdToNameMap[e]=A2S(#e) 797 798 AddEntry(Image_Grip); 799 AddEntry(Image_Expand); 800 AddEntry(Image_Collapse); 801 AddEntry(Image_TabBarMenu); 802 AddEntry(Image_PanelMenu); 803 AddEntry(Image_ToolBoxItemSeparator); 804 AddEntry(Image_Closer); 805 806 AddEntry(Color_DeckTitleFont); 807 AddEntry(Color_PanelTitleFont); 808 AddEntry(Color_TabMenuSeparator); 809 AddEntry(Color_TabItemBorder); 810 AddEntry(Color_DropDownBorder); 811 AddEntry(Color_Highlight); 812 AddEntry(Color_HighlightText); 813 814 AddEntry(Paint_DeckBackground); 815 AddEntry(Paint_DeckTitleBarBackground); 816 AddEntry(Paint_PanelBackground); 817 AddEntry(Paint_PanelTitleBarBackground); 818 AddEntry(Paint_TabBarBackground); 819 AddEntry(Paint_TabItemBackgroundNormal); 820 AddEntry(Paint_TabItemBackgroundHighlight); 821 AddEntry(Paint_HorizontalBorder); 822 AddEntry(Paint_VerticalBorder); 823 AddEntry(Paint_ToolBoxBackground); 824 AddEntry(Paint_ToolBoxBorderTopLeft); 825 AddEntry(Paint_ToolBoxBorderCenterCorners); 826 AddEntry(Paint_ToolBoxBorderBottomRight); 827 AddEntry(Paint_DropDownBackground); 828 829 AddEntry(Int_DeckTitleBarHeight); 830 AddEntry(Int_DeckBorderSize); 831 AddEntry(Int_DeckSeparatorHeight); 832 AddEntry(Int_PanelTitleBarHeight); 833 AddEntry(Int_TabMenuPadding); 834 AddEntry(Int_TabMenuSeparatorPadding); 835 AddEntry(Int_TabItemWidth); 836 AddEntry(Int_TabItemHeight); 837 AddEntry(Int_DeckLeftPadding); 838 AddEntry(Int_DeckTopPadding); 839 AddEntry(Int_DeckRightPadding); 840 AddEntry(Int_DeckBottomPadding); 841 AddEntry(Int_TabBarLeftPadding); 842 AddEntry(Int_TabBarTopPadding); 843 AddEntry(Int_TabBarRightPadding); 844 AddEntry(Int_TabBarBottomPadding); 845 846 AddEntry(Bool_UseSymphonyIcons); 847 AddEntry(Bool_UseSystemColors); 848 AddEntry(Bool_UseToolBoxItemSeparator); 849 AddEntry(Bool_IsHighContrastModeActive); 850 851 AddEntry(Rect_ToolBoxPadding); 852 AddEntry(Rect_ToolBoxBorder); 853 854 #undef AddEntry 855 856 maRawValues.resize(maPropertyIdToNameMap.size()); 857 } 858 859 860 861 862 Theme::PropertyType Theme::GetPropertyType (const ThemeItem eItem) 863 { 864 switch(eItem) 865 { 866 case Image_Grip: 867 case Image_Expand: 868 case Image_Collapse: 869 case Image_TabBarMenu: 870 case Image_PanelMenu: 871 case Image_ToolBoxItemSeparator: 872 case Image_Closer: 873 return PT_Image; 874 875 case Color_DeckTitleFont: 876 case Color_PanelTitleFont: 877 case Color_TabMenuSeparator: 878 case Color_TabItemBorder: 879 case Color_DropDownBorder: 880 case Color_Highlight: 881 case Color_HighlightText: 882 return PT_Color; 883 884 case Paint_DeckBackground: 885 case Paint_DeckTitleBarBackground: 886 case Paint_PanelBackground: 887 case Paint_PanelTitleBarBackground: 888 case Paint_TabBarBackground: 889 case Paint_TabItemBackgroundNormal: 890 case Paint_TabItemBackgroundHighlight: 891 case Paint_HorizontalBorder: 892 case Paint_VerticalBorder: 893 case Paint_ToolBoxBackground: 894 case Paint_ToolBoxBorderTopLeft: 895 case Paint_ToolBoxBorderCenterCorners: 896 case Paint_ToolBoxBorderBottomRight: 897 case Paint_DropDownBackground: 898 return PT_Paint; 899 900 case Int_DeckTitleBarHeight: 901 case Int_DeckBorderSize: 902 case Int_DeckSeparatorHeight: 903 case Int_PanelTitleBarHeight: 904 case Int_TabMenuPadding: 905 case Int_TabMenuSeparatorPadding: 906 case Int_TabItemWidth: 907 case Int_TabItemHeight: 908 case Int_DeckLeftPadding: 909 case Int_DeckTopPadding: 910 case Int_DeckRightPadding: 911 case Int_DeckBottomPadding: 912 case Int_TabBarLeftPadding: 913 case Int_TabBarTopPadding: 914 case Int_TabBarRightPadding: 915 case Int_TabBarBottomPadding: 916 return PT_Integer; 917 918 case Bool_UseSymphonyIcons: 919 case Bool_UseSystemColors: 920 case Bool_UseToolBoxItemSeparator: 921 case Bool_IsHighContrastModeActive: 922 return PT_Boolean; 923 924 case Rect_ToolBoxBorder: 925 case Rect_ToolBoxPadding: 926 return PT_Rectangle; 927 928 default: 929 return PT_Invalid; 930 } 931 } 932 933 934 935 936 cssu::Type Theme::GetCppuType (const PropertyType eType) 937 { 938 switch(eType) 939 { 940 case PT_Image: 941 return getCppuType((rtl::OUString*)NULL); 942 943 case PT_Color: 944 return getCppuType((sal_uInt32*)NULL); 945 946 case PT_Paint: 947 return getCppuVoidType(); 948 949 case PT_Integer: 950 return getCppuType((sal_Int32*)NULL); 951 952 case PT_Boolean: 953 return getCppuType((sal_Bool*)NULL); 954 955 case PT_Rectangle: 956 return getCppuType((awt::Rectangle*)NULL); 957 958 case PT_Invalid: 959 default: 960 return getCppuVoidType(); 961 } 962 } 963 964 965 966 967 sal_Int32 Theme::GetIndex (const ThemeItem eItem, const PropertyType eType) 968 { 969 switch(eType) 970 { 971 case PT_Image: 972 return eItem - __Pre_Image-1; 973 case PT_Color: 974 return eItem - __Image_Color-1; 975 case PT_Paint: 976 return eItem - __Color_Paint-1; 977 case PT_Integer: 978 return eItem - __Paint_Int-1; 979 case PT_Boolean: 980 return eItem - __Int_Bool-1; 981 case PT_Rectangle: 982 return eItem - __Bool_Rect-1; 983 984 default: 985 OSL_ASSERT(false); 986 return 0; 987 } 988 } 989 990 991 992 993 Theme::VetoableListenerContainer* Theme::GetVetoableListeners ( 994 const ThemeItem eItem, 995 const bool bCreate) 996 { 997 VetoableListeners::iterator iContainer (maVetoableListeners.find(eItem)); 998 if (iContainer != maVetoableListeners.end()) 999 return &iContainer->second; 1000 else if (bCreate) 1001 { 1002 maVetoableListeners[eItem] = VetoableListenerContainer(); 1003 return &maVetoableListeners[eItem]; 1004 } 1005 else 1006 return NULL; 1007 } 1008 1009 1010 1011 1012 Theme::ChangeListenerContainer* Theme::GetChangeListeners ( 1013 const ThemeItem eItem, 1014 const bool bCreate) 1015 { 1016 ChangeListeners::iterator iContainer (maChangeListeners.find(eItem)); 1017 if (iContainer != maChangeListeners.end()) 1018 return &iContainer->second; 1019 else if (bCreate) 1020 { 1021 maChangeListeners[eItem] = ChangeListenerContainer(); 1022 return &maChangeListeners[eItem]; 1023 } 1024 else 1025 return NULL; 1026 } 1027 1028 1029 1030 1031 bool Theme::DoVetoableListenersVeto ( 1032 const VetoableListenerContainer* pListeners, 1033 const beans::PropertyChangeEvent& rEvent) const 1034 { 1035 if (pListeners == NULL) 1036 return false; 1037 1038 VetoableListenerContainer aListeners (*pListeners); 1039 try 1040 { 1041 for (VetoableListenerContainer::const_iterator 1042 iListener(aListeners.begin()), 1043 iEnd(aListeners.end()); 1044 iListener!=iEnd; 1045 ++iListener) 1046 { 1047 (*iListener)->vetoableChange(rEvent); 1048 } 1049 } 1050 catch(const beans::PropertyVetoException&) 1051 { 1052 return true; 1053 } 1054 catch(const Exception&) 1055 { 1056 // Ignore any other errors (such as disposed listeners). 1057 } 1058 return false; 1059 } 1060 1061 1062 1063 1064 void Theme::BroadcastPropertyChange ( 1065 const ChangeListenerContainer* pListeners, 1066 const beans::PropertyChangeEvent& rEvent) const 1067 { 1068 if (pListeners == NULL) 1069 return; 1070 1071 const ChangeListenerContainer aListeners (*pListeners); 1072 try 1073 { 1074 for (ChangeListenerContainer::const_iterator 1075 iListener(aListeners.begin()), 1076 iEnd(aListeners.end()); 1077 iListener!=iEnd; 1078 ++iListener) 1079 { 1080 (*iListener)->propertyChange(rEvent); 1081 } 1082 } 1083 catch(const Exception&) 1084 { 1085 // Ignore any errors (such as disposed listeners). 1086 } 1087 } 1088 1089 1090 1091 1092 void Theme::ProcessNewValue ( 1093 const Any& rValue, 1094 const ThemeItem eItem, 1095 const PropertyType eType) 1096 { 1097 const sal_Int32 nIndex (GetIndex (eItem, eType)); 1098 switch (eType) 1099 { 1100 case PT_Image: 1101 { 1102 ::rtl::OUString sURL; 1103 if (rValue >>= sURL) 1104 { 1105 maImages[nIndex] = Tools::GetImage(sURL, NULL); 1106 } 1107 break; 1108 } 1109 case PT_Color: 1110 { 1111 sal_Int32 nColorValue (0); 1112 if (rValue >>= nColorValue) 1113 { 1114 maColors[nIndex] = Color(nColorValue); 1115 } 1116 break; 1117 } 1118 case PT_Paint: 1119 { 1120 maPaints[nIndex] = Paint::Create(rValue); 1121 break; 1122 } 1123 case PT_Integer: 1124 { 1125 sal_Int32 nValue (0); 1126 if (rValue >>= nValue) 1127 { 1128 maIntegers[nIndex] = nValue; 1129 } 1130 break; 1131 } 1132 case PT_Boolean: 1133 { 1134 sal_Bool nValue (0); 1135 if (rValue >>= nValue) 1136 { 1137 maBooleans[nIndex] = (nValue==sal_True); 1138 if (eItem == Bool_IsHighContrastModeActive) 1139 { 1140 mbIsHighContrastModeSetManually = true; 1141 mbIsHighContrastMode = maBooleans[nIndex]; 1142 HandleDataChange(); 1143 } 1144 else if (eItem == Bool_UseSystemColors) 1145 { 1146 HandleDataChange(); 1147 } 1148 } 1149 break; 1150 } 1151 case PT_Rectangle: 1152 { 1153 awt::Rectangle aBox; 1154 if (rValue >>= aBox) 1155 { 1156 maRectangles[nIndex] = Rectangle( 1157 aBox.X, 1158 aBox.Y, 1159 aBox.Width, 1160 aBox.Height); 1161 } 1162 break; 1163 } 1164 case PT_Invalid: 1165 OSL_ASSERT(eType != PT_Invalid); 1166 throw RuntimeException(); 1167 } 1168 } 1169 1170 1171 1172 1173 } } // end of namespace sfx2::sidebar 1174