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_vcl.hxx" 26 27 #include "tools/debug.hxx" 28 29 #include "i18npool/mslangid.hxx" 30 31 #include "vcl/svapp.hxx" 32 #include "vcl/event.hxx" 33 #include "vcl/settings.hxx" 34 #include "vcl/i18nhelp.hxx" 35 #include "vcl/configsettings.hxx" 36 #include "vcl/gradient.hxx" 37 #include "vcl/unohelp.hxx" 38 #include "vcl/bitmapex.hxx" 39 40 #include "unotools/fontcfg.hxx" 41 #include "unotools/localedatawrapper.hxx" 42 #include "unotools/collatorwrapper.hxx" 43 #include "unotools/configmgr.hxx" 44 #include "unotools/confignode.hxx" 45 #include "unotools/syslocaleoptions.hxx" 46 47 #ifdef WNT 48 #include "tools/prewin.h" 49 #include <windows.h> 50 #include "tools/postwin.h" 51 #endif 52 53 #include "svdata.hxx" 54 #include "impimagetree.hxx" 55 56 using namespace rtl; 57 58 // ======================================================================= 59 60 DBG_NAME( AllSettings ) 61 62 // ======================================================================= 63 64 #define STDSYS_STYLE (STYLE_OPTION_SCROLLARROW | \ 65 STYLE_OPTION_SPINARROW | \ 66 STYLE_OPTION_SPINUPDOWN | \ 67 STYLE_OPTION_NOMNEMONICS) 68 69 // ======================================================================= 70 ImplMachineData::ImplMachineData() 71 { 72 mnRefCount = 1; 73 mnOptions = 0; 74 mnScreenOptions = 0; 75 mnPrintOptions = 0; 76 mnScreenRasterFontDeviation = 0; 77 } 78 79 // ----------------------------------------------------------------------- 80 81 ImplMachineData::ImplMachineData( const ImplMachineData& rData ) 82 { 83 mnRefCount = 1; 84 mnOptions = rData.mnOptions; 85 mnScreenOptions = rData.mnScreenOptions; 86 mnPrintOptions = rData.mnPrintOptions; 87 mnScreenRasterFontDeviation = rData.mnScreenRasterFontDeviation; 88 } 89 90 // ----------------------------------------------------------------------- 91 92 MachineSettings::MachineSettings() 93 { 94 mpData = new ImplMachineData(); 95 } 96 97 // ----------------------------------------------------------------------- 98 99 MachineSettings::MachineSettings( const MachineSettings& rSet ) 100 { 101 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MachineSettings: RefCount overflow" ); 102 103 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 104 mpData = rSet.mpData; 105 mpData->mnRefCount++; 106 } 107 108 // ----------------------------------------------------------------------- 109 110 MachineSettings::~MachineSettings() 111 { 112 // Daten loeschen, wenn letzte Referenz 113 if ( mpData->mnRefCount == 1 ) 114 delete mpData; 115 else 116 mpData->mnRefCount--; 117 } 118 119 // ----------------------------------------------------------------------- 120 121 const MachineSettings& MachineSettings::operator =( const MachineSettings& rSet ) 122 { 123 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MachineSettings: RefCount overflow" ); 124 125 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 126 rSet.mpData->mnRefCount++; 127 128 // Daten loeschen, wenn letzte Referenz 129 if ( mpData->mnRefCount == 1 ) 130 delete mpData; 131 else 132 mpData->mnRefCount--; 133 134 mpData = rSet.mpData; 135 136 return *this; 137 } 138 139 // ----------------------------------------------------------------------- 140 141 void MachineSettings::CopyData() 142 { 143 // Falls noch andere Referenzen bestehen, dann kopieren 144 if ( mpData->mnRefCount != 1 ) 145 { 146 mpData->mnRefCount--; 147 mpData = new ImplMachineData( *mpData ); 148 } 149 } 150 151 // ----------------------------------------------------------------------- 152 153 sal_Bool MachineSettings::operator ==( const MachineSettings& rSet ) const 154 { 155 if ( mpData == rSet.mpData ) 156 return sal_True; 157 158 if ( (mpData->mnOptions == rSet.mpData->mnOptions) && 159 (mpData->mnScreenOptions == rSet.mpData->mnScreenOptions) && 160 (mpData->mnPrintOptions == rSet.mpData->mnPrintOptions) && 161 (mpData->mnScreenRasterFontDeviation == rSet.mpData->mnScreenRasterFontDeviation) ) 162 return sal_True; 163 else 164 return sal_False; 165 } 166 167 // ======================================================================= 168 169 ImplMouseData::ImplMouseData() 170 { 171 mnRefCount = 1; 172 mnOptions = 0; 173 mnDoubleClkTime = 500; 174 mnDoubleClkWidth = 2; 175 mnDoubleClkHeight = 2; 176 mnStartDragWidth = 2; 177 mnStartDragHeight = 2; 178 mnStartDragCode = MOUSE_LEFT; 179 mnDragMoveCode = 0; 180 mnDragCopyCode = KEY_MOD1; 181 mnDragLinkCode = KEY_SHIFT | KEY_MOD1; 182 mnContextMenuCode = MOUSE_RIGHT; 183 mnContextMenuClicks = 1; 184 mbContextMenuDown = sal_True; 185 mnMiddleButtonAction = MOUSE_MIDDLE_AUTOSCROLL; 186 mnScrollRepeat = 100; 187 mnButtonStartRepeat = 370; 188 mnButtonRepeat = 90; 189 mnActionDelay = 250; 190 mnMenuDelay = 150; 191 mnFollow = MOUSE_FOLLOW_MENU | MOUSE_FOLLOW_DDLIST; 192 mnWheelBehavior = MOUSE_WHEEL_ALWAYS; 193 } 194 195 // ----------------------------------------------------------------------- 196 197 ImplMouseData::ImplMouseData( const ImplMouseData& rData ) 198 { 199 mnRefCount = 1; 200 mnOptions = rData.mnOptions; 201 mnDoubleClkTime = rData.mnDoubleClkTime; 202 mnDoubleClkWidth = rData.mnDoubleClkWidth; 203 mnDoubleClkHeight = rData.mnDoubleClkHeight; 204 mnStartDragWidth = rData.mnStartDragWidth; 205 mnStartDragHeight = rData.mnStartDragHeight; 206 mnStartDragCode = rData.mnStartDragCode; 207 mnDragMoveCode = rData.mnDragMoveCode; 208 mnDragCopyCode = rData.mnDragCopyCode; 209 mnDragLinkCode = rData.mnDragLinkCode; 210 mnContextMenuCode = rData.mnContextMenuCode; 211 mnContextMenuClicks = rData.mnContextMenuClicks; 212 mbContextMenuDown = rData.mbContextMenuDown; 213 mnMiddleButtonAction = rData.mnMiddleButtonAction; 214 mnScrollRepeat = rData.mnScrollRepeat; 215 mnButtonStartRepeat = rData.mnButtonStartRepeat; 216 mnButtonRepeat = rData.mnButtonRepeat; 217 mnActionDelay = rData.mnActionDelay; 218 mnMenuDelay = rData.mnMenuDelay; 219 mnFollow = rData.mnFollow; 220 mnWheelBehavior = rData.mnWheelBehavior; 221 } 222 223 // ----------------------------------------------------------------------- 224 225 MouseSettings::MouseSettings() 226 { 227 mpData = new ImplMouseData(); 228 } 229 230 // ----------------------------------------------------------------------- 231 232 MouseSettings::MouseSettings( const MouseSettings& rSet ) 233 { 234 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MouseSettings: RefCount overflow" ); 235 236 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 237 mpData = rSet.mpData; 238 mpData->mnRefCount++; 239 } 240 241 // ----------------------------------------------------------------------- 242 243 MouseSettings::~MouseSettings() 244 { 245 // Daten loeschen, wenn letzte Referenz 246 if ( mpData->mnRefCount == 1 ) 247 delete mpData; 248 else 249 mpData->mnRefCount--; 250 } 251 252 // ----------------------------------------------------------------------- 253 254 const MouseSettings& MouseSettings::operator =( const MouseSettings& rSet ) 255 { 256 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MouseSettings: RefCount overflow" ); 257 258 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 259 rSet.mpData->mnRefCount++; 260 261 // Daten loeschen, wenn letzte Referenz 262 if ( mpData->mnRefCount == 1 ) 263 delete mpData; 264 else 265 mpData->mnRefCount--; 266 267 mpData = rSet.mpData; 268 269 return *this; 270 } 271 272 // ----------------------------------------------------------------------- 273 274 void MouseSettings::CopyData() 275 { 276 // Falls noch andere Referenzen bestehen, dann kopieren 277 if ( mpData->mnRefCount != 1 ) 278 { 279 mpData->mnRefCount--; 280 mpData = new ImplMouseData( *mpData ); 281 } 282 } 283 284 // ----------------------------------------------------------------------- 285 286 sal_Bool MouseSettings::operator ==( const MouseSettings& rSet ) const 287 { 288 if ( mpData == rSet.mpData ) 289 return sal_True; 290 291 if ( (mpData->mnOptions == rSet.mpData->mnOptions) && 292 (mpData->mnDoubleClkTime == rSet.mpData->mnDoubleClkTime) && 293 (mpData->mnDoubleClkWidth == rSet.mpData->mnDoubleClkWidth) && 294 (mpData->mnDoubleClkHeight == rSet.mpData->mnDoubleClkHeight) && 295 (mpData->mnStartDragWidth == rSet.mpData->mnStartDragWidth) && 296 (mpData->mnStartDragHeight == rSet.mpData->mnStartDragHeight) && 297 (mpData->mnStartDragCode == rSet.mpData->mnStartDragCode) && 298 (mpData->mnDragMoveCode == rSet.mpData->mnDragMoveCode) && 299 (mpData->mnDragCopyCode == rSet.mpData->mnDragCopyCode) && 300 (mpData->mnDragLinkCode == rSet.mpData->mnDragLinkCode) && 301 (mpData->mnContextMenuCode == rSet.mpData->mnContextMenuCode) && 302 (mpData->mnContextMenuClicks == rSet.mpData->mnContextMenuClicks) && 303 (mpData->mbContextMenuDown == rSet.mpData->mbContextMenuDown) && 304 (mpData->mnMiddleButtonAction == rSet.mpData->mnMiddleButtonAction) && 305 (mpData->mnScrollRepeat == rSet.mpData->mnScrollRepeat) && 306 (mpData->mnButtonStartRepeat == rSet.mpData->mnButtonStartRepeat) && 307 (mpData->mnButtonRepeat == rSet.mpData->mnButtonRepeat) && 308 (mpData->mnActionDelay == rSet.mpData->mnActionDelay) && 309 (mpData->mnMenuDelay == rSet.mpData->mnMenuDelay) && 310 (mpData->mnFollow == rSet.mpData->mnFollow) && 311 (mpData->mnWheelBehavior == rSet.mpData->mnWheelBehavior ) ) 312 return sal_True; 313 else 314 return sal_False; 315 } 316 317 // ======================================================================= 318 319 ImplKeyboardData::ImplKeyboardData() 320 { 321 mnRefCount = 1; 322 mnOptions = 0; 323 } 324 325 // ----------------------------------------------------------------------- 326 327 ImplKeyboardData::ImplKeyboardData( const ImplKeyboardData& rData ) 328 { 329 mnRefCount = 1; 330 mnOptions = rData.mnOptions; 331 } 332 333 // ----------------------------------------------------------------------- 334 335 KeyboardSettings::KeyboardSettings() 336 { 337 mpData = new ImplKeyboardData(); 338 } 339 340 // ----------------------------------------------------------------------- 341 342 KeyboardSettings::KeyboardSettings( const KeyboardSettings& rSet ) 343 { 344 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "KeyboardSettings: RefCount overflow" ); 345 346 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 347 mpData = rSet.mpData; 348 mpData->mnRefCount++; 349 } 350 351 // ----------------------------------------------------------------------- 352 353 KeyboardSettings::~KeyboardSettings() 354 { 355 // Daten loeschen, wenn letzte Referenz 356 if ( mpData->mnRefCount == 1 ) 357 delete mpData; 358 else 359 mpData->mnRefCount--; 360 } 361 362 // ----------------------------------------------------------------------- 363 364 const KeyboardSettings& KeyboardSettings::operator =( const KeyboardSettings& rSet ) 365 { 366 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "KeyboardSettings: RefCount overflow" ); 367 368 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 369 rSet.mpData->mnRefCount++; 370 371 // Daten loeschen, wenn letzte Referenz 372 if ( mpData->mnRefCount == 1 ) 373 delete mpData; 374 else 375 mpData->mnRefCount--; 376 377 mpData = rSet.mpData; 378 379 return *this; 380 } 381 382 // ----------------------------------------------------------------------- 383 384 void KeyboardSettings::CopyData() 385 { 386 // Falls noch andere Referenzen bestehen, dann kopieren 387 if ( mpData->mnRefCount != 1 ) 388 { 389 mpData->mnRefCount--; 390 mpData = new ImplKeyboardData( *mpData ); 391 } 392 } 393 394 // ----------------------------------------------------------------------- 395 396 sal_Bool KeyboardSettings::operator ==( const KeyboardSettings& rSet ) const 397 { 398 if ( mpData == rSet.mpData ) 399 return sal_True; 400 401 if ( (mpData->mnOptions == rSet.mpData->mnOptions) ) 402 return sal_True; 403 else 404 return sal_False; 405 } 406 407 // ======================================================================= 408 409 ImplStyleData::ImplStyleData() 410 { 411 mnRefCount = 1; 412 mnScrollBarSize = 16; 413 mnMinThumbSize = 16; 414 mnSplitSize = 3; 415 mnSpinSize = 16; 416 mnIconHorzSpace = 50; 417 mnIconVertSpace = 40; 418 mnAntialiasedMin = 0; 419 mnCursorSize = 2; 420 mnCursorBlinkTime = STYLE_CURSOR_NOBLINKTIME; 421 mnScreenZoom = 100; 422 mnScreenFontZoom = 100; 423 mnLogoDisplayTime = LOGO_DISPLAYTIME_STARTTIME; 424 mnDragFullOptions = DRAGFULL_OPTION_WINDOWMOVE | DRAGFULL_OPTION_WINDOWSIZE | 425 DRAGFULL_OPTION_OBJECTMOVE | DRAGFULL_OPTION_OBJECTSIZE | 426 DRAGFULL_OPTION_DOCKING | DRAGFULL_OPTION_SPLIT | 427 DRAGFULL_OPTION_SCROLL; 428 mnAnimationOptions = 0; 429 mnSelectionOptions = 0; 430 mnDisplayOptions = 0; 431 mnOptions = 0; 432 mnAutoMnemonic = 1; 433 mnToolbarIconSize = STYLE_TOOLBAR_ICONSIZE_UNKNOWN; 434 mnSymbolsStyle = STYLE_SYMBOLS_AUTO; 435 mnPreferredSymbolsStyle = STYLE_SYMBOLS_AUTO; 436 mpFontOptions = NULL; 437 438 SetStandardStyles(); 439 } 440 441 // ----------------------------------------------------------------------- 442 443 ImplStyleData::ImplStyleData( const ImplStyleData& rData ) : 444 maActiveBorderColor( rData.maActiveBorderColor ), 445 maActiveColor( rData.maActiveColor ), 446 maActiveColor2( rData.maActiveColor2 ), 447 maActiveTextColor( rData.maActiveTextColor ), 448 maButtonTextColor( rData.maButtonTextColor ), 449 maButtonRolloverTextColor( rData.maButtonRolloverTextColor ), 450 maCheckedColor( rData.maCheckedColor ), 451 maDarkShadowColor( rData.maDarkShadowColor ), 452 maDeactiveBorderColor( rData.maDeactiveBorderColor ), 453 maDeactiveColor( rData.maDeactiveColor ), 454 maDeactiveColor2( rData.maDeactiveColor2 ), 455 maDeactiveTextColor( rData.maDeactiveTextColor ), 456 maDialogColor( rData.maDialogColor ), 457 maDialogTextColor( rData.maDialogTextColor ), 458 maDisableColor( rData.maDisableColor ), 459 maFaceColor( rData.maFaceColor ), 460 maFieldColor( rData.maFieldColor ), 461 maFieldTextColor( rData.maFieldTextColor ), 462 maFieldRolloverTextColor( rData.maFieldRolloverTextColor ), 463 maFontColor( rData.maFontColor ), 464 maGroupTextColor( rData.maGroupTextColor ), 465 maHelpColor( rData.maHelpColor ), 466 maHelpTextColor( rData.maHelpTextColor ), 467 maHighlightColor( rData.maHighlightColor ), 468 maHighlightLinkColor( rData.maHighlightLinkColor ), 469 maHighlightTextColor( rData.maHighlightTextColor ), 470 maInfoTextColor( rData.maInfoTextColor ), 471 maLabelTextColor( rData.maLabelTextColor ), 472 maLightBorderColor( rData.maLightBorderColor ), 473 maLightColor( rData.maLightColor ), 474 maLinkColor( rData.maLinkColor ), 475 maMenuBarColor( rData.maMenuBarColor ), 476 maMenuBorderColor( rData.maMenuBorderColor ), 477 maMenuColor( rData.maMenuColor ), 478 maMenuHighlightColor( rData.maMenuHighlightColor ), 479 maMenuHighlightTextColor( rData.maMenuHighlightTextColor ), 480 maMenuTextColor( rData.maMenuTextColor ), 481 maMenuBarTextColor( rData.maMenuBarTextColor ), 482 maMonoColor( rData.maMonoColor ), 483 maRadioCheckTextColor( rData.maRadioCheckTextColor ), 484 maShadowColor( rData.maShadowColor ), 485 maVisitedLinkColor( rData.maVisitedLinkColor ), 486 maWindowColor( rData.maWindowColor ), 487 maWindowTextColor( rData.maWindowTextColor ), 488 maWorkspaceColor( rData.maWorkspaceColor ), 489 maActiveTabColor( rData.maActiveTabColor ), 490 maInactiveTabColor( rData.maInactiveTabColor ), 491 maAppFont( rData.maAppFont ), 492 maHelpFont( rData.maAppFont ), 493 maTitleFont( rData.maTitleFont ), 494 maFloatTitleFont( rData.maFloatTitleFont ), 495 maMenuFont( rData.maMenuFont ), 496 maToolFont( rData.maToolFont ), 497 maLabelFont( rData.maLabelFont ), 498 maInfoFont( rData.maInfoFont ), 499 maRadioCheckFont( rData.maRadioCheckFont ), 500 maPushButtonFont( rData.maPushButtonFont ), 501 maFieldFont( rData.maFieldFont ), 502 maIconFont( rData.maIconFont ), 503 maGroupFont( rData.maGroupFont ), 504 maWorkspaceGradient( rData.maWorkspaceGradient ) 505 { 506 mnRefCount = 1; 507 mnBorderSize = rData.mnBorderSize; 508 mnTitleHeight = rData.mnTitleHeight; 509 mnFloatTitleHeight = rData.mnFloatTitleHeight; 510 mnTearOffTitleHeight = rData.mnTearOffTitleHeight; 511 mnMenuBarHeight = rData.mnMenuBarHeight; 512 mnScrollBarSize = rData.mnScrollBarSize; 513 mnMinThumbSize = rData.mnMinThumbSize; 514 mnSplitSize = rData.mnSplitSize; 515 mnSpinSize = rData.mnSpinSize; 516 mnIconHorzSpace = rData.mnIconHorzSpace; 517 mnIconVertSpace = rData.mnIconVertSpace; 518 mnAntialiasedMin = rData.mnAntialiasedMin; 519 mnCursorSize = rData.mnCursorSize; 520 mnCursorBlinkTime = rData.mnCursorBlinkTime; 521 mnScreenZoom = rData.mnScreenZoom; 522 mnScreenFontZoom = rData.mnScreenFontZoom; 523 mnLogoDisplayTime = rData.mnLogoDisplayTime; 524 mnDragFullOptions = rData.mnDragFullOptions; 525 mnAnimationOptions = rData.mnAnimationOptions; 526 mnSelectionOptions = rData.mnSelectionOptions; 527 mnDisplayOptions = rData.mnDisplayOptions; 528 mnOptions = rData.mnOptions; 529 mnHighContrast = rData.mnHighContrast; 530 mnUseSystemUIFonts = rData.mnUseSystemUIFonts; 531 mnUseFlatBorders = rData.mnUseFlatBorders; 532 mnUseFlatMenues = rData.mnUseFlatMenues; 533 mnAutoMnemonic = rData.mnAutoMnemonic; 534 mnUseImagesInMenus = rData.mnUseImagesInMenus; 535 mnSkipDisabledInMenus = rData.mnSkipDisabledInMenus; 536 mnToolbarIconSize = rData.mnToolbarIconSize; 537 mnSymbolsStyle = rData.mnSymbolsStyle; 538 mnPreferredSymbolsStyle = rData.mnPreferredSymbolsStyle; 539 mpFontOptions = rData.mpFontOptions; 540 } 541 542 // ----------------------------------------------------------------------- 543 544 void ImplStyleData::SetStandardStyles() 545 { 546 Font aStdFont( FAMILY_SWISS, Size( 0, 8 ) ); 547 aStdFont.SetCharSet( gsl_getSystemTextEncoding() ); 548 aStdFont.SetWeight( WEIGHT_NORMAL ); 549 aStdFont.SetName( utl::DefaultFontConfiguration::get()->getUserInterfaceFont(com::sun::star::lang::Locale( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("en") ), rtl::OUString(), rtl::OUString() ) ) ); 550 maAppFont = aStdFont; 551 maHelpFont = aStdFont; 552 maMenuFont = aStdFont; 553 maToolFont = aStdFont; 554 maGroupFont = aStdFont; 555 maLabelFont = aStdFont; 556 maInfoFont = aStdFont; 557 maRadioCheckFont = aStdFont; 558 maPushButtonFont = aStdFont; 559 maFieldFont = aStdFont; 560 maIconFont = aStdFont; 561 maFloatTitleFont = aStdFont; 562 aStdFont.SetWeight( WEIGHT_BOLD ); 563 maTitleFont = aStdFont; 564 565 maFaceColor = Color( COL_LIGHTGRAY ); 566 maCheckedColor = Color( 0xCC, 0xCC, 0xCC ); 567 maLightColor = Color( COL_WHITE ); 568 maLightBorderColor = Color( COL_LIGHTGRAY ); 569 maShadowColor = Color( COL_GRAY ); 570 maDarkShadowColor = Color( COL_BLACK ); 571 maButtonTextColor = Color( COL_BLACK ); 572 maButtonRolloverTextColor = Color( COL_BLACK ); 573 maRadioCheckTextColor = Color( COL_BLACK ); 574 maGroupTextColor = Color( COL_BLACK ); 575 maLabelTextColor = Color( COL_BLACK ); 576 maInfoTextColor = Color( COL_BLACK ); 577 maWindowColor = Color( COL_WHITE ); 578 maWindowTextColor = Color( COL_BLACK ); 579 maDialogColor = Color( COL_LIGHTGRAY ); 580 maDialogTextColor = Color( COL_BLACK ); 581 maWorkspaceColor = Color( COL_GRAY ); 582 maMonoColor = Color( COL_BLACK ); 583 maFieldColor = Color( COL_WHITE ); 584 maFieldTextColor = Color( COL_BLACK ); 585 maFieldRolloverTextColor = Color( COL_BLACK ); 586 maActiveColor = Color( COL_BLUE ); 587 maActiveColor2 = Color( COL_BLACK ); 588 maActiveTextColor = Color( COL_WHITE ); 589 maActiveBorderColor = Color( COL_LIGHTGRAY ); 590 maDeactiveColor = Color( COL_GRAY ); 591 maDeactiveColor2 = Color( COL_BLACK ); 592 maDeactiveTextColor = Color( COL_LIGHTGRAY ); 593 maDeactiveBorderColor = Color( COL_LIGHTGRAY ); 594 maMenuColor = Color( COL_LIGHTGRAY ); 595 maMenuBarColor = Color( COL_LIGHTGRAY ); 596 maMenuBorderColor = Color( COL_LIGHTGRAY ); 597 maMenuTextColor = Color( COL_BLACK ); 598 maMenuBarTextColor = Color( COL_BLACK ); 599 maMenuHighlightColor = Color( COL_BLUE ); 600 maMenuHighlightTextColor = Color( COL_WHITE ); 601 maHighlightColor = Color( COL_BLUE ); 602 maHighlightTextColor = Color( COL_WHITE ); 603 maActiveTabColor = Color( COL_WHITE ); 604 maInactiveTabColor = Color( COL_LIGHTGRAY ); 605 maDisableColor = Color( COL_GRAY ); 606 maHelpColor = Color( 0xFF, 0xFF, 0xE0 ); 607 maHelpTextColor = Color( COL_BLACK ); 608 maLinkColor = Color( COL_BLUE ); 609 maVisitedLinkColor = Color( 0x00, 0x00, 0xCC ); 610 maHighlightLinkColor = Color( COL_LIGHTBLUE ); 611 maFontColor = Color( COL_BLACK ); 612 613 mnBorderSize = 1; 614 mnTitleHeight = 18; 615 mnFloatTitleHeight = 13; 616 mnTearOffTitleHeight = 8; 617 mnMenuBarHeight = 14; 618 mnHighContrast = 0; 619 mnUseSystemUIFonts = 1; 620 mnUseFlatBorders = 0; 621 mnUseFlatMenues = 0; 622 mnUseImagesInMenus = (sal_uInt16)sal_True; 623 mnSkipDisabledInMenus = (sal_uInt16)sal_False; 624 625 Gradient aGrad( GRADIENT_LINEAR, DEFAULT_WORKSPACE_GRADIENT_START_COLOR, DEFAULT_WORKSPACE_GRADIENT_END_COLOR ); 626 maWorkspaceGradient = Wallpaper( aGrad ); 627 } 628 629 // ----------------------------------------------------------------------- 630 631 StyleSettings::StyleSettings() 632 { 633 mpData = new ImplStyleData(); 634 } 635 636 // ----------------------------------------------------------------------- 637 638 StyleSettings::StyleSettings( const StyleSettings& rSet ) 639 { 640 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" ); 641 642 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 643 mpData = rSet.mpData; 644 mpData->mnRefCount++; 645 } 646 647 // ----------------------------------------------------------------------- 648 649 StyleSettings::~StyleSettings() 650 { 651 // Daten loeschen, wenn letzte Referenz 652 if ( mpData->mnRefCount == 1 ) 653 delete mpData; 654 else 655 mpData->mnRefCount--; 656 } 657 658 // ----------------------------------------------------------------------- 659 660 void StyleSettings::Set3DColors( const Color& rColor ) 661 { 662 CopyData(); 663 mpData->maFaceColor = rColor; 664 mpData->maLightBorderColor = rColor; 665 mpData->maMenuBorderColor = rColor; 666 mpData->maDarkShadowColor = Color( COL_BLACK ); 667 if ( rColor != Color( COL_LIGHTGRAY ) ) 668 { 669 mpData->maLightColor = rColor; 670 mpData->maShadowColor = rColor; 671 mpData->maLightColor.IncreaseLuminance( 64 ); 672 mpData->maShadowColor.DecreaseLuminance( 64 ); 673 sal_uLong nRed = mpData->maLightColor.GetRed(); 674 sal_uLong nGreen = mpData->maLightColor.GetGreen(); 675 sal_uLong nBlue = mpData->maLightColor.GetBlue(); 676 nRed += (sal_uLong)(mpData->maShadowColor.GetRed()); 677 nGreen += (sal_uLong)(mpData->maShadowColor.GetGreen()); 678 nBlue += (sal_uLong)(mpData->maShadowColor.GetBlue()); 679 mpData->maCheckedColor = Color( (sal_uInt8)(nRed/2), (sal_uInt8)(nGreen/2), (sal_uInt8)(nBlue/2) ); 680 } 681 else 682 { 683 mpData->maCheckedColor = Color( 0x99, 0x99, 0x99 ); 684 mpData->maLightColor = Color( COL_WHITE ); 685 mpData->maShadowColor = Color( COL_GRAY ); 686 } 687 } 688 689 // ----------------------------------------------------------------------- 690 691 ::rtl::OUString StyleSettings::ImplSymbolsStyleToName( sal_uLong nStyle ) const 692 { 693 switch ( nStyle ) 694 { 695 case STYLE_SYMBOLS_DEFAULT: return ::rtl::OUString::createFromAscii( "default" ); 696 case STYLE_SYMBOLS_HICONTRAST: return ::rtl::OUString::createFromAscii( "hicontrast" ); 697 case STYLE_SYMBOLS_INDUSTRIAL: return ::rtl::OUString::createFromAscii( "industrial" ); 698 case STYLE_SYMBOLS_CLASSIC: return ::rtl::OUString::createFromAscii( "classic" ); 699 } 700 701 return ::rtl::OUString::createFromAscii( "auto" ); 702 } 703 704 // ----------------------------------------------------------------------- 705 706 sal_uLong StyleSettings::ImplNameToSymbolsStyle( const ::rtl::OUString &rName ) const 707 { 708 if ( rName == ::rtl::OUString::createFromAscii( "default" ) ) 709 return STYLE_SYMBOLS_DEFAULT; 710 else if ( rName == ::rtl::OUString::createFromAscii( "hicontrast" ) ) 711 return STYLE_SYMBOLS_HICONTRAST; 712 else if ( rName == ::rtl::OUString::createFromAscii( "industrial" ) ) 713 return STYLE_SYMBOLS_INDUSTRIAL; 714 else if ( rName == ::rtl::OUString::createFromAscii( "classic" ) ) 715 return STYLE_SYMBOLS_CLASSIC; 716 717 return STYLE_SYMBOLS_AUTO; 718 } 719 720 // ----------------------------------------------------------------------- 721 722 /** 723 The preferred style name can be read from the desktop setting. We 724 need to find the closest theme name registered in OOo. Therefore 725 we check if any registered style name is a case-insensitive 726 substring of the preferred style name. 727 */ 728 void StyleSettings::SetPreferredSymbolsStyleName( const ::rtl::OUString &rName ) 729 { 730 if ( rName.getLength() > 0 ) 731 { 732 ::rtl::OUString rNameLowCase( rName.toAsciiLowerCase() ); 733 734 for( sal_uInt32 n = 0; n <= STYLE_SYMBOLS_THEMES_MAX; n++ ) 735 if ( rNameLowCase.indexOf( ImplSymbolsStyleToName( n ) ) != -1 ) 736 SetPreferredSymbolsStyle( n ); 737 } 738 } 739 740 // ----------------------------------------------------------------------- 741 742 sal_uLong StyleSettings::GetCurrentSymbolsStyle() const 743 { 744 // style selected in Tools -> Options... -> OpenOffice.org -> View 745 sal_uLong nStyle = GetSymbolsStyle(); 746 747 if ( nStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nStyle) ) ) 748 { 749 // the preferred style can be read from the desktop setting by the desktop native widgets modules 750 sal_uLong nPreferredStyle = GetPreferredSymbolsStyle(); 751 752 if ( nPreferredStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nPreferredStyle) ) ) 753 { 754 755 // use a hardcoded desktop-specific fallback if no preferred style has been detected 756 static bool sbFallbackDesktopChecked = false; 757 static sal_uLong snFallbackDesktopStyle = STYLE_SYMBOLS_DEFAULT; 758 759 if ( !sbFallbackDesktopChecked ) 760 { 761 snFallbackDesktopStyle = GetAutoSymbolsStyle(); 762 sbFallbackDesktopChecked = true; 763 } 764 765 nPreferredStyle = snFallbackDesktopStyle; 766 } 767 768 if (GetHighContrastMode() && CheckSymbolStyle (STYLE_SYMBOLS_HICONTRAST) ) 769 nStyle = STYLE_SYMBOLS_HICONTRAST; 770 else 771 nStyle = nPreferredStyle; 772 } 773 774 return nStyle; 775 } 776 777 // ----------------------------------------------------------------------- 778 779 sal_uLong StyleSettings::GetAutoSymbolsStyle() const 780 { 781 sal_uLong nRet = STYLE_SYMBOLS_DEFAULT; 782 bool bCont = true; 783 784 try 785 { 786 const ::com::sun::star::uno::Any aAny( ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::OPENSOURCECONTEXT ) ); 787 sal_Int32 nValue( 0 ); 788 789 aAny >>= nValue; 790 791 if( 0 == nValue ) 792 bCont = false; 793 } 794 catch ( ::com::sun::star::uno::Exception& ) 795 { 796 } 797 798 // falback to any existing style 799 if ( ! CheckSymbolStyle (nRet) ) 800 { 801 for ( sal_uLong n = 0 ; n <= STYLE_SYMBOLS_THEMES_MAX ; n++ ) 802 { 803 sal_uLong nStyleToCheck = n; 804 805 // auto is not a real theme => can't be fallback 806 if ( nStyleToCheck == STYLE_SYMBOLS_AUTO ) 807 continue; 808 809 // will check hicontrast in the end 810 if ( nStyleToCheck == STYLE_SYMBOLS_HICONTRAST ) 811 continue; 812 if ( nStyleToCheck == STYLE_SYMBOLS_THEMES_MAX ) 813 nStyleToCheck = STYLE_SYMBOLS_HICONTRAST; 814 815 if ( CheckSymbolStyle ( nStyleToCheck ) ) 816 { 817 nRet = nStyleToCheck; 818 n = STYLE_SYMBOLS_THEMES_MAX; 819 } 820 } 821 } 822 823 return nRet; 824 } 825 826 // ----------------------------------------------------------------------- 827 828 bool StyleSettings::CheckSymbolStyle( sal_uLong nStyle ) const 829 { 830 static ImplImageTreeSingletonRef aImageTree; 831 return aImageTree->checkStyle( ImplSymbolsStyleToName( nStyle ) ); 832 } 833 834 // ----------------------------------------------------------------------- 835 836 void StyleSettings::SetStandardStyles() 837 { 838 CopyData(); 839 mpData->SetStandardStyles(); 840 } 841 842 // ----------------------------------------------------------------------- 843 844 Color StyleSettings::GetFaceGradientColor() const 845 { 846 // compute a brighter face color that can be used in gradients 847 // for a convex look (eg toolbars) 848 849 sal_uInt16 h, s, b; 850 GetFaceColor().RGBtoHSB( h, s, b ); 851 if( s > 1) s=1; 852 if( b < 98) b=98; 853 return Color( Color::HSBtoRGB( h, s, b ) ); 854 } 855 856 // ----------------------------------------------------------------------- 857 858 Color StyleSettings::GetSeparatorColor() const 859 { 860 // compute a brighter shadow color for separators (used in toolbars or between menubar and toolbars on Windows XP) 861 sal_uInt16 h, s, b; 862 GetShadowColor().RGBtoHSB( h, s, b ); 863 b += b/4; 864 s -= s/4; 865 return Color( Color::HSBtoRGB( h, s, b ) ); 866 } 867 868 // ----------------------------------------------------------------------- 869 870 const StyleSettings& StyleSettings::operator =( const StyleSettings& rSet ) 871 { 872 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" ); 873 874 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 875 rSet.mpData->mnRefCount++; 876 877 // Daten loeschen, wenn letzte Referenz 878 if ( mpData->mnRefCount == 1 ) 879 delete mpData; 880 else 881 mpData->mnRefCount--; 882 883 mpData = rSet.mpData; 884 885 return *this; 886 } 887 888 // ----------------------------------------------------------------------- 889 890 void StyleSettings::CopyData() 891 { 892 // Falls noch andere Referenzen bestehen, dann kopieren 893 if ( mpData->mnRefCount != 1 ) 894 { 895 mpData->mnRefCount--; 896 mpData = new ImplStyleData( *mpData ); 897 } 898 } 899 900 // ----------------------------------------------------------------------- 901 902 inline sal_Bool ImplIsBackOrWhite( const Color& rColor ) 903 { 904 sal_uInt8 nLuminance = rColor.GetLuminance(); 905 return ( nLuminance < 8 ) || ( nLuminance > 250 ); 906 } 907 908 sal_Bool StyleSettings::IsHighContrastBlackAndWhite() const 909 { 910 sal_Bool bBWOnly = sal_True; 911 912 // Only use B&W if fully B&W, like on GNOME. 913 // Some colors like CheckedColor and HighlightColor are not B&W in Windows Standard HC Black, 914 // and we don't want to be B&W then, so check these color first, very probably not B&W. 915 916 // Unfortunately, GNOME uses a very very dark color (0x000033) instead of BLACK (0x000000) 917 918 if ( !ImplIsBackOrWhite( GetFaceColor() ) ) 919 bBWOnly = sal_False; 920 else if ( !ImplIsBackOrWhite( GetHighlightTextColor() ) ) 921 bBWOnly = sal_False; 922 else if ( !ImplIsBackOrWhite( GetWindowColor() ) ) 923 bBWOnly = sal_False; 924 else if ( !ImplIsBackOrWhite( GetWindowTextColor() ) ) 925 bBWOnly = sal_False; 926 else if ( !ImplIsBackOrWhite( GetButtonTextColor() ) ) 927 bBWOnly = sal_False; 928 else if ( !ImplIsBackOrWhite( GetButtonTextColor() ) ) 929 bBWOnly = sal_False; 930 else if ( !ImplIsBackOrWhite( GetGroupTextColor() ) ) 931 bBWOnly = sal_False; 932 else if ( !ImplIsBackOrWhite( GetLabelTextColor() ) ) 933 bBWOnly = sal_False; 934 else if ( !ImplIsBackOrWhite( GetDialogColor() ) ) 935 bBWOnly = sal_False; 936 else if ( !ImplIsBackOrWhite( GetFieldColor() ) ) 937 bBWOnly = sal_False; 938 else if ( !ImplIsBackOrWhite( GetMenuColor() ) ) 939 bBWOnly = sal_False; 940 else if ( !ImplIsBackOrWhite( GetMenuBarColor() ) ) 941 bBWOnly = sal_False; 942 else if ( !ImplIsBackOrWhite( GetMenuHighlightColor() ) ) 943 bBWOnly = sal_False; 944 945 return bBWOnly; 946 } 947 948 // ----------------------------------------------------------------------- 949 950 sal_Bool StyleSettings::operator ==( const StyleSettings& rSet ) const 951 { 952 if ( mpData == rSet.mpData ) 953 return sal_True; 954 955 if ( (mpData->mnOptions == rSet.mpData->mnOptions) && 956 (mpData->mnAutoMnemonic == rSet.mpData->mnAutoMnemonic) && 957 (mpData->mnLogoDisplayTime == rSet.mpData->mnLogoDisplayTime) && 958 (mpData->mnDragFullOptions == rSet.mpData->mnDragFullOptions) && 959 (mpData->mnAnimationOptions == rSet.mpData->mnAnimationOptions) && 960 (mpData->mnSelectionOptions == rSet.mpData->mnSelectionOptions) && 961 (mpData->mnDisplayOptions == rSet.mpData->mnDisplayOptions) && 962 (mpData->mnCursorSize == rSet.mpData->mnCursorSize) && 963 (mpData->mnCursorBlinkTime == rSet.mpData->mnCursorBlinkTime) && 964 (mpData->mnBorderSize == rSet.mpData->mnBorderSize) && 965 (mpData->mnTitleHeight == rSet.mpData->mnTitleHeight) && 966 (mpData->mnFloatTitleHeight == rSet.mpData->mnFloatTitleHeight) && 967 (mpData->mnTearOffTitleHeight == rSet.mpData->mnTearOffTitleHeight) && 968 (mpData->mnMenuBarHeight == rSet.mpData->mnMenuBarHeight) && 969 (mpData->mnScrollBarSize == rSet.mpData->mnScrollBarSize) && 970 (mpData->mnMinThumbSize == rSet.mpData->mnMinThumbSize) && 971 (mpData->mnSplitSize == rSet.mpData->mnSplitSize) && 972 (mpData->mnSpinSize == rSet.mpData->mnSpinSize) && 973 (mpData->mnIconHorzSpace == rSet.mpData->mnIconHorzSpace) && 974 (mpData->mnIconVertSpace == rSet.mpData->mnIconVertSpace) && 975 (mpData->mnAntialiasedMin == rSet.mpData->mnAntialiasedMin) && 976 (mpData->mnScreenZoom == rSet.mpData->mnScreenZoom) && 977 (mpData->mnScreenFontZoom == rSet.mpData->mnScreenFontZoom) && 978 (mpData->mnHighContrast == rSet.mpData->mnHighContrast) && 979 (mpData->mnUseSystemUIFonts == rSet.mpData->mnUseSystemUIFonts) && 980 (mpData->mnUseFlatBorders == rSet.mpData->mnUseFlatBorders) && 981 (mpData->mnUseFlatMenues == rSet.mpData->mnUseFlatMenues) && 982 (mpData->mnSymbolsStyle == rSet.mpData->mnSymbolsStyle) && 983 (mpData->mnPreferredSymbolsStyle == rSet.mpData->mnPreferredSymbolsStyle) && 984 (mpData->maFaceColor == rSet.mpData->maFaceColor) && 985 (mpData->maCheckedColor == rSet.mpData->maCheckedColor) && 986 (mpData->maLightColor == rSet.mpData->maLightColor) && 987 (mpData->maLightBorderColor == rSet.mpData->maLightBorderColor) && 988 (mpData->maShadowColor == rSet.mpData->maShadowColor) && 989 (mpData->maDarkShadowColor == rSet.mpData->maDarkShadowColor) && 990 (mpData->maButtonTextColor == rSet.mpData->maButtonTextColor) && 991 (mpData->maRadioCheckTextColor == rSet.mpData->maRadioCheckTextColor) && 992 (mpData->maGroupTextColor == rSet.mpData->maGroupTextColor) && 993 (mpData->maLabelTextColor == rSet.mpData->maLabelTextColor) && 994 (mpData->maInfoTextColor == rSet.mpData->maInfoTextColor) && 995 (mpData->maWindowColor == rSet.mpData->maWindowColor) && 996 (mpData->maWindowTextColor == rSet.mpData->maWindowTextColor) && 997 (mpData->maDialogColor == rSet.mpData->maDialogColor) && 998 (mpData->maDialogTextColor == rSet.mpData->maDialogTextColor) && 999 (mpData->maWorkspaceColor == rSet.mpData->maWorkspaceColor) && 1000 (mpData->maMonoColor == rSet.mpData->maMonoColor) && 1001 (mpData->maFieldColor == rSet.mpData->maFieldColor) && 1002 (mpData->maFieldTextColor == rSet.mpData->maFieldTextColor) && 1003 (mpData->maActiveColor == rSet.mpData->maActiveColor) && 1004 (mpData->maActiveColor2 == rSet.mpData->maActiveColor2) && 1005 (mpData->maActiveTextColor == rSet.mpData->maActiveTextColor) && 1006 (mpData->maActiveBorderColor == rSet.mpData->maActiveBorderColor) && 1007 (mpData->maDeactiveColor == rSet.mpData->maDeactiveColor) && 1008 (mpData->maDeactiveColor2 == rSet.mpData->maDeactiveColor2) && 1009 (mpData->maDeactiveTextColor == rSet.mpData->maDeactiveTextColor) && 1010 (mpData->maDeactiveBorderColor == rSet.mpData->maDeactiveBorderColor) && 1011 (mpData->maMenuColor == rSet.mpData->maMenuColor) && 1012 (mpData->maMenuBarColor == rSet.mpData->maMenuBarColor) && 1013 (mpData->maMenuBorderColor == rSet.mpData->maMenuBorderColor) && 1014 (mpData->maMenuTextColor == rSet.mpData->maMenuTextColor) && 1015 (mpData->maMenuBarTextColor == rSet.mpData->maMenuBarTextColor) && 1016 (mpData->maMenuHighlightColor == rSet.mpData->maMenuHighlightColor) && 1017 (mpData->maMenuHighlightTextColor == rSet.mpData->maMenuHighlightTextColor) && 1018 (mpData->maHighlightColor == rSet.mpData->maHighlightColor) && 1019 (mpData->maHighlightTextColor == rSet.mpData->maHighlightTextColor) && 1020 (mpData->maActiveTabColor == rSet.mpData->maActiveTabColor) && 1021 (mpData->maInactiveTabColor == rSet.mpData->maInactiveTabColor) && 1022 (mpData->maDisableColor == rSet.mpData->maDisableColor) && 1023 (mpData->maHelpColor == rSet.mpData->maHelpColor) && 1024 (mpData->maHelpTextColor == rSet.mpData->maHelpTextColor) && 1025 (mpData->maLinkColor == rSet.mpData->maLinkColor) && 1026 (mpData->maVisitedLinkColor == rSet.mpData->maVisitedLinkColor) && 1027 (mpData->maHighlightLinkColor == rSet.mpData->maHighlightLinkColor) && 1028 (mpData->maAppFont == rSet.mpData->maAppFont) && 1029 (mpData->maHelpFont == rSet.mpData->maHelpFont) && 1030 (mpData->maTitleFont == rSet.mpData->maTitleFont) && 1031 (mpData->maFloatTitleFont == rSet.mpData->maFloatTitleFont) && 1032 (mpData->maMenuFont == rSet.mpData->maMenuFont) && 1033 (mpData->maToolFont == rSet.mpData->maToolFont) && 1034 (mpData->maGroupFont == rSet.mpData->maGroupFont) && 1035 (mpData->maLabelFont == rSet.mpData->maLabelFont) && 1036 (mpData->maInfoFont == rSet.mpData->maInfoFont) && 1037 (mpData->maRadioCheckFont == rSet.mpData->maRadioCheckFont) && 1038 (mpData->maPushButtonFont == rSet.mpData->maPushButtonFont) && 1039 (mpData->maFieldFont == rSet.mpData->maFieldFont) && 1040 (mpData->maIconFont == rSet.mpData->maIconFont) && 1041 (mpData->mnUseImagesInMenus == rSet.mpData->mnUseImagesInMenus) && 1042 (mpData->mnSkipDisabledInMenus == rSet.mpData->mnSkipDisabledInMenus) && 1043 (mpData->maFontColor == rSet.mpData->maFontColor )) 1044 return sal_True; 1045 else 1046 return sal_False; 1047 } 1048 1049 // ======================================================================= 1050 1051 ImplMiscData::ImplMiscData() 1052 { 1053 mnRefCount = 1; 1054 mnEnableATT = sal::static_int_cast<sal_uInt16>(~0U); 1055 mnDisablePrinting = sal::static_int_cast<sal_uInt16>(~0U); 1056 static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI 1057 mbEnableLocalizedDecimalSep = (pEnv != NULL) ? sal_True : sal_False; 1058 } 1059 1060 // ----------------------------------------------------------------------- 1061 1062 ImplMiscData::ImplMiscData( const ImplMiscData& rData ) 1063 { 1064 mnRefCount = 1; 1065 mnEnableATT = rData.mnEnableATT; 1066 mnDisablePrinting = rData.mnDisablePrinting; 1067 mbEnableLocalizedDecimalSep = rData.mbEnableLocalizedDecimalSep; 1068 } 1069 1070 // ----------------------------------------------------------------------- 1071 1072 MiscSettings::MiscSettings() 1073 { 1074 mpData = new ImplMiscData(); 1075 } 1076 1077 // ----------------------------------------------------------------------- 1078 1079 MiscSettings::MiscSettings( const MiscSettings& rSet ) 1080 { 1081 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" ); 1082 1083 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1084 mpData = rSet.mpData; 1085 mpData->mnRefCount++; 1086 } 1087 1088 // ----------------------------------------------------------------------- 1089 1090 MiscSettings::~MiscSettings() 1091 { 1092 // Daten loeschen, wenn letzte Referenz 1093 if ( mpData->mnRefCount == 1 ) 1094 delete mpData; 1095 else 1096 mpData->mnRefCount--; 1097 } 1098 1099 // ----------------------------------------------------------------------- 1100 1101 const MiscSettings& MiscSettings::operator =( const MiscSettings& rSet ) 1102 { 1103 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" ); 1104 1105 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1106 rSet.mpData->mnRefCount++; 1107 1108 // Daten loeschen, wenn letzte Referenz 1109 if ( mpData->mnRefCount == 1 ) 1110 delete mpData; 1111 else 1112 mpData->mnRefCount--; 1113 1114 mpData = rSet.mpData; 1115 1116 return *this; 1117 } 1118 1119 // ----------------------------------------------------------------------- 1120 1121 void MiscSettings::CopyData() 1122 { 1123 // Falls noch andere Referenzen bestehen, dann kopieren 1124 if ( mpData->mnRefCount != 1 ) 1125 { 1126 mpData->mnRefCount--; 1127 mpData = new ImplMiscData( *mpData ); 1128 } 1129 } 1130 1131 // ----------------------------------------------------------------------- 1132 1133 sal_Bool MiscSettings::operator ==( const MiscSettings& rSet ) const 1134 { 1135 if ( mpData == rSet.mpData ) 1136 return sal_True; 1137 1138 if ( (mpData->mnEnableATT == rSet.mpData->mnEnableATT ) && 1139 (mpData->mnDisablePrinting == rSet.mpData->mnDisablePrinting ) && 1140 (mpData->mbEnableLocalizedDecimalSep == rSet.mpData->mbEnableLocalizedDecimalSep ) ) 1141 return sal_True; 1142 else 1143 return sal_False; 1144 } 1145 1146 // ----------------------------------------------------------------------- 1147 1148 sal_Bool MiscSettings::GetDisablePrinting() const 1149 { 1150 if( mpData->mnDisablePrinting == (sal_uInt16)~0 ) 1151 { 1152 rtl::OUString aEnable = 1153 vcl::SettingsConfigItem::get()-> 1154 getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DesktopManagement" ) ), 1155 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisablePrinting" ) ) ); 1156 mpData->mnDisablePrinting = aEnable.equalsIgnoreAsciiCaseAscii( "true" ) ? 1 : 0; 1157 } 1158 1159 return (sal_Bool)mpData->mnDisablePrinting; 1160 } 1161 // ----------------------------------------------------------------------- 1162 1163 sal_Bool MiscSettings::GetEnableATToolSupport() const 1164 { 1165 1166 #ifdef WNT 1167 if( mpData->mnEnableATT == (sal_uInt16)~0 ) 1168 { 1169 // Check in the Windows registry if an AT tool wants Accessibility support to 1170 // be activated .. 1171 HKEY hkey; 1172 1173 if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, 1174 "Software\\OpenOffice.org\\Accessibility\\AtToolSupport", 1175 &hkey) ) 1176 { 1177 DWORD dwType; 1178 sal_uInt8 Data[6]; // possible values: "true", "false", "1", "0", DWORD 1179 DWORD cbData = sizeof(Data); 1180 1181 if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology", 1182 NULL, &dwType, Data, &cbData) ) 1183 { 1184 switch (dwType) 1185 { 1186 case REG_SZ: 1187 mpData->mnEnableATT = ((0 == stricmp((const char *) Data, "1")) || (0 == stricmp((const char *) Data, "true"))); 1188 break; 1189 case REG_DWORD: 1190 mpData->mnEnableATT = (sal_uInt16) (((DWORD *) Data)[0]); 1191 break; 1192 default: 1193 // Unsupported registry type 1194 break; 1195 } 1196 } 1197 1198 RegCloseKey(hkey); 1199 } 1200 } 1201 #endif 1202 1203 if( mpData->mnEnableATT == (sal_uInt16)~0 ) 1204 { 1205 static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" ); 1206 if( !pEnv || !*pEnv ) 1207 { 1208 rtl::OUString aEnable = 1209 vcl::SettingsConfigItem::get()-> 1210 getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Accessibility" ) ), 1211 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EnableATToolSupport" ) ) ); 1212 mpData->mnEnableATT = aEnable.equalsIgnoreAsciiCaseAscii( "true" ) ? 1 : 0; 1213 } 1214 else 1215 { 1216 mpData->mnEnableATT = 1; 1217 } 1218 } 1219 1220 return (sal_Bool)mpData->mnEnableATT; 1221 } 1222 1223 // ----------------------------------------------------------------------- 1224 1225 void MiscSettings::SetDisablePrinting( sal_Bool bEnable ) 1226 { 1227 if ( bEnable != mpData->mnDisablePrinting ) 1228 { 1229 vcl::SettingsConfigItem::get()-> 1230 setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DesktopManagement" ) ), 1231 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisablePrinting" ) ), 1232 rtl::OUString::createFromAscii( bEnable ? "true" : "false" ) ); 1233 mpData->mnDisablePrinting = bEnable ? 1 : 0; 1234 } 1235 } 1236 1237 // ----------------------------------------------------------------------- 1238 1239 void MiscSettings::SetEnableATToolSupport( sal_Bool bEnable ) 1240 { 1241 if ( bEnable != mpData->mnEnableATT ) 1242 { 1243 sal_Bool bDummy; 1244 if( bEnable && !ImplInitAccessBridge(false, bDummy) ) 1245 return; 1246 1247 #ifdef WNT 1248 HKEY hkey; 1249 1250 // If the accessibility key in the Windows registry exists, change it synchronously 1251 if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, 1252 "Software\\OpenOffice.org\\Accessibility\\AtToolSupport", 1253 &hkey) ) 1254 { 1255 DWORD dwType; 1256 sal_uInt8 Data[6]; // possible values: "true", "false", 1, 0 1257 DWORD cbData = sizeof(Data); 1258 1259 if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology", 1260 NULL, &dwType, Data, &cbData) ) 1261 { 1262 switch (dwType) 1263 { 1264 case REG_SZ: 1265 RegSetValueEx(hkey, "SupportAssistiveTechnology", 1266 NULL, dwType, 1267 bEnable ? (sal_uInt8 *) "true" : (sal_uInt8 *) "false", 1268 bEnable ? sizeof("true") : sizeof("false")); 1269 break; 1270 case REG_DWORD: 1271 ((DWORD *) Data)[0] = bEnable ? 1 : 0; 1272 RegSetValueEx(hkey, "SupportAssistiveTechnology", 1273 NULL, dwType, Data, sizeof(DWORD)); 1274 break; 1275 default: 1276 // Unsupported registry type 1277 break; 1278 } 1279 } 1280 1281 RegCloseKey(hkey); 1282 } 1283 1284 #endif 1285 vcl::SettingsConfigItem::get()-> 1286 setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Accessibility" ) ), 1287 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EnableATToolSupport" ) ), 1288 rtl::OUString::createFromAscii( bEnable ? "true" : "false" ) ); 1289 mpData->mnEnableATT = bEnable ? 1 : 0; 1290 } 1291 } 1292 1293 void MiscSettings::SetEnableLocalizedDecimalSep( sal_Bool bEnable ) 1294 { 1295 CopyData(); 1296 mpData->mbEnableLocalizedDecimalSep = bEnable; 1297 } 1298 1299 sal_Bool MiscSettings::GetEnableLocalizedDecimalSep() const 1300 { 1301 return mpData->mbEnableLocalizedDecimalSep; 1302 } 1303 1304 // ======================================================================= 1305 1306 ImplNotificationData::ImplNotificationData() 1307 { 1308 mnRefCount = 1; 1309 mnOptions = 0; 1310 } 1311 1312 // ----------------------------------------------------------------------- 1313 1314 ImplNotificationData::ImplNotificationData( const ImplNotificationData& rData ) 1315 { 1316 mnRefCount = 1; 1317 mnOptions = rData.mnOptions; 1318 } 1319 1320 // ----------------------------------------------------------------------- 1321 1322 NotificationSettings::NotificationSettings() 1323 { 1324 mpData = new ImplNotificationData(); 1325 } 1326 1327 // ----------------------------------------------------------------------- 1328 1329 NotificationSettings::NotificationSettings( const NotificationSettings& rSet ) 1330 { 1331 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "NotificationSettings: RefCount overflow" ); 1332 1333 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1334 mpData = rSet.mpData; 1335 mpData->mnRefCount++; 1336 } 1337 1338 // ----------------------------------------------------------------------- 1339 1340 NotificationSettings::~NotificationSettings() 1341 { 1342 // Daten loeschen, wenn letzte Referenz 1343 if ( mpData->mnRefCount == 1 ) 1344 delete mpData; 1345 else 1346 mpData->mnRefCount--; 1347 } 1348 1349 // ----------------------------------------------------------------------- 1350 1351 const NotificationSettings& NotificationSettings::operator =( const NotificationSettings& rSet ) 1352 { 1353 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "NotificationSettings: RefCount overflow" ); 1354 1355 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1356 rSet.mpData->mnRefCount++; 1357 1358 // Daten loeschen, wenn letzte Referenz 1359 if ( mpData->mnRefCount == 1 ) 1360 delete mpData; 1361 else 1362 mpData->mnRefCount--; 1363 1364 mpData = rSet.mpData; 1365 1366 return *this; 1367 } 1368 1369 // ----------------------------------------------------------------------- 1370 1371 void NotificationSettings::CopyData() 1372 { 1373 // Falls noch andere Referenzen bestehen, dann kopieren 1374 if ( mpData->mnRefCount != 1 ) 1375 { 1376 mpData->mnRefCount--; 1377 mpData = new ImplNotificationData( *mpData ); 1378 } 1379 } 1380 1381 // ----------------------------------------------------------------------- 1382 1383 sal_Bool NotificationSettings::operator ==( const NotificationSettings& rSet ) const 1384 { 1385 if ( mpData == rSet.mpData ) 1386 return sal_True; 1387 1388 if ( (mpData->mnOptions == rSet.mpData->mnOptions) ) 1389 return sal_True; 1390 else 1391 return sal_False; 1392 } 1393 1394 // ======================================================================= 1395 1396 ImplHelpData::ImplHelpData() 1397 { 1398 mnRefCount = 1; 1399 mnOptions = 0; 1400 mnTipDelay = 500; 1401 mnTipTimeout = 3000; 1402 mnBalloonDelay = 1500; 1403 } 1404 1405 // ----------------------------------------------------------------------- 1406 1407 ImplHelpData::ImplHelpData( const ImplHelpData& rData ) 1408 { 1409 mnRefCount = 1; 1410 mnOptions = rData.mnOptions; 1411 mnTipDelay = rData.mnTipDelay; 1412 mnTipTimeout = rData.mnTipTimeout; 1413 mnBalloonDelay = rData.mnBalloonDelay; 1414 } 1415 1416 // ----------------------------------------------------------------------- 1417 1418 HelpSettings::HelpSettings() 1419 { 1420 mpData = new ImplHelpData(); 1421 } 1422 1423 // ----------------------------------------------------------------------- 1424 1425 HelpSettings::HelpSettings( const HelpSettings& rSet ) 1426 { 1427 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" ); 1428 1429 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1430 mpData = rSet.mpData; 1431 mpData->mnRefCount++; 1432 } 1433 1434 // ----------------------------------------------------------------------- 1435 1436 HelpSettings::~HelpSettings() 1437 { 1438 // Daten loeschen, wenn letzte Referenz 1439 if ( mpData->mnRefCount == 1 ) 1440 delete mpData; 1441 else 1442 mpData->mnRefCount--; 1443 } 1444 1445 // ----------------------------------------------------------------------- 1446 1447 const HelpSettings& HelpSettings::operator =( const HelpSettings& rSet ) 1448 { 1449 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" ); 1450 1451 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1452 rSet.mpData->mnRefCount++; 1453 1454 // Daten loeschen, wenn letzte Referenz 1455 if ( mpData->mnRefCount == 1 ) 1456 delete mpData; 1457 else 1458 mpData->mnRefCount--; 1459 1460 mpData = rSet.mpData; 1461 1462 return *this; 1463 } 1464 1465 // ----------------------------------------------------------------------- 1466 1467 void HelpSettings::CopyData() 1468 { 1469 // Falls noch andere Referenzen bestehen, dann kopieren 1470 if ( mpData->mnRefCount != 1 ) 1471 { 1472 mpData->mnRefCount--; 1473 mpData = new ImplHelpData( *mpData ); 1474 } 1475 } 1476 1477 // ----------------------------------------------------------------------- 1478 1479 sal_Bool HelpSettings::operator ==( const HelpSettings& rSet ) const 1480 { 1481 if ( mpData == rSet.mpData ) 1482 return sal_True; 1483 1484 if ( (mpData->mnOptions == rSet.mpData->mnOptions ) && 1485 (mpData->mnTipDelay == rSet.mpData->mnTipDelay ) && 1486 (mpData->mnTipTimeout == rSet.mpData->mnTipTimeout ) && 1487 (mpData->mnBalloonDelay == rSet.mpData->mnBalloonDelay ) ) 1488 return sal_True; 1489 else 1490 return sal_False; 1491 } 1492 1493 // ======================================================================= 1494 1495 ImplAllSettingsData::ImplAllSettingsData() 1496 { 1497 mnRefCount = 1; 1498 mnSystemUpdate = SETTINGS_ALLSETTINGS; 1499 mnWindowUpdate = SETTINGS_ALLSETTINGS; 1500 meLanguage = LANGUAGE_SYSTEM; 1501 meUILanguage = LANGUAGE_SYSTEM; 1502 mpLocaleDataWrapper = NULL; 1503 mpUILocaleDataWrapper = NULL; 1504 mpCollatorWrapper = NULL; 1505 mpUICollatorWrapper = NULL; 1506 mpI18nHelper = NULL; 1507 mpUII18nHelper = NULL; 1508 maMiscSettings.SetEnableLocalizedDecimalSep( maSysLocale.GetOptions().IsDecimalSeparatorAsLocale() ); 1509 } 1510 1511 // ----------------------------------------------------------------------- 1512 1513 ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) : 1514 maMouseSettings( rData.maMouseSettings ), 1515 maKeyboardSettings( rData.maKeyboardSettings ), 1516 maStyleSettings( rData.maStyleSettings ), 1517 maMiscSettings( rData.maMiscSettings ), 1518 maNotificationSettings( rData.maNotificationSettings ), 1519 maHelpSettings( rData.maHelpSettings ), 1520 maLocale( rData.maLocale ) 1521 { 1522 mnRefCount = 1; 1523 mnSystemUpdate = rData.mnSystemUpdate; 1524 mnWindowUpdate = rData.mnWindowUpdate; 1525 meLanguage = rData.meLanguage; 1526 // Pointer couldn't shared and objects haven't a copy ctor 1527 // So we create the cache objects new, if the GetFunction is 1528 // called 1529 mpLocaleDataWrapper = NULL; 1530 mpUILocaleDataWrapper = NULL; 1531 mpCollatorWrapper = NULL; 1532 mpUICollatorWrapper = NULL; 1533 mpI18nHelper = NULL; 1534 mpUII18nHelper = NULL; 1535 } 1536 1537 // ----------------------------------------------------------------------- 1538 1539 ImplAllSettingsData::~ImplAllSettingsData() 1540 { 1541 if ( mpLocaleDataWrapper ) 1542 delete mpLocaleDataWrapper; 1543 if ( mpUILocaleDataWrapper ) 1544 delete mpUILocaleDataWrapper; 1545 if ( mpCollatorWrapper ) 1546 delete mpCollatorWrapper; 1547 if ( mpUICollatorWrapper ) 1548 delete mpUICollatorWrapper; 1549 if ( mpI18nHelper ) 1550 delete mpI18nHelper; 1551 if ( mpUII18nHelper ) 1552 delete mpUII18nHelper; 1553 } 1554 1555 // ----------------------------------------------------------------------- 1556 1557 AllSettings::AllSettings() 1558 { 1559 DBG_CTOR( AllSettings, NULL ); 1560 1561 mpData = new ImplAllSettingsData(); 1562 } 1563 1564 // ----------------------------------------------------------------------- 1565 1566 AllSettings::AllSettings( const AllSettings& rSet ) 1567 { 1568 DBG_CTOR( AllSettings, NULL ); 1569 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "Settings: RefCount overflow" ); 1570 1571 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1572 mpData = rSet.mpData; 1573 mpData->mnRefCount++; 1574 } 1575 1576 // ----------------------------------------------------------------------- 1577 1578 AllSettings::~AllSettings() 1579 { 1580 DBG_DTOR( AllSettings, NULL ); 1581 1582 // Daten loeschen, wenn letzte Referenz 1583 if ( mpData->mnRefCount == 1 ) 1584 delete mpData; 1585 else 1586 mpData->mnRefCount--; 1587 } 1588 1589 // ----------------------------------------------------------------------- 1590 1591 const AllSettings& AllSettings::operator =( const AllSettings& rSet ) 1592 { 1593 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "AllSettings: RefCount overflow" ); 1594 DBG_CHKTHIS( AllSettings, NULL ); 1595 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1596 1597 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1598 rSet.mpData->mnRefCount++; 1599 1600 // Daten loeschen, wenn letzte Referenz 1601 if ( mpData->mnRefCount == 1 ) 1602 delete mpData; 1603 else 1604 mpData->mnRefCount--; 1605 1606 mpData = rSet.mpData; 1607 1608 return *this; 1609 } 1610 1611 // ----------------------------------------------------------------------- 1612 1613 void AllSettings::CopyData() 1614 { 1615 DBG_CHKTHIS( AllSettings, NULL ); 1616 1617 // Falls noch andere Referenzen bestehen, dann kopieren 1618 if ( mpData->mnRefCount != 1 ) 1619 { 1620 mpData->mnRefCount--; 1621 mpData = new ImplAllSettingsData( *mpData ); 1622 } 1623 } 1624 1625 // ----------------------------------------------------------------------- 1626 1627 sal_uLong AllSettings::Update( sal_uLong nFlags, const AllSettings& rSet ) 1628 { 1629 DBG_CHKTHIS( AllSettings, NULL ); 1630 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1631 1632 sal_uLong nChangeFlags = 0; 1633 1634 if ( nFlags & SETTINGS_MACHINE ) 1635 { 1636 if ( mpData->maMachineSettings != rSet.mpData->maMachineSettings ) 1637 { 1638 CopyData(); 1639 mpData->maMachineSettings = rSet.mpData->maMachineSettings; 1640 nChangeFlags |= SETTINGS_MACHINE; 1641 } 1642 } 1643 1644 if ( nFlags & SETTINGS_MOUSE ) 1645 { 1646 if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings ) 1647 { 1648 CopyData(); 1649 mpData->maMouseSettings = rSet.mpData->maMouseSettings; 1650 nChangeFlags |= SETTINGS_MOUSE; 1651 } 1652 } 1653 1654 if ( nFlags & SETTINGS_KEYBOARD ) 1655 { 1656 if ( mpData->maKeyboardSettings != rSet.mpData->maKeyboardSettings ) 1657 { 1658 CopyData(); 1659 mpData->maKeyboardSettings = rSet.mpData->maKeyboardSettings; 1660 nChangeFlags |= SETTINGS_KEYBOARD; 1661 } 1662 } 1663 1664 if ( nFlags & SETTINGS_STYLE ) 1665 { 1666 if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings ) 1667 { 1668 CopyData(); 1669 mpData->maStyleSettings = rSet.mpData->maStyleSettings; 1670 nChangeFlags |= SETTINGS_STYLE; 1671 } 1672 } 1673 1674 if ( nFlags & SETTINGS_MISC ) 1675 { 1676 if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings ) 1677 { 1678 CopyData(); 1679 mpData->maMiscSettings = rSet.mpData->maMiscSettings; 1680 nChangeFlags |= SETTINGS_MISC; 1681 } 1682 } 1683 1684 if ( nFlags & SETTINGS_NOTIFICATION ) 1685 { 1686 if ( mpData->maNotificationSettings != rSet.mpData->maNotificationSettings ) 1687 { 1688 CopyData(); 1689 mpData->maNotificationSettings = rSet.mpData->maNotificationSettings; 1690 nChangeFlags |= SETTINGS_NOTIFICATION; 1691 } 1692 } 1693 1694 if ( nFlags & SETTINGS_HELP ) 1695 { 1696 if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings ) 1697 { 1698 CopyData(); 1699 mpData->maHelpSettings = rSet.mpData->maHelpSettings; 1700 nChangeFlags |= SETTINGS_HELP; 1701 } 1702 } 1703 1704 if ( nFlags & SETTINGS_INTERNATIONAL ) 1705 { 1706 // Nothing, class International is gone. 1707 DBG_ERRORFILE("AllSettings::Update: who calls with SETTINGS_INTERNATIONAL and why? You're flogging a dead horse."); 1708 } 1709 1710 if ( nFlags & SETTINGS_LOCALE ) 1711 { 1712 if ( mpData->meLanguage || rSet.mpData->meLanguage ) 1713 { 1714 SetLanguage( rSet.mpData->meLanguage ); 1715 nChangeFlags |= SETTINGS_LOCALE; 1716 } 1717 } 1718 1719 if ( nFlags & SETTINGS_UILOCALE ) 1720 { 1721 // UILocale can't be changed 1722 } 1723 1724 return nChangeFlags; 1725 } 1726 1727 // ----------------------------------------------------------------------- 1728 1729 sal_uLong AllSettings::GetChangeFlags( const AllSettings& rSet ) const 1730 { 1731 DBG_CHKTHIS( AllSettings, NULL ); 1732 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1733 1734 sal_uLong nChangeFlags = 0; 1735 1736 if ( mpData->maMachineSettings != rSet.mpData->maMachineSettings ) 1737 nChangeFlags |= SETTINGS_MACHINE; 1738 1739 if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings ) 1740 nChangeFlags |= SETTINGS_MOUSE; 1741 1742 if ( mpData->maKeyboardSettings != rSet.mpData->maKeyboardSettings ) 1743 nChangeFlags |= SETTINGS_KEYBOARD; 1744 1745 if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings ) 1746 nChangeFlags |= SETTINGS_STYLE; 1747 1748 if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings ) 1749 nChangeFlags |= SETTINGS_MISC; 1750 1751 if ( mpData->maNotificationSettings != rSet.mpData->maNotificationSettings ) 1752 nChangeFlags |= SETTINGS_NOTIFICATION; 1753 1754 if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings ) 1755 nChangeFlags |= SETTINGS_HELP; 1756 1757 if ( mpData->meLanguage || rSet.mpData->meLanguage ) 1758 nChangeFlags |= SETTINGS_LOCALE; 1759 1760 return nChangeFlags; 1761 } 1762 1763 // ----------------------------------------------------------------------- 1764 1765 sal_Bool AllSettings::operator ==( const AllSettings& rSet ) const 1766 { 1767 DBG_CHKTHIS( AllSettings, NULL ); 1768 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1769 1770 if ( mpData == rSet.mpData ) 1771 return sal_True; 1772 1773 if ( (mpData->maMachineSettings == rSet.mpData->maMachineSettings) && 1774 (mpData->maMouseSettings == rSet.mpData->maMouseSettings) && 1775 (mpData->maKeyboardSettings == rSet.mpData->maKeyboardSettings) && 1776 (mpData->maStyleSettings == rSet.mpData->maStyleSettings) && 1777 (mpData->maMiscSettings == rSet.mpData->maMiscSettings) && 1778 (mpData->maNotificationSettings == rSet.mpData->maNotificationSettings) && 1779 (mpData->maHelpSettings == rSet.mpData->maHelpSettings) && 1780 (mpData->mnSystemUpdate == rSet.mpData->mnSystemUpdate) && 1781 (mpData->maLocale == rSet.mpData->maLocale) && 1782 (mpData->mnWindowUpdate == rSet.mpData->mnWindowUpdate) ) 1783 { 1784 return sal_True; 1785 } 1786 else 1787 return sal_False; 1788 } 1789 1790 // ----------------------------------------------------------------------- 1791 1792 void AllSettings::SetLocale( const ::com::sun::star::lang::Locale& rLocale ) 1793 { 1794 CopyData(); 1795 1796 mpData->maLocale = rLocale; 1797 1798 if ( !rLocale.Language.getLength() ) 1799 mpData->meLanguage = LANGUAGE_SYSTEM; 1800 else 1801 mpData->meLanguage = MsLangId::convertLocaleToLanguage( rLocale ); 1802 if ( mpData->mpLocaleDataWrapper ) 1803 { 1804 delete mpData->mpLocaleDataWrapper; 1805 mpData->mpLocaleDataWrapper = NULL; 1806 } 1807 if ( mpData->mpI18nHelper ) 1808 { 1809 delete mpData->mpI18nHelper; 1810 mpData->mpI18nHelper = NULL; 1811 } 1812 } 1813 1814 // ----------------------------------------------------------------------- 1815 1816 void AllSettings::SetUILocale( const ::com::sun::star::lang::Locale& ) 1817 { 1818 // there is only one UILocale per process 1819 } 1820 1821 // ----------------------------------------------------------------------- 1822 1823 void AllSettings::SetLanguage( LanguageType eLang ) 1824 { 1825 if ( eLang != mpData->meLanguage ) 1826 { 1827 CopyData(); 1828 1829 mpData->meLanguage = eLang; 1830 MsLangId::convertLanguageToLocale( GetLanguage(), ((AllSettings*)this)->mpData->maLocale ); 1831 if ( mpData->mpLocaleDataWrapper ) 1832 { 1833 delete mpData->mpLocaleDataWrapper; 1834 mpData->mpLocaleDataWrapper = NULL; 1835 } 1836 if ( mpData->mpI18nHelper ) 1837 { 1838 delete mpData->mpI18nHelper; 1839 mpData->mpI18nHelper = NULL; 1840 } 1841 } 1842 } 1843 1844 // ----------------------------------------------------------------------- 1845 1846 void AllSettings::SetUILanguage( LanguageType ) 1847 { 1848 // there is only one UILanguage per process 1849 } 1850 1851 // ----------------------------------------------------------------------- 1852 1853 sal_Bool AllSettings::GetLayoutRTL() const 1854 { 1855 static const char* pEnv = getenv("SAL_RTL_ENABLED" ); 1856 static int nUIMirroring = -1; // -1: undef, 0: auto, 1: on 2: off 1857 1858 // environment always overrides 1859 if( pEnv ) 1860 return true; 1861 1862 sal_Bool bRTL = sal_False; 1863 1864 if( nUIMirroring == -1 ) 1865 { 1866 nUIMirroring = 0; // ask configuration only once 1867 utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithServiceFactory( 1868 vcl::unohelper::GetMultiServiceFactory(), 1869 OUString::createFromAscii( "org.openoffice.Office.Common/I18N/CTL" ) ); // note: case sensisitive ! 1870 if ( aNode.isValid() ) 1871 { 1872 sal_Bool bTmp = sal_Bool(); 1873 ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString::createFromAscii( "UIMirroring" ) ); 1874 if( aValue >>= bTmp ) 1875 { 1876 // found true or false; if it was nil, nothing is changed 1877 nUIMirroring = bTmp ? 1 : 2; 1878 } 1879 } 1880 } 1881 1882 if( nUIMirroring == 0 ) // no config found (eg, setup) or default (nil) was set: check language 1883 { 1884 LanguageType aLang = LANGUAGE_DONTKNOW; 1885 ImplSVData* pSVData = ImplGetSVData(); 1886 if ( pSVData->maAppData.mpSettings ) 1887 aLang = pSVData->maAppData.mpSettings->GetUILanguage(); 1888 bRTL = MsLangId::isRightToLeft( aLang ); 1889 } 1890 else 1891 bRTL = (nUIMirroring == 1); 1892 1893 return bRTL; 1894 } 1895 1896 // ----------------------------------------------------------------------- 1897 1898 const ::com::sun::star::lang::Locale& AllSettings::GetLocale() const 1899 { 1900 if ( !mpData->maLocale.Language.getLength() ) 1901 mpData->maLocale = mpData->maSysLocale.GetLocale(); 1902 1903 return mpData->maLocale; 1904 } 1905 1906 // ----------------------------------------------------------------------- 1907 1908 const ::com::sun::star::lang::Locale& AllSettings::GetUILocale() const 1909 { 1910 // the UILocale is never changed 1911 if ( !mpData->maUILocale.Language.getLength() ) 1912 mpData->maUILocale = mpData->maSysLocale.GetUILocale(); 1913 1914 return mpData->maUILocale; 1915 } 1916 1917 // ----------------------------------------------------------------------- 1918 1919 LanguageType AllSettings::GetLanguage() const 1920 { 1921 // meLanguage == LANGUAGE_SYSTEM means: use settings from SvtSysLocale 1922 if ( mpData->meLanguage == LANGUAGE_SYSTEM ) 1923 return mpData->maSysLocale.GetLanguage(); 1924 1925 return mpData->meLanguage; 1926 } 1927 1928 // ----------------------------------------------------------------------- 1929 1930 LanguageType AllSettings::GetUILanguage() const 1931 { 1932 // the UILanguage is never changed 1933 return mpData->maSysLocale.GetUILanguage(); 1934 } 1935 1936 // ----------------------------------------------------------------------- 1937 1938 const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const 1939 { 1940 if ( !mpData->mpLocaleDataWrapper ) 1941 ((AllSettings*)this)->mpData->mpLocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetLocale() ); 1942 return *mpData->mpLocaleDataWrapper; 1943 } 1944 1945 // ----------------------------------------------------------------------- 1946 1947 const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const 1948 { 1949 if ( !mpData->mpUILocaleDataWrapper ) 1950 ((AllSettings*)this)->mpData->mpUILocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetUILocale() ); 1951 return *mpData->mpUILocaleDataWrapper; 1952 } 1953 1954 // ----------------------------------------------------------------------- 1955 1956 const vcl::I18nHelper& AllSettings::GetLocaleI18nHelper() const 1957 { 1958 if ( !mpData->mpI18nHelper ) { 1959 ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> aFactory(vcl::unohelper::GetMultiServiceFactory()); 1960 ((AllSettings*)this)->mpData->mpI18nHelper = new vcl::I18nHelper( aFactory, GetLocale() ); 1961 } 1962 return *mpData->mpI18nHelper; 1963 } 1964 1965 // ----------------------------------------------------------------------- 1966 1967 const vcl::I18nHelper& AllSettings::GetUILocaleI18nHelper() const 1968 { 1969 if ( !mpData->mpUII18nHelper ) { 1970 ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> aFactory(vcl::unohelper::GetMultiServiceFactory()); 1971 ((AllSettings*)this)->mpData->mpUII18nHelper = new vcl::I18nHelper( aFactory, GetUILocale() ); 1972 } 1973 return *mpData->mpUII18nHelper; 1974 } 1975 1976 1977 // ----------------------------------------------------------------------- 1978 /* 1979 const CollatorWrapper& AllSettings::GetCollatorWrapper() const 1980 { 1981 if ( !mpData->mpCollatorWrapper ) 1982 { 1983 ((AllSettings*)this)->mpData->mpCollatorWrapper = new CollatorWrapper( vcl::unohelper::GetMultiServiceFactory() ); 1984 ((AllSettings*)this)->mpData->mpCollatorWrapper->loadDefaultCollator( GetLocale(), 0 ); 1985 } 1986 return *mpData->mpCollatorWrapper; 1987 } 1988 */ 1989 // ----------------------------------------------------------------------- 1990 /* 1991 const CollatorWrapper& AllSettings::GetUICollatorWrapper() const 1992 { 1993 if ( !mpData->mpUICollatorWrapper ) 1994 { 1995 ((AllSettings*)this)->mpData->mpUICollatorWrapper = new CollatorWrapper( vcl::unohelper::GetMultiServiceFactory() ); 1996 ((AllSettings*)this)->mpData->mpUICollatorWrapper->loadDefaultCollator( GetUILocale(), 0 ); 1997 } 1998 return *mpData->mpUICollatorWrapper; 1999 } 2000 */ 2001 2002 void AllSettings::LocaleSettingsChanged( sal_uInt32 nHint ) 2003 { 2004 AllSettings aAllSettings( Application::GetSettings() ); 2005 if ( nHint & SYSLOCALEOPTIONS_HINT_DECSEP ) 2006 { 2007 MiscSettings aMiscSettings = aAllSettings.GetMiscSettings(); 2008 sal_Bool bIsDecSepAsLocale = aAllSettings.mpData->maSysLocale.GetOptions().IsDecimalSeparatorAsLocale(); 2009 if ( aMiscSettings.GetEnableLocalizedDecimalSep() != bIsDecSepAsLocale ) 2010 { 2011 aMiscSettings.SetEnableLocalizedDecimalSep( bIsDecSepAsLocale ); 2012 aAllSettings.SetMiscSettings( aMiscSettings ); 2013 } 2014 } 2015 2016 if ( (nHint & SYSLOCALEOPTIONS_HINT_LOCALE) ) 2017 aAllSettings.SetLocale( aAllSettings.mpData->maSysLocale.GetOptions().GetLocale() ); 2018 2019 Application::SetSettings( aAllSettings ); 2020 } 2021