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_TANGO: return ::rtl::OUString::createFromAscii( "tango" ); 699 case STYLE_SYMBOLS_CLASSIC: return ::rtl::OUString::createFromAscii( "classic" ); 700 } 701 702 return ::rtl::OUString::createFromAscii( "auto" ); 703 } 704 705 // ----------------------------------------------------------------------- 706 707 sal_uLong StyleSettings::ImplNameToSymbolsStyle( const ::rtl::OUString &rName ) const 708 { 709 if ( rName == ::rtl::OUString::createFromAscii( "default" ) ) 710 return STYLE_SYMBOLS_DEFAULT; 711 else if ( rName == ::rtl::OUString::createFromAscii( "hicontrast" ) ) 712 return STYLE_SYMBOLS_HICONTRAST; 713 else if ( rName == ::rtl::OUString::createFromAscii( "industrial" ) ) 714 return STYLE_SYMBOLS_INDUSTRIAL; 715 else if ( rName == ::rtl::OUString::createFromAscii( "tango" ) ) 716 return STYLE_SYMBOLS_TANGO; 717 else if ( rName == ::rtl::OUString::createFromAscii( "classic" ) ) 718 return STYLE_SYMBOLS_CLASSIC; 719 720 return STYLE_SYMBOLS_AUTO; 721 } 722 723 // ----------------------------------------------------------------------- 724 725 /** 726 The preferred style name can be read from the desktop setting. We 727 need to find the closest theme name registered in OOo. Therefore 728 we check if any registered style name is a case-insensitive 729 substring of the preferred style name. 730 */ 731 void StyleSettings::SetPreferredSymbolsStyleName( const ::rtl::OUString &rName ) 732 { 733 if ( rName.getLength() > 0 ) 734 { 735 ::rtl::OUString rNameLowCase( rName.toAsciiLowerCase() ); 736 737 for( sal_uInt32 n = 0; n <= STYLE_SYMBOLS_THEMES_MAX; n++ ) 738 if ( rNameLowCase.indexOf( ImplSymbolsStyleToName( n ) ) != -1 ) 739 SetPreferredSymbolsStyle( n ); 740 } 741 } 742 743 // ----------------------------------------------------------------------- 744 745 sal_uLong StyleSettings::GetCurrentSymbolsStyle() const 746 { 747 // style selected in Tools -> Options... -> OpenOffice.org -> View 748 sal_uLong nStyle = GetSymbolsStyle(); 749 750 if ( nStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nStyle) ) ) 751 { 752 // the preferred style can be read from the desktop setting by the desktop native widgets modules 753 sal_uLong nPreferredStyle = GetPreferredSymbolsStyle(); 754 755 if ( nPreferredStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nPreferredStyle) ) ) 756 { 757 758 // use a hardcoded desktop-specific fallback if no preferred style has been detected 759 static bool sbFallbackDesktopChecked = false; 760 static sal_uLong snFallbackDesktopStyle = STYLE_SYMBOLS_DEFAULT; 761 762 if ( !sbFallbackDesktopChecked ) 763 { 764 snFallbackDesktopStyle = GetAutoSymbolsStyle(); 765 sbFallbackDesktopChecked = true; 766 } 767 768 nPreferredStyle = snFallbackDesktopStyle; 769 } 770 771 if (GetHighContrastMode() && CheckSymbolStyle (STYLE_SYMBOLS_HICONTRAST) ) 772 nStyle = STYLE_SYMBOLS_HICONTRAST; 773 else 774 nStyle = nPreferredStyle; 775 } 776 777 return nStyle; 778 } 779 780 // ----------------------------------------------------------------------- 781 782 sal_uLong StyleSettings::GetAutoSymbolsStyle() const 783 { 784 const ::rtl::OUString& rDesktopEnvironment = Application::GetDesktopEnvironment(); 785 sal_uLong nRet = STYLE_SYMBOLS_DEFAULT; 786 bool bCont = true; 787 788 try 789 { 790 const ::com::sun::star::uno::Any aAny( ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::OPENSOURCECONTEXT ) ); 791 sal_Int32 nValue( 0 ); 792 793 aAny >>= nValue; 794 795 if( 0 == nValue ) 796 bCont = false; 797 } 798 catch ( ::com::sun::star::uno::Exception& ) 799 { 800 } 801 802 if( bCont ) 803 { 804 if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "gnome" ) ) 805 nRet = STYLE_SYMBOLS_TANGO; 806 } 807 808 // falback to any existing style 809 if ( ! CheckSymbolStyle (nRet) ) 810 { 811 for ( sal_uLong n = 0 ; n <= STYLE_SYMBOLS_THEMES_MAX ; n++ ) 812 { 813 sal_uLong nStyleToCheck = n; 814 815 // auto is not a real theme => can't be fallback 816 if ( nStyleToCheck == STYLE_SYMBOLS_AUTO ) 817 continue; 818 819 // will check hicontrast in the end 820 if ( nStyleToCheck == STYLE_SYMBOLS_HICONTRAST ) 821 continue; 822 if ( nStyleToCheck == STYLE_SYMBOLS_THEMES_MAX ) 823 nStyleToCheck = STYLE_SYMBOLS_HICONTRAST; 824 825 if ( CheckSymbolStyle ( nStyleToCheck ) ) 826 { 827 nRet = nStyleToCheck; 828 n = STYLE_SYMBOLS_THEMES_MAX; 829 } 830 } 831 } 832 833 return nRet; 834 } 835 836 // ----------------------------------------------------------------------- 837 838 bool StyleSettings::CheckSymbolStyle( sal_uLong nStyle ) const 839 { 840 static ImplImageTreeSingletonRef aImageTree; 841 return aImageTree->checkStyle( ImplSymbolsStyleToName( nStyle ) ); 842 } 843 844 // ----------------------------------------------------------------------- 845 846 void StyleSettings::SetStandardStyles() 847 { 848 CopyData(); 849 mpData->SetStandardStyles(); 850 } 851 852 // ----------------------------------------------------------------------- 853 854 Color StyleSettings::GetFaceGradientColor() const 855 { 856 // compute a brighter face color that can be used in gradients 857 // for a convex look (eg toolbars) 858 859 sal_uInt16 h, s, b; 860 GetFaceColor().RGBtoHSB( h, s, b ); 861 if( s > 1) s=1; 862 if( b < 98) b=98; 863 return Color( Color::HSBtoRGB( h, s, b ) ); 864 } 865 866 // ----------------------------------------------------------------------- 867 868 Color StyleSettings::GetSeparatorColor() const 869 { 870 // compute a brighter shadow color for separators (used in toolbars or between menubar and toolbars on Windows XP) 871 sal_uInt16 h, s, b; 872 GetShadowColor().RGBtoHSB( h, s, b ); 873 b += b/4; 874 s -= s/4; 875 return Color( Color::HSBtoRGB( h, s, b ) ); 876 } 877 878 // ----------------------------------------------------------------------- 879 880 const StyleSettings& StyleSettings::operator =( const StyleSettings& rSet ) 881 { 882 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" ); 883 884 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 885 rSet.mpData->mnRefCount++; 886 887 // Daten loeschen, wenn letzte Referenz 888 if ( mpData->mnRefCount == 1 ) 889 delete mpData; 890 else 891 mpData->mnRefCount--; 892 893 mpData = rSet.mpData; 894 895 return *this; 896 } 897 898 // ----------------------------------------------------------------------- 899 900 void StyleSettings::CopyData() 901 { 902 // Falls noch andere Referenzen bestehen, dann kopieren 903 if ( mpData->mnRefCount != 1 ) 904 { 905 mpData->mnRefCount--; 906 mpData = new ImplStyleData( *mpData ); 907 } 908 } 909 910 // ----------------------------------------------------------------------- 911 912 inline sal_Bool ImplIsBackOrWhite( const Color& rColor ) 913 { 914 sal_uInt8 nLuminance = rColor.GetLuminance(); 915 return ( nLuminance < 8 ) || ( nLuminance > 250 ); 916 } 917 918 sal_Bool StyleSettings::IsHighContrastBlackAndWhite() const 919 { 920 sal_Bool bBWOnly = sal_True; 921 922 // Only use B&W if fully B&W, like on GNOME. 923 // Some colors like CheckedColor and HighlightColor are not B&W in Windows Standard HC Black, 924 // and we don't want to be B&W then, so check these color first, very probably not B&W. 925 926 // Unfortunately, GNOME uses a very very dark color (0x000033) instead of BLACK (0x000000) 927 928 if ( !ImplIsBackOrWhite( GetFaceColor() ) ) 929 bBWOnly = sal_False; 930 else if ( !ImplIsBackOrWhite( GetHighlightTextColor() ) ) 931 bBWOnly = sal_False; 932 else if ( !ImplIsBackOrWhite( GetWindowColor() ) ) 933 bBWOnly = sal_False; 934 else if ( !ImplIsBackOrWhite( GetWindowTextColor() ) ) 935 bBWOnly = sal_False; 936 else if ( !ImplIsBackOrWhite( GetButtonTextColor() ) ) 937 bBWOnly = sal_False; 938 else if ( !ImplIsBackOrWhite( GetButtonTextColor() ) ) 939 bBWOnly = sal_False; 940 else if ( !ImplIsBackOrWhite( GetGroupTextColor() ) ) 941 bBWOnly = sal_False; 942 else if ( !ImplIsBackOrWhite( GetLabelTextColor() ) ) 943 bBWOnly = sal_False; 944 else if ( !ImplIsBackOrWhite( GetDialogColor() ) ) 945 bBWOnly = sal_False; 946 else if ( !ImplIsBackOrWhite( GetFieldColor() ) ) 947 bBWOnly = sal_False; 948 else if ( !ImplIsBackOrWhite( GetMenuColor() ) ) 949 bBWOnly = sal_False; 950 else if ( !ImplIsBackOrWhite( GetMenuBarColor() ) ) 951 bBWOnly = sal_False; 952 else if ( !ImplIsBackOrWhite( GetMenuHighlightColor() ) ) 953 bBWOnly = sal_False; 954 955 return bBWOnly; 956 } 957 958 // ----------------------------------------------------------------------- 959 960 sal_Bool StyleSettings::operator ==( const StyleSettings& rSet ) const 961 { 962 if ( mpData == rSet.mpData ) 963 return sal_True; 964 965 if ( (mpData->mnOptions == rSet.mpData->mnOptions) && 966 (mpData->mnAutoMnemonic == rSet.mpData->mnAutoMnemonic) && 967 (mpData->mnLogoDisplayTime == rSet.mpData->mnLogoDisplayTime) && 968 (mpData->mnDragFullOptions == rSet.mpData->mnDragFullOptions) && 969 (mpData->mnAnimationOptions == rSet.mpData->mnAnimationOptions) && 970 (mpData->mnSelectionOptions == rSet.mpData->mnSelectionOptions) && 971 (mpData->mnDisplayOptions == rSet.mpData->mnDisplayOptions) && 972 (mpData->mnCursorSize == rSet.mpData->mnCursorSize) && 973 (mpData->mnCursorBlinkTime == rSet.mpData->mnCursorBlinkTime) && 974 (mpData->mnBorderSize == rSet.mpData->mnBorderSize) && 975 (mpData->mnTitleHeight == rSet.mpData->mnTitleHeight) && 976 (mpData->mnFloatTitleHeight == rSet.mpData->mnFloatTitleHeight) && 977 (mpData->mnTearOffTitleHeight == rSet.mpData->mnTearOffTitleHeight) && 978 (mpData->mnMenuBarHeight == rSet.mpData->mnMenuBarHeight) && 979 (mpData->mnScrollBarSize == rSet.mpData->mnScrollBarSize) && 980 (mpData->mnMinThumbSize == rSet.mpData->mnMinThumbSize) && 981 (mpData->mnSplitSize == rSet.mpData->mnSplitSize) && 982 (mpData->mnSpinSize == rSet.mpData->mnSpinSize) && 983 (mpData->mnIconHorzSpace == rSet.mpData->mnIconHorzSpace) && 984 (mpData->mnIconVertSpace == rSet.mpData->mnIconVertSpace) && 985 (mpData->mnAntialiasedMin == rSet.mpData->mnAntialiasedMin) && 986 (mpData->mnScreenZoom == rSet.mpData->mnScreenZoom) && 987 (mpData->mnScreenFontZoom == rSet.mpData->mnScreenFontZoom) && 988 (mpData->mnHighContrast == rSet.mpData->mnHighContrast) && 989 (mpData->mnUseSystemUIFonts == rSet.mpData->mnUseSystemUIFonts) && 990 (mpData->mnUseFlatBorders == rSet.mpData->mnUseFlatBorders) && 991 (mpData->mnUseFlatMenues == rSet.mpData->mnUseFlatMenues) && 992 (mpData->mnSymbolsStyle == rSet.mpData->mnSymbolsStyle) && 993 (mpData->mnPreferredSymbolsStyle == rSet.mpData->mnPreferredSymbolsStyle) && 994 (mpData->maFaceColor == rSet.mpData->maFaceColor) && 995 (mpData->maCheckedColor == rSet.mpData->maCheckedColor) && 996 (mpData->maLightColor == rSet.mpData->maLightColor) && 997 (mpData->maLightBorderColor == rSet.mpData->maLightBorderColor) && 998 (mpData->maShadowColor == rSet.mpData->maShadowColor) && 999 (mpData->maDarkShadowColor == rSet.mpData->maDarkShadowColor) && 1000 (mpData->maButtonTextColor == rSet.mpData->maButtonTextColor) && 1001 (mpData->maRadioCheckTextColor == rSet.mpData->maRadioCheckTextColor) && 1002 (mpData->maGroupTextColor == rSet.mpData->maGroupTextColor) && 1003 (mpData->maLabelTextColor == rSet.mpData->maLabelTextColor) && 1004 (mpData->maInfoTextColor == rSet.mpData->maInfoTextColor) && 1005 (mpData->maWindowColor == rSet.mpData->maWindowColor) && 1006 (mpData->maWindowTextColor == rSet.mpData->maWindowTextColor) && 1007 (mpData->maDialogColor == rSet.mpData->maDialogColor) && 1008 (mpData->maDialogTextColor == rSet.mpData->maDialogTextColor) && 1009 (mpData->maWorkspaceColor == rSet.mpData->maWorkspaceColor) && 1010 (mpData->maMonoColor == rSet.mpData->maMonoColor) && 1011 (mpData->maFieldColor == rSet.mpData->maFieldColor) && 1012 (mpData->maFieldTextColor == rSet.mpData->maFieldTextColor) && 1013 (mpData->maActiveColor == rSet.mpData->maActiveColor) && 1014 (mpData->maActiveColor2 == rSet.mpData->maActiveColor2) && 1015 (mpData->maActiveTextColor == rSet.mpData->maActiveTextColor) && 1016 (mpData->maActiveBorderColor == rSet.mpData->maActiveBorderColor) && 1017 (mpData->maDeactiveColor == rSet.mpData->maDeactiveColor) && 1018 (mpData->maDeactiveColor2 == rSet.mpData->maDeactiveColor2) && 1019 (mpData->maDeactiveTextColor == rSet.mpData->maDeactiveTextColor) && 1020 (mpData->maDeactiveBorderColor == rSet.mpData->maDeactiveBorderColor) && 1021 (mpData->maMenuColor == rSet.mpData->maMenuColor) && 1022 (mpData->maMenuBarColor == rSet.mpData->maMenuBarColor) && 1023 (mpData->maMenuBorderColor == rSet.mpData->maMenuBorderColor) && 1024 (mpData->maMenuTextColor == rSet.mpData->maMenuTextColor) && 1025 (mpData->maMenuBarTextColor == rSet.mpData->maMenuBarTextColor) && 1026 (mpData->maMenuHighlightColor == rSet.mpData->maMenuHighlightColor) && 1027 (mpData->maMenuHighlightTextColor == rSet.mpData->maMenuHighlightTextColor) && 1028 (mpData->maHighlightColor == rSet.mpData->maHighlightColor) && 1029 (mpData->maHighlightTextColor == rSet.mpData->maHighlightTextColor) && 1030 (mpData->maActiveTabColor == rSet.mpData->maActiveTabColor) && 1031 (mpData->maInactiveTabColor == rSet.mpData->maInactiveTabColor) && 1032 (mpData->maDisableColor == rSet.mpData->maDisableColor) && 1033 (mpData->maHelpColor == rSet.mpData->maHelpColor) && 1034 (mpData->maHelpTextColor == rSet.mpData->maHelpTextColor) && 1035 (mpData->maLinkColor == rSet.mpData->maLinkColor) && 1036 (mpData->maVisitedLinkColor == rSet.mpData->maVisitedLinkColor) && 1037 (mpData->maHighlightLinkColor == rSet.mpData->maHighlightLinkColor) && 1038 (mpData->maAppFont == rSet.mpData->maAppFont) && 1039 (mpData->maHelpFont == rSet.mpData->maHelpFont) && 1040 (mpData->maTitleFont == rSet.mpData->maTitleFont) && 1041 (mpData->maFloatTitleFont == rSet.mpData->maFloatTitleFont) && 1042 (mpData->maMenuFont == rSet.mpData->maMenuFont) && 1043 (mpData->maToolFont == rSet.mpData->maToolFont) && 1044 (mpData->maGroupFont == rSet.mpData->maGroupFont) && 1045 (mpData->maLabelFont == rSet.mpData->maLabelFont) && 1046 (mpData->maInfoFont == rSet.mpData->maInfoFont) && 1047 (mpData->maRadioCheckFont == rSet.mpData->maRadioCheckFont) && 1048 (mpData->maPushButtonFont == rSet.mpData->maPushButtonFont) && 1049 (mpData->maFieldFont == rSet.mpData->maFieldFont) && 1050 (mpData->maIconFont == rSet.mpData->maIconFont) && 1051 (mpData->mnUseImagesInMenus == rSet.mpData->mnUseImagesInMenus) && 1052 (mpData->mnSkipDisabledInMenus == rSet.mpData->mnSkipDisabledInMenus) && 1053 (mpData->maFontColor == rSet.mpData->maFontColor )) 1054 return sal_True; 1055 else 1056 return sal_False; 1057 } 1058 1059 // ======================================================================= 1060 1061 ImplMiscData::ImplMiscData() 1062 { 1063 mnRefCount = 1; 1064 mnEnableATT = sal::static_int_cast<sal_uInt16>(~0U); 1065 mnDisablePrinting = sal::static_int_cast<sal_uInt16>(~0U); 1066 static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI 1067 mbEnableLocalizedDecimalSep = (pEnv != NULL) ? sal_True : sal_False; 1068 } 1069 1070 // ----------------------------------------------------------------------- 1071 1072 ImplMiscData::ImplMiscData( const ImplMiscData& rData ) 1073 { 1074 mnRefCount = 1; 1075 mnEnableATT = rData.mnEnableATT; 1076 mnDisablePrinting = rData.mnDisablePrinting; 1077 mbEnableLocalizedDecimalSep = rData.mbEnableLocalizedDecimalSep; 1078 } 1079 1080 // ----------------------------------------------------------------------- 1081 1082 MiscSettings::MiscSettings() 1083 { 1084 mpData = new ImplMiscData(); 1085 } 1086 1087 // ----------------------------------------------------------------------- 1088 1089 MiscSettings::MiscSettings( const MiscSettings& rSet ) 1090 { 1091 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" ); 1092 1093 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1094 mpData = rSet.mpData; 1095 mpData->mnRefCount++; 1096 } 1097 1098 // ----------------------------------------------------------------------- 1099 1100 MiscSettings::~MiscSettings() 1101 { 1102 // Daten loeschen, wenn letzte Referenz 1103 if ( mpData->mnRefCount == 1 ) 1104 delete mpData; 1105 else 1106 mpData->mnRefCount--; 1107 } 1108 1109 // ----------------------------------------------------------------------- 1110 1111 const MiscSettings& MiscSettings::operator =( const MiscSettings& rSet ) 1112 { 1113 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" ); 1114 1115 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1116 rSet.mpData->mnRefCount++; 1117 1118 // Daten loeschen, wenn letzte Referenz 1119 if ( mpData->mnRefCount == 1 ) 1120 delete mpData; 1121 else 1122 mpData->mnRefCount--; 1123 1124 mpData = rSet.mpData; 1125 1126 return *this; 1127 } 1128 1129 // ----------------------------------------------------------------------- 1130 1131 void MiscSettings::CopyData() 1132 { 1133 // Falls noch andere Referenzen bestehen, dann kopieren 1134 if ( mpData->mnRefCount != 1 ) 1135 { 1136 mpData->mnRefCount--; 1137 mpData = new ImplMiscData( *mpData ); 1138 } 1139 } 1140 1141 // ----------------------------------------------------------------------- 1142 1143 sal_Bool MiscSettings::operator ==( const MiscSettings& rSet ) const 1144 { 1145 if ( mpData == rSet.mpData ) 1146 return sal_True; 1147 1148 if ( (mpData->mnEnableATT == rSet.mpData->mnEnableATT ) && 1149 (mpData->mnDisablePrinting == rSet.mpData->mnDisablePrinting ) && 1150 (mpData->mbEnableLocalizedDecimalSep == rSet.mpData->mbEnableLocalizedDecimalSep ) ) 1151 return sal_True; 1152 else 1153 return sal_False; 1154 } 1155 1156 // ----------------------------------------------------------------------- 1157 1158 sal_Bool MiscSettings::GetDisablePrinting() const 1159 { 1160 if( mpData->mnDisablePrinting == (sal_uInt16)~0 ) 1161 { 1162 rtl::OUString aEnable = 1163 vcl::SettingsConfigItem::get()-> 1164 getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DesktopManagement" ) ), 1165 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisablePrinting" ) ) ); 1166 mpData->mnDisablePrinting = aEnable.equalsIgnoreAsciiCaseAscii( "true" ) ? 1 : 0; 1167 } 1168 1169 return (sal_Bool)mpData->mnDisablePrinting; 1170 } 1171 // ----------------------------------------------------------------------- 1172 1173 sal_Bool MiscSettings::GetEnableATToolSupport() const 1174 { 1175 1176 #ifdef WNT 1177 if( mpData->mnEnableATT == (sal_uInt16)~0 ) 1178 { 1179 // Check in the Windows registry if an AT tool wants Accessibility support to 1180 // be activated .. 1181 HKEY hkey; 1182 1183 if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, 1184 "Software\\OpenOffice.org\\Accessibility\\AtToolSupport", 1185 &hkey) ) 1186 { 1187 DWORD dwType; 1188 sal_uInt8 Data[6]; // possible values: "true", "false", "1", "0", DWORD 1189 DWORD cbData = sizeof(Data); 1190 1191 if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology", 1192 NULL, &dwType, Data, &cbData) ) 1193 { 1194 switch (dwType) 1195 { 1196 case REG_SZ: 1197 mpData->mnEnableATT = ((0 == stricmp((const char *) Data, "1")) || (0 == stricmp((const char *) Data, "true"))); 1198 break; 1199 case REG_DWORD: 1200 mpData->mnEnableATT = (sal_uInt16) (((DWORD *) Data)[0]); 1201 break; 1202 default: 1203 // Unsupported registry type 1204 break; 1205 } 1206 } 1207 1208 RegCloseKey(hkey); 1209 } 1210 } 1211 #endif 1212 1213 if( mpData->mnEnableATT == (sal_uInt16)~0 ) 1214 { 1215 static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" ); 1216 if( !pEnv || !*pEnv ) 1217 { 1218 rtl::OUString aEnable = 1219 vcl::SettingsConfigItem::get()-> 1220 getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Accessibility" ) ), 1221 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EnableATToolSupport" ) ) ); 1222 mpData->mnEnableATT = aEnable.equalsIgnoreAsciiCaseAscii( "true" ) ? 1 : 0; 1223 } 1224 else 1225 { 1226 mpData->mnEnableATT = 1; 1227 } 1228 } 1229 1230 return (sal_Bool)mpData->mnEnableATT; 1231 } 1232 1233 // ----------------------------------------------------------------------- 1234 1235 void MiscSettings::SetDisablePrinting( sal_Bool bEnable ) 1236 { 1237 if ( bEnable != mpData->mnDisablePrinting ) 1238 { 1239 vcl::SettingsConfigItem::get()-> 1240 setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DesktopManagement" ) ), 1241 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisablePrinting" ) ), 1242 rtl::OUString::createFromAscii( bEnable ? "true" : "false" ) ); 1243 mpData->mnDisablePrinting = bEnable ? 1 : 0; 1244 } 1245 } 1246 1247 // ----------------------------------------------------------------------- 1248 1249 void MiscSettings::SetEnableATToolSupport( sal_Bool bEnable ) 1250 { 1251 if ( bEnable != mpData->mnEnableATT ) 1252 { 1253 sal_Bool bDummy; 1254 if( bEnable && !ImplInitAccessBridge(false, bDummy) ) 1255 return; 1256 1257 #ifdef WNT 1258 HKEY hkey; 1259 1260 // If the accessibility key in the Windows registry exists, change it synchronously 1261 if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, 1262 "Software\\OpenOffice.org\\Accessibility\\AtToolSupport", 1263 &hkey) ) 1264 { 1265 DWORD dwType; 1266 sal_uInt8 Data[6]; // possible values: "true", "false", 1, 0 1267 DWORD cbData = sizeof(Data); 1268 1269 if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology", 1270 NULL, &dwType, Data, &cbData) ) 1271 { 1272 switch (dwType) 1273 { 1274 case REG_SZ: 1275 RegSetValueEx(hkey, "SupportAssistiveTechnology", 1276 NULL, dwType, 1277 bEnable ? (sal_uInt8 *) "true" : (sal_uInt8 *) "false", 1278 bEnable ? sizeof("true") : sizeof("false")); 1279 break; 1280 case REG_DWORD: 1281 ((DWORD *) Data)[0] = bEnable ? 1 : 0; 1282 RegSetValueEx(hkey, "SupportAssistiveTechnology", 1283 NULL, dwType, Data, sizeof(DWORD)); 1284 break; 1285 default: 1286 // Unsupported registry type 1287 break; 1288 } 1289 } 1290 1291 RegCloseKey(hkey); 1292 } 1293 1294 #endif 1295 vcl::SettingsConfigItem::get()-> 1296 setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Accessibility" ) ), 1297 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EnableATToolSupport" ) ), 1298 rtl::OUString::createFromAscii( bEnable ? "true" : "false" ) ); 1299 mpData->mnEnableATT = bEnable ? 1 : 0; 1300 } 1301 } 1302 1303 void MiscSettings::SetEnableLocalizedDecimalSep( sal_Bool bEnable ) 1304 { 1305 CopyData(); 1306 mpData->mbEnableLocalizedDecimalSep = bEnable; 1307 } 1308 1309 sal_Bool MiscSettings::GetEnableLocalizedDecimalSep() const 1310 { 1311 return mpData->mbEnableLocalizedDecimalSep; 1312 } 1313 1314 // ======================================================================= 1315 1316 ImplNotificationData::ImplNotificationData() 1317 { 1318 mnRefCount = 1; 1319 mnOptions = 0; 1320 } 1321 1322 // ----------------------------------------------------------------------- 1323 1324 ImplNotificationData::ImplNotificationData( const ImplNotificationData& rData ) 1325 { 1326 mnRefCount = 1; 1327 mnOptions = rData.mnOptions; 1328 } 1329 1330 // ----------------------------------------------------------------------- 1331 1332 NotificationSettings::NotificationSettings() 1333 { 1334 mpData = new ImplNotificationData(); 1335 } 1336 1337 // ----------------------------------------------------------------------- 1338 1339 NotificationSettings::NotificationSettings( const NotificationSettings& rSet ) 1340 { 1341 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "NotificationSettings: RefCount overflow" ); 1342 1343 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1344 mpData = rSet.mpData; 1345 mpData->mnRefCount++; 1346 } 1347 1348 // ----------------------------------------------------------------------- 1349 1350 NotificationSettings::~NotificationSettings() 1351 { 1352 // Daten loeschen, wenn letzte Referenz 1353 if ( mpData->mnRefCount == 1 ) 1354 delete mpData; 1355 else 1356 mpData->mnRefCount--; 1357 } 1358 1359 // ----------------------------------------------------------------------- 1360 1361 const NotificationSettings& NotificationSettings::operator =( const NotificationSettings& rSet ) 1362 { 1363 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "NotificationSettings: RefCount overflow" ); 1364 1365 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1366 rSet.mpData->mnRefCount++; 1367 1368 // Daten loeschen, wenn letzte Referenz 1369 if ( mpData->mnRefCount == 1 ) 1370 delete mpData; 1371 else 1372 mpData->mnRefCount--; 1373 1374 mpData = rSet.mpData; 1375 1376 return *this; 1377 } 1378 1379 // ----------------------------------------------------------------------- 1380 1381 void NotificationSettings::CopyData() 1382 { 1383 // Falls noch andere Referenzen bestehen, dann kopieren 1384 if ( mpData->mnRefCount != 1 ) 1385 { 1386 mpData->mnRefCount--; 1387 mpData = new ImplNotificationData( *mpData ); 1388 } 1389 } 1390 1391 // ----------------------------------------------------------------------- 1392 1393 sal_Bool NotificationSettings::operator ==( const NotificationSettings& rSet ) const 1394 { 1395 if ( mpData == rSet.mpData ) 1396 return sal_True; 1397 1398 if ( (mpData->mnOptions == rSet.mpData->mnOptions) ) 1399 return sal_True; 1400 else 1401 return sal_False; 1402 } 1403 1404 // ======================================================================= 1405 1406 ImplHelpData::ImplHelpData() 1407 { 1408 mnRefCount = 1; 1409 mnOptions = 0; 1410 mnTipDelay = 500; 1411 mnTipTimeout = 3000; 1412 mnBalloonDelay = 1500; 1413 } 1414 1415 // ----------------------------------------------------------------------- 1416 1417 ImplHelpData::ImplHelpData( const ImplHelpData& rData ) 1418 { 1419 mnRefCount = 1; 1420 mnOptions = rData.mnOptions; 1421 mnTipDelay = rData.mnTipDelay; 1422 mnTipTimeout = rData.mnTipTimeout; 1423 mnBalloonDelay = rData.mnBalloonDelay; 1424 } 1425 1426 // ----------------------------------------------------------------------- 1427 1428 HelpSettings::HelpSettings() 1429 { 1430 mpData = new ImplHelpData(); 1431 } 1432 1433 // ----------------------------------------------------------------------- 1434 1435 HelpSettings::HelpSettings( const HelpSettings& rSet ) 1436 { 1437 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" ); 1438 1439 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1440 mpData = rSet.mpData; 1441 mpData->mnRefCount++; 1442 } 1443 1444 // ----------------------------------------------------------------------- 1445 1446 HelpSettings::~HelpSettings() 1447 { 1448 // Daten loeschen, wenn letzte Referenz 1449 if ( mpData->mnRefCount == 1 ) 1450 delete mpData; 1451 else 1452 mpData->mnRefCount--; 1453 } 1454 1455 // ----------------------------------------------------------------------- 1456 1457 const HelpSettings& HelpSettings::operator =( const HelpSettings& rSet ) 1458 { 1459 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" ); 1460 1461 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1462 rSet.mpData->mnRefCount++; 1463 1464 // Daten loeschen, wenn letzte Referenz 1465 if ( mpData->mnRefCount == 1 ) 1466 delete mpData; 1467 else 1468 mpData->mnRefCount--; 1469 1470 mpData = rSet.mpData; 1471 1472 return *this; 1473 } 1474 1475 // ----------------------------------------------------------------------- 1476 1477 void HelpSettings::CopyData() 1478 { 1479 // Falls noch andere Referenzen bestehen, dann kopieren 1480 if ( mpData->mnRefCount != 1 ) 1481 { 1482 mpData->mnRefCount--; 1483 mpData = new ImplHelpData( *mpData ); 1484 } 1485 } 1486 1487 // ----------------------------------------------------------------------- 1488 1489 sal_Bool HelpSettings::operator ==( const HelpSettings& rSet ) const 1490 { 1491 if ( mpData == rSet.mpData ) 1492 return sal_True; 1493 1494 if ( (mpData->mnOptions == rSet.mpData->mnOptions ) && 1495 (mpData->mnTipDelay == rSet.mpData->mnTipDelay ) && 1496 (mpData->mnTipTimeout == rSet.mpData->mnTipTimeout ) && 1497 (mpData->mnBalloonDelay == rSet.mpData->mnBalloonDelay ) ) 1498 return sal_True; 1499 else 1500 return sal_False; 1501 } 1502 1503 // ======================================================================= 1504 1505 ImplAllSettingsData::ImplAllSettingsData() 1506 { 1507 mnRefCount = 1; 1508 mnSystemUpdate = SETTINGS_ALLSETTINGS; 1509 mnWindowUpdate = SETTINGS_ALLSETTINGS; 1510 meLanguage = LANGUAGE_SYSTEM; 1511 meUILanguage = LANGUAGE_SYSTEM; 1512 mpLocaleDataWrapper = NULL; 1513 mpUILocaleDataWrapper = NULL; 1514 mpCollatorWrapper = NULL; 1515 mpUICollatorWrapper = NULL; 1516 mpI18nHelper = NULL; 1517 mpUII18nHelper = NULL; 1518 maMiscSettings.SetEnableLocalizedDecimalSep( maSysLocale.GetOptions().IsDecimalSeparatorAsLocale() ); 1519 } 1520 1521 // ----------------------------------------------------------------------- 1522 1523 ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) : 1524 maMouseSettings( rData.maMouseSettings ), 1525 maKeyboardSettings( rData.maKeyboardSettings ), 1526 maStyleSettings( rData.maStyleSettings ), 1527 maMiscSettings( rData.maMiscSettings ), 1528 maNotificationSettings( rData.maNotificationSettings ), 1529 maHelpSettings( rData.maHelpSettings ), 1530 maLocale( rData.maLocale ) 1531 { 1532 mnRefCount = 1; 1533 mnSystemUpdate = rData.mnSystemUpdate; 1534 mnWindowUpdate = rData.mnWindowUpdate; 1535 meLanguage = rData.meLanguage; 1536 // Pointer couldn't shared and objects haven't a copy ctor 1537 // So we create the cache objects new, if the GetFunction is 1538 // called 1539 mpLocaleDataWrapper = NULL; 1540 mpUILocaleDataWrapper = NULL; 1541 mpCollatorWrapper = NULL; 1542 mpUICollatorWrapper = NULL; 1543 mpI18nHelper = NULL; 1544 mpUII18nHelper = NULL; 1545 } 1546 1547 // ----------------------------------------------------------------------- 1548 1549 ImplAllSettingsData::~ImplAllSettingsData() 1550 { 1551 if ( mpLocaleDataWrapper ) 1552 delete mpLocaleDataWrapper; 1553 if ( mpUILocaleDataWrapper ) 1554 delete mpUILocaleDataWrapper; 1555 if ( mpCollatorWrapper ) 1556 delete mpCollatorWrapper; 1557 if ( mpUICollatorWrapper ) 1558 delete mpUICollatorWrapper; 1559 if ( mpI18nHelper ) 1560 delete mpI18nHelper; 1561 if ( mpUII18nHelper ) 1562 delete mpUII18nHelper; 1563 } 1564 1565 // ----------------------------------------------------------------------- 1566 1567 AllSettings::AllSettings() 1568 { 1569 DBG_CTOR( AllSettings, NULL ); 1570 1571 mpData = new ImplAllSettingsData(); 1572 } 1573 1574 // ----------------------------------------------------------------------- 1575 1576 AllSettings::AllSettings( const AllSettings& rSet ) 1577 { 1578 DBG_CTOR( AllSettings, NULL ); 1579 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "Settings: RefCount overflow" ); 1580 1581 // shared Instance Daten uebernehmen und Referenzcounter erhoehen 1582 mpData = rSet.mpData; 1583 mpData->mnRefCount++; 1584 } 1585 1586 // ----------------------------------------------------------------------- 1587 1588 AllSettings::~AllSettings() 1589 { 1590 DBG_DTOR( AllSettings, NULL ); 1591 1592 // Daten loeschen, wenn letzte Referenz 1593 if ( mpData->mnRefCount == 1 ) 1594 delete mpData; 1595 else 1596 mpData->mnRefCount--; 1597 } 1598 1599 // ----------------------------------------------------------------------- 1600 1601 const AllSettings& AllSettings::operator =( const AllSettings& rSet ) 1602 { 1603 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "AllSettings: RefCount overflow" ); 1604 DBG_CHKTHIS( AllSettings, NULL ); 1605 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1606 1607 // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann 1608 rSet.mpData->mnRefCount++; 1609 1610 // Daten loeschen, wenn letzte Referenz 1611 if ( mpData->mnRefCount == 1 ) 1612 delete mpData; 1613 else 1614 mpData->mnRefCount--; 1615 1616 mpData = rSet.mpData; 1617 1618 return *this; 1619 } 1620 1621 // ----------------------------------------------------------------------- 1622 1623 void AllSettings::CopyData() 1624 { 1625 DBG_CHKTHIS( AllSettings, NULL ); 1626 1627 // Falls noch andere Referenzen bestehen, dann kopieren 1628 if ( mpData->mnRefCount != 1 ) 1629 { 1630 mpData->mnRefCount--; 1631 mpData = new ImplAllSettingsData( *mpData ); 1632 } 1633 } 1634 1635 // ----------------------------------------------------------------------- 1636 1637 sal_uLong AllSettings::Update( sal_uLong nFlags, const AllSettings& rSet ) 1638 { 1639 DBG_CHKTHIS( AllSettings, NULL ); 1640 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1641 1642 sal_uLong nChangeFlags = 0; 1643 1644 if ( nFlags & SETTINGS_MACHINE ) 1645 { 1646 if ( mpData->maMachineSettings != rSet.mpData->maMachineSettings ) 1647 { 1648 CopyData(); 1649 mpData->maMachineSettings = rSet.mpData->maMachineSettings; 1650 nChangeFlags |= SETTINGS_MACHINE; 1651 } 1652 } 1653 1654 if ( nFlags & SETTINGS_MOUSE ) 1655 { 1656 if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings ) 1657 { 1658 CopyData(); 1659 mpData->maMouseSettings = rSet.mpData->maMouseSettings; 1660 nChangeFlags |= SETTINGS_MOUSE; 1661 } 1662 } 1663 1664 if ( nFlags & SETTINGS_KEYBOARD ) 1665 { 1666 if ( mpData->maKeyboardSettings != rSet.mpData->maKeyboardSettings ) 1667 { 1668 CopyData(); 1669 mpData->maKeyboardSettings = rSet.mpData->maKeyboardSettings; 1670 nChangeFlags |= SETTINGS_KEYBOARD; 1671 } 1672 } 1673 1674 if ( nFlags & SETTINGS_STYLE ) 1675 { 1676 if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings ) 1677 { 1678 CopyData(); 1679 mpData->maStyleSettings = rSet.mpData->maStyleSettings; 1680 nChangeFlags |= SETTINGS_STYLE; 1681 } 1682 } 1683 1684 if ( nFlags & SETTINGS_MISC ) 1685 { 1686 if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings ) 1687 { 1688 CopyData(); 1689 mpData->maMiscSettings = rSet.mpData->maMiscSettings; 1690 nChangeFlags |= SETTINGS_MISC; 1691 } 1692 } 1693 1694 if ( nFlags & SETTINGS_NOTIFICATION ) 1695 { 1696 if ( mpData->maNotificationSettings != rSet.mpData->maNotificationSettings ) 1697 { 1698 CopyData(); 1699 mpData->maNotificationSettings = rSet.mpData->maNotificationSettings; 1700 nChangeFlags |= SETTINGS_NOTIFICATION; 1701 } 1702 } 1703 1704 if ( nFlags & SETTINGS_HELP ) 1705 { 1706 if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings ) 1707 { 1708 CopyData(); 1709 mpData->maHelpSettings = rSet.mpData->maHelpSettings; 1710 nChangeFlags |= SETTINGS_HELP; 1711 } 1712 } 1713 1714 if ( nFlags & SETTINGS_INTERNATIONAL ) 1715 { 1716 // Nothing, class International is gone. 1717 DBG_ERRORFILE("AllSettings::Update: who calls with SETTINGS_INTERNATIONAL and why? You're flogging a dead horse."); 1718 } 1719 1720 if ( nFlags & SETTINGS_LOCALE ) 1721 { 1722 if ( mpData->meLanguage || rSet.mpData->meLanguage ) 1723 { 1724 SetLanguage( rSet.mpData->meLanguage ); 1725 nChangeFlags |= SETTINGS_LOCALE; 1726 } 1727 } 1728 1729 if ( nFlags & SETTINGS_UILOCALE ) 1730 { 1731 // UILocale can't be changed 1732 } 1733 1734 return nChangeFlags; 1735 } 1736 1737 // ----------------------------------------------------------------------- 1738 1739 sal_uLong AllSettings::GetChangeFlags( const AllSettings& rSet ) const 1740 { 1741 DBG_CHKTHIS( AllSettings, NULL ); 1742 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1743 1744 sal_uLong nChangeFlags = 0; 1745 1746 if ( mpData->maMachineSettings != rSet.mpData->maMachineSettings ) 1747 nChangeFlags |= SETTINGS_MACHINE; 1748 1749 if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings ) 1750 nChangeFlags |= SETTINGS_MOUSE; 1751 1752 if ( mpData->maKeyboardSettings != rSet.mpData->maKeyboardSettings ) 1753 nChangeFlags |= SETTINGS_KEYBOARD; 1754 1755 if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings ) 1756 nChangeFlags |= SETTINGS_STYLE; 1757 1758 if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings ) 1759 nChangeFlags |= SETTINGS_MISC; 1760 1761 if ( mpData->maNotificationSettings != rSet.mpData->maNotificationSettings ) 1762 nChangeFlags |= SETTINGS_NOTIFICATION; 1763 1764 if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings ) 1765 nChangeFlags |= SETTINGS_HELP; 1766 1767 if ( mpData->meLanguage || rSet.mpData->meLanguage ) 1768 nChangeFlags |= SETTINGS_LOCALE; 1769 1770 return nChangeFlags; 1771 } 1772 1773 // ----------------------------------------------------------------------- 1774 1775 sal_Bool AllSettings::operator ==( const AllSettings& rSet ) const 1776 { 1777 DBG_CHKTHIS( AllSettings, NULL ); 1778 DBG_CHKOBJ( &rSet, AllSettings, NULL ); 1779 1780 if ( mpData == rSet.mpData ) 1781 return sal_True; 1782 1783 if ( (mpData->maMachineSettings == rSet.mpData->maMachineSettings) && 1784 (mpData->maMouseSettings == rSet.mpData->maMouseSettings) && 1785 (mpData->maKeyboardSettings == rSet.mpData->maKeyboardSettings) && 1786 (mpData->maStyleSettings == rSet.mpData->maStyleSettings) && 1787 (mpData->maMiscSettings == rSet.mpData->maMiscSettings) && 1788 (mpData->maNotificationSettings == rSet.mpData->maNotificationSettings) && 1789 (mpData->maHelpSettings == rSet.mpData->maHelpSettings) && 1790 (mpData->mnSystemUpdate == rSet.mpData->mnSystemUpdate) && 1791 (mpData->maLocale == rSet.mpData->maLocale) && 1792 (mpData->mnWindowUpdate == rSet.mpData->mnWindowUpdate) ) 1793 { 1794 return sal_True; 1795 } 1796 else 1797 return sal_False; 1798 } 1799 1800 // ----------------------------------------------------------------------- 1801 1802 void AllSettings::SetLocale( const ::com::sun::star::lang::Locale& rLocale ) 1803 { 1804 CopyData(); 1805 1806 mpData->maLocale = rLocale; 1807 1808 if ( !rLocale.Language.getLength() ) 1809 mpData->meLanguage = LANGUAGE_SYSTEM; 1810 else 1811 mpData->meLanguage = MsLangId::convertLocaleToLanguage( rLocale ); 1812 if ( mpData->mpLocaleDataWrapper ) 1813 { 1814 delete mpData->mpLocaleDataWrapper; 1815 mpData->mpLocaleDataWrapper = NULL; 1816 } 1817 if ( mpData->mpI18nHelper ) 1818 { 1819 delete mpData->mpI18nHelper; 1820 mpData->mpI18nHelper = NULL; 1821 } 1822 } 1823 1824 // ----------------------------------------------------------------------- 1825 1826 void AllSettings::SetUILocale( const ::com::sun::star::lang::Locale& ) 1827 { 1828 // there is only one UILocale per process 1829 } 1830 1831 // ----------------------------------------------------------------------- 1832 1833 void AllSettings::SetLanguage( LanguageType eLang ) 1834 { 1835 if ( eLang != mpData->meLanguage ) 1836 { 1837 CopyData(); 1838 1839 mpData->meLanguage = eLang; 1840 MsLangId::convertLanguageToLocale( GetLanguage(), ((AllSettings*)this)->mpData->maLocale ); 1841 if ( mpData->mpLocaleDataWrapper ) 1842 { 1843 delete mpData->mpLocaleDataWrapper; 1844 mpData->mpLocaleDataWrapper = NULL; 1845 } 1846 if ( mpData->mpI18nHelper ) 1847 { 1848 delete mpData->mpI18nHelper; 1849 mpData->mpI18nHelper = NULL; 1850 } 1851 } 1852 } 1853 1854 // ----------------------------------------------------------------------- 1855 1856 void AllSettings::SetUILanguage( LanguageType ) 1857 { 1858 // there is only one UILanguage per process 1859 } 1860 1861 // ----------------------------------------------------------------------- 1862 1863 sal_Bool AllSettings::GetLayoutRTL() const 1864 { 1865 static const char* pEnv = getenv("SAL_RTL_ENABLED" ); 1866 static int nUIMirroring = -1; // -1: undef, 0: auto, 1: on 2: off 1867 1868 // environment always overrides 1869 if( pEnv ) 1870 return true; 1871 1872 sal_Bool bRTL = sal_False; 1873 1874 if( nUIMirroring == -1 ) 1875 { 1876 nUIMirroring = 0; // ask configuration only once 1877 utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithServiceFactory( 1878 vcl::unohelper::GetMultiServiceFactory(), 1879 OUString::createFromAscii( "org.openoffice.Office.Common/I18N/CTL" ) ); // note: case sensisitive ! 1880 if ( aNode.isValid() ) 1881 { 1882 sal_Bool bTmp = sal_Bool(); 1883 ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString::createFromAscii( "UIMirroring" ) ); 1884 if( aValue >>= bTmp ) 1885 { 1886 // found true or false; if it was nil, nothing is changed 1887 nUIMirroring = bTmp ? 1 : 2; 1888 } 1889 } 1890 } 1891 1892 if( nUIMirroring == 0 ) // no config found (eg, setup) or default (nil) was set: check language 1893 { 1894 LanguageType aLang = LANGUAGE_DONTKNOW; 1895 ImplSVData* pSVData = ImplGetSVData(); 1896 if ( pSVData->maAppData.mpSettings ) 1897 aLang = pSVData->maAppData.mpSettings->GetUILanguage(); 1898 bRTL = MsLangId::isRightToLeft( aLang ); 1899 } 1900 else 1901 bRTL = (nUIMirroring == 1); 1902 1903 return bRTL; 1904 } 1905 1906 // ----------------------------------------------------------------------- 1907 1908 const ::com::sun::star::lang::Locale& AllSettings::GetLocale() const 1909 { 1910 if ( !mpData->maLocale.Language.getLength() ) 1911 mpData->maLocale = mpData->maSysLocale.GetLocale(); 1912 1913 return mpData->maLocale; 1914 } 1915 1916 // ----------------------------------------------------------------------- 1917 1918 const ::com::sun::star::lang::Locale& AllSettings::GetUILocale() const 1919 { 1920 // the UILocale is never changed 1921 if ( !mpData->maUILocale.Language.getLength() ) 1922 mpData->maUILocale = mpData->maSysLocale.GetUILocale(); 1923 1924 return mpData->maUILocale; 1925 } 1926 1927 // ----------------------------------------------------------------------- 1928 1929 LanguageType AllSettings::GetLanguage() const 1930 { 1931 // meLanguage == LANGUAGE_SYSTEM means: use settings from SvtSysLocale 1932 if ( mpData->meLanguage == LANGUAGE_SYSTEM ) 1933 return mpData->maSysLocale.GetLanguage(); 1934 1935 return mpData->meLanguage; 1936 } 1937 1938 // ----------------------------------------------------------------------- 1939 1940 LanguageType AllSettings::GetUILanguage() const 1941 { 1942 // the UILanguage is never changed 1943 return mpData->maSysLocale.GetUILanguage(); 1944 } 1945 1946 // ----------------------------------------------------------------------- 1947 1948 const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const 1949 { 1950 if ( !mpData->mpLocaleDataWrapper ) 1951 ((AllSettings*)this)->mpData->mpLocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetLocale() ); 1952 return *mpData->mpLocaleDataWrapper; 1953 } 1954 1955 // ----------------------------------------------------------------------- 1956 1957 const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const 1958 { 1959 if ( !mpData->mpUILocaleDataWrapper ) 1960 ((AllSettings*)this)->mpData->mpUILocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetUILocale() ); 1961 return *mpData->mpUILocaleDataWrapper; 1962 } 1963 1964 // ----------------------------------------------------------------------- 1965 1966 const vcl::I18nHelper& AllSettings::GetLocaleI18nHelper() const 1967 { 1968 if ( !mpData->mpI18nHelper ) { 1969 ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> aFactory(vcl::unohelper::GetMultiServiceFactory()); 1970 ((AllSettings*)this)->mpData->mpI18nHelper = new vcl::I18nHelper( aFactory, GetLocale() ); 1971 } 1972 return *mpData->mpI18nHelper; 1973 } 1974 1975 // ----------------------------------------------------------------------- 1976 1977 const vcl::I18nHelper& AllSettings::GetUILocaleI18nHelper() const 1978 { 1979 if ( !mpData->mpUII18nHelper ) { 1980 ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> aFactory(vcl::unohelper::GetMultiServiceFactory()); 1981 ((AllSettings*)this)->mpData->mpUII18nHelper = new vcl::I18nHelper( aFactory, GetUILocale() ); 1982 } 1983 return *mpData->mpUII18nHelper; 1984 } 1985 1986 1987 // ----------------------------------------------------------------------- 1988 /* 1989 const CollatorWrapper& AllSettings::GetCollatorWrapper() const 1990 { 1991 if ( !mpData->mpCollatorWrapper ) 1992 { 1993 ((AllSettings*)this)->mpData->mpCollatorWrapper = new CollatorWrapper( vcl::unohelper::GetMultiServiceFactory() ); 1994 ((AllSettings*)this)->mpData->mpCollatorWrapper->loadDefaultCollator( GetLocale(), 0 ); 1995 } 1996 return *mpData->mpCollatorWrapper; 1997 } 1998 */ 1999 // ----------------------------------------------------------------------- 2000 /* 2001 const CollatorWrapper& AllSettings::GetUICollatorWrapper() const 2002 { 2003 if ( !mpData->mpUICollatorWrapper ) 2004 { 2005 ((AllSettings*)this)->mpData->mpUICollatorWrapper = new CollatorWrapper( vcl::unohelper::GetMultiServiceFactory() ); 2006 ((AllSettings*)this)->mpData->mpUICollatorWrapper->loadDefaultCollator( GetUILocale(), 0 ); 2007 } 2008 return *mpData->mpUICollatorWrapper; 2009 } 2010 */ 2011 2012 void AllSettings::LocaleSettingsChanged( sal_uInt32 nHint ) 2013 { 2014 AllSettings aAllSettings( Application::GetSettings() ); 2015 if ( nHint & SYSLOCALEOPTIONS_HINT_DECSEP ) 2016 { 2017 MiscSettings aMiscSettings = aAllSettings.GetMiscSettings(); 2018 sal_Bool bIsDecSepAsLocale = aAllSettings.mpData->maSysLocale.GetOptions().IsDecimalSeparatorAsLocale(); 2019 if ( aMiscSettings.GetEnableLocalizedDecimalSep() != bIsDecSepAsLocale ) 2020 { 2021 aMiscSettings.SetEnableLocalizedDecimalSep( bIsDecSepAsLocale ); 2022 aAllSettings.SetMiscSettings( aMiscSettings ); 2023 } 2024 } 2025 2026 if ( (nHint & SYSLOCALEOPTIONS_HINT_LOCALE) ) 2027 aAllSettings.SetLocale( aAllSettings.mpData->maSysLocale.GetOptions().GetLocale() ); 2028 2029 Application::SetSettings( aAllSettings ); 2030 } 2031