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