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