update credits
[LibreOffice.git] / vcl / source / app / settings.cxx
blobd62966be652a3916b930e9c2c7e194119fcd3883
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <officecfg/Office/Common.hxx>
22 #include <svsys.h>
23 #include "comphelper/processfactory.hxx"
24 #include <rtl/bootstrap.hxx>
25 #include "tools/debug.hxx"
26 #include <vcl/graphicfilter.hxx>
28 #include "i18nlangtag/mslangid.hxx"
29 #include "i18nlangtag/languagetag.hxx"
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/outdev.hxx"
39 #include "unotools/fontcfg.hxx"
40 #include "unotools/localedatawrapper.hxx"
41 #include "unotools/collatorwrapper.hxx"
42 #include "unotools/confignode.hxx"
43 #include "unotools/syslocaleoptions.hxx"
45 using namespace ::com::sun::star;
47 #include "svdata.hxx"
48 #include "impimagetree.hxx"
49 // =======================================================================
51 DBG_NAME( AllSettings )
53 // =======================================================================
55 ImplMouseData::ImplMouseData()
57 mnRefCount = 1;
58 mnOptions = 0;
59 mnDoubleClkTime = 500;
60 mnDoubleClkWidth = 2;
61 mnDoubleClkHeight = 2;
62 mnStartDragWidth = 2;
63 mnStartDragHeight = 2;
64 mnStartDragCode = MOUSE_LEFT;
65 mnDragMoveCode = 0;
66 mnDragCopyCode = KEY_MOD1;
67 mnDragLinkCode = KEY_SHIFT | KEY_MOD1;
68 mnContextMenuCode = MOUSE_RIGHT;
69 mnContextMenuClicks = 1;
70 mbContextMenuDown = sal_True;
71 mnMiddleButtonAction = MOUSE_MIDDLE_AUTOSCROLL;
72 mnScrollRepeat = 100;
73 mnButtonStartRepeat = 370;
74 mnButtonRepeat = 90;
75 mnActionDelay = 250;
76 mnMenuDelay = 150;
77 mnFollow = MOUSE_FOLLOW_MENU | MOUSE_FOLLOW_DDLIST;
78 mnWheelBehavior = MOUSE_WHEEL_ALWAYS;
81 // -----------------------------------------------------------------------
83 ImplMouseData::ImplMouseData( const ImplMouseData& rData )
85 mnRefCount = 1;
86 mnOptions = rData.mnOptions;
87 mnDoubleClkTime = rData.mnDoubleClkTime;
88 mnDoubleClkWidth = rData.mnDoubleClkWidth;
89 mnDoubleClkHeight = rData.mnDoubleClkHeight;
90 mnStartDragWidth = rData.mnStartDragWidth;
91 mnStartDragHeight = rData.mnStartDragHeight;
92 mnStartDragCode = rData.mnStartDragCode;
93 mnDragMoveCode = rData.mnDragMoveCode;
94 mnDragCopyCode = rData.mnDragCopyCode;
95 mnDragLinkCode = rData.mnDragLinkCode;
96 mnContextMenuCode = rData.mnContextMenuCode;
97 mnContextMenuClicks = rData.mnContextMenuClicks;
98 mbContextMenuDown = rData.mbContextMenuDown;
99 mnMiddleButtonAction = rData.mnMiddleButtonAction;
100 mnScrollRepeat = rData.mnScrollRepeat;
101 mnButtonStartRepeat = rData.mnButtonStartRepeat;
102 mnButtonRepeat = rData.mnButtonRepeat;
103 mnActionDelay = rData.mnActionDelay;
104 mnMenuDelay = rData.mnMenuDelay;
105 mnFollow = rData.mnFollow;
106 mnWheelBehavior = rData.mnWheelBehavior;
109 // -----------------------------------------------------------------------
111 MouseSettings::MouseSettings()
113 mpData = new ImplMouseData();
116 // -----------------------------------------------------------------------
118 MouseSettings::MouseSettings( const MouseSettings& rSet )
120 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MouseSettings: RefCount overflow" );
122 // copy shared instance data and increment reference counter
123 mpData = rSet.mpData;
124 mpData->mnRefCount++;
127 // -----------------------------------------------------------------------
129 MouseSettings::~MouseSettings()
131 // delete data if last reference
132 if ( mpData->mnRefCount == 1 )
133 delete mpData;
134 else
135 mpData->mnRefCount--;
138 // -----------------------------------------------------------------------
140 const MouseSettings& MouseSettings::operator =( const MouseSettings& rSet )
142 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MouseSettings: RefCount overflow" );
144 // increment reference counter first, to be able to assign oneself
145 rSet.mpData->mnRefCount++;
147 // delete data if last reference
148 if ( mpData->mnRefCount == 1 )
149 delete mpData;
150 else
151 mpData->mnRefCount--;
153 mpData = rSet.mpData;
155 return *this;
158 // -----------------------------------------------------------------------
160 void MouseSettings::CopyData()
162 // copy if another references exist
163 if ( mpData->mnRefCount != 1 )
165 mpData->mnRefCount--;
166 mpData = new ImplMouseData( *mpData );
170 // -----------------------------------------------------------------------
172 sal_Bool MouseSettings::operator ==( const MouseSettings& rSet ) const
174 if ( mpData == rSet.mpData )
175 return sal_True;
177 if ( (mpData->mnOptions == rSet.mpData->mnOptions) &&
178 (mpData->mnDoubleClkTime == rSet.mpData->mnDoubleClkTime) &&
179 (mpData->mnDoubleClkWidth == rSet.mpData->mnDoubleClkWidth) &&
180 (mpData->mnDoubleClkHeight == rSet.mpData->mnDoubleClkHeight) &&
181 (mpData->mnStartDragWidth == rSet.mpData->mnStartDragWidth) &&
182 (mpData->mnStartDragHeight == rSet.mpData->mnStartDragHeight) &&
183 (mpData->mnStartDragCode == rSet.mpData->mnStartDragCode) &&
184 (mpData->mnDragMoveCode == rSet.mpData->mnDragMoveCode) &&
185 (mpData->mnDragCopyCode == rSet.mpData->mnDragCopyCode) &&
186 (mpData->mnDragLinkCode == rSet.mpData->mnDragLinkCode) &&
187 (mpData->mnContextMenuCode == rSet.mpData->mnContextMenuCode) &&
188 (mpData->mnContextMenuClicks == rSet.mpData->mnContextMenuClicks) &&
189 (mpData->mbContextMenuDown == rSet.mpData->mbContextMenuDown) &&
190 (mpData->mnMiddleButtonAction == rSet.mpData->mnMiddleButtonAction) &&
191 (mpData->mnScrollRepeat == rSet.mpData->mnScrollRepeat) &&
192 (mpData->mnButtonStartRepeat == rSet.mpData->mnButtonStartRepeat) &&
193 (mpData->mnButtonRepeat == rSet.mpData->mnButtonRepeat) &&
194 (mpData->mnActionDelay == rSet.mpData->mnActionDelay) &&
195 (mpData->mnMenuDelay == rSet.mpData->mnMenuDelay) &&
196 (mpData->mnFollow == rSet.mpData->mnFollow) &&
197 (mpData->mnWheelBehavior == rSet.mpData->mnWheelBehavior ) )
198 return sal_True;
199 else
200 return sal_False;
203 // =======================================================================
205 ImplStyleData::ImplStyleData() :
206 maPersonaHeaderFooter(),
207 maPersonaHeaderBitmap(),
208 maPersonaFooterBitmap()
210 mnRefCount = 1;
211 mnScrollBarSize = 16;
212 mnMinThumbSize = 16;
213 mnSplitSize = 3;
214 mnSpinSize = 16;
215 mnIconHorzSpace = 50;
216 mnIconVertSpace = 40;
217 mnAntialiasedMin = 0;
218 mnCursorSize = 2;
219 mnCursorBlinkTime = STYLE_CURSOR_NOBLINKTIME;
220 mnScreenZoom = 100;
221 mnScreenFontZoom = 100;
222 mnLogoDisplayTime = LOGO_DISPLAYTIME_STARTTIME;
223 mnDragFullOptions = DRAGFULL_OPTION_WINDOWMOVE | DRAGFULL_OPTION_WINDOWSIZE |
224 DRAGFULL_OPTION_OBJECTMOVE | DRAGFULL_OPTION_OBJECTSIZE |
225 DRAGFULL_OPTION_DOCKING | DRAGFULL_OPTION_SPLIT |
226 DRAGFULL_OPTION_SCROLL;
227 mnAnimationOptions = 0;
228 mnSelectionOptions = 0;
229 mnDisplayOptions = 0;
230 mnOptions = 0;
231 mnAutoMnemonic = 1;
232 mnToolbarIconSize = STYLE_TOOLBAR_ICONSIZE_UNKNOWN;
233 mnSymbolsStyle = STYLE_SYMBOLS_AUTO;
234 mnUseImagesInMenus = STYLE_MENUIMAGES_AUTO;
235 mnPreferredSymbolsStyle = STYLE_SYMBOLS_AUTO;
236 mpFontOptions = NULL;
237 mnEdgeBlending = 35;
238 maEdgeBlendingTopLeftColor = RGB_COLORDATA(0xC0, 0xC0, 0xC0);
239 maEdgeBlendingBottomRightColor = RGB_COLORDATA(0x40, 0x40, 0x40);
240 mnListBoxMaximumLineCount = 25;
241 mnColorValueSetColumnCount = 12;
242 mnColorValueSetMaximumRowCount = 40;
243 maListBoxPreviewDefaultLogicSize = Size(15, 7);
244 maListBoxPreviewDefaultPixelSize = Size(0, 0); // on-demand calculated in GetListBoxPreviewDefaultPixelSize()
245 mnListBoxPreviewDefaultLineWidth = 1;
247 SetStandardStyles();
250 // -----------------------------------------------------------------------
252 ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
253 maActiveBorderColor( rData.maActiveBorderColor ),
254 maActiveColor( rData.maActiveColor ),
255 maActiveColor2( rData.maActiveColor2 ),
256 maActiveTextColor( rData.maActiveTextColor ),
257 maButtonTextColor( rData.maButtonTextColor ),
258 maButtonRolloverTextColor( rData.maButtonRolloverTextColor ),
259 maCheckedColor( rData.maCheckedColor ),
260 maDarkShadowColor( rData.maDarkShadowColor ),
261 maDeactiveBorderColor( rData.maDeactiveBorderColor ),
262 maDeactiveColor( rData.maDeactiveColor ),
263 maDeactiveColor2( rData.maDeactiveColor2 ),
264 maDeactiveTextColor( rData.maDeactiveTextColor ),
265 maDialogColor( rData.maDialogColor ),
266 maDialogTextColor( rData.maDialogTextColor ),
267 maDisableColor( rData.maDisableColor ),
268 maFaceColor( rData.maFaceColor ),
269 maFieldColor( rData.maFieldColor ),
270 maFieldTextColor( rData.maFieldTextColor ),
271 maFieldRolloverTextColor( rData.maFieldRolloverTextColor ),
272 maFontColor( rData.maFontColor ),
273 maGroupTextColor( rData.maGroupTextColor ),
274 maHelpColor( rData.maHelpColor ),
275 maHelpTextColor( rData.maHelpTextColor ),
276 maHighlightColor( rData.maHighlightColor ),
277 maHighlightLinkColor( rData.maHighlightLinkColor ),
278 maHighlightTextColor( rData.maHighlightTextColor ),
279 maInfoTextColor( rData.maInfoTextColor ),
280 maLabelTextColor( rData.maLabelTextColor ),
281 maLightBorderColor( rData.maLightBorderColor ),
282 maLightColor( rData.maLightColor ),
283 maLinkColor( rData.maLinkColor ),
284 maMenuBarColor( rData.maMenuBarColor ),
285 maMenuBarRolloverColor( rData.maMenuBarRolloverColor ),
286 maMenuBorderColor( rData.maMenuBorderColor ),
287 maMenuColor( rData.maMenuColor ),
288 maMenuHighlightColor( rData.maMenuHighlightColor ),
289 maMenuHighlightTextColor( rData.maMenuHighlightTextColor ),
290 maMenuTextColor( rData.maMenuTextColor ),
291 maMenuBarTextColor( rData.maMenuBarTextColor ),
292 maMenuBarRolloverTextColor( rData.maMenuBarRolloverTextColor ),
293 maMonoColor( rData.maMonoColor ),
294 maRadioCheckTextColor( rData.maRadioCheckTextColor ),
295 maShadowColor( rData.maShadowColor ),
296 maVisitedLinkColor( rData.maVisitedLinkColor ),
297 maWindowColor( rData.maWindowColor ),
298 maWindowTextColor( rData.maWindowTextColor ),
299 maWorkspaceColor( rData.maWorkspaceColor ),
300 maActiveTabColor( rData.maActiveTabColor ),
301 maInactiveTabColor( rData.maInactiveTabColor ),
302 maAppFont( rData.maAppFont ),
303 maHelpFont( rData.maAppFont ),
304 maTitleFont( rData.maTitleFont ),
305 maFloatTitleFont( rData.maFloatTitleFont ),
306 maMenuFont( rData.maMenuFont ),
307 maToolFont( rData.maToolFont ),
308 maLabelFont( rData.maLabelFont ),
309 maInfoFont( rData.maInfoFont ),
310 maRadioCheckFont( rData.maRadioCheckFont ),
311 maPushButtonFont( rData.maPushButtonFont ),
312 maFieldFont( rData.maFieldFont ),
313 maIconFont( rData.maIconFont ),
314 maGroupFont( rData.maGroupFont ),
315 maWorkspaceGradient( rData.maWorkspaceGradient ),
316 maDialogStyle( rData.maDialogStyle ),
317 maFrameStyle( rData.maFrameStyle ),
318 maPersonaHeaderFooter( rData.maPersonaHeaderFooter ),
319 maPersonaHeaderBitmap( rData.maPersonaHeaderBitmap ),
320 maPersonaFooterBitmap( rData.maPersonaFooterBitmap )
322 mnRefCount = 1;
323 mnBorderSize = rData.mnBorderSize;
324 mnTitleHeight = rData.mnTitleHeight;
325 mnFloatTitleHeight = rData.mnFloatTitleHeight;
326 mnTearOffTitleHeight = rData.mnTearOffTitleHeight;
327 mnMenuBarHeight = rData.mnMenuBarHeight;
328 mnScrollBarSize = rData.mnScrollBarSize;
329 mnMinThumbSize = rData.mnMinThumbSize;
330 mnSplitSize = rData.mnSplitSize;
331 mnSpinSize = rData.mnSpinSize;
332 mnIconHorzSpace = rData.mnIconHorzSpace;
333 mnIconVertSpace = rData.mnIconVertSpace;
334 mnAntialiasedMin = rData.mnAntialiasedMin;
335 mnCursorSize = rData.mnCursorSize;
336 mnCursorBlinkTime = rData.mnCursorBlinkTime;
337 mnScreenZoom = rData.mnScreenZoom;
338 mnScreenFontZoom = rData.mnScreenFontZoom;
339 mnLogoDisplayTime = rData.mnLogoDisplayTime;
340 mnDragFullOptions = rData.mnDragFullOptions;
341 mnAnimationOptions = rData.mnAnimationOptions;
342 mnSelectionOptions = rData.mnSelectionOptions;
343 mnDisplayOptions = rData.mnDisplayOptions;
344 mnOptions = rData.mnOptions;
345 mnHighContrast = rData.mnHighContrast;
346 mnUseSystemUIFonts = rData.mnUseSystemUIFonts;
347 mnUseFlatBorders = rData.mnUseFlatBorders;
348 mnUseFlatMenus = rData.mnUseFlatMenus;
349 mnAutoMnemonic = rData.mnAutoMnemonic;
350 mnUseImagesInMenus = rData.mnUseImagesInMenus;
351 mbPreferredUseImagesInMenus = rData.mbPreferredUseImagesInMenus;
352 mnSkipDisabledInMenus = rData.mnSkipDisabledInMenus;
353 mbHideDisabledMenuItems = rData.mbHideDisabledMenuItems;
354 mbAcceleratorsInContextMenus = rData.mbAcceleratorsInContextMenus;
355 mbPrimaryButtonWarpsSlider = rData.mbPrimaryButtonWarpsSlider;
356 mnToolbarIconSize = rData.mnToolbarIconSize;
357 mnSymbolsStyle = rData.mnSymbolsStyle;
358 mnPreferredSymbolsStyle = rData.mnPreferredSymbolsStyle;
359 mpFontOptions = rData.mpFontOptions;
360 mnEdgeBlending = rData.mnEdgeBlending;
361 maEdgeBlendingTopLeftColor = rData.maEdgeBlendingTopLeftColor;
362 maEdgeBlendingBottomRightColor = rData.maEdgeBlendingBottomRightColor;
363 mnListBoxMaximumLineCount = rData.mnListBoxMaximumLineCount;
364 mnColorValueSetColumnCount = rData.mnColorValueSetColumnCount;
365 mnColorValueSetMaximumRowCount = rData.mnColorValueSetMaximumRowCount;
366 maListBoxPreviewDefaultLogicSize = rData.maListBoxPreviewDefaultLogicSize;
367 maListBoxPreviewDefaultPixelSize = rData.maListBoxPreviewDefaultPixelSize;
368 mnListBoxPreviewDefaultLineWidth = rData.mnListBoxPreviewDefaultLineWidth;
371 // -----------------------------------------------------------------------
373 void ImplStyleData::SetStandardStyles()
375 Font aStdFont( FAMILY_SWISS, Size( 0, 8 ) );
376 aStdFont.SetCharSet( osl_getThreadTextEncoding() );
377 aStdFont.SetWeight( WEIGHT_NORMAL );
378 aStdFont.SetName( utl::DefaultFontConfiguration::get().getUserInterfaceFont(com::sun::star::lang::Locale( OUString( "en" ), OUString(), OUString() ) ) );
379 maAppFont = aStdFont;
380 maHelpFont = aStdFont;
381 maMenuFont = aStdFont;
382 maToolFont = aStdFont;
383 maGroupFont = aStdFont;
384 maLabelFont = aStdFont;
385 maInfoFont = aStdFont;
386 maRadioCheckFont = aStdFont;
387 maPushButtonFont = aStdFont;
388 maFieldFont = aStdFont;
389 maIconFont = aStdFont;
390 aStdFont.SetWeight( WEIGHT_BOLD );
391 maFloatTitleFont = aStdFont;
392 maTitleFont = aStdFont;
394 maFaceColor = Color( COL_LIGHTGRAY );
395 maCheckedColor = Color( 0xCC, 0xCC, 0xCC );
396 maLightColor = Color( COL_WHITE );
397 maLightBorderColor = Color( COL_LIGHTGRAY );
398 maShadowColor = Color( COL_GRAY );
399 maDarkShadowColor = Color( COL_BLACK );
400 maButtonTextColor = Color( COL_BLACK );
401 maButtonRolloverTextColor = Color( COL_BLACK );
402 maRadioCheckTextColor = Color( COL_BLACK );
403 maGroupTextColor = Color( COL_BLACK );
404 maLabelTextColor = Color( COL_BLACK );
405 maInfoTextColor = Color( COL_BLACK );
406 maWindowColor = Color( COL_WHITE );
407 maWindowTextColor = Color( COL_BLACK );
408 maDialogColor = Color( COL_LIGHTGRAY );
409 maDialogTextColor = Color( COL_BLACK );
410 maWorkspaceColor = Color( 0xF0, 0xF0, 0xF0 );
411 maMonoColor = Color( COL_BLACK );
412 maFieldColor = Color( COL_WHITE );
413 maFieldTextColor = Color( COL_BLACK );
414 maFieldRolloverTextColor = Color( COL_BLACK );
415 maActiveColor = Color( COL_BLUE );
416 maActiveColor2 = Color( COL_BLACK );
417 maActiveTextColor = Color( COL_WHITE );
418 maActiveBorderColor = Color( COL_LIGHTGRAY );
419 maDeactiveColor = Color( COL_GRAY );
420 maDeactiveColor2 = Color( COL_BLACK );
421 maDeactiveTextColor = Color( COL_LIGHTGRAY );
422 maDeactiveBorderColor = Color( COL_LIGHTGRAY );
423 maMenuColor = Color( COL_LIGHTGRAY );
424 maMenuBarColor = Color( COL_LIGHTGRAY );
425 maMenuBarRolloverColor = Color( COL_BLUE );
426 maMenuBorderColor = Color( COL_LIGHTGRAY );
427 maMenuTextColor = Color( COL_BLACK );
428 maMenuBarTextColor = Color( COL_BLACK );
429 maMenuBarRolloverTextColor = Color( COL_WHITE );
430 maMenuHighlightColor = Color( COL_BLUE );
431 maMenuHighlightTextColor = Color( COL_WHITE );
432 maHighlightColor = Color( COL_BLUE );
433 maHighlightTextColor = Color( COL_WHITE );
434 maActiveTabColor = Color( COL_WHITE );
435 maInactiveTabColor = Color( COL_LIGHTGRAY );
436 maDisableColor = Color( COL_GRAY );
437 maHelpColor = Color( 0xFF, 0xFF, 0xE0 );
438 maHelpTextColor = Color( COL_BLACK );
439 maLinkColor = Color( COL_BLUE );
440 maVisitedLinkColor = Color( 0x00, 0x00, 0xCC );
441 maHighlightLinkColor = Color( COL_LIGHTBLUE );
442 maFontColor = Color( COL_BLACK );
444 mnBorderSize = 1;
445 mnTitleHeight = 18;
446 mnFloatTitleHeight = 13;
447 mnTearOffTitleHeight = 8;
448 mnMenuBarHeight = 14;
449 mnHighContrast = 0;
450 mnUseSystemUIFonts = 1;
451 mnUseFlatBorders = 0;
452 mnUseFlatMenus = 0;
453 mbPreferredUseImagesInMenus = sal_True;
454 mnSkipDisabledInMenus = (sal_uInt16)sal_False;
455 mbHideDisabledMenuItems = sal_False;
456 mbAcceleratorsInContextMenus = sal_True;
457 mbPrimaryButtonWarpsSlider = sal_False;
459 Gradient aGrad( GradientStyle_LINEAR, DEFAULT_WORKSPACE_GRADIENT_START_COLOR, DEFAULT_WORKSPACE_GRADIENT_END_COLOR );
460 maWorkspaceGradient = Wallpaper( aGrad );
463 // -----------------------------------------------------------------------
465 StyleSettings::StyleSettings()
467 mpData = new ImplStyleData();
470 // -----------------------------------------------------------------------
472 StyleSettings::StyleSettings( const StyleSettings& rSet )
474 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" );
476 // copy shared instance data and increment reference counter
477 mpData = rSet.mpData;
478 mpData->mnRefCount++;
481 // -----------------------------------------------------------------------
483 StyleSettings::~StyleSettings()
485 // if last reference then delete data
486 if ( mpData->mnRefCount == 1 )
487 delete mpData;
488 else
489 mpData->mnRefCount--;
492 const Size& StyleSettings::GetListBoxPreviewDefaultPixelSize() const
494 if(0 == mpData->maListBoxPreviewDefaultPixelSize.Width() || 0 == mpData->maListBoxPreviewDefaultPixelSize.Height())
496 const_cast< StyleSettings* >(this)->mpData->maListBoxPreviewDefaultPixelSize =
497 Application::GetDefaultDevice()->LogicToPixel(mpData->maListBoxPreviewDefaultLogicSize, MAP_APPFONT);
500 return mpData->maListBoxPreviewDefaultPixelSize;
503 // -----------------------------------------------------------------------
505 void StyleSettings::Set3DColors( const Color& rColor )
507 CopyData();
508 mpData->maFaceColor = rColor;
509 mpData->maLightBorderColor = rColor;
510 mpData->maMenuBorderColor = rColor;
511 mpData->maDarkShadowColor = Color( COL_BLACK );
512 if ( rColor != Color( COL_LIGHTGRAY ) )
514 mpData->maLightColor = rColor;
515 mpData->maShadowColor = rColor;
516 mpData->maDarkShadowColor=rColor;
517 mpData->maLightColor.IncreaseLuminance( 64 );
518 mpData->maShadowColor.DecreaseLuminance( 64 );
519 mpData->maDarkShadowColor.DecreaseLuminance( 100 );
520 sal_uLong nRed = mpData->maLightColor.GetRed();
521 sal_uLong nGreen = mpData->maLightColor.GetGreen();
522 sal_uLong nBlue = mpData->maLightColor.GetBlue();
523 nRed += (sal_uLong)(mpData->maShadowColor.GetRed());
524 nGreen += (sal_uLong)(mpData->maShadowColor.GetGreen());
525 nBlue += (sal_uLong)(mpData->maShadowColor.GetBlue());
526 mpData->maCheckedColor = Color( (sal_uInt8)(nRed/2), (sal_uInt8)(nGreen/2), (sal_uInt8)(nBlue/2) );
528 else
530 mpData->maCheckedColor = Color( 0x99, 0x99, 0x99 );
531 mpData->maLightColor = Color( COL_WHITE );
532 mpData->maShadowColor = Color( COL_GRAY );
536 // -----------------------------------------------------------------------
538 OUString StyleSettings::ImplSymbolsStyleToName( sal_uLong nStyle ) const
540 switch ( nStyle )
542 case STYLE_SYMBOLS_DEFAULT: return OUString("default");
543 case STYLE_SYMBOLS_HICONTRAST: return OUString("hicontrast");
544 case STYLE_SYMBOLS_INDUSTRIAL: return OUString("tango"); // industrial is dead
545 case STYLE_SYMBOLS_CRYSTAL: return OUString("crystal");
546 case STYLE_SYMBOLS_TANGO: return OUString("tango");
547 case STYLE_SYMBOLS_OXYGEN: return OUString("oxygen");
548 case STYLE_SYMBOLS_CLASSIC: return OUString("classic");
549 case STYLE_SYMBOLS_HUMAN: return OUString("human");
550 case STYLE_SYMBOLS_TANGO_TESTING: return OUString("tango_testing");
553 return OUString("auto");
556 // -----------------------------------------------------------------------
558 sal_uLong StyleSettings::ImplNameToSymbolsStyle( const OUString &rName ) const
560 if ( rName == OUString("default") )
561 return STYLE_SYMBOLS_DEFAULT;
562 else if ( rName == OUString("hicontrast") )
563 return STYLE_SYMBOLS_HICONTRAST;
564 else if ( rName == OUString("industrial") )
565 return STYLE_SYMBOLS_TANGO; // industrial is dead
566 else if ( rName == OUString("crystal") )
567 return STYLE_SYMBOLS_CRYSTAL;
568 else if ( rName == OUString("tango") )
569 return STYLE_SYMBOLS_TANGO;
570 else if ( rName == OUString("oxygen") )
571 return STYLE_SYMBOLS_OXYGEN;
572 else if ( rName == OUString("classic") )
573 return STYLE_SYMBOLS_CLASSIC;
574 else if ( rName == OUString("human") )
575 return STYLE_SYMBOLS_HUMAN;
576 else if ( rName == OUString("tango_testing") )
577 return STYLE_SYMBOLS_TANGO_TESTING;
579 return STYLE_SYMBOLS_AUTO;
582 // -----------------------------------------------------------------------
585 The preferred style name can be read from the desktop setting. We
586 need to find the closest theme name registered in OOo. Therefore
587 we check if any registered style name is a case-insensitive
588 substring of the preferred style name.
590 void StyleSettings::SetPreferredSymbolsStyleName( const OUString &rName )
592 if ( !rName.isEmpty() )
594 OUString rNameLowCase( rName.toAsciiLowerCase() );
596 for( sal_uInt32 n = 0; n <= STYLE_SYMBOLS_THEMES_MAX; n++ )
597 if ( rNameLowCase.indexOf( ImplSymbolsStyleToName( n ) ) != -1 )
598 SetPreferredSymbolsStyle( n );
602 void StyleSettings::SetCheckedColorSpecialCase( )
604 CopyData();
605 // Light gray checked color special case
606 if ( GetFaceColor() == COL_LIGHTGRAY )
607 mpData->maCheckedColor = Color( 0xCC, 0xCC, 0xCC );
608 else
610 sal_uInt8 nRed = (sal_uInt8)(((sal_uInt16)mpData->maFaceColor.GetRed() + (sal_uInt16)mpData->maLightColor.GetRed())/2);
611 sal_uInt8 nGreen = (sal_uInt8)(((sal_uInt16)mpData->maFaceColor.GetGreen() + (sal_uInt16)mpData->maLightColor.GetGreen())/2);
612 sal_uInt8 nBlue = (sal_uInt8)(((sal_uInt16)mpData->maFaceColor.GetBlue() + (sal_uInt16)mpData->maLightColor.GetBlue())/2);
613 mpData->maCheckedColor = Color( nRed, nGreen, nBlue );
617 // -----------------------------------------------------------------------
619 sal_uLong StyleSettings::GetCurrentSymbolsStyle() const
621 // style selected in Tools -> Options... -> OpenOffice.org -> View
622 sal_uLong nStyle = GetSymbolsStyle();
624 if ( nStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nStyle) ) )
626 // the preferred style can be read from the desktop setting by the desktop native widgets modules
627 sal_uLong nPreferredStyle = GetPreferredSymbolsStyle();
629 if ( nPreferredStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nPreferredStyle) ) )
632 // use a hardcoded desktop-specific fallback if no preferred style has been detected
633 static bool sbFallbackDesktopChecked = false;
634 static sal_uLong snFallbackDesktopStyle = STYLE_SYMBOLS_DEFAULT;
636 if ( !sbFallbackDesktopChecked )
638 snFallbackDesktopStyle = GetAutoSymbolsStyle();
639 sbFallbackDesktopChecked = true;
642 nPreferredStyle = snFallbackDesktopStyle;
645 if (GetHighContrastMode() && CheckSymbolStyle (STYLE_SYMBOLS_HICONTRAST) )
646 nStyle = STYLE_SYMBOLS_HICONTRAST;
647 else
648 nStyle = nPreferredStyle;
651 return nStyle;
654 // -----------------------------------------------------------------------
656 sal_uLong StyleSettings::GetAutoSymbolsStyle() const
658 OUString const & env = Application::GetDesktopEnvironment();
660 sal_uLong nRet;
661 if ( env.equalsIgnoreAsciiCase("tde") ||
662 env.equalsIgnoreAsciiCase("kde") )
663 nRet = STYLE_SYMBOLS_CRYSTAL;
664 else if ( env.equalsIgnoreAsciiCase("kde4") )
665 nRet = STYLE_SYMBOLS_OXYGEN;
666 else
667 nRet = STYLE_SYMBOLS_TANGO;
669 // falback to any existing style
670 if ( ! CheckSymbolStyle (nRet) )
672 for ( sal_uLong n = 0 ; n <= STYLE_SYMBOLS_THEMES_MAX ; n++ )
674 sal_uLong nStyleToCheck = n;
676 // auto is not a real theme => can't be fallback
677 if ( nStyleToCheck == STYLE_SYMBOLS_AUTO )
678 continue;
680 // will check hicontrast in the end
681 if ( nStyleToCheck == STYLE_SYMBOLS_HICONTRAST )
682 continue;
683 if ( nStyleToCheck == STYLE_SYMBOLS_THEMES_MAX )
684 nStyleToCheck = STYLE_SYMBOLS_HICONTRAST;
686 if ( CheckSymbolStyle ( nStyleToCheck ) )
688 nRet = nStyleToCheck;
689 n = STYLE_SYMBOLS_THEMES_MAX;
694 return nRet;
697 // -----------------------------------------------------------------------
699 bool StyleSettings::CheckSymbolStyle( sal_uLong nStyle ) const
701 if ( nStyle == STYLE_SYMBOLS_INDUSTRIAL )
702 return false; // industrial is dead
704 static ImplImageTreeSingletonRef aImageTree;
705 return aImageTree->checkStyle( ImplSymbolsStyleToName( nStyle ) );
708 // -----------------------------------------------------------------------
710 sal_Bool StyleSettings::GetUseImagesInMenus() const
712 // icon mode selected in Tools -> Options... -> OpenOffice.org -> View
713 sal_uInt16 nStyle = mpData->mnUseImagesInMenus;
715 if ( nStyle == STYLE_MENUIMAGES_AUTO )
716 return GetPreferredUseImagesInMenus();
718 return (sal_Bool)nStyle;
721 // -----------------------------------------------------------------------
723 static BitmapEx readBitmapEx( const OUString& rPath )
725 OUString aPath( rPath );
726 rtl::Bootstrap::expandMacros( aPath );
728 // import the image
729 Graphic aGraphic;
730 if ( GraphicFilter::LoadGraphic( aPath, String(), aGraphic ) != GRFILTER_OK )
731 return BitmapEx();
733 return aGraphic.GetBitmapEx();
736 enum WhichPersona { PERSONA_HEADER, PERSONA_FOOTER };
738 /** Update the setting of the Persona header / footer in ImplStyleData */
739 static void setupPersonaHeaderFooter( WhichPersona eWhich, OUString& rHeaderFooter, BitmapEx& rHeaderFooterBitmap, Color& maMenuBarTextColor )
741 uno::Reference< uno::XComponentContext > xContext( comphelper::getProcessComponentContext() );
742 if ( !xContext.is() )
743 return;
745 // read from the configuration
746 OUString aPersona( officecfg::Office::Common::Misc::Persona::get( xContext ) );
747 OUString aPersonaSettings( officecfg::Office::Common::Misc::PersonaSettings::get( xContext ) );
749 // have the settings changed?
750 OUString aOldValue( aPersona + ";" + aPersonaSettings );
751 if ( rHeaderFooter == aOldValue )
752 return;
754 rHeaderFooter = aOldValue;
755 rHeaderFooterBitmap = BitmapEx();
757 // now read the new values and setup bitmaps
758 OUString aHeader, aFooter;
759 if ( aPersona == "own" )
761 sal_Int32 nIndex = 0;
762 aHeader = aPersonaSettings.getToken( 0, ';', nIndex );
763 if ( nIndex > 0 )
764 aFooter = aPersonaSettings.getToken( 0, ';', nIndex );
766 // change menu text color, advance nIndex to skip the '#'
767 if ( nIndex > 0 )
769 OUString aColor = aPersonaSettings.getToken( 0, ';', ++nIndex );
770 maMenuBarTextColor = Color( aColor.toInt64( 16 ) );
773 else if ( aPersona == "default" )
775 aHeader = "header.jpg";
776 aFooter = "footer.jpg";
779 OUString aName;
780 switch ( eWhich ) {
781 case PERSONA_HEADER: aName = aHeader; break;
782 case PERSONA_FOOTER: aName = aFooter; break;
785 if ( !aName.isEmpty() )
787 // try the gallery first, then the program path:
788 OUString gallery = "${$BRAND_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap") "::UserInstallation}";
789 rtl::Bootstrap::expandMacros( gallery );
790 gallery += "/user/gallery/personas/";
792 if ( aPersona == "own" )
793 rHeaderFooterBitmap = readBitmapEx( gallery + aName );
795 if ( rHeaderFooterBitmap.IsEmpty() )
796 rHeaderFooterBitmap = readBitmapEx( "$BRAND_BASE_DIR/program/" + aName );
800 const BitmapEx StyleSettings::GetPersonaHeader() const
802 setupPersonaHeaderFooter( PERSONA_HEADER, mpData->maPersonaHeaderFooter, mpData->maPersonaHeaderBitmap, mpData->maMenuBarTextColor );
803 return mpData->maPersonaHeaderBitmap;
806 // -----------------------------------------------------------------------
808 void StyleSettings::SetStandardStyles()
810 CopyData();
811 mpData->SetStandardStyles();
814 // -----------------------------------------------------------------------
816 Color StyleSettings::GetFaceGradientColor() const
818 // compute a brighter face color that can be used in gradients
819 // for a convex look (eg toolbars)
821 sal_uInt16 h, s, b;
822 GetFaceColor().RGBtoHSB( h, s, b );
823 if( s > 1) s=1;
824 if( b < 98) b=98;
825 return Color( Color::HSBtoRGB( h, s, b ) );
828 // -----------------------------------------------------------------------
830 Color StyleSettings::GetSeparatorColor() const
832 // compute a brighter shadow color for separators (used in toolbars or between menubar and toolbars on Windows XP)
833 sal_uInt16 h, s, b;
834 GetShadowColor().RGBtoHSB( h, s, b );
835 b += b/4;
836 s -= s/4;
837 return Color( Color::HSBtoRGB( h, s, b ) );
840 // -----------------------------------------------------------------------
842 const StyleSettings& StyleSettings::operator =( const StyleSettings& rSet )
844 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" );
846 // increase reference counter first, to be able to assign oneself
847 rSet.mpData->mnRefCount++;
849 // if last reference then delete data
850 if ( mpData->mnRefCount == 1 )
851 delete mpData;
852 else
853 mpData->mnRefCount--;
855 mpData = rSet.mpData;
857 return *this;
860 // -----------------------------------------------------------------------
862 void StyleSettings::CopyData()
864 // copy if other references exist
865 if ( mpData->mnRefCount != 1 )
867 mpData->mnRefCount--;
868 mpData = new ImplStyleData( *mpData );
872 // -----------------------------------------------------------------------
874 sal_Bool StyleSettings::operator ==( const StyleSettings& rSet ) const
876 if ( mpData == rSet.mpData )
877 return sal_True;
879 if ( (mpData->mnOptions == rSet.mpData->mnOptions) &&
880 (mpData->mnAutoMnemonic == rSet.mpData->mnAutoMnemonic) &&
881 (mpData->mnLogoDisplayTime == rSet.mpData->mnLogoDisplayTime) &&
882 (mpData->mnDragFullOptions == rSet.mpData->mnDragFullOptions) &&
883 (mpData->mnAnimationOptions == rSet.mpData->mnAnimationOptions) &&
884 (mpData->mnSelectionOptions == rSet.mpData->mnSelectionOptions) &&
885 (mpData->mnDisplayOptions == rSet.mpData->mnDisplayOptions) &&
886 (mpData->mnCursorSize == rSet.mpData->mnCursorSize) &&
887 (mpData->mnCursorBlinkTime == rSet.mpData->mnCursorBlinkTime) &&
888 (mpData->mnBorderSize == rSet.mpData->mnBorderSize) &&
889 (mpData->mnTitleHeight == rSet.mpData->mnTitleHeight) &&
890 (mpData->mnFloatTitleHeight == rSet.mpData->mnFloatTitleHeight) &&
891 (mpData->mnTearOffTitleHeight == rSet.mpData->mnTearOffTitleHeight) &&
892 (mpData->mnMenuBarHeight == rSet.mpData->mnMenuBarHeight) &&
893 (mpData->mnScrollBarSize == rSet.mpData->mnScrollBarSize) &&
894 (mpData->mnMinThumbSize == rSet.mpData->mnMinThumbSize) &&
895 (mpData->mnSplitSize == rSet.mpData->mnSplitSize) &&
896 (mpData->mnSpinSize == rSet.mpData->mnSpinSize) &&
897 (mpData->mnIconHorzSpace == rSet.mpData->mnIconHorzSpace) &&
898 (mpData->mnIconVertSpace == rSet.mpData->mnIconVertSpace) &&
899 (mpData->mnAntialiasedMin == rSet.mpData->mnAntialiasedMin) &&
900 (mpData->mnScreenZoom == rSet.mpData->mnScreenZoom) &&
901 (mpData->mnScreenFontZoom == rSet.mpData->mnScreenFontZoom) &&
902 (mpData->mnHighContrast == rSet.mpData->mnHighContrast) &&
903 (mpData->mnUseSystemUIFonts == rSet.mpData->mnUseSystemUIFonts) &&
904 (mpData->mnUseFlatBorders == rSet.mpData->mnUseFlatBorders) &&
905 (mpData->mnUseFlatMenus == rSet.mpData->mnUseFlatMenus) &&
906 (mpData->mnSymbolsStyle == rSet.mpData->mnSymbolsStyle) &&
907 (mpData->mnPreferredSymbolsStyle == rSet.mpData->mnPreferredSymbolsStyle) &&
908 (mpData->maFaceColor == rSet.mpData->maFaceColor) &&
909 (mpData->maCheckedColor == rSet.mpData->maCheckedColor) &&
910 (mpData->maLightColor == rSet.mpData->maLightColor) &&
911 (mpData->maLightBorderColor == rSet.mpData->maLightBorderColor) &&
912 (mpData->maShadowColor == rSet.mpData->maShadowColor) &&
913 (mpData->maDarkShadowColor == rSet.mpData->maDarkShadowColor) &&
914 (mpData->maButtonTextColor == rSet.mpData->maButtonTextColor) &&
915 (mpData->maRadioCheckTextColor == rSet.mpData->maRadioCheckTextColor) &&
916 (mpData->maGroupTextColor == rSet.mpData->maGroupTextColor) &&
917 (mpData->maLabelTextColor == rSet.mpData->maLabelTextColor) &&
918 (mpData->maInfoTextColor == rSet.mpData->maInfoTextColor) &&
919 (mpData->maWindowColor == rSet.mpData->maWindowColor) &&
920 (mpData->maWindowTextColor == rSet.mpData->maWindowTextColor) &&
921 (mpData->maDialogColor == rSet.mpData->maDialogColor) &&
922 (mpData->maDialogTextColor == rSet.mpData->maDialogTextColor) &&
923 (mpData->maWorkspaceColor == rSet.mpData->maWorkspaceColor) &&
924 (mpData->maMonoColor == rSet.mpData->maMonoColor) &&
925 (mpData->maFieldColor == rSet.mpData->maFieldColor) &&
926 (mpData->maFieldTextColor == rSet.mpData->maFieldTextColor) &&
927 (mpData->maActiveColor == rSet.mpData->maActiveColor) &&
928 (mpData->maActiveColor2 == rSet.mpData->maActiveColor2) &&
929 (mpData->maActiveTextColor == rSet.mpData->maActiveTextColor) &&
930 (mpData->maActiveBorderColor == rSet.mpData->maActiveBorderColor) &&
931 (mpData->maDeactiveColor == rSet.mpData->maDeactiveColor) &&
932 (mpData->maDeactiveColor2 == rSet.mpData->maDeactiveColor2) &&
933 (mpData->maDeactiveTextColor == rSet.mpData->maDeactiveTextColor) &&
934 (mpData->maDeactiveBorderColor == rSet.mpData->maDeactiveBorderColor) &&
935 (mpData->maMenuColor == rSet.mpData->maMenuColor) &&
936 (mpData->maMenuBarColor == rSet.mpData->maMenuBarColor) &&
937 (mpData->maMenuBarRolloverColor == rSet.mpData->maMenuBarRolloverColor) &&
938 (mpData->maMenuBorderColor == rSet.mpData->maMenuBorderColor) &&
939 (mpData->maMenuTextColor == rSet.mpData->maMenuTextColor) &&
940 (mpData->maMenuBarTextColor == rSet.mpData->maMenuBarTextColor) &&
941 (mpData->maMenuBarRolloverTextColor == rSet.mpData->maMenuBarRolloverTextColor) &&
942 (mpData->maMenuHighlightColor == rSet.mpData->maMenuHighlightColor) &&
943 (mpData->maMenuHighlightTextColor == rSet.mpData->maMenuHighlightTextColor) &&
944 (mpData->maHighlightColor == rSet.mpData->maHighlightColor) &&
945 (mpData->maHighlightTextColor == rSet.mpData->maHighlightTextColor) &&
946 (mpData->maActiveTabColor == rSet.mpData->maActiveTabColor) &&
947 (mpData->maInactiveTabColor == rSet.mpData->maInactiveTabColor) &&
948 (mpData->maDisableColor == rSet.mpData->maDisableColor) &&
949 (mpData->maHelpColor == rSet.mpData->maHelpColor) &&
950 (mpData->maHelpTextColor == rSet.mpData->maHelpTextColor) &&
951 (mpData->maLinkColor == rSet.mpData->maLinkColor) &&
952 (mpData->maVisitedLinkColor == rSet.mpData->maVisitedLinkColor) &&
953 (mpData->maHighlightLinkColor == rSet.mpData->maHighlightLinkColor) &&
954 (mpData->maAppFont == rSet.mpData->maAppFont) &&
955 (mpData->maHelpFont == rSet.mpData->maHelpFont) &&
956 (mpData->maTitleFont == rSet.mpData->maTitleFont) &&
957 (mpData->maFloatTitleFont == rSet.mpData->maFloatTitleFont) &&
958 (mpData->maMenuFont == rSet.mpData->maMenuFont) &&
959 (mpData->maToolFont == rSet.mpData->maToolFont) &&
960 (mpData->maGroupFont == rSet.mpData->maGroupFont) &&
961 (mpData->maLabelFont == rSet.mpData->maLabelFont) &&
962 (mpData->maInfoFont == rSet.mpData->maInfoFont) &&
963 (mpData->maRadioCheckFont == rSet.mpData->maRadioCheckFont) &&
964 (mpData->maPushButtonFont == rSet.mpData->maPushButtonFont) &&
965 (mpData->maFieldFont == rSet.mpData->maFieldFont) &&
966 (mpData->maIconFont == rSet.mpData->maIconFont) &&
967 (mpData->mnUseImagesInMenus == rSet.mpData->mnUseImagesInMenus) &&
968 (mpData->mbPreferredUseImagesInMenus == rSet.mpData->mbPreferredUseImagesInMenus) &&
969 (mpData->mnSkipDisabledInMenus == rSet.mpData->mnSkipDisabledInMenus) &&
970 (mpData->mbHideDisabledMenuItems == rSet.mpData->mbHideDisabledMenuItems) &&
971 (mpData->mbAcceleratorsInContextMenus == rSet.mpData->mbAcceleratorsInContextMenus)&&
972 (mpData->mbPrimaryButtonWarpsSlider == rSet.mpData->mbPrimaryButtonWarpsSlider) &&
973 (mpData->maFontColor == rSet.mpData->maFontColor) &&
974 (mpData->mnEdgeBlending == rSet.mpData->mnEdgeBlending) &&
975 (mpData->maEdgeBlendingTopLeftColor == rSet.mpData->maEdgeBlendingTopLeftColor) &&
976 (mpData->maEdgeBlendingBottomRightColor == rSet.mpData->maEdgeBlendingBottomRightColor) &&
977 (mpData->mnListBoxMaximumLineCount == rSet.mpData->mnListBoxMaximumLineCount) &&
978 (mpData->mnColorValueSetColumnCount == rSet.mpData->mnColorValueSetColumnCount) &&
979 (mpData->mnColorValueSetMaximumRowCount == rSet.mpData->mnColorValueSetMaximumRowCount) &&
980 (mpData->maListBoxPreviewDefaultLogicSize == rSet.mpData->maListBoxPreviewDefaultLogicSize) &&
981 (mpData->maListBoxPreviewDefaultPixelSize == rSet.mpData->maListBoxPreviewDefaultPixelSize) &&
982 (mpData->mnListBoxPreviewDefaultLineWidth == rSet.mpData->mnListBoxPreviewDefaultLineWidth))
983 return sal_True;
984 else
985 return sal_False;
988 // =======================================================================
990 ImplMiscData::ImplMiscData()
992 mnRefCount = 1;
993 mnEnableATT = sal::static_int_cast<sal_uInt16>(~0U);
994 mnDisablePrinting = sal::static_int_cast<sal_uInt16>(~0U);
995 static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI
996 mbEnableLocalizedDecimalSep = (pEnv != NULL) ? sal_True : sal_False;
999 // -----------------------------------------------------------------------
1001 ImplMiscData::ImplMiscData( const ImplMiscData& rData )
1003 mnRefCount = 1;
1004 mnEnableATT = rData.mnEnableATT;
1005 mnDisablePrinting = rData.mnDisablePrinting;
1006 mbEnableLocalizedDecimalSep = rData.mbEnableLocalizedDecimalSep;
1009 // -----------------------------------------------------------------------
1011 MiscSettings::MiscSettings()
1013 mpData = new ImplMiscData();
1016 // -----------------------------------------------------------------------
1018 MiscSettings::MiscSettings( const MiscSettings& rSet )
1020 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" );
1022 // copy shared instance data and increment reference counter
1023 mpData = rSet.mpData;
1024 mpData->mnRefCount++;
1027 // -----------------------------------------------------------------------
1029 MiscSettings::~MiscSettings()
1031 // if last reference then delete data
1032 if ( mpData->mnRefCount == 1 )
1033 delete mpData;
1034 else
1035 mpData->mnRefCount--;
1038 // -----------------------------------------------------------------------
1040 const MiscSettings& MiscSettings::operator =( const MiscSettings& rSet )
1042 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" );
1044 // increase reference counter first, to be able to assign oneself
1045 rSet.mpData->mnRefCount++;
1047 // if last reference then delete data
1048 if ( mpData->mnRefCount == 1 )
1049 delete mpData;
1050 else
1051 mpData->mnRefCount--;
1053 mpData = rSet.mpData;
1055 return *this;
1058 // -----------------------------------------------------------------------
1060 void MiscSettings::CopyData()
1062 // copy if other references exist
1063 if ( mpData->mnRefCount != 1 )
1065 mpData->mnRefCount--;
1066 mpData = new ImplMiscData( *mpData );
1070 // -----------------------------------------------------------------------
1072 sal_Bool MiscSettings::operator ==( const MiscSettings& rSet ) const
1074 if ( mpData == rSet.mpData )
1075 return sal_True;
1077 if ( (mpData->mnEnableATT == rSet.mpData->mnEnableATT ) &&
1078 (mpData->mnDisablePrinting == rSet.mpData->mnDisablePrinting ) &&
1079 (mpData->mbEnableLocalizedDecimalSep == rSet.mpData->mbEnableLocalizedDecimalSep ) )
1080 return sal_True;
1081 else
1082 return sal_False;
1085 // -----------------------------------------------------------------------
1087 sal_Bool MiscSettings::GetDisablePrinting() const
1089 if( mpData->mnDisablePrinting == (sal_uInt16)~0 )
1091 OUString aEnable =
1092 vcl::SettingsConfigItem::get()->
1093 getValue( OUString( "DesktopManagement" ),
1094 OUString( "DisablePrinting" ) );
1095 mpData->mnDisablePrinting = aEnable.equalsIgnoreAsciiCase("true") ? 1 : 0;
1098 return (sal_Bool)mpData->mnDisablePrinting;
1100 // -----------------------------------------------------------------------
1102 sal_Bool MiscSettings::GetEnableATToolSupport() const
1105 #ifdef WNT
1106 if( mpData->mnEnableATT == (sal_uInt16)~0 )
1108 // Check in the Windows registry if an AT tool wants Accessibility support to
1109 // be activated ..
1110 HKEY hkey;
1112 if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER,
1113 "Software\\LibreOffice\\Accessibility\\AtToolSupport",
1114 &hkey) )
1116 DWORD dwType;
1117 sal_uInt8 Data[6]; // possible values: "true", "false", "1", "0", DWORD
1118 DWORD cbData = sizeof(Data);
1120 if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology",
1121 NULL, &dwType, Data, &cbData) )
1123 switch (dwType)
1125 case REG_SZ:
1126 mpData->mnEnableATT = ((0 == stricmp((const char *) Data, "1")) || (0 == stricmp((const char *) Data, "true")));
1127 break;
1128 case REG_DWORD:
1129 mpData->mnEnableATT = (sal_uInt16) (((DWORD *) Data)[0]);
1130 break;
1131 default:
1132 // Unsupported registry type
1133 break;
1137 RegCloseKey(hkey);
1140 #endif
1142 if( mpData->mnEnableATT == (sal_uInt16)~0 )
1144 static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" );
1145 if( !pEnv || !*pEnv )
1147 OUString aEnable =
1148 vcl::SettingsConfigItem::get()->
1149 getValue( OUString( "Accessibility" ),
1150 OUString( "EnableATToolSupport" ) );
1151 mpData->mnEnableATT = aEnable.equalsIgnoreAsciiCase("true") ? 1 : 0;
1153 else
1155 mpData->mnEnableATT = 1;
1159 return (sal_Bool)mpData->mnEnableATT;
1162 #ifdef WNT
1163 void MiscSettings::SetEnableATToolSupport( sal_Bool bEnable )
1165 if ( bEnable != mpData->mnEnableATT )
1167 bool bDummy;
1168 if( bEnable && !ImplInitAccessBridge(false, bDummy) )
1169 return;
1171 HKEY hkey;
1173 // If the accessibility key in the Windows registry exists, change it synchronously
1174 if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER,
1175 "Software\\LibreOffice\\Accessibility\\AtToolSupport",
1176 &hkey) )
1178 DWORD dwType;
1179 sal_uInt8 Data[6]; // possible values: "true", "false", 1, 0
1180 DWORD cbData = sizeof(Data);
1182 if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology",
1183 NULL, &dwType, Data, &cbData) )
1185 switch (dwType)
1187 case REG_SZ:
1188 RegSetValueEx(hkey, "SupportAssistiveTechnology",
1189 0, dwType,
1190 bEnable ? (sal_uInt8 *) "true" : (sal_uInt8 *) "false",
1191 bEnable ? sizeof("true") : sizeof("false"));
1192 break;
1193 case REG_DWORD:
1194 ((DWORD *) Data)[0] = bEnable ? 1 : 0;
1195 RegSetValueEx(hkey, "SupportAssistiveTechnology",
1196 0, dwType, Data, sizeof(DWORD));
1197 break;
1198 default:
1199 // Unsupported registry type
1200 break;
1204 RegCloseKey(hkey);
1207 vcl::SettingsConfigItem::get()->
1208 setValue( OUString( "Accessibility" ),
1209 OUString( "EnableATToolSupport" ),
1210 bEnable ? OUString("true") : OUString("false" ) );
1211 mpData->mnEnableATT = bEnable ? 1 : 0;
1214 #endif
1216 void MiscSettings::SetEnableLocalizedDecimalSep( sal_Bool bEnable )
1218 CopyData();
1219 mpData->mbEnableLocalizedDecimalSep = bEnable;
1222 sal_Bool MiscSettings::GetEnableLocalizedDecimalSep() const
1224 return mpData->mbEnableLocalizedDecimalSep;
1227 // =======================================================================
1229 ImplHelpData::ImplHelpData()
1231 mnRefCount = 1;
1232 mnOptions = 0;
1233 mnTipDelay = 500;
1234 mnTipTimeout = 3000;
1235 mnBalloonDelay = 1500;
1238 // -----------------------------------------------------------------------
1240 ImplHelpData::ImplHelpData( const ImplHelpData& rData )
1242 mnRefCount = 1;
1243 mnOptions = rData.mnOptions;
1244 mnTipDelay = rData.mnTipDelay;
1245 mnTipTimeout = rData.mnTipTimeout;
1246 mnBalloonDelay = rData.mnBalloonDelay;
1249 // -----------------------------------------------------------------------
1251 HelpSettings::HelpSettings()
1253 mpData = new ImplHelpData();
1256 // -----------------------------------------------------------------------
1258 HelpSettings::HelpSettings( const HelpSettings& rSet )
1260 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" );
1262 // copy shared instance data and increment reference counter
1263 mpData = rSet.mpData;
1264 mpData->mnRefCount++;
1267 // -----------------------------------------------------------------------
1269 HelpSettings::~HelpSettings()
1271 // if last reference then delete data
1272 if ( mpData->mnRefCount == 1 )
1273 delete mpData;
1274 else
1275 mpData->mnRefCount--;
1278 // -----------------------------------------------------------------------
1280 const HelpSettings& HelpSettings::operator =( const HelpSettings& rSet )
1282 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" );
1284 // increase reference counter first, to be able to assign oneself
1285 rSet.mpData->mnRefCount++;
1287 // delete data if last reference
1288 if ( mpData->mnRefCount == 1 )
1289 delete mpData;
1290 else
1291 mpData->mnRefCount--;
1293 mpData = rSet.mpData;
1295 return *this;
1298 // -----------------------------------------------------------------------
1300 void HelpSettings::CopyData()
1302 // copy of other references exist
1303 if ( mpData->mnRefCount != 1 )
1305 mpData->mnRefCount--;
1306 mpData = new ImplHelpData( *mpData );
1310 // -----------------------------------------------------------------------
1312 sal_Bool HelpSettings::operator ==( const HelpSettings& rSet ) const
1314 if ( mpData == rSet.mpData )
1315 return sal_True;
1317 if ( (mpData->mnOptions == rSet.mpData->mnOptions ) &&
1318 (mpData->mnTipDelay == rSet.mpData->mnTipDelay ) &&
1319 (mpData->mnTipTimeout == rSet.mpData->mnTipTimeout ) &&
1320 (mpData->mnBalloonDelay == rSet.mpData->mnBalloonDelay ) )
1321 return sal_True;
1322 else
1323 return sal_False;
1326 // =======================================================================
1328 ImplAllSettingsData::ImplAllSettingsData()
1330 maLocale( LANGUAGE_SYSTEM ),
1331 maUILocale( LANGUAGE_SYSTEM )
1333 mnRefCount = 1;
1334 mnSystemUpdate = SETTINGS_ALLSETTINGS;
1335 mnWindowUpdate = SETTINGS_ALLSETTINGS;
1336 mpLocaleDataWrapper = NULL;
1337 mpUILocaleDataWrapper = NULL;
1338 mpI18nHelper = NULL;
1339 mpUII18nHelper = NULL;
1340 maMiscSettings.SetEnableLocalizedDecimalSep( maSysLocale.GetOptions().IsDecimalSeparatorAsLocale() );
1343 // -----------------------------------------------------------------------
1345 ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) :
1346 maMouseSettings( rData.maMouseSettings ),
1347 maStyleSettings( rData.maStyleSettings ),
1348 maMiscSettings( rData.maMiscSettings ),
1349 maHelpSettings( rData.maHelpSettings ),
1350 maLocale( rData.maLocale ),
1351 maUILocale( rData.maUILocale )
1353 mnRefCount = 1;
1354 mnSystemUpdate = rData.mnSystemUpdate;
1355 mnWindowUpdate = rData.mnWindowUpdate;
1356 // Pointer couldn't shared and objects haven't a copy ctor
1357 // So we create the cache objects new, if the GetFunction is
1358 // called
1359 mpLocaleDataWrapper = NULL;
1360 mpUILocaleDataWrapper = NULL;
1361 mpI18nHelper = NULL;
1362 mpUII18nHelper = NULL;
1365 // -----------------------------------------------------------------------
1367 ImplAllSettingsData::~ImplAllSettingsData()
1369 delete mpLocaleDataWrapper;
1370 delete mpUILocaleDataWrapper;
1371 if ( mpI18nHelper )
1372 delete mpI18nHelper;
1373 if ( mpUII18nHelper )
1374 delete mpUII18nHelper;
1377 // -----------------------------------------------------------------------
1379 AllSettings::AllSettings()
1381 DBG_CTOR( AllSettings, NULL );
1383 mpData = new ImplAllSettingsData();
1386 // -----------------------------------------------------------------------
1388 AllSettings::AllSettings( const AllSettings& rSet )
1390 DBG_CTOR( AllSettings, NULL );
1391 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "Settings: RefCount overflow" );
1393 // copy shared instance data and increse reference counter
1394 mpData = rSet.mpData;
1395 mpData->mnRefCount++;
1398 // -----------------------------------------------------------------------
1400 AllSettings::~AllSettings()
1402 DBG_DTOR( AllSettings, NULL );
1404 // if last reference then delete data
1405 if ( mpData->mnRefCount == 1 )
1406 delete mpData;
1407 else
1408 mpData->mnRefCount--;
1411 // -----------------------------------------------------------------------
1413 const AllSettings& AllSettings::operator =( const AllSettings& rSet )
1415 DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "AllSettings: RefCount overflow" );
1416 DBG_CHKTHIS( AllSettings, NULL );
1417 DBG_CHKOBJ( &rSet, AllSettings, NULL );
1419 // increase reference counter first, to be able to assign oneself
1420 rSet.mpData->mnRefCount++;
1422 // if last reference then delete data
1423 if ( mpData->mnRefCount == 1 )
1424 delete mpData;
1425 else
1426 mpData->mnRefCount--;
1428 mpData = rSet.mpData;
1430 return *this;
1433 // -----------------------------------------------------------------------
1435 void AllSettings::CopyData()
1437 DBG_CHKTHIS( AllSettings, NULL );
1439 // copy if other references exist
1440 if ( mpData->mnRefCount != 1 )
1442 mpData->mnRefCount--;
1443 mpData = new ImplAllSettingsData( *mpData );
1447 // -----------------------------------------------------------------------
1449 sal_uLong AllSettings::Update( sal_uLong nFlags, const AllSettings& rSet )
1451 DBG_CHKTHIS( AllSettings, NULL );
1452 DBG_CHKOBJ( &rSet, AllSettings, NULL );
1454 sal_uLong nChangeFlags = 0;
1456 if ( nFlags & SETTINGS_MOUSE )
1458 if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings )
1460 CopyData();
1461 mpData->maMouseSettings = rSet.mpData->maMouseSettings;
1462 nChangeFlags |= SETTINGS_MOUSE;
1466 if ( nFlags & SETTINGS_STYLE )
1468 if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings )
1470 CopyData();
1471 mpData->maStyleSettings = rSet.mpData->maStyleSettings;
1472 nChangeFlags |= SETTINGS_STYLE;
1476 if ( nFlags & SETTINGS_MISC )
1478 if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings )
1480 CopyData();
1481 mpData->maMiscSettings = rSet.mpData->maMiscSettings;
1482 nChangeFlags |= SETTINGS_MISC;
1486 if ( nFlags & SETTINGS_HELP )
1488 if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings )
1490 CopyData();
1491 mpData->maHelpSettings = rSet.mpData->maHelpSettings;
1492 nChangeFlags |= SETTINGS_HELP;
1496 if ( nFlags & SETTINGS_LOCALE )
1498 if ( mpData->maLocale != rSet.mpData->maLocale )
1500 SetLanguageTag( rSet.mpData->maLocale );
1501 nChangeFlags |= SETTINGS_LOCALE;
1505 if ( nFlags & SETTINGS_UILOCALE )
1507 // UILocale can't be changed
1510 return nChangeFlags;
1513 // -----------------------------------------------------------------------
1515 sal_uLong AllSettings::GetChangeFlags( const AllSettings& rSet ) const
1517 DBG_CHKTHIS( AllSettings, NULL );
1518 DBG_CHKOBJ( &rSet, AllSettings, NULL );
1520 sal_uLong nChangeFlags = 0;
1522 if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings )
1523 nChangeFlags |= SETTINGS_MOUSE;
1525 if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings )
1526 nChangeFlags |= SETTINGS_STYLE;
1528 if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings )
1529 nChangeFlags |= SETTINGS_MISC;
1531 if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings )
1532 nChangeFlags |= SETTINGS_HELP;
1534 if ( mpData->maLocale != rSet.mpData->maLocale )
1535 nChangeFlags |= SETTINGS_LOCALE;
1537 return nChangeFlags;
1540 // -----------------------------------------------------------------------
1542 sal_Bool AllSettings::operator ==( const AllSettings& rSet ) const
1544 DBG_CHKTHIS( AllSettings, NULL );
1545 DBG_CHKOBJ( &rSet, AllSettings, NULL );
1547 if ( mpData == rSet.mpData )
1548 return sal_True;
1550 if ( (mpData->maMouseSettings == rSet.mpData->maMouseSettings) &&
1551 (mpData->maStyleSettings == rSet.mpData->maStyleSettings) &&
1552 (mpData->maMiscSettings == rSet.mpData->maMiscSettings) &&
1553 (mpData->maHelpSettings == rSet.mpData->maHelpSettings) &&
1554 (mpData->mnSystemUpdate == rSet.mpData->mnSystemUpdate) &&
1555 (mpData->maLocale == rSet.mpData->maLocale) &&
1556 (mpData->mnWindowUpdate == rSet.mpData->mnWindowUpdate) )
1558 return sal_True;
1560 else
1561 return sal_False;
1564 // -----------------------------------------------------------------------
1566 void AllSettings::SetLanguageTag( const LanguageTag& rLanguageTag )
1568 if (mpData->maLocale != rLanguageTag)
1570 CopyData();
1572 mpData->maLocale = rLanguageTag;
1574 if ( mpData->mpLocaleDataWrapper )
1576 delete mpData->mpLocaleDataWrapper;
1577 mpData->mpLocaleDataWrapper = NULL;
1579 if ( mpData->mpI18nHelper )
1581 delete mpData->mpI18nHelper;
1582 mpData->mpI18nHelper = NULL;
1587 // -----------------------------------------------------------------------
1589 void AllSettings::SetUILanguageTag( const LanguageTag& )
1591 // there is only one UILocale per process
1594 // -----------------------------------------------------------------------
1596 bool AllSettings::GetLayoutRTL() const
1598 static const char* pEnv = getenv("SAL_RTL_ENABLED" );
1599 static int nUIMirroring = -1; // -1: undef, 0: auto, 1: on 2: off
1601 // environment always overrides
1602 if( pEnv )
1603 return true;
1605 bool bRTL = false;
1607 if( nUIMirroring == -1 )
1609 nUIMirroring = 0; // ask configuration only once
1610 utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext(
1611 comphelper::getProcessComponentContext(),
1612 OUString("org.openoffice.Office.Common/I18N/CTL") ); // note: case sensitive !
1613 if ( aNode.isValid() )
1615 sal_Bool bTmp = sal_Bool();
1616 ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString("UIMirroring") );
1617 if( aValue >>= bTmp )
1619 // found true or false; if it was nil, nothing is changed
1620 nUIMirroring = bTmp ? 1 : 2;
1625 if( nUIMirroring == 0 ) // no config found (eg, setup) or default (nil) was set: check language
1627 LanguageType aLang = LANGUAGE_DONTKNOW;
1628 ImplSVData* pSVData = ImplGetSVData();
1629 if ( pSVData->maAppData.mpSettings )
1630 aLang = pSVData->maAppData.mpSettings->GetUILanguageTag().getLanguageType();
1631 bRTL = MsLangId::isRightToLeft( aLang );
1633 else
1634 bRTL = (nUIMirroring == 1);
1636 return bRTL;
1639 // -----------------------------------------------------------------------
1641 const LanguageTag& AllSettings::GetLanguageTag() const
1643 // SYSTEM locale means: use settings from SvtSysLocale that is resolved
1644 if ( mpData->maLocale.isSystemLocale() )
1645 mpData->maLocale = mpData->maSysLocale.GetLanguageTag();
1647 return mpData->maLocale;
1650 // -----------------------------------------------------------------------
1652 const LanguageTag& AllSettings::GetUILanguageTag() const
1654 // the UILocale is never changed
1655 if ( mpData->maUILocale.isSystemLocale() )
1656 mpData->maUILocale = mpData->maSysLocale.GetUILanguageTag();
1658 return mpData->maUILocale;
1661 // -----------------------------------------------------------------------
1663 const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const
1665 if ( !mpData->mpLocaleDataWrapper )
1666 ((AllSettings*)this)->mpData->mpLocaleDataWrapper = new LocaleDataWrapper(
1667 comphelper::getProcessComponentContext(), GetLanguageTag() );
1668 return *mpData->mpLocaleDataWrapper;
1671 // -----------------------------------------------------------------------
1673 const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const
1675 if ( !mpData->mpUILocaleDataWrapper )
1676 ((AllSettings*)this)->mpData->mpUILocaleDataWrapper = new LocaleDataWrapper(
1677 comphelper::getProcessComponentContext(), GetUILanguageTag() );
1678 return *mpData->mpUILocaleDataWrapper;
1681 // -----------------------------------------------------------------------
1683 const vcl::I18nHelper& AllSettings::GetLocaleI18nHelper() const
1685 if ( !mpData->mpI18nHelper ) {
1686 ((AllSettings*)this)->mpData->mpI18nHelper = new vcl::I18nHelper(
1687 comphelper::getProcessComponentContext(), GetLanguageTag() );
1689 return *mpData->mpI18nHelper;
1692 // -----------------------------------------------------------------------
1694 const vcl::I18nHelper& AllSettings::GetUILocaleI18nHelper() const
1696 if ( !mpData->mpUII18nHelper ) {
1697 ((AllSettings*)this)->mpData->mpUII18nHelper = new vcl::I18nHelper(
1698 comphelper::getProcessComponentContext(), GetUILanguageTag() );
1700 return *mpData->mpUII18nHelper;
1703 void AllSettings::LocaleSettingsChanged( sal_uInt32 nHint )
1705 AllSettings aAllSettings( Application::GetSettings() );
1706 if ( nHint & SYSLOCALEOPTIONS_HINT_DECSEP )
1708 MiscSettings aMiscSettings = aAllSettings.GetMiscSettings();
1709 sal_Bool bIsDecSepAsLocale = aAllSettings.mpData->maSysLocale.GetOptions().IsDecimalSeparatorAsLocale();
1710 if ( aMiscSettings.GetEnableLocalizedDecimalSep() != bIsDecSepAsLocale )
1712 aMiscSettings.SetEnableLocalizedDecimalSep( bIsDecSepAsLocale );
1713 aAllSettings.SetMiscSettings( aMiscSettings );
1717 if ( (nHint & SYSLOCALEOPTIONS_HINT_LOCALE) )
1718 aAllSettings.SetLanguageTag( aAllSettings.mpData->maSysLocale.GetOptions().GetLanguageTag() );
1720 Application::SetSettings( aAllSettings );
1723 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */