xref: /core/vcl/source/app/settings.cxx (revision 98f9e9aa)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
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/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
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 .
18  */
19 
20 #include <config_folders.h>
21 
22 #include <officecfg/Office/Common.hxx>
23 
24 #ifdef _WIN32
25 #include <win/svsys.h>
26 #endif
27 
28 #include <comphelper/processfactory.hxx>
29 #include <rtl/bootstrap.hxx>
30 
31 #include <i18nlangtag/mslangid.hxx>
32 #include <i18nlangtag/languagetag.hxx>
33 
34 #include <comphelper/lok.hxx>
35 
36 #include <vcl/graphicfilter.hxx>
37 #include <IconThemeScanner.hxx>
38 #include <IconThemeSelector.hxx>
39 #include <vcl/IconThemeInfo.hxx>
40 #include <vcl/svapp.hxx>
41 #include <vcl/event.hxx>
42 #include <vcl/settings.hxx>
43 #include <vcl/i18nhelp.hxx>
44 #include <configsettings.hxx>
45 #include <vcl/outdev.hxx>
46 
47 #include <unotools/fontcfg.hxx>
48 #include <unotools/localedatawrapper.hxx>
49 #include <unotools/confignode.hxx>
50 #include <unotools/configmgr.hxx>
51 #include <unotools/syslocale.hxx>
52 #include <unotools/syslocaleoptions.hxx>
53 
54 #include <salframe.hxx>
55 #include <svdata.hxx>
56 
57 using namespace ::com::sun::star;
58 
59 struct ImplMouseData
60 {
61     MouseSettingsOptions            mnOptions           = MouseSettingsOptions::NONE;
62     sal_uInt64                      mnDoubleClkTime     = 500;
63     sal_Int32                       mnDoubleClkWidth    = 2;
64     sal_Int32                       mnDoubleClkHeight   = 2;
65     sal_Int32                       mnStartDragWidth    = 2 ;
66     sal_Int32                       mnStartDragHeight   = 2;
67     sal_Int32                       mnButtonRepeat      = 90;
68     sal_Int32                       mnMenuDelay         = 150;
69     MouseFollowFlags                mnFollow            = MouseFollowFlags::Menu;
70     MouseMiddleButtonAction         mnMiddleButtonAction= MouseMiddleButtonAction::AutoScroll;
71     MouseWheelBehaviour             mnWheelBehavior     = MouseWheelBehaviour::FocusOnly;
72 };
73 
74 struct ImplStyleData
75 {
76                                     ImplStyleData();
77                                     ImplStyleData( const ImplStyleData& rData );
78 
79     void                            SetStandardStyles();
80 
81     Color                           maActiveBorderColor;
82     Color                           maActiveColor;
83     Color                           maActiveTextColor;
84     Color                           maAlternatingRowColor;
85     Color                           maDefaultButtonTextColor;
86     Color                           maButtonTextColor;
87     Color                           maDefaultActionButtonTextColor;
88     Color                           maActionButtonTextColor;
89     Color                           maFlatButtonTextColor;
90     Color                           maDefaultButtonRolloverTextColor;
91     Color                           maButtonRolloverTextColor;
92     Color                           maDefaultActionButtonRolloverTextColor;
93     Color                           maActionButtonRolloverTextColor;
94     Color                           maFlatButtonRolloverTextColor;
95     Color                           maDefaultButtonPressedRolloverTextColor;
96     Color                           maButtonPressedRolloverTextColor;
97     Color                           maDefaultActionButtonPressedRolloverTextColor;
98     Color                           maActionButtonPressedRolloverTextColor;
99     Color                           maFlatButtonPressedRolloverTextColor;
100     Color                           maCheckedColor;
101     Color                           maDarkShadowColor;
102     Color                           maDeactiveBorderColor;
103     Color                           maDeactiveColor;
104     Color                           maDeactiveTextColor;
105     Color                           maDialogColor;
106     Color                           maDialogTextColor;
107     Color                           maDisableColor;
108     Color                           maFaceColor;
109     Color                           maFieldColor;
110     Color                           maFieldTextColor;
111     Color                           maFieldRolloverTextColor;
112     Color                           maGroupTextColor;
113     Color                           maHelpColor;
114     Color                           maHelpTextColor;
115     Color                           maAccentColor;
116     Color                           maHighlightColor;
117     Color                           maHighlightTextColor;
118     Color                           maLabelTextColor;
119     Color                           maLightBorderColor;
120     Color                           maLightColor;
121     Color                           maLinkColor;
122     Color                           maMenuBarColor;
123     Color                           maMenuBarRolloverColor;
124     Color                           maMenuBorderColor;
125     Color                           maMenuColor;
126     Color                           maMenuHighlightColor;
127     Color                           maMenuHighlightTextColor;
128     Color                           maMenuTextColor;
129     Color                           maListBoxWindowBackgroundColor;
130     Color                           maListBoxWindowTextColor;
131     Color                           maListBoxWindowHighlightColor;
132     Color                           maListBoxWindowHighlightTextColor;
133     Color                           maMenuBarTextColor;
134     Color                           maMenuBarRolloverTextColor;
135     Color                           maMenuBarHighlightTextColor;
136     Color                           maMonoColor;
137     Color                           maRadioCheckTextColor;
138     Color                           maShadowColor;
139     Color                           maWarningColor;
140     Color                           maWarningTextColor;
141     Color                           maErrorColor;
142     Color                           maErrorTextColor;
143     Color                           maVisitedLinkColor;
144     Color                           maToolTextColor;
145     Color                           maWindowColor;
146     Color                           maWindowTextColor;
147     Color                           maWorkspaceColor;
148     Color                           maActiveTabColor;
149     Color                           maInactiveTabColor;
150     Color                           maTabTextColor;
151     Color                           maTabRolloverTextColor;
152     Color                           maTabHighlightTextColor;
153     vcl::Font                       maAppFont;
154     vcl::Font                       maHelpFont;
155     vcl::Font                       maTitleFont;
156     vcl::Font                       maFloatTitleFont;
157     vcl::Font                       maMenuFont;
158     vcl::Font                       maToolFont;
159     vcl::Font                       maLabelFont;
160     vcl::Font                       maRadioCheckFont;
161     vcl::Font                       maPushButtonFont;
162     vcl::Font                       maFieldFont;
163     vcl::Font                       maIconFont;
164     vcl::Font                       maTabFont;
165     vcl::Font                       maGroupFont;
166     sal_Int32                       mnTitleHeight;
167     sal_Int32                       mnFloatTitleHeight;
168     sal_Int32                       mnScrollBarSize;
169     sal_Int32                       mnSpinSize;
170     sal_Int32                       mnCursorSize;
171     sal_Int32                       mnAntialiasedMin;
172     sal_uInt64                      mnCursorBlinkTime;
173     DragFullOptions                 mnDragFullOptions;
174     SelectionOptions                mnSelectionOptions;
175     DisplayOptions                  mnDisplayOptions;
176     ToolbarIconSize                 mnToolbarIconSize;
177     bool                            mnUseFlatMenus;
178     StyleSettingsOptions            mnOptions;
179     bool                            mbHighContrast;
180     bool                            mbUseSystemUIFonts;
181     /**
182      * Disabling AA doesn't actually disable AA of fonts, instead it is taken
183      * from system settings.
184      */
185     bool mbUseFontAAFromSystem;
186     bool                            mbAutoMnemonic;
187     TriState                        meUseImagesInMenus;
188     bool                            mnUseFlatBorders;
189     bool                            mbPreferredUseImagesInMenus;
190     sal_Int32                       mnMinThumbSize;
191     std::shared_ptr<vcl::IconThemeScanner>
192                                     mIconThemeScanner;
193     std::shared_ptr<vcl::IconThemeSelector>
194                                     mIconThemeSelector;
195 
196     OUString                        mIconTheme;
197     bool                            mbSkipDisabledInMenus;
198     bool                            mbHideDisabledMenuItems;
199     bool                            mbPreferredContextMenuShortcuts;
200     TriState                        meContextMenuShortcuts;
201     //mbPrimaryButtonWarpsSlider == true for "jump to here" behavior for primary button, otherwise
202     //primary means scroll by single page. Secondary button takes the alternative behaviour
203     bool                            mbPrimaryButtonWarpsSlider;
204     DialogStyle                     maDialogStyle;
205 
206     sal_uInt16                      mnEdgeBlending;
207     Color                           maEdgeBlendingTopLeftColor;
208     Color                           maEdgeBlendingBottomRightColor;
209     sal_uInt16                      mnListBoxMaximumLineCount;
210     sal_uInt16                      mnColorValueSetColumnCount;
211     Size                            maListBoxPreviewDefaultLogicSize;
212     Size                            maListBoxPreviewDefaultPixelSize;
213     ComboBoxTextSelectionMode       meComboBoxTextSelectionMode;
214     bool                            mbPreviewUsesCheckeredBackground;
215 
216     OUString                        maPersonaHeaderFooter; ///< Cache the settings to detect changes.
217 
218     BitmapEx                        maPersonaHeaderBitmap; ///< Cache the header bitmap.
219     BitmapEx                        maPersonaFooterBitmap; ///< Cache the footer bitmap.
220     std::optional<Color>          maPersonaMenuBarTextColor; ///< Cache the menubar color.
221 };
222 
223 struct ImplMiscData
224 {
225                                     ImplMiscData();
226     TriState                        mnEnableATT;
227     bool                            mbEnableLocalizedDecimalSep;
228     TriState                        mnDisablePrinting;
229 };
230 
231 struct ImplHelpData
232 {
233     sal_Int32                       mnTipTimeout = 3000;
234 };
235 
236 struct ImplAllSettingsData
237 {
238     ImplAllSettingsData();
239     ImplAllSettingsData( const ImplAllSettingsData& rData );
240     ~ImplAllSettingsData();
241 
242     MouseSettings                           maMouseSettings;
243     StyleSettings                           maStyleSettings;
244     MiscSettings                            maMiscSettings;
245     HelpSettings                            maHelpSettings;
246     LanguageTag                             maLocale;
247     LanguageTag                             maUILocale;
248     std::unique_ptr<LocaleDataWrapper>      mpLocaleDataWrapper;
249     std::unique_ptr<LocaleDataWrapper>      mpUILocaleDataWrapper;
250     std::unique_ptr<LocaleDataWrapper>      mpNeutralLocaleDataWrapper;
251     std::unique_ptr<vcl::I18nHelper>        mpI18nHelper;
252     std::unique_ptr<vcl::I18nHelper>        mpUII18nHelper;
253     SvtSysLocale                            maSysLocale;
254 };
255 
256 void
SetOptions(MouseSettingsOptions nOptions)257 MouseSettings::SetOptions(MouseSettingsOptions nOptions)
258 {
259     CopyData();
260     mxData->mnOptions = nOptions;
261 }
262 
263 MouseSettingsOptions
GetOptions() const264 MouseSettings::GetOptions() const
265 {
266     return mxData->mnOptions;
267 }
268 
269 void
SetDoubleClickTime(sal_uInt64 nDoubleClkTime)270 MouseSettings::SetDoubleClickTime( sal_uInt64 nDoubleClkTime )
271 {
272     CopyData();
273     mxData->mnDoubleClkTime = nDoubleClkTime;
274 }
275 
276 sal_uInt64
GetDoubleClickTime() const277 MouseSettings::GetDoubleClickTime() const
278 {
279     return mxData->mnDoubleClkTime;
280 }
281 
282 void
SetDoubleClickWidth(sal_Int32 nDoubleClkWidth)283 MouseSettings::SetDoubleClickWidth( sal_Int32 nDoubleClkWidth )
284 {
285     CopyData();
286     mxData->mnDoubleClkWidth = nDoubleClkWidth;
287 }
288 
289 sal_Int32
GetDoubleClickWidth() const290 MouseSettings::GetDoubleClickWidth() const
291 {
292     return mxData->mnDoubleClkWidth;
293 }
294 
295 void
SetDoubleClickHeight(sal_Int32 nDoubleClkHeight)296 MouseSettings::SetDoubleClickHeight( sal_Int32 nDoubleClkHeight )
297 {
298     CopyData();
299     mxData->mnDoubleClkHeight = nDoubleClkHeight;
300 }
301 
302 sal_Int32
GetDoubleClickHeight() const303 MouseSettings::GetDoubleClickHeight() const
304 {
305     return mxData->mnDoubleClkHeight;
306 }
307 
308 void
SetStartDragWidth(sal_Int32 nDragWidth)309 MouseSettings::SetStartDragWidth( sal_Int32 nDragWidth )
310 {
311     CopyData();
312     mxData->mnStartDragWidth = nDragWidth;
313 }
314 
315 sal_Int32
GetStartDragWidth() const316 MouseSettings::GetStartDragWidth() const
317 {
318     return mxData->mnStartDragWidth;
319 }
320 
321 void
SetStartDragHeight(sal_Int32 nDragHeight)322 MouseSettings::SetStartDragHeight( sal_Int32 nDragHeight )
323 {
324     CopyData();
325     mxData->mnStartDragHeight = nDragHeight;
326 }
327 
328 sal_Int32
GetStartDragHeight() const329 MouseSettings::GetStartDragHeight() const
330 {
331     return mxData->mnStartDragHeight;
332 }
333 
334 sal_uInt16
GetStartDragCode()335 MouseSettings::GetStartDragCode()
336 {
337     return MOUSE_LEFT;
338 }
339 
340 sal_uInt16
GetContextMenuCode()341 MouseSettings::GetContextMenuCode()
342 {
343     return MOUSE_RIGHT;
344 }
345 
346 sal_uInt16
GetContextMenuClicks()347 MouseSettings::GetContextMenuClicks()
348 {
349     return 1;
350 }
351 
352 sal_Int32
GetScrollRepeat()353 MouseSettings::GetScrollRepeat()
354 {
355     return 100;
356 }
357 
358 sal_Int32
GetButtonStartRepeat()359 MouseSettings::GetButtonStartRepeat()
360 {
361     return 370;
362 }
363 
364 void
SetButtonRepeat(sal_Int32 nRepeat)365 MouseSettings::SetButtonRepeat( sal_Int32 nRepeat )
366 {
367     CopyData();
368     mxData->mnButtonRepeat = nRepeat;
369 }
370 
371 sal_Int32
GetButtonRepeat() const372 MouseSettings::GetButtonRepeat() const
373 {
374     return mxData->mnButtonRepeat;
375 }
376 
377 sal_Int32
GetActionDelay()378 MouseSettings::GetActionDelay()
379 {
380     return 250;
381 }
382 
383 void
SetMenuDelay(sal_Int32 nDelay)384 MouseSettings::SetMenuDelay( sal_Int32 nDelay )
385 {
386     CopyData();
387     mxData->mnMenuDelay = nDelay;
388 }
389 
390 sal_Int32
GetMenuDelay() const391 MouseSettings::GetMenuDelay() const
392 {
393     return mxData->mnMenuDelay;
394 }
395 
396 void
SetFollow(MouseFollowFlags nFollow)397 MouseSettings::SetFollow( MouseFollowFlags nFollow )
398 {
399     CopyData();
400     mxData->mnFollow = nFollow;
401 }
402 
403 MouseFollowFlags
GetFollow() const404 MouseSettings::GetFollow() const
405 {
406     return mxData->mnFollow;
407 }
408 
409 void
SetMiddleButtonAction(MouseMiddleButtonAction nAction)410 MouseSettings::SetMiddleButtonAction( MouseMiddleButtonAction nAction )
411 {
412     CopyData();
413     mxData->mnMiddleButtonAction = nAction;
414 }
415 
416 MouseMiddleButtonAction
GetMiddleButtonAction() const417 MouseSettings::GetMiddleButtonAction() const
418 {
419     return mxData->mnMiddleButtonAction;
420 }
421 
422 void
SetWheelBehavior(MouseWheelBehaviour nBehavior)423 MouseSettings::SetWheelBehavior( MouseWheelBehaviour nBehavior )
424 {
425     CopyData();
426     mxData->mnWheelBehavior = nBehavior;
427 }
428 
429 MouseWheelBehaviour
GetWheelBehavior() const430 MouseSettings::GetWheelBehavior() const
431 {
432     return mxData->mnWheelBehavior;
433 }
434 
435 bool
operator !=(const MouseSettings & rSet) const436 MouseSettings::operator !=( const MouseSettings& rSet ) const
437 {
438     return !(*this == rSet);
439 }
440 
MouseSettings()441 MouseSettings::MouseSettings()
442     : mxData(std::make_shared<ImplMouseData>())
443 {
444 }
445 
CopyData()446 void MouseSettings::CopyData()
447 {
448     // copy if other references exist
449     if (mxData.use_count() > 1)
450     {
451         mxData = std::make_shared<ImplMouseData>(*mxData);
452     }
453 }
454 
operator ==(const MouseSettings & rSet) const455 bool MouseSettings::operator ==( const MouseSettings& rSet ) const
456 {
457     if ( mxData == rSet.mxData )
458         return true;
459 
460     return
461          (mxData->mnOptions             == rSet.mxData->mnOptions)              &&
462          (mxData->mnDoubleClkTime       == rSet.mxData->mnDoubleClkTime)        &&
463          (mxData->mnDoubleClkWidth      == rSet.mxData->mnDoubleClkWidth)       &&
464          (mxData->mnDoubleClkHeight     == rSet.mxData->mnDoubleClkHeight)      &&
465          (mxData->mnStartDragWidth      == rSet.mxData->mnStartDragWidth)       &&
466          (mxData->mnStartDragHeight     == rSet.mxData->mnStartDragHeight)      &&
467          (mxData->mnMiddleButtonAction  == rSet.mxData->mnMiddleButtonAction)   &&
468          (mxData->mnButtonRepeat        == rSet.mxData->mnButtonRepeat)         &&
469          (mxData->mnMenuDelay           == rSet.mxData->mnMenuDelay)            &&
470          (mxData->mnFollow              == rSet.mxData->mnFollow)               &&
471          (mxData->mnWheelBehavior       == rSet.mxData->mnWheelBehavior );
472 }
473 
ImplStyleData()474 ImplStyleData::ImplStyleData() :
475     mnScrollBarSize(16),
476     mnSpinSize(16),
477     mnCursorSize(2),
478     mnAntialiasedMin(0),
479     mnCursorBlinkTime(STYLE_CURSOR_NOBLINKTIME),
480     mnDragFullOptions(DragFullOptions::All),
481     mnSelectionOptions(SelectionOptions::NONE),
482     mnDisplayOptions(DisplayOptions::NONE),
483     mnToolbarIconSize(ToolbarIconSize::Unknown),
484     mnOptions(StyleSettingsOptions::NONE),
485     mbAutoMnemonic(true),
486     meUseImagesInMenus(TRISTATE_INDET),
487     mnMinThumbSize(16),
488     mIconThemeSelector(std::make_shared<vcl::IconThemeSelector>()),
489     meContextMenuShortcuts(TRISTATE_INDET),
490     mnEdgeBlending(35),
491     maEdgeBlendingTopLeftColor(Color(0xC0, 0xC0, 0xC0)),
492     maEdgeBlendingBottomRightColor(Color(0x40, 0x40, 0x40)),
493     mnListBoxMaximumLineCount(25),
494     // For some reason this isn't actually the column count that gets used, at least on iOS, but
495     // instead what SvtAccessibilityOptions_Impl::GetColorValueSetColumnCount() in
496     // svtools/source/config/accessibilityoptions.cxx returns.
497     mnColorValueSetColumnCount(12),
498 #ifdef IOS
499     maListBoxPreviewDefaultLogicSize(Size(30, 30)),
500 #else
501     maListBoxPreviewDefaultLogicSize(Size(15, 7)),
502 #endif
503     maListBoxPreviewDefaultPixelSize(Size(0, 0)), // on-demand calculated in GetListBoxPreviewDefaultPixelSize(),
504     meComboBoxTextSelectionMode(ComboBoxTextSelectionMode::SelectText),
505     mbPreviewUsesCheckeredBackground(true)
506 {
507     SetStandardStyles();
508 }
509 
ImplStyleData(const ImplStyleData & rData)510 ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
511     maActiveBorderColor( rData.maActiveBorderColor ),
512     maActiveColor( rData.maActiveColor ),
513     maActiveTextColor( rData.maActiveTextColor ),
514     maAlternatingRowColor( rData.maAlternatingRowColor ),
515     maDefaultButtonTextColor( rData.maDefaultButtonTextColor ),
516     maButtonTextColor( rData.maButtonTextColor ),
517     maDefaultActionButtonTextColor( rData.maDefaultActionButtonTextColor ),
518     maActionButtonTextColor( rData.maActionButtonTextColor ),
519     maFlatButtonTextColor( rData.maFlatButtonTextColor ),
520     maDefaultButtonRolloverTextColor( rData.maDefaultButtonRolloverTextColor ),
521     maButtonRolloverTextColor( rData.maButtonRolloverTextColor ),
522     maDefaultActionButtonRolloverTextColor( rData.maDefaultActionButtonRolloverTextColor ),
523     maActionButtonRolloverTextColor( rData.maActionButtonRolloverTextColor ),
524     maFlatButtonRolloverTextColor( rData.maFlatButtonRolloverTextColor ),
525     maDefaultButtonPressedRolloverTextColor( rData.maDefaultButtonPressedRolloverTextColor ),
526     maButtonPressedRolloverTextColor( rData.maButtonPressedRolloverTextColor ),
527     maDefaultActionButtonPressedRolloverTextColor( rData.maDefaultActionButtonPressedRolloverTextColor ),
528     maActionButtonPressedRolloverTextColor( rData.maActionButtonPressedRolloverTextColor ),
529     maFlatButtonPressedRolloverTextColor( rData.maFlatButtonPressedRolloverTextColor ),
530     maCheckedColor( rData.maCheckedColor ),
531     maDarkShadowColor( rData.maDarkShadowColor ),
532     maDeactiveBorderColor( rData.maDeactiveBorderColor ),
533     maDeactiveColor( rData.maDeactiveColor ),
534     maDeactiveTextColor( rData.maDeactiveTextColor ),
535     maDialogColor( rData.maDialogColor ),
536     maDialogTextColor( rData.maDialogTextColor ),
537     maDisableColor( rData.maDisableColor ),
538     maFaceColor( rData.maFaceColor ),
539     maFieldColor( rData.maFieldColor ),
540     maFieldTextColor( rData.maFieldTextColor ),
541     maFieldRolloverTextColor( rData.maFieldRolloverTextColor ),
542     maGroupTextColor( rData.maGroupTextColor ),
543     maHelpColor( rData.maHelpColor ),
544     maHelpTextColor( rData.maHelpTextColor ),
545     maAccentColor( rData.maAccentColor ),
546     maHighlightColor( rData.maHighlightColor ),
547     maHighlightTextColor( rData.maHighlightTextColor ),
548     maLabelTextColor( rData.maLabelTextColor ),
549     maLightBorderColor( rData.maLightBorderColor ),
550     maLightColor( rData.maLightColor ),
551     maLinkColor( rData.maLinkColor ),
552     maMenuBarColor( rData.maMenuBarColor ),
553     maMenuBarRolloverColor( rData.maMenuBarRolloverColor ),
554     maMenuBorderColor( rData.maMenuBorderColor ),
555     maMenuColor( rData.maMenuColor ),
556     maMenuHighlightColor( rData.maMenuHighlightColor ),
557     maMenuHighlightTextColor( rData.maMenuHighlightTextColor ),
558     maMenuTextColor( rData.maMenuTextColor ),
559     maListBoxWindowBackgroundColor( rData.maListBoxWindowBackgroundColor ),
560     maListBoxWindowTextColor( rData.maListBoxWindowTextColor ),
561     maListBoxWindowHighlightColor( rData.maListBoxWindowHighlightColor ),
562     maListBoxWindowHighlightTextColor( rData.maListBoxWindowHighlightTextColor ),
563     maMenuBarTextColor( rData.maMenuBarTextColor ),
564     maMenuBarRolloverTextColor( rData.maMenuBarRolloverTextColor ),
565     maMenuBarHighlightTextColor( rData.maMenuBarHighlightTextColor ),
566     maMonoColor( rData.maMonoColor ),
567     maRadioCheckTextColor( rData.maRadioCheckTextColor ),
568     maShadowColor( rData.maShadowColor ),
569     maWarningColor( rData.maWarningColor ),
570     maWarningTextColor( rData.maWarningTextColor ),
571     maErrorColor( rData.maErrorColor ),
572     maErrorTextColor( rData.maErrorTextColor ),
573     maVisitedLinkColor( rData.maVisitedLinkColor ),
574     maToolTextColor( rData.maToolTextColor ),
575     maWindowColor( rData.maWindowColor ),
576     maWindowTextColor( rData.maWindowTextColor ),
577     maWorkspaceColor( rData.maWorkspaceColor ),
578     maActiveTabColor( rData.maActiveTabColor ),
579     maInactiveTabColor( rData.maInactiveTabColor ),
580     maTabTextColor( rData.maTabTextColor ),
581     maTabRolloverTextColor( rData.maTabRolloverTextColor ),
582     maTabHighlightTextColor( rData.maTabHighlightTextColor ),
583     maAppFont( rData.maAppFont ),
584     maHelpFont( rData.maAppFont ),
585     maTitleFont( rData.maTitleFont ),
586     maFloatTitleFont( rData.maFloatTitleFont ),
587     maMenuFont( rData.maMenuFont ),
588     maToolFont( rData.maToolFont ),
589     maLabelFont( rData.maLabelFont ),
590     maRadioCheckFont( rData.maRadioCheckFont ),
591     maPushButtonFont( rData.maPushButtonFont ),
592     maFieldFont( rData.maFieldFont ),
593     maIconFont( rData.maIconFont ),
594     maTabFont( rData.maTabFont ),
595     maGroupFont( rData.maGroupFont ),
596     mnTitleHeight(rData.mnTitleHeight),
597     mnFloatTitleHeight(rData.mnFloatTitleHeight),
598     mnScrollBarSize(rData.mnScrollBarSize),
599     mnSpinSize(rData.mnSpinSize),
600     mnCursorSize(rData.mnCursorSize),
601     mnAntialiasedMin(rData.mnAntialiasedMin),
602     mnCursorBlinkTime(rData.mnCursorBlinkTime),
603     mnDragFullOptions(rData.mnDragFullOptions),
604     mnSelectionOptions(rData.mnSelectionOptions),
605     mnDisplayOptions(rData.mnDisplayOptions),
606     mnToolbarIconSize(rData.mnToolbarIconSize),
607     mnUseFlatMenus(rData.mnUseFlatMenus),
608     mnOptions(rData.mnOptions),
609     mbHighContrast(rData.mbHighContrast),
610     mbUseSystemUIFonts(rData.mbUseSystemUIFonts),
611     mbUseFontAAFromSystem(rData.mbUseFontAAFromSystem),
612     mbAutoMnemonic(rData.mbAutoMnemonic),
613     meUseImagesInMenus(rData.meUseImagesInMenus),
614     mnUseFlatBorders(rData.mnUseFlatBorders),
615     mbPreferredUseImagesInMenus(rData.mbPreferredUseImagesInMenus),
616     mnMinThumbSize(rData.mnMinThumbSize),
617     mIconThemeSelector(std::make_shared<vcl::IconThemeSelector>(*rData.mIconThemeSelector)),
618     mIconTheme(rData.mIconTheme),
619     mbSkipDisabledInMenus(rData.mbSkipDisabledInMenus),
620     mbHideDisabledMenuItems(rData.mbHideDisabledMenuItems),
621     mbPreferredContextMenuShortcuts(rData.mbPreferredContextMenuShortcuts),
622     meContextMenuShortcuts(rData.meContextMenuShortcuts),
623     mbPrimaryButtonWarpsSlider(rData.mbPrimaryButtonWarpsSlider),
624     maDialogStyle( rData.maDialogStyle ),
625     mnEdgeBlending(rData.mnEdgeBlending),
626     maEdgeBlendingTopLeftColor(rData.maEdgeBlendingTopLeftColor),
627     maEdgeBlendingBottomRightColor(rData.maEdgeBlendingBottomRightColor),
628     mnListBoxMaximumLineCount(rData.mnListBoxMaximumLineCount),
629     mnColorValueSetColumnCount(rData.mnColorValueSetColumnCount),
630     maListBoxPreviewDefaultLogicSize(rData.maListBoxPreviewDefaultLogicSize),
631     maListBoxPreviewDefaultPixelSize(rData.maListBoxPreviewDefaultPixelSize),
632     meComboBoxTextSelectionMode(rData.meComboBoxTextSelectionMode),
633     mbPreviewUsesCheckeredBackground(rData.mbPreviewUsesCheckeredBackground),
634     maPersonaHeaderFooter( rData.maPersonaHeaderFooter ),
635     maPersonaHeaderBitmap( rData.maPersonaHeaderBitmap ),
636     maPersonaFooterBitmap( rData.maPersonaFooterBitmap ),
637     maPersonaMenuBarTextColor( rData.maPersonaMenuBarTextColor )
638 {
639     if (rData.mIconThemeScanner)
640         mIconThemeScanner = std::make_shared<vcl::IconThemeScanner>(*rData.mIconThemeScanner);
641 }
642 
SetStandardStyles()643 void ImplStyleData::SetStandardStyles()
644 {
645     vcl::Font aStdFont( FAMILY_SWISS, Size( 0, 8 ) );
646     aStdFont.SetCharSet( osl_getThreadTextEncoding() );
647     aStdFont.SetWeight( WEIGHT_NORMAL );
648     if (!comphelper::IsFuzzing())
649         aStdFont.SetFamilyName(utl::DefaultFontConfiguration::get().getUserInterfaceFont(LanguageTag(u"en"_ustr)));
650     else
651         aStdFont.SetFamilyName(u"Liberation Sans"_ustr);
652     maAppFont                   = aStdFont;
653     maHelpFont                  = aStdFont;
654     maMenuFont                  = aStdFont;
655     maToolFont                  = aStdFont;
656     maGroupFont                 = aStdFont;
657     maLabelFont                 = aStdFont;
658     maRadioCheckFont            = aStdFont;
659     maPushButtonFont            = aStdFont;
660     maFieldFont                 = aStdFont;
661     maIconFont                  = aStdFont;
662     maTabFont                   = aStdFont;
663     aStdFont.SetWeight( WEIGHT_BOLD );
664     maFloatTitleFont            = aStdFont;
665     maTitleFont                 = aStdFont;
666 
667     maFaceColor                 = COL_LIGHTGRAY;
668     maCheckedColor              = Color( 0xCC, 0xCC, 0xCC );
669     maLightColor                = COL_WHITE;
670     maLightBorderColor          = COL_LIGHTGRAY;
671     maShadowColor               = COL_GRAY;
672     maDarkShadowColor           = COL_BLACK;
673 
674     maWarningColor              = Color(0xFE, 0xEF, 0xB3); // tdf#105829
675     maWarningTextColor          = Color(0x70, 0x43, 0x00);
676     maErrorColor                = Color(0xFF, 0xBA, 0xBA);
677     maErrorTextColor            = Color(0x7A, 0x00, 0x06);
678 
679     maDefaultButtonTextColor                      = COL_BLACK;
680     maButtonTextColor                             = COL_BLACK;
681     maDefaultActionButtonTextColor                = COL_BLACK;
682     maActionButtonTextColor                       = COL_BLACK;
683     maFlatButtonTextColor                         = COL_BLACK;
684     maDefaultButtonRolloverTextColor              = COL_BLACK;
685     maButtonRolloverTextColor                     = COL_BLACK;
686     maDefaultActionButtonRolloverTextColor        = COL_BLACK;
687     maActionButtonRolloverTextColor               = COL_BLACK;
688     maFlatButtonRolloverTextColor                 = COL_BLACK;
689     maDefaultButtonPressedRolloverTextColor       = COL_BLACK;
690     maButtonPressedRolloverTextColor              = COL_BLACK;
691     maDefaultActionButtonPressedRolloverTextColor = COL_BLACK;
692     maActionButtonPressedRolloverTextColor        = COL_BLACK;
693     maFlatButtonPressedRolloverTextColor          = COL_BLACK;
694 
695     maRadioCheckTextColor       = COL_BLACK;
696     maGroupTextColor            = COL_BLACK;
697     maLabelTextColor            = COL_BLACK;
698     maWindowColor               = COL_WHITE;
699     maWindowTextColor           = COL_BLACK;
700     maDialogColor               = COL_LIGHTGRAY;
701     maDialogTextColor           = COL_BLACK;
702     maWorkspaceColor            = Color( 0xDF, 0xDF, 0xDE );
703     maMonoColor                 = COL_BLACK;
704     maFieldColor                = COL_WHITE;
705     maFieldTextColor            = COL_BLACK;
706     maFieldRolloverTextColor    = COL_BLACK;
707     maActiveBorderColor         = COL_LIGHTGRAY;
708     maDeactiveColor             = COL_GRAY;
709     maDeactiveTextColor         = COL_LIGHTGRAY;
710     maDeactiveBorderColor       = COL_LIGHTGRAY;
711     maMenuColor                 = COL_LIGHTGRAY;
712     maMenuBarColor              = COL_LIGHTGRAY;
713     maMenuBarRolloverColor      = COL_BLUE;
714     maMenuBorderColor           = COL_LIGHTGRAY;
715     maMenuTextColor             = COL_BLACK;
716     maListBoxWindowBackgroundColor = COL_WHITE;
717     maListBoxWindowTextColor    = COL_BLACK;
718     maListBoxWindowHighlightColor = COL_BLUE;
719     maListBoxWindowHighlightTextColor = COL_WHITE;
720     maMenuBarTextColor          = COL_BLACK;
721     maMenuBarRolloverTextColor  = COL_WHITE;
722     maMenuBarHighlightTextColor = COL_WHITE;
723     maMenuHighlightColor        = COL_BLUE;
724     maMenuHighlightTextColor    = COL_WHITE;
725     maAccentColor               = COL_RED;
726     maHighlightColor            = COL_BLUE;
727     maHighlightTextColor        = COL_WHITE;
728     // make active like highlight, except with a small contrast
729     maActiveColor               = maHighlightColor;
730     maActiveColor.IncreaseLuminance(32);
731     maActiveTextColor           = maHighlightTextColor;
732     maActiveTabColor            = COL_WHITE;
733     maInactiveTabColor          = COL_LIGHTGRAY;
734     maTabTextColor              = COL_BLACK;
735     maTabRolloverTextColor      = COL_BLACK;
736     maTabHighlightTextColor     = COL_BLACK;
737     maDisableColor              = COL_GRAY;
738     maHelpColor                 = Color( 0xFF, 0xFF, 0xE0 );
739     maHelpTextColor             = COL_BLACK;
740     maLinkColor                 = COL_BLUE;
741     maVisitedLinkColor          = Color( 0x00, 0x00, 0xCC );
742     maToolTextColor             = COL_BLACK;
743     maAlternatingRowColor       = Color( 0xEE, 0xEE, 0xEE );
744 
745     mnTitleHeight                   = 18;
746     mnFloatTitleHeight              = 13;
747     mbHighContrast                  = false;
748     mbUseSystemUIFonts              = true;
749     mbUseFontAAFromSystem           = true;
750     mnUseFlatBorders                = false;
751     mnUseFlatMenus                  = false;
752     mbPreferredUseImagesInMenus     = true;
753     mbSkipDisabledInMenus           = false;
754     mbHideDisabledMenuItems         = false;
755     mbPreferredContextMenuShortcuts = true;
756     mbPrimaryButtonWarpsSlider      = false;
757 }
758 
StyleSettings()759 StyleSettings::StyleSettings()
760     : mxData(std::make_shared<ImplStyleData>())
761 {
762 }
763 
764 void
SetFaceColor(const Color & rColor)765 StyleSettings::SetFaceColor( const Color& rColor )
766 {
767     CopyData();
768     mxData->maFaceColor = rColor;
769 }
770 
771 const Color&
GetFaceColor() const772 StyleSettings::GetFaceColor() const
773 {
774     return mxData->maFaceColor;
775 }
776 
777 void
SetCheckedColor(const Color & rColor)778 StyleSettings::SetCheckedColor( const Color& rColor )
779 {
780     CopyData();
781     mxData->maCheckedColor = rColor;
782 }
783 
784 const Color&
GetCheckedColor() const785 StyleSettings::GetCheckedColor() const
786 {
787     return mxData->maCheckedColor;
788 }
789 
790 void
SetLightColor(const Color & rColor)791 StyleSettings::SetLightColor( const Color& rColor )
792 {
793     CopyData();
794     mxData->maLightColor = rColor;
795 }
796 
797 const Color&
GetLightColor() const798 StyleSettings::GetLightColor() const
799 {
800     return mxData->maLightColor;
801 }
802 
803 void
SetLightBorderColor(const Color & rColor)804 StyleSettings::SetLightBorderColor( const Color& rColor )
805 {
806     CopyData();
807     mxData->maLightBorderColor = rColor;
808 }
809 
810 const Color&
GetLightBorderColor() const811 StyleSettings::GetLightBorderColor() const
812 {
813     return mxData->maLightBorderColor;
814 }
815 
816 void
SetWarningColor(const Color & rColor)817 StyleSettings::SetWarningColor( const Color& rColor )
818 {
819     CopyData();
820     mxData->maWarningColor = rColor;
821 }
822 
823 const Color&
GetWarningColor() const824 StyleSettings::GetWarningColor() const
825 {
826     return mxData->maWarningColor;
827 }
828 
829 void
SetWarningTextColor(const Color & rColor)830 StyleSettings::SetWarningTextColor( const Color& rColor )
831 {
832     CopyData();
833     mxData->maWarningTextColor = rColor;
834 }
835 
836 const Color&
GetWarningTextColor() const837 StyleSettings::GetWarningTextColor() const
838 {
839     return mxData->maWarningTextColor;
840 }
841 
842 void
SetErrorColor(const Color & rColor)843 StyleSettings::SetErrorColor( const Color& rColor )
844 {
845     CopyData();
846     mxData->maErrorColor = rColor;
847 }
848 
849 const Color&
GetErrorColor() const850 StyleSettings::GetErrorColor() const
851 {
852     return mxData->maErrorColor;
853 }
854 
855 void
SetErrorTextColor(const Color & rColor)856 StyleSettings::SetErrorTextColor( const Color& rColor )
857 {
858     CopyData();
859     mxData->maErrorTextColor = rColor;
860 }
861 
862 const Color&
GetErrorTextColor() const863 StyleSettings::GetErrorTextColor() const
864 {
865     return mxData->maErrorTextColor;
866 }
867 
868 void
SetShadowColor(const Color & rColor)869 StyleSettings::SetShadowColor( const Color& rColor )
870 {
871     CopyData();
872     mxData->maShadowColor = rColor;
873 }
874 
875 const Color&
GetShadowColor() const876 StyleSettings::GetShadowColor() const
877 {
878     return mxData->maShadowColor;
879 }
880 
881 void
SetDarkShadowColor(const Color & rColor)882 StyleSettings::SetDarkShadowColor( const Color& rColor )
883 {
884     CopyData();
885     mxData->maDarkShadowColor = rColor;
886 }
887 
888 const Color&
GetDarkShadowColor() const889 StyleSettings::GetDarkShadowColor() const
890 {
891     return mxData->maDarkShadowColor;
892 }
893 
894 void
SetDefaultButtonTextColor(const Color & rColor)895 StyleSettings::SetDefaultButtonTextColor( const Color& rColor )
896 {
897     CopyData();
898     mxData->maDefaultButtonTextColor = rColor;
899 }
900 
901 const Color&
GetDefaultButtonTextColor() const902 StyleSettings::GetDefaultButtonTextColor() const
903 {
904     return mxData->maDefaultButtonTextColor;
905 }
906 
907 void
SetButtonTextColor(const Color & rColor)908 StyleSettings::SetButtonTextColor( const Color& rColor )
909 {
910     CopyData();
911     mxData->maButtonTextColor = rColor;
912 }
913 
914 const Color&
GetButtonTextColor() const915 StyleSettings::GetButtonTextColor() const
916 {
917     return mxData->maButtonTextColor;
918 }
919 
920 void
SetDefaultActionButtonTextColor(const Color & rColor)921 StyleSettings::SetDefaultActionButtonTextColor( const Color& rColor )
922 {
923     CopyData();
924     mxData->maDefaultActionButtonTextColor = rColor;
925 }
926 
927 const Color&
GetDefaultActionButtonTextColor() const928 StyleSettings::GetDefaultActionButtonTextColor() const
929 {
930     return mxData->maDefaultActionButtonTextColor;
931 }
932 
933 void
SetActionButtonTextColor(const Color & rColor)934 StyleSettings::SetActionButtonTextColor( const Color& rColor )
935 {
936     CopyData();
937     mxData->maActionButtonTextColor = rColor;
938 }
939 
940 const Color&
GetActionButtonTextColor() const941 StyleSettings::GetActionButtonTextColor() const
942 {
943     return mxData->maActionButtonTextColor;
944 }
945 
946 void
SetFlatButtonTextColor(const Color & rColor)947 StyleSettings::SetFlatButtonTextColor( const Color& rColor )
948 {
949     CopyData();
950     mxData->maFlatButtonTextColor = rColor;
951 }
952 
953 const Color&
GetFlatButtonTextColor() const954 StyleSettings::GetFlatButtonTextColor() const
955 {
956     return mxData->maFlatButtonTextColor;
957 }
958 
959 void
SetDefaultButtonRolloverTextColor(const Color & rColor)960 StyleSettings::SetDefaultButtonRolloverTextColor( const Color& rColor )
961 {
962     CopyData();
963     mxData->maDefaultButtonRolloverTextColor = rColor;
964 }
965 
966 const Color&
GetDefaultButtonRolloverTextColor() const967 StyleSettings::GetDefaultButtonRolloverTextColor() const
968 {
969     return mxData->maDefaultButtonRolloverTextColor;
970 }
971 
972 void
SetButtonRolloverTextColor(const Color & rColor)973 StyleSettings::SetButtonRolloverTextColor( const Color& rColor )
974 {
975     CopyData();
976     mxData->maButtonRolloverTextColor = rColor;
977 }
978 
979 const Color&
GetButtonRolloverTextColor() const980 StyleSettings::GetButtonRolloverTextColor() const
981 {
982     return mxData->maButtonRolloverTextColor;
983 }
984 
985 void
SetDefaultActionButtonRolloverTextColor(const Color & rColor)986 StyleSettings::SetDefaultActionButtonRolloverTextColor( const Color& rColor )
987 {
988     CopyData();
989     mxData->maDefaultActionButtonRolloverTextColor = rColor;
990 }
991 
992 const Color&
GetDefaultActionButtonRolloverTextColor() const993 StyleSettings::GetDefaultActionButtonRolloverTextColor() const
994 {
995     return mxData->maDefaultActionButtonRolloverTextColor;
996 }
997 
998 void
SetActionButtonRolloverTextColor(const Color & rColor)999 StyleSettings::SetActionButtonRolloverTextColor( const Color& rColor )
1000 {
1001     CopyData();
1002     mxData->maActionButtonRolloverTextColor = rColor;
1003 }
1004 
1005 const Color&
GetActionButtonRolloverTextColor() const1006 StyleSettings::GetActionButtonRolloverTextColor() const
1007 {
1008     return mxData->maActionButtonRolloverTextColor;
1009 }
1010 
1011 void
SetFlatButtonRolloverTextColor(const Color & rColor)1012 StyleSettings::SetFlatButtonRolloverTextColor( const Color& rColor )
1013 {
1014     CopyData();
1015     mxData->maFlatButtonRolloverTextColor = rColor;
1016 }
1017 
1018 const Color&
GetFlatButtonRolloverTextColor() const1019 StyleSettings::GetFlatButtonRolloverTextColor() const
1020 {
1021     return mxData->maFlatButtonRolloverTextColor;
1022 }
1023 
1024 void
SetDefaultButtonPressedRolloverTextColor(const Color & rColor)1025 StyleSettings::SetDefaultButtonPressedRolloverTextColor( const Color& rColor )
1026 {
1027     CopyData();
1028     mxData->maDefaultButtonPressedRolloverTextColor = rColor;
1029 }
1030 
1031 const Color&
GetDefaultButtonPressedRolloverTextColor() const1032 StyleSettings::GetDefaultButtonPressedRolloverTextColor() const
1033 {
1034     return mxData->maDefaultButtonPressedRolloverTextColor;
1035 }
1036 
1037 void
SetButtonPressedRolloverTextColor(const Color & rColor)1038 StyleSettings::SetButtonPressedRolloverTextColor( const Color& rColor )
1039 {
1040     CopyData();
1041     mxData->maButtonPressedRolloverTextColor = rColor;
1042 }
1043 
1044 const Color&
GetButtonPressedRolloverTextColor() const1045 StyleSettings::GetButtonPressedRolloverTextColor() const
1046 {
1047     return mxData->maButtonPressedRolloverTextColor;
1048 }
1049 
1050 void
SetDefaultActionButtonPressedRolloverTextColor(const Color & rColor)1051 StyleSettings::SetDefaultActionButtonPressedRolloverTextColor( const Color& rColor )
1052 {
1053     CopyData();
1054     mxData->maDefaultActionButtonPressedRolloverTextColor = rColor;
1055 }
1056 
1057 const Color&
GetDefaultActionButtonPressedRolloverTextColor() const1058 StyleSettings::GetDefaultActionButtonPressedRolloverTextColor() const
1059 {
1060     return mxData->maDefaultActionButtonPressedRolloverTextColor;
1061 }
1062 
1063 void
SetActionButtonPressedRolloverTextColor(const Color & rColor)1064 StyleSettings::SetActionButtonPressedRolloverTextColor( const Color& rColor )
1065 {
1066     CopyData();
1067     mxData->maActionButtonPressedRolloverTextColor = rColor;
1068 }
1069 
1070 const Color&
GetActionButtonPressedRolloverTextColor() const1071 StyleSettings::GetActionButtonPressedRolloverTextColor() const
1072 {
1073     return mxData->maActionButtonPressedRolloverTextColor;
1074 }
1075 
1076 void
SetFlatButtonPressedRolloverTextColor(const Color & rColor)1077 StyleSettings::SetFlatButtonPressedRolloverTextColor( const Color& rColor )
1078 {
1079     CopyData();
1080     mxData->maFlatButtonPressedRolloverTextColor = rColor;
1081 }
1082 
1083 const Color&
GetFlatButtonPressedRolloverTextColor() const1084 StyleSettings::GetFlatButtonPressedRolloverTextColor() const
1085 {
1086     return mxData->maFlatButtonPressedRolloverTextColor;
1087 }
1088 
1089 void
SetRadioCheckTextColor(const Color & rColor)1090 StyleSettings::SetRadioCheckTextColor( const Color& rColor )
1091 {
1092     CopyData();
1093     mxData->maRadioCheckTextColor = rColor;
1094 }
1095 
1096 const Color&
GetRadioCheckTextColor() const1097 StyleSettings::GetRadioCheckTextColor() const
1098 {
1099     return mxData->maRadioCheckTextColor;
1100 }
1101 
1102 void
SetGroupTextColor(const Color & rColor)1103 StyleSettings::SetGroupTextColor( const Color& rColor )
1104 {
1105     CopyData();
1106     mxData->maGroupTextColor = rColor;
1107 }
1108 
1109 const Color&
GetGroupTextColor() const1110 StyleSettings::GetGroupTextColor() const
1111 {
1112     return mxData->maGroupTextColor;
1113 }
1114 
1115 void
SetLabelTextColor(const Color & rColor)1116 StyleSettings::SetLabelTextColor( const Color& rColor )
1117 {
1118     CopyData();
1119     mxData->maLabelTextColor = rColor;
1120 }
1121 
1122 const Color&
GetLabelTextColor() const1123 StyleSettings::GetLabelTextColor() const
1124 {
1125     return mxData->maLabelTextColor;
1126 }
1127 
1128 void
SetWindowColor(const Color & rColor)1129 StyleSettings::SetWindowColor( const Color& rColor )
1130 {
1131     CopyData();
1132     mxData->maWindowColor = rColor;
1133 }
1134 
1135 const Color&
GetWindowColor() const1136 StyleSettings::GetWindowColor() const
1137 {
1138     return mxData->maWindowColor;
1139 }
1140 
1141 void
SetWindowTextColor(const Color & rColor)1142 StyleSettings::SetWindowTextColor( const Color& rColor )
1143 {
1144     CopyData();
1145     mxData->maWindowTextColor = rColor;
1146 }
1147 
1148 const Color&
GetWindowTextColor() const1149 StyleSettings::GetWindowTextColor() const
1150 {
1151     return mxData->maWindowTextColor;
1152 }
1153 
1154 void
SetDialogColor(const Color & rColor)1155 StyleSettings::SetDialogColor( const Color& rColor )
1156 {
1157     CopyData();
1158     mxData->maDialogColor = rColor;
1159 }
1160 
1161 const Color&
GetDialogColor() const1162 StyleSettings::GetDialogColor() const
1163 {
1164     return mxData->maDialogColor;
1165 }
1166 
1167 void
SetDialogTextColor(const Color & rColor)1168 StyleSettings::SetDialogTextColor( const Color& rColor )
1169 {
1170     CopyData();
1171     mxData->maDialogTextColor = rColor;
1172 }
1173 
1174 const Color&
GetDialogTextColor() const1175 StyleSettings::GetDialogTextColor() const
1176 {
1177     return mxData->maDialogTextColor;
1178 }
1179 
1180 void
SetWorkspaceColor(const Color & rColor)1181 StyleSettings::SetWorkspaceColor( const Color& rColor )
1182 {
1183     CopyData();
1184     mxData->maWorkspaceColor = rColor;
1185 }
1186 
1187 const Color&
GetWorkspaceColor() const1188 StyleSettings::GetWorkspaceColor() const
1189 {
1190     return mxData->maWorkspaceColor;
1191 }
1192 
1193 void
SetFieldColor(const Color & rColor)1194 StyleSettings::SetFieldColor( const Color& rColor )
1195 {
1196     CopyData();
1197     mxData->maFieldColor = rColor;
1198 }
1199 
1200 const Color&
GetFieldColor() const1201 StyleSettings::GetFieldColor() const
1202 {
1203     return mxData->maFieldColor;
1204 }
1205 
1206 void
SetFieldTextColor(const Color & rColor)1207 StyleSettings::SetFieldTextColor( const Color& rColor )
1208 {
1209     CopyData();
1210     mxData->maFieldTextColor = rColor;
1211 }
1212 
1213 const Color&
GetFieldTextColor() const1214 StyleSettings::GetFieldTextColor() const
1215 {
1216     return mxData->maFieldTextColor;
1217 }
1218 
1219 void
SetFieldRolloverTextColor(const Color & rColor)1220 StyleSettings::SetFieldRolloverTextColor( const Color& rColor )
1221 {
1222     CopyData();
1223     mxData->maFieldRolloverTextColor = rColor;
1224 }
1225 
1226 const Color&
GetFieldRolloverTextColor() const1227 StyleSettings::GetFieldRolloverTextColor() const
1228 {
1229     return mxData->maFieldRolloverTextColor;
1230 }
1231 
1232 void
SetActiveColor(const Color & rColor)1233 StyleSettings::SetActiveColor( const Color& rColor )
1234 {
1235     CopyData();
1236     mxData->maActiveColor = rColor;
1237 }
1238 
1239 const Color&
GetActiveColor() const1240 StyleSettings::GetActiveColor() const
1241 {
1242     return mxData->maActiveColor;
1243 }
1244 
1245 void
SetActiveTextColor(const Color & rColor)1246 StyleSettings::SetActiveTextColor( const Color& rColor )
1247 {
1248     CopyData();
1249     mxData->maActiveTextColor = rColor;
1250 }
1251 
1252 const Color&
GetActiveTextColor() const1253 StyleSettings::GetActiveTextColor() const
1254 {
1255     return mxData->maActiveTextColor;
1256 }
1257 
1258 void
SetActiveBorderColor(const Color & rColor)1259 StyleSettings::SetActiveBorderColor( const Color& rColor )
1260 {
1261     CopyData();
1262     mxData->maActiveBorderColor = rColor;
1263 }
1264 
1265 const Color&
GetActiveBorderColor() const1266 StyleSettings::GetActiveBorderColor() const
1267 {
1268     return mxData->maActiveBorderColor;
1269 }
1270 
1271 void
SetDeactiveColor(const Color & rColor)1272 StyleSettings::SetDeactiveColor( const Color& rColor )
1273 {
1274     CopyData();
1275     mxData->maDeactiveColor = rColor;
1276 }
1277 
1278 const Color&
GetDeactiveColor() const1279 StyleSettings::GetDeactiveColor() const
1280 {
1281     return mxData->maDeactiveColor;
1282 }
1283 
1284 void
SetDeactiveTextColor(const Color & rColor)1285 StyleSettings::SetDeactiveTextColor( const Color& rColor )
1286 {
1287     CopyData();
1288     mxData->maDeactiveTextColor = rColor;
1289 }
1290 
1291 const Color&
GetDeactiveTextColor() const1292 StyleSettings::GetDeactiveTextColor() const
1293 {
1294     return mxData->maDeactiveTextColor;
1295 }
1296 
1297 void
SetDeactiveBorderColor(const Color & rColor)1298 StyleSettings::SetDeactiveBorderColor( const Color& rColor )
1299 {
1300     CopyData();
1301     mxData->maDeactiveBorderColor = rColor;
1302 }
1303 
1304 const Color&
GetDeactiveBorderColor() const1305 StyleSettings::GetDeactiveBorderColor() const
1306 {
1307     return mxData->maDeactiveBorderColor;
1308 }
1309 
1310 void
SetAccentColor(const Color & rColor)1311 StyleSettings::SetAccentColor( const Color& rColor )
1312 {
1313     CopyData();
1314     mxData->maAccentColor = rColor;
1315 }
1316 
1317 const Color&
GetAccentColor() const1318 StyleSettings::GetAccentColor() const
1319 {
1320     return mxData->maAccentColor;
1321 }
1322 
1323 void
SetHighlightColor(const Color & rColor)1324 StyleSettings::SetHighlightColor( const Color& rColor )
1325 {
1326     CopyData();
1327     mxData->maHighlightColor = rColor;
1328 }
1329 
1330 const Color&
GetHighlightColor() const1331 StyleSettings::GetHighlightColor() const
1332 {
1333     return mxData->maHighlightColor;
1334 }
1335 
1336 void
SetHighlightTextColor(const Color & rColor)1337 StyleSettings::SetHighlightTextColor( const Color& rColor )
1338 {
1339     CopyData();
1340     mxData->maHighlightTextColor = rColor;
1341 }
1342 
1343 const Color&
GetHighlightTextColor() const1344 StyleSettings::GetHighlightTextColor() const
1345 {
1346     return mxData->maHighlightTextColor;
1347 }
1348 
1349 void
SetDisableColor(const Color & rColor)1350 StyleSettings::SetDisableColor( const Color& rColor )
1351 {
1352     CopyData();
1353     mxData->maDisableColor = rColor;
1354 }
1355 
1356 const Color&
GetDisableColor() const1357 StyleSettings::GetDisableColor() const
1358 {
1359     return mxData->maDisableColor;
1360 }
1361 
1362 void
SetHelpColor(const Color & rColor)1363 StyleSettings::SetHelpColor( const Color& rColor )
1364 {
1365     CopyData();
1366     mxData->maHelpColor = rColor;
1367 }
1368 
1369 const Color&
GetHelpColor() const1370 StyleSettings::GetHelpColor() const
1371 {
1372     return mxData->maHelpColor;
1373 }
1374 
1375 void
SetHelpTextColor(const Color & rColor)1376 StyleSettings::SetHelpTextColor( const Color& rColor )
1377 {
1378     CopyData();
1379     mxData->maHelpTextColor = rColor;
1380 }
1381 
1382 const Color&
GetHelpTextColor() const1383 StyleSettings::GetHelpTextColor() const
1384 {
1385     return mxData->maHelpTextColor;
1386 }
1387 
1388 void
SetMenuColor(const Color & rColor)1389 StyleSettings::SetMenuColor( const Color& rColor )
1390 {
1391     CopyData();
1392     mxData->maMenuColor = rColor;
1393 }
1394 
1395 const Color&
GetMenuColor() const1396 StyleSettings::GetMenuColor() const
1397 {
1398     return mxData->maMenuColor;
1399 }
1400 
1401 void
SetMenuBarColor(const Color & rColor)1402 StyleSettings::SetMenuBarColor( const Color& rColor )
1403 {
1404     CopyData();
1405     mxData->maMenuBarColor = rColor;
1406 }
1407 
1408 const Color&
GetMenuBarColor() const1409 StyleSettings::GetMenuBarColor() const
1410 {
1411     return mxData->maMenuBarColor;
1412 }
1413 
1414 void
SetMenuBarRolloverColor(const Color & rColor)1415 StyleSettings::SetMenuBarRolloverColor( const Color& rColor )
1416 {
1417     CopyData();
1418     mxData->maMenuBarRolloverColor = rColor;
1419 }
1420 
1421 const Color&
GetMenuBarRolloverColor() const1422 StyleSettings::GetMenuBarRolloverColor() const
1423 {
1424     return mxData->maMenuBarRolloverColor;
1425 }
1426 
1427 void
SetMenuBorderColor(const Color & rColor)1428 StyleSettings::SetMenuBorderColor( const Color& rColor )
1429 {
1430     CopyData();
1431     mxData->maMenuBorderColor = rColor;
1432 }
1433 
1434 const Color&
GetMenuBorderColor() const1435 StyleSettings::GetMenuBorderColor() const
1436 {
1437     return mxData->maMenuBorderColor;
1438 }
1439 
1440 void
SetMenuTextColor(const Color & rColor)1441 StyleSettings::SetMenuTextColor( const Color& rColor )
1442 {
1443     CopyData();
1444     mxData->maMenuTextColor = rColor;
1445 }
1446 
1447 const Color&
GetMenuTextColor() const1448 StyleSettings::GetMenuTextColor() const
1449 {
1450     return mxData->maMenuTextColor;
1451 }
1452 
1453 void
SetMenuBarTextColor(const Color & rColor)1454 StyleSettings::SetMenuBarTextColor( const Color& rColor )
1455 {
1456     CopyData();
1457     mxData->maMenuBarTextColor = rColor;
1458 }
1459 
1460 const Color&
GetMenuBarTextColor() const1461 StyleSettings::GetMenuBarTextColor() const
1462 {
1463     return mxData->maMenuBarTextColor;
1464 }
1465 
1466 void
SetMenuBarRolloverTextColor(const Color & rColor)1467 StyleSettings::SetMenuBarRolloverTextColor( const Color& rColor )
1468 {
1469     CopyData();
1470     mxData->maMenuBarRolloverTextColor = rColor;
1471 }
1472 
1473 const Color&
GetMenuBarRolloverTextColor() const1474 StyleSettings::GetMenuBarRolloverTextColor() const
1475 {
1476     return mxData->maMenuBarRolloverTextColor;
1477 }
1478 
1479 void
SetMenuBarHighlightTextColor(const Color & rColor)1480 StyleSettings::SetMenuBarHighlightTextColor( const Color& rColor )
1481 {
1482     CopyData();
1483     mxData->maMenuBarHighlightTextColor = rColor;
1484 }
1485 
1486 const Color&
GetMenuBarHighlightTextColor() const1487 StyleSettings::GetMenuBarHighlightTextColor() const
1488 {
1489     return mxData->maMenuBarHighlightTextColor;
1490 }
1491 
1492 void
SetMenuHighlightColor(const Color & rColor)1493 StyleSettings::SetMenuHighlightColor( const Color& rColor )
1494 {
1495     CopyData();
1496     mxData->maMenuHighlightColor = rColor;
1497 }
1498 
1499 const Color&
GetMenuHighlightColor() const1500 StyleSettings::GetMenuHighlightColor() const
1501 {
1502     return mxData->maMenuHighlightColor;
1503 }
1504 
1505 void
SetMenuHighlightTextColor(const Color & rColor)1506 StyleSettings::SetMenuHighlightTextColor( const Color& rColor )
1507 {
1508     CopyData();
1509     mxData->maMenuHighlightTextColor = rColor;
1510 }
1511 
1512 const Color&
GetMenuHighlightTextColor() const1513 StyleSettings::GetMenuHighlightTextColor() const
1514 {
1515     return mxData->maMenuHighlightTextColor;
1516 }
1517 
1518 void
SetListBoxWindowBackgroundColor(const Color & rColor)1519 StyleSettings::SetListBoxWindowBackgroundColor( const Color& rColor )
1520 {
1521     CopyData();
1522     mxData->maListBoxWindowBackgroundColor = rColor;
1523 }
1524 
1525 const Color&
GetListBoxWindowBackgroundColor() const1526 StyleSettings::GetListBoxWindowBackgroundColor() const
1527 {
1528     return mxData->maListBoxWindowBackgroundColor;
1529 }
1530 
1531 void
SetListBoxWindowTextColor(const Color & rColor)1532 StyleSettings::SetListBoxWindowTextColor( const Color& rColor )
1533 {
1534     CopyData();
1535     mxData->maListBoxWindowTextColor = rColor;
1536 }
1537 
1538 const Color&
GetListBoxWindowTextColor() const1539 StyleSettings::GetListBoxWindowTextColor() const
1540 {
1541     return mxData->maListBoxWindowTextColor;
1542 }
1543 
1544 void
SetListBoxWindowHighlightColor(const Color & rColor)1545 StyleSettings::SetListBoxWindowHighlightColor( const Color& rColor )
1546 {
1547     CopyData();
1548     mxData->maListBoxWindowHighlightColor = rColor;
1549 }
1550 
1551 const Color&
GetListBoxWindowHighlightColor() const1552 StyleSettings::GetListBoxWindowHighlightColor() const
1553 {
1554     return mxData->maListBoxWindowHighlightColor;
1555 }
1556 
1557 void
SetListBoxWindowHighlightTextColor(const Color & rColor)1558 StyleSettings::SetListBoxWindowHighlightTextColor( const Color& rColor )
1559 {
1560     CopyData();
1561     mxData->maListBoxWindowHighlightTextColor = rColor;
1562 }
1563 
1564 const Color&
GetListBoxWindowHighlightTextColor() const1565 StyleSettings::GetListBoxWindowHighlightTextColor() const
1566 {
1567     return mxData->maListBoxWindowHighlightTextColor;
1568 }
1569 
1570 void
SetTabTextColor(const Color & rColor)1571 StyleSettings::SetTabTextColor( const Color& rColor )
1572 {
1573     CopyData();
1574     mxData->maTabTextColor = rColor;
1575 }
1576 
1577 const Color&
GetTabTextColor() const1578 StyleSettings::GetTabTextColor() const
1579 {
1580     return mxData->maTabTextColor;
1581 }
1582 
1583 void
SetTabRolloverTextColor(const Color & rColor)1584 StyleSettings::SetTabRolloverTextColor( const Color& rColor )
1585 {
1586     CopyData();
1587     mxData->maTabRolloverTextColor = rColor;
1588 }
1589 
1590 const Color&
GetTabRolloverTextColor() const1591 StyleSettings::GetTabRolloverTextColor() const
1592 {
1593     return mxData->maTabRolloverTextColor;
1594 }
1595 
1596 void
SetTabHighlightTextColor(const Color & rColor)1597 StyleSettings::SetTabHighlightTextColor( const Color& rColor )
1598 {
1599     CopyData();
1600     mxData->maTabHighlightTextColor = rColor;
1601 }
1602 
1603 const Color&
GetTabHighlightTextColor() const1604 StyleSettings::GetTabHighlightTextColor() const
1605 {
1606     return mxData->maTabHighlightTextColor;
1607 }
1608 
1609 void
SetLinkColor(const Color & rColor)1610 StyleSettings::SetLinkColor( const Color& rColor )
1611 {
1612     CopyData();
1613     mxData->maLinkColor = rColor;
1614 }
1615 
1616 const Color&
GetLinkColor() const1617 StyleSettings::GetLinkColor() const
1618 {
1619     return mxData->maLinkColor;
1620 }
1621 
1622 void
SetVisitedLinkColor(const Color & rColor)1623 StyleSettings::SetVisitedLinkColor( const Color& rColor )
1624 {
1625     CopyData();
1626     mxData->maVisitedLinkColor = rColor;
1627 }
1628 
1629 const Color&
GetVisitedLinkColor() const1630 StyleSettings::GetVisitedLinkColor() const
1631 {
1632     return mxData->maVisitedLinkColor;
1633 }
1634 
1635 void
SetToolTextColor(const Color & rColor)1636 StyleSettings::SetToolTextColor( const Color& rColor )
1637 {
1638     CopyData();
1639     mxData->maToolTextColor = rColor;
1640 }
1641 
1642 const Color&
GetToolTextColor() const1643 StyleSettings::GetToolTextColor() const
1644 {
1645     return mxData->maToolTextColor;
1646 }
1647 
1648 void
SetMonoColor(const Color & rColor)1649 StyleSettings::SetMonoColor( const Color& rColor )
1650 {
1651     CopyData();
1652     mxData->maMonoColor = rColor;
1653 }
1654 
1655 const Color&
GetMonoColor() const1656 StyleSettings::GetMonoColor() const
1657 {
1658     return mxData->maMonoColor;
1659 }
1660 
1661 void
SetActiveTabColor(const Color & rColor)1662 StyleSettings::SetActiveTabColor( const Color& rColor )
1663 {
1664     CopyData();
1665     mxData->maActiveTabColor = rColor;
1666 }
1667 
1668 const Color&
GetActiveTabColor() const1669 StyleSettings::GetActiveTabColor() const
1670 {
1671     return mxData->maActiveTabColor;
1672 }
1673 
1674 void
SetInactiveTabColor(const Color & rColor)1675 StyleSettings::SetInactiveTabColor( const Color& rColor )
1676 {
1677     CopyData();
1678     mxData->maInactiveTabColor = rColor;
1679 }
1680 
1681 const Color&
GetInactiveTabColor() const1682 StyleSettings::GetInactiveTabColor() const
1683 {
1684     return mxData->maInactiveTabColor;
1685 }
1686 
SetAlternatingRowColor(const Color & rColor)1687 void StyleSettings::SetAlternatingRowColor(const Color& rColor)
1688 {
1689     CopyData();
1690     mxData->maAlternatingRowColor = rColor;
1691 }
1692 
1693 const Color&
GetAlternatingRowColor() const1694 StyleSettings::GetAlternatingRowColor() const
1695 {
1696     return mxData->maAlternatingRowColor;
1697 }
1698 
1699 void
SetUseSystemUIFonts(bool bUseSystemUIFonts)1700 StyleSettings::SetUseSystemUIFonts( bool bUseSystemUIFonts )
1701 {
1702     CopyData();
1703     mxData->mbUseSystemUIFonts = bUseSystemUIFonts;
1704 }
1705 
1706 bool
GetUseSystemUIFonts() const1707 StyleSettings::GetUseSystemUIFonts() const
1708 {
1709     return mxData->mbUseSystemUIFonts;
1710 }
1711 
SetUseFontAAFromSystem(bool bUseFontAAFromSystem)1712 void StyleSettings::SetUseFontAAFromSystem(bool bUseFontAAFromSystem)
1713 {
1714     CopyData();
1715     mxData->mbUseFontAAFromSystem = bUseFontAAFromSystem;
1716 }
1717 
GetUseFontAAFromSystem() const1718 bool StyleSettings::GetUseFontAAFromSystem() const
1719 {
1720     return mxData->mbUseFontAAFromSystem;
1721 }
1722 
1723 void
SetUseFlatBorders(bool bUseFlatBorders)1724 StyleSettings::SetUseFlatBorders( bool bUseFlatBorders )
1725 {
1726     CopyData();
1727     mxData->mnUseFlatBorders = bUseFlatBorders;
1728 }
1729 
1730 bool
GetUseFlatBorders() const1731 StyleSettings::GetUseFlatBorders() const
1732 {
1733     return mxData->mnUseFlatBorders;
1734 }
1735 
1736 void
SetUseFlatMenus(bool bUseFlatMenus)1737 StyleSettings::SetUseFlatMenus( bool bUseFlatMenus )
1738 {
1739     CopyData();
1740     mxData->mnUseFlatMenus = bUseFlatMenus;
1741 }
1742 
1743 bool
GetUseFlatMenus() const1744 StyleSettings::GetUseFlatMenus() const
1745 {
1746     return mxData->mnUseFlatMenus;
1747 }
1748 
1749 void
SetUseImagesInMenus(TriState eUseImagesInMenus)1750 StyleSettings::SetUseImagesInMenus( TriState eUseImagesInMenus )
1751 {
1752     CopyData();
1753     mxData->meUseImagesInMenus = eUseImagesInMenus;
1754 }
1755 
1756 void
SetPreferredUseImagesInMenus(bool bPreferredUseImagesInMenus)1757 StyleSettings::SetPreferredUseImagesInMenus( bool bPreferredUseImagesInMenus )
1758 {
1759     CopyData();
1760     mxData->mbPreferredUseImagesInMenus = bPreferredUseImagesInMenus;
1761 }
1762 
1763 bool
GetPreferredUseImagesInMenus() const1764 StyleSettings::GetPreferredUseImagesInMenus() const
1765 {
1766     return mxData->mbPreferredUseImagesInMenus;
1767 }
1768 
1769 void
SetSkipDisabledInMenus(bool bSkipDisabledInMenus)1770 StyleSettings::SetSkipDisabledInMenus( bool bSkipDisabledInMenus )
1771 {
1772     CopyData();
1773     mxData->mbSkipDisabledInMenus = bSkipDisabledInMenus;
1774 }
1775 
1776 bool
GetSkipDisabledInMenus() const1777 StyleSettings::GetSkipDisabledInMenus() const
1778 {
1779     return mxData->mbSkipDisabledInMenus;
1780 }
1781 
1782 void
SetHideDisabledMenuItems(bool bHideDisabledMenuItems)1783 StyleSettings::SetHideDisabledMenuItems( bool bHideDisabledMenuItems )
1784 {
1785     CopyData();
1786     mxData->mbHideDisabledMenuItems = bHideDisabledMenuItems;
1787 }
1788 
1789 bool
GetHideDisabledMenuItems() const1790 StyleSettings::GetHideDisabledMenuItems() const
1791 {
1792     return mxData->mbHideDisabledMenuItems;
1793 }
1794 
1795 void
SetContextMenuShortcuts(TriState eContextMenuShortcuts)1796 StyleSettings::SetContextMenuShortcuts( TriState eContextMenuShortcuts )
1797 {
1798     CopyData();
1799     mxData->meContextMenuShortcuts = eContextMenuShortcuts;
1800 }
1801 
1802 bool
GetContextMenuShortcuts() const1803 StyleSettings::GetContextMenuShortcuts() const
1804 {
1805     switch (mxData->meContextMenuShortcuts)
1806     {
1807     case TRISTATE_FALSE:
1808         return false;
1809     case TRISTATE_TRUE:
1810         return true;
1811     default: // TRISTATE_INDET:
1812         return GetPreferredContextMenuShortcuts();
1813     }
1814 }
1815 
1816 void
SetPreferredContextMenuShortcuts(bool bContextMenuShortcuts)1817 StyleSettings::SetPreferredContextMenuShortcuts( bool bContextMenuShortcuts )
1818 {
1819     CopyData();
1820     mxData->mbPreferredContextMenuShortcuts = bContextMenuShortcuts;
1821 }
1822 
1823 bool
GetPreferredContextMenuShortcuts() const1824 StyleSettings::GetPreferredContextMenuShortcuts() const
1825 {
1826     return mxData->mbPreferredContextMenuShortcuts;
1827 }
1828 
1829 void
SetPrimaryButtonWarpsSlider(bool bPrimaryButtonWarpsSlider)1830 StyleSettings::SetPrimaryButtonWarpsSlider( bool bPrimaryButtonWarpsSlider )
1831 {
1832     CopyData();
1833     mxData->mbPrimaryButtonWarpsSlider = bPrimaryButtonWarpsSlider;
1834 }
1835 
1836 bool
GetPrimaryButtonWarpsSlider() const1837 StyleSettings::GetPrimaryButtonWarpsSlider() const
1838 {
1839     return mxData->mbPrimaryButtonWarpsSlider;
1840 }
1841 
1842 void
SetAppFont(const vcl::Font & rFont)1843 StyleSettings::SetAppFont( const vcl::Font& rFont )
1844 {
1845     CopyData();
1846     mxData->maAppFont = rFont;
1847 }
1848 
1849 const vcl::Font&
GetAppFont() const1850 StyleSettings::GetAppFont() const
1851 {
1852     return mxData->maAppFont;
1853 }
1854 
1855 void
SetHelpFont(const vcl::Font & rFont)1856 StyleSettings::SetHelpFont( const vcl::Font& rFont )
1857 {
1858     CopyData();
1859     mxData->maHelpFont = rFont;
1860 }
1861 
1862 const vcl::Font&
GetHelpFont() const1863 StyleSettings::GetHelpFont() const
1864 {
1865     return mxData->maHelpFont;
1866 }
1867 
1868 void
SetTitleFont(const vcl::Font & rFont)1869 StyleSettings::SetTitleFont( const vcl::Font& rFont )
1870 {
1871     CopyData();
1872     mxData->maTitleFont = rFont;
1873 }
1874 
1875 const vcl::Font&
GetTitleFont() const1876 StyleSettings::GetTitleFont() const
1877 {
1878     return mxData->maTitleFont;
1879 }
1880 
1881 void
SetFloatTitleFont(const vcl::Font & rFont)1882 StyleSettings::SetFloatTitleFont( const vcl::Font& rFont )
1883 {
1884     CopyData();
1885     mxData->maFloatTitleFont = rFont;
1886 }
1887 
1888 const vcl::Font&
GetFloatTitleFont() const1889 StyleSettings::GetFloatTitleFont() const
1890 {
1891     return mxData->maFloatTitleFont;
1892 }
1893 
1894 void
SetMenuFont(const vcl::Font & rFont)1895 StyleSettings::SetMenuFont( const vcl::Font& rFont )
1896 {
1897     CopyData();
1898     mxData->maMenuFont = rFont;
1899 }
1900 
1901 const vcl::Font&
GetMenuFont() const1902 StyleSettings::GetMenuFont() const
1903 {
1904     return mxData->maMenuFont;
1905 }
1906 
1907 void
SetToolFont(const vcl::Font & rFont)1908 StyleSettings::SetToolFont( const vcl::Font& rFont )
1909 {
1910     CopyData();
1911     mxData->maToolFont = rFont;
1912 }
1913 
1914 const vcl::Font&
GetToolFont() const1915 StyleSettings::GetToolFont() const
1916 {
1917     return mxData->maToolFont;
1918 }
1919 
1920 void
SetGroupFont(const vcl::Font & rFont)1921 StyleSettings::SetGroupFont( const vcl::Font& rFont )
1922 {
1923     CopyData();
1924     mxData->maGroupFont = rFont;
1925 }
1926 
1927 const vcl::Font&
GetGroupFont() const1928 StyleSettings::GetGroupFont() const
1929 {
1930     return mxData->maGroupFont;
1931 }
1932 
1933 void
SetLabelFont(const vcl::Font & rFont)1934 StyleSettings::SetLabelFont( const vcl::Font& rFont )
1935 {
1936     CopyData();
1937     mxData->maLabelFont = rFont;
1938 }
1939 
1940 const vcl::Font&
GetLabelFont() const1941 StyleSettings::GetLabelFont() const
1942 {
1943     return mxData->maLabelFont;
1944 }
1945 
1946 void
SetRadioCheckFont(const vcl::Font & rFont)1947 StyleSettings::SetRadioCheckFont( const vcl::Font& rFont )
1948 {
1949     CopyData();
1950     mxData->maRadioCheckFont = rFont;
1951 }
1952 
1953 const vcl::Font&
GetRadioCheckFont() const1954 StyleSettings::GetRadioCheckFont() const
1955 {
1956     return mxData->maRadioCheckFont;
1957 }
1958 
1959 void
SetPushButtonFont(const vcl::Font & rFont)1960 StyleSettings::SetPushButtonFont( const vcl::Font& rFont )
1961 {
1962     CopyData();
1963     mxData->maPushButtonFont = rFont;
1964 }
1965 
1966 const vcl::Font&
GetPushButtonFont() const1967 StyleSettings::GetPushButtonFont() const
1968 {
1969     return mxData->maPushButtonFont;
1970 }
1971 
1972 void
SetFieldFont(const vcl::Font & rFont)1973 StyleSettings::SetFieldFont( const vcl::Font& rFont )
1974 {
1975     CopyData();
1976     mxData->maFieldFont = rFont;
1977 }
1978 
1979 const vcl::Font&
GetFieldFont() const1980 StyleSettings::GetFieldFont() const
1981 {
1982     return mxData->maFieldFont;
1983 }
1984 
1985 void
SetIconFont(const vcl::Font & rFont)1986 StyleSettings::SetIconFont( const vcl::Font& rFont )
1987 {
1988     CopyData();
1989     mxData->maIconFont = rFont;
1990 }
1991 
1992 const vcl::Font&
GetIconFont() const1993 StyleSettings::GetIconFont() const
1994 {
1995     return mxData->maIconFont;
1996 }
1997 
1998 void
SetTabFont(const vcl::Font & rFont)1999 StyleSettings::SetTabFont( const vcl::Font& rFont )
2000 {
2001     CopyData();
2002     mxData->maTabFont = rFont;
2003 }
2004 
2005 const vcl::Font&
GetTabFont() const2006 StyleSettings::GetTabFont() const
2007 {
2008     return mxData->maTabFont;
2009 }
2010 
2011 sal_Int32
GetBorderSize()2012 StyleSettings::GetBorderSize()
2013 {
2014     return 1;
2015 }
2016 
2017 void
SetTitleHeight(sal_Int32 nSize)2018 StyleSettings::SetTitleHeight( sal_Int32 nSize )
2019 {
2020     CopyData();
2021     mxData->mnTitleHeight = nSize;
2022 }
2023 
2024 sal_Int32
GetTitleHeight() const2025 StyleSettings::GetTitleHeight() const
2026 {
2027     return mxData->mnTitleHeight;
2028 }
2029 
2030 void
SetFloatTitleHeight(sal_Int32 nSize)2031 StyleSettings::SetFloatTitleHeight( sal_Int32 nSize )
2032 {
2033     CopyData();
2034     mxData->mnFloatTitleHeight = nSize;
2035 }
2036 
2037 sal_Int32
GetFloatTitleHeight() const2038 StyleSettings::GetFloatTitleHeight() const
2039 {
2040     return mxData->mnFloatTitleHeight;
2041 }
2042 
2043 void
SetScrollBarSize(sal_Int32 nSize)2044 StyleSettings::SetScrollBarSize( sal_Int32 nSize )
2045 {
2046     CopyData();
2047     mxData->mnScrollBarSize = nSize;
2048 }
2049 
2050 sal_Int32
GetScrollBarSize() const2051 StyleSettings::GetScrollBarSize() const
2052 {
2053     return mxData->mnScrollBarSize;
2054 }
2055 
2056 void
SetMinThumbSize(sal_Int32 nSize)2057 StyleSettings::SetMinThumbSize( sal_Int32 nSize )
2058 {
2059     CopyData();
2060     mxData->mnMinThumbSize = nSize;
2061 }
2062 
2063 sal_Int32
GetMinThumbSize() const2064 StyleSettings::GetMinThumbSize() const
2065 {
2066     return mxData->mnMinThumbSize;
2067 }
2068 
2069 void
SetSpinSize(sal_Int32 nSize)2070 StyleSettings::SetSpinSize( sal_Int32 nSize )
2071 {
2072     CopyData();
2073     mxData->mnSpinSize = nSize;
2074 }
2075 
2076 sal_Int32
GetSpinSize() const2077 StyleSettings::GetSpinSize() const
2078 {
2079     return mxData->mnSpinSize;
2080 }
2081 
2082 sal_Int32
GetSplitSize()2083 StyleSettings::GetSplitSize()
2084 {
2085     return 3;
2086 }
2087 
2088 void
SetCursorSize(sal_Int32 nSize)2089 StyleSettings::SetCursorSize( sal_Int32 nSize )
2090 {
2091     CopyData();
2092     mxData->mnCursorSize = nSize;
2093 }
2094 
2095 sal_Int32
GetCursorSize() const2096 StyleSettings::GetCursorSize() const
2097 {
2098     return mxData->mnCursorSize;
2099 }
2100 
2101 void
SetCursorBlinkTime(sal_uInt64 nBlinkTime)2102 StyleSettings::SetCursorBlinkTime( sal_uInt64 nBlinkTime )
2103 {
2104     CopyData();
2105     mxData->mnCursorBlinkTime = nBlinkTime;
2106 }
2107 
2108 sal_uInt64
GetCursorBlinkTime() const2109 StyleSettings::GetCursorBlinkTime() const
2110 {
2111     return mxData->mnCursorBlinkTime;
2112 }
2113 
2114 void
SetDragFullOptions(DragFullOptions nOptions)2115 StyleSettings::SetDragFullOptions( DragFullOptions nOptions )
2116 {
2117     CopyData();
2118     mxData->mnDragFullOptions = nOptions;
2119 }
2120 
2121 DragFullOptions
GetDragFullOptions() const2122 StyleSettings::GetDragFullOptions() const
2123 {
2124     return mxData->mnDragFullOptions;
2125 }
2126 
2127 void
SetSelectionOptions(SelectionOptions nOptions)2128 StyleSettings::SetSelectionOptions( SelectionOptions nOptions )
2129 {
2130     CopyData();
2131     mxData->mnSelectionOptions = nOptions;
2132 }
2133 
2134 SelectionOptions
GetSelectionOptions() const2135 StyleSettings::GetSelectionOptions() const
2136 {
2137     return mxData->mnSelectionOptions;
2138 }
2139 
2140 void
SetDisplayOptions(DisplayOptions nOptions)2141 StyleSettings::SetDisplayOptions( DisplayOptions nOptions )
2142 {
2143     CopyData();
2144     mxData->mnDisplayOptions = nOptions;
2145 }
2146 
2147 DisplayOptions
GetDisplayOptions() const2148 StyleSettings::GetDisplayOptions() const
2149 {
2150     return mxData->mnDisplayOptions;
2151 }
2152 
2153 void
SetAntialiasingMinPixelHeight(sal_Int32 nMinPixel)2154 StyleSettings::SetAntialiasingMinPixelHeight( sal_Int32 nMinPixel )
2155 {
2156     CopyData();
2157     mxData->mnAntialiasedMin = nMinPixel;
2158 }
2159 
2160 sal_Int32
GetAntialiasingMinPixelHeight() const2161 StyleSettings::GetAntialiasingMinPixelHeight() const
2162 {
2163     return mxData->mnAntialiasedMin;
2164 }
2165 
2166 void
SetOptions(StyleSettingsOptions nOptions)2167 StyleSettings::SetOptions( StyleSettingsOptions nOptions )
2168 {
2169     CopyData();
2170     mxData->mnOptions = nOptions;
2171 }
2172 
2173 void
SetAutoMnemonic(bool bAutoMnemonic)2174 StyleSettings::SetAutoMnemonic( bool bAutoMnemonic )
2175 {
2176     CopyData();
2177     mxData->mbAutoMnemonic = bAutoMnemonic;
2178 }
2179 
2180 bool
GetAutoMnemonic() const2181 StyleSettings::GetAutoMnemonic() const
2182 {
2183     return mxData->mbAutoMnemonic;
2184 }
2185 
2186 bool
GetDockingFloatsSupported()2187 StyleSettings::GetDockingFloatsSupported()
2188 {
2189     ImplSVData* pSVData = ImplGetSVData();
2190     return pSVData->maNWFData.mbCanDetermineWindowPosition;
2191 }
2192 
2193 void
SetToolbarIconSize(ToolbarIconSize nSize)2194 StyleSettings::SetToolbarIconSize( ToolbarIconSize nSize )
2195 {
2196     CopyData();
2197     mxData->mnToolbarIconSize = nSize;
2198 }
2199 
2200 ToolbarIconSize
GetToolbarIconSize() const2201 StyleSettings::GetToolbarIconSize() const
2202 {
2203     return mxData->mnToolbarIconSize;
2204 }
2205 
GetToolbarIconSizePixel() const2206 Size StyleSettings::GetToolbarIconSizePixel() const
2207 {
2208     switch (GetToolbarIconSize())
2209     {
2210         case ToolbarIconSize::Large:
2211             return Size(24, 24);
2212         case ToolbarIconSize::Size32:
2213             return Size(32, 32);
2214         case ToolbarIconSize::Small:
2215         default:
2216             return Size(16, 16);
2217     }
2218 }
2219 
2220 const DialogStyle&
GetDialogStyle() const2221 StyleSettings::GetDialogStyle() const
2222 {
2223     return mxData->maDialogStyle;
2224 }
2225 
2226 void
SetEdgeBlending(sal_uInt16 nCount)2227 StyleSettings::SetEdgeBlending(sal_uInt16 nCount)
2228 {
2229     CopyData();
2230     mxData->mnEdgeBlending = nCount;
2231 }
2232 
2233 sal_uInt16
GetEdgeBlending() const2234 StyleSettings::GetEdgeBlending() const
2235 {
2236     return mxData->mnEdgeBlending;
2237 }
2238 
2239 const Color&
GetEdgeBlendingTopLeftColor() const2240 StyleSettings::GetEdgeBlendingTopLeftColor() const
2241 {
2242     return mxData->maEdgeBlendingTopLeftColor;
2243 }
2244 
2245 const Color&
GetEdgeBlendingBottomRightColor() const2246 StyleSettings::GetEdgeBlendingBottomRightColor() const
2247 {
2248     return mxData->maEdgeBlendingBottomRightColor;
2249 }
2250 
2251 void
SetListBoxMaximumLineCount(sal_uInt16 nCount)2252 StyleSettings::SetListBoxMaximumLineCount(sal_uInt16 nCount)
2253 {
2254     CopyData();
2255     mxData->mnListBoxMaximumLineCount = nCount;
2256 }
2257 
2258 sal_uInt16
GetListBoxMaximumLineCount() const2259 StyleSettings::GetListBoxMaximumLineCount() const
2260 {
2261     return mxData->mnListBoxMaximumLineCount;
2262 }
2263 
2264 void
SetColorValueSetColumnCount(sal_uInt16 nCount)2265 StyleSettings::SetColorValueSetColumnCount(sal_uInt16 nCount)
2266 {
2267     CopyData();
2268     mxData->mnColorValueSetColumnCount = nCount;
2269 }
2270 
2271 sal_uInt16
GetColorValueSetColumnCount() const2272 StyleSettings::GetColorValueSetColumnCount() const
2273 {
2274     return mxData->mnColorValueSetColumnCount;
2275 }
2276 
2277 sal_uInt16
GetListBoxPreviewDefaultLineWidth()2278 StyleSettings::GetListBoxPreviewDefaultLineWidth()
2279 {
2280     return 1;
2281 }
2282 
SetComboBoxTextSelectionMode(ComboBoxTextSelectionMode eMode)2283 void StyleSettings::SetComboBoxTextSelectionMode(
2284     ComboBoxTextSelectionMode eMode)
2285 {
2286     mxData->meComboBoxTextSelectionMode = eMode;
2287 }
2288 
GetComboBoxTextSelectionMode() const2289 ComboBoxTextSelectionMode StyleSettings::GetComboBoxTextSelectionMode() const
2290 {
2291     return mxData->meComboBoxTextSelectionMode;
2292 }
2293 
2294 void
SetPreviewUsesCheckeredBackground(bool bNew)2295 StyleSettings::SetPreviewUsesCheckeredBackground(bool bNew)
2296 {
2297     CopyData();
2298     mxData->mbPreviewUsesCheckeredBackground = bNew;
2299 }
2300 
2301 bool
GetPreviewUsesCheckeredBackground() const2302 StyleSettings::GetPreviewUsesCheckeredBackground() const
2303 {
2304     return mxData->mbPreviewUsesCheckeredBackground;
2305 }
2306 
2307 bool
operator !=(const StyleSettings & rSet) const2308 StyleSettings::operator !=( const StyleSettings& rSet ) const
2309 {
2310     return !(*this == rSet);
2311 }
2312 
SetListBoxPreviewDefaultLogicSize(Size const & rSize)2313 void StyleSettings::SetListBoxPreviewDefaultLogicSize(Size const& rSize)
2314 {
2315     mxData->maListBoxPreviewDefaultLogicSize = rSize;
2316 }
2317 
GetListBoxPreviewDefaultPixelSize() const2318 const Size& StyleSettings::GetListBoxPreviewDefaultPixelSize() const
2319 {
2320     if(0 == mxData->maListBoxPreviewDefaultPixelSize.Width() || 0 == mxData->maListBoxPreviewDefaultPixelSize.Height())
2321     {
2322         const_cast< StyleSettings* >(this)->mxData->maListBoxPreviewDefaultPixelSize =
2323             Application::GetDefaultDevice()->LogicToPixel(mxData->maListBoxPreviewDefaultLogicSize, MapMode(MapUnit::MapAppFont));
2324     }
2325 
2326     return mxData->maListBoxPreviewDefaultPixelSize;
2327 }
2328 
Set3DColors(const Color & rColor)2329 void StyleSettings::Set3DColors( const Color& rColor )
2330 {
2331     CopyData();
2332     mxData->maFaceColor         = rColor;
2333     mxData->maLightBorderColor  = rColor;
2334     mxData->maMenuBorderColor   = rColor;
2335     mxData->maDarkShadowColor   = COL_BLACK;
2336     if ( rColor != COL_LIGHTGRAY )
2337     {
2338         mxData->maLightColor = rColor;
2339         mxData->maShadowColor = rColor;
2340         mxData->maDarkShadowColor = rColor;
2341 
2342         if (!rColor.IsDark())
2343         {
2344             mxData->maLightColor.IncreaseLuminance(64);
2345             mxData->maShadowColor.DecreaseLuminance(64);
2346             mxData->maDarkShadowColor.DecreaseLuminance(100);
2347         }
2348         else
2349         {
2350             mxData->maLightColor.DecreaseLuminance(64);
2351             mxData->maShadowColor.IncreaseLuminance(64);
2352             mxData->maDarkShadowColor.IncreaseLuminance(100);
2353         }
2354 
2355         sal_uInt8 nRed = (mxData->maLightColor.GetRed() + mxData->maShadowColor.GetRed()) / 2;
2356         sal_uInt8 nGreen = (mxData->maLightColor.GetGreen() + mxData->maShadowColor.GetGreen()) / 2;
2357         sal_uInt8 nBlue = (mxData->maLightColor.GetBlue() + mxData->maShadowColor.GetBlue()) / 2;
2358         mxData->maCheckedColor = Color(nRed, nGreen, nBlue);
2359     }
2360     else
2361     {
2362         mxData->maCheckedColor  = Color( 0x99, 0x99, 0x99 );
2363         mxData->maLightColor    = COL_WHITE;
2364         mxData->maShadowColor   = COL_GRAY;
2365     }
2366 }
2367 
SetCheckedColorSpecialCase()2368 void StyleSettings::SetCheckedColorSpecialCase( )
2369 {
2370     CopyData();
2371     // Light gray checked color special case
2372     if ( GetFaceColor() == COL_LIGHTGRAY )
2373         mxData->maCheckedColor = Color( 0xCC, 0xCC, 0xCC );
2374     else
2375     {
2376         sal_uInt8 nRed   = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxData->maFaceColor.GetRed())   + static_cast<sal_uInt16>(mxData->maLightColor.GetRed()))/2);
2377         sal_uInt8 nGreen = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxData->maFaceColor.GetGreen()) + static_cast<sal_uInt16>(mxData->maLightColor.GetGreen()))/2);
2378         sal_uInt8 nBlue  = static_cast<sal_uInt8>((static_cast<sal_uInt16>(mxData->maFaceColor.GetBlue())  + static_cast<sal_uInt16>(mxData->maLightColor.GetBlue()))/2);
2379         mxData->maCheckedColor = Color( nRed, nGreen, nBlue );
2380     }
2381 }
2382 
GetUseImagesInMenus() const2383 bool StyleSettings::GetUseImagesInMenus() const
2384 {
2385     // icon mode selected in Tools -> Options... -> OpenOffice.org -> View
2386     switch (mxData->meUseImagesInMenus) {
2387     case TRISTATE_FALSE:
2388         return false;
2389     case TRISTATE_TRUE:
2390         return true;
2391     default: // TRISTATE_INDET:
2392         return GetPreferredUseImagesInMenus();
2393     }
2394 }
2395 
readBitmapEx(const OUString & rPath)2396 static BitmapEx readBitmapEx( const OUString& rPath )
2397 {
2398     OUString aPath( rPath );
2399     rtl::Bootstrap::expandMacros( aPath );
2400 
2401     // import the image
2402     Graphic aGraphic;
2403     if ( GraphicFilter::LoadGraphic( aPath, OUString(), aGraphic ) != ERRCODE_NONE )
2404         return BitmapEx();
2405     return aGraphic.GetBitmapEx();
2406 }
2407 
2408 namespace {
2409 
2410 enum WhichPersona { PERSONA_HEADER, PERSONA_FOOTER };
2411 
2412 }
2413 
2414 /** Update the setting of the Persona header / footer in ImplStyleData */
setupPersonaHeaderFooter(WhichPersona eWhich,OUString & rHeaderFooter,BitmapEx & rHeaderFooterBitmap,std::optional<Color> & rMenuBarTextColor)2415 static void setupPersonaHeaderFooter( WhichPersona eWhich, OUString& rHeaderFooter, BitmapEx& rHeaderFooterBitmap, std::optional<Color>& rMenuBarTextColor )
2416 {
2417     // don't burn time loading images we don't need.
2418     if ( Application::IsHeadlessModeEnabled() )
2419         return;
2420 
2421     // read from the configuration
2422     OUString aPersona( officecfg::Office::Common::Misc::Persona::get() );
2423     OUString aPersonaSettings( officecfg::Office::Common::Misc::PersonaSettings::get() );
2424 
2425     // have the settings changed? marks if header /footer prepared before
2426     //should maybe extended to a flag that marks if header /footer /both are loaded
2427     OUString  aOldValue= eWhich==PERSONA_HEADER?OUString(aPersona + ";" + aPersonaSettings+";h" ):OUString(aPersona + ";" + aPersonaSettings+";f" );
2428     if ( rHeaderFooter == aOldValue )
2429         return;
2430 
2431     rHeaderFooter = aOldValue;
2432     rHeaderFooterBitmap = BitmapEx();
2433     rMenuBarTextColor.reset();
2434 
2435     // now read the new values and setup bitmaps
2436     OUString aHeader, aFooter;
2437     if ( aPersona == "own" || aPersona == "default" )
2438     {
2439         sal_Int32 nIndex = 0;
2440 
2441         // Skip the persona slug, name, and preview
2442         aHeader = aPersonaSettings.getToken( 3, ';', nIndex );
2443 
2444         if ( nIndex > 0 )
2445             aFooter = aPersonaSettings.getToken( 0, ';', nIndex );
2446 
2447         // change menu text color, advance nIndex to skip the '#'
2448         if ( nIndex > 0 )
2449         {
2450             OUString aColor = aPersonaSettings.getToken( 0, ';', ++nIndex );
2451             rMenuBarTextColor = Color( ColorTransparency, aColor.toUInt32( 16 ) );
2452         }
2453     }
2454 
2455     OUString aName;
2456     switch ( eWhich ) {
2457         case PERSONA_HEADER: aName = aHeader; break;
2458         case PERSONA_FOOTER: aName = aFooter; break;
2459     }
2460 
2461     if ( !aName.isEmpty() )
2462     {
2463         OUString gallery(u""_ustr);
2464         // try the gallery first, then the program path:
2465         if ( aPersona == "own" && !aPersonaSettings.startsWith( "vnd.sun.star.expand" ) )
2466         {
2467             gallery = "${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE( "bootstrap") "::UserInstallation}";
2468             rtl::Bootstrap::expandMacros( gallery );
2469             gallery += "/user/gallery/personas/";
2470         }
2471         else if ( aPersona == "default" )
2472         {
2473             gallery = "$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/gallery/personas/";
2474         }
2475         rHeaderFooterBitmap = readBitmapEx( gallery + aName );
2476 
2477         if ( rHeaderFooterBitmap.IsEmpty() )
2478             rHeaderFooterBitmap = readBitmapEx( "$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" + aName );
2479     }
2480 
2481     // Something went wrong. Probably, the images are missing. Clear the persona properties in the registry.
2482 
2483     if( rHeaderFooterBitmap.IsEmpty() )
2484     {
2485         std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
2486         officecfg::Office::Common::Misc::Persona::set( u"no"_ustr, batch );
2487         officecfg::Office::Common::Misc::PersonaSettings::set( u""_ustr, batch );
2488         batch->commit();
2489     }
2490 }
2491 
GetPersonaHeader() const2492 BitmapEx const & StyleSettings::GetPersonaHeader() const
2493 {
2494     setupPersonaHeaderFooter( PERSONA_HEADER, mxData->maPersonaHeaderFooter, mxData->maPersonaHeaderBitmap, mxData->maPersonaMenuBarTextColor );
2495     return mxData->maPersonaHeaderBitmap;
2496 }
2497 
GetPersonaFooter() const2498 BitmapEx const & StyleSettings::GetPersonaFooter() const
2499 {
2500     setupPersonaHeaderFooter( PERSONA_FOOTER, mxData->maPersonaHeaderFooter, mxData->maPersonaFooterBitmap, mxData->maPersonaMenuBarTextColor );
2501     return mxData->maPersonaFooterBitmap;
2502 }
2503 
GetPersonaMenuBarTextColor() const2504 const std::optional<Color>& StyleSettings::GetPersonaMenuBarTextColor() const
2505 {
2506     GetPersonaHeader();
2507     return mxData->maPersonaMenuBarTextColor;
2508 }
2509 
SetStandardStyles()2510 void StyleSettings::SetStandardStyles()
2511 {
2512     CopyData();
2513     mxData->SetStandardStyles();
2514 }
2515 
GetFaceGradientColor() const2516 Color StyleSettings::GetFaceGradientColor() const
2517 {
2518     // compute a brighter face color that can be used in gradients
2519     // for a convex look (eg toolbars)
2520 
2521     sal_uInt16 h, s, b;
2522     GetFaceColor().RGBtoHSB( h, s, b );
2523     if( s > 1) s=1;
2524     if( b < 98) b=98;
2525     return Color::HSBtoRGB( h, s, b );
2526 }
2527 
GetSeparatorColor() const2528 Color StyleSettings::GetSeparatorColor() const
2529 {
2530     // compute a brighter shadow color for separators (used in toolbars or between menubar and toolbars on Windows XP)
2531     sal_uInt16 h, s, b;
2532     GetShadowColor().RGBtoHSB( h, s, b );
2533     b += b/4;
2534     s -= s/4;
2535     return Color::HSBtoRGB( h, s, b );
2536 }
2537 
CopyData()2538 void StyleSettings::CopyData()
2539 {
2540     // copy if other references exist
2541     if (mxData.use_count() > 1)
2542     {
2543         mxData = std::make_shared<ImplStyleData>(*mxData);
2544     }
2545 }
2546 
operator ==(const StyleSettings & rSet) const2547 bool StyleSettings::operator ==( const StyleSettings& rSet ) const
2548 {
2549     if ( mxData == rSet.mxData )
2550         return true;
2551 
2552     if (mxData->mIconTheme != rSet.mxData->mIconTheme) {
2553         return false;
2554     }
2555 
2556     if (*mxData->mIconThemeSelector != *rSet.mxData->mIconThemeSelector) {
2557         return false;
2558     }
2559 
2560     return (mxData->mnOptions                 == rSet.mxData->mnOptions)                  &&
2561          (mxData->mbAutoMnemonic            == rSet.mxData->mbAutoMnemonic)             &&
2562          (mxData->mnDragFullOptions         == rSet.mxData->mnDragFullOptions)          &&
2563          (mxData->mnSelectionOptions        == rSet.mxData->mnSelectionOptions)         &&
2564          (mxData->mnDisplayOptions          == rSet.mxData->mnDisplayOptions)           &&
2565          (mxData->mnCursorSize              == rSet.mxData->mnCursorSize)               &&
2566          (mxData->mnCursorBlinkTime         == rSet.mxData->mnCursorBlinkTime)          &&
2567          (mxData->mnTitleHeight             == rSet.mxData->mnTitleHeight)              &&
2568          (mxData->mnFloatTitleHeight        == rSet.mxData->mnFloatTitleHeight)         &&
2569          (mxData->mnScrollBarSize           == rSet.mxData->mnScrollBarSize)            &&
2570          (mxData->mnMinThumbSize            == rSet.mxData->mnMinThumbSize)             &&
2571          (mxData->mnSpinSize                == rSet.mxData->mnSpinSize)                 &&
2572          (mxData->mnAntialiasedMin          == rSet.mxData->mnAntialiasedMin)           &&
2573          (mxData->mbHighContrast            == rSet.mxData->mbHighContrast)             &&
2574          (mxData->mbUseSystemUIFonts        == rSet.mxData->mbUseSystemUIFonts)         &&
2575          (mxData->mbUseFontAAFromSystem     == rSet.mxData->mbUseFontAAFromSystem)      &&
2576          (mxData->mnUseFlatBorders          == rSet.mxData->mnUseFlatBorders)           &&
2577          (mxData->mnUseFlatMenus            == rSet.mxData->mnUseFlatMenus)             &&
2578          (mxData->maFaceColor               == rSet.mxData->maFaceColor)                &&
2579          (mxData->maCheckedColor            == rSet.mxData->maCheckedColor)             &&
2580          (mxData->maLightColor              == rSet.mxData->maLightColor)               &&
2581          (mxData->maLightBorderColor        == rSet.mxData->maLightBorderColor)         &&
2582          (mxData->maShadowColor             == rSet.mxData->maShadowColor)              &&
2583          (mxData->maDarkShadowColor         == rSet.mxData->maDarkShadowColor)          &&
2584          (mxData->maWarningColor            == rSet.mxData->maWarningColor)             &&
2585          (mxData->maWarningTextColor        == rSet.mxData->maWarningTextColor)         &&
2586          (mxData->maErrorColor              == rSet.mxData->maErrorColor)               &&
2587          (mxData->maErrorTextColor          == rSet.mxData->maErrorTextColor)           &&
2588          (mxData->maButtonTextColor         == rSet.mxData->maButtonTextColor)          &&
2589          (mxData->maDefaultActionButtonTextColor == rSet.mxData->maDefaultActionButtonTextColor) &&
2590          (mxData->maActionButtonTextColor   == rSet.mxData->maActionButtonTextColor)    &&
2591          (mxData->maButtonRolloverTextColor == rSet.mxData->maButtonRolloverTextColor)  &&
2592          (mxData->maActionButtonRolloverTextColor == rSet.mxData->maActionButtonRolloverTextColor) &&
2593          (mxData->maRadioCheckTextColor     == rSet.mxData->maRadioCheckTextColor)      &&
2594          (mxData->maGroupTextColor          == rSet.mxData->maGroupTextColor)           &&
2595          (mxData->maLabelTextColor          == rSet.mxData->maLabelTextColor)           &&
2596          (mxData->maWindowColor             == rSet.mxData->maWindowColor)              &&
2597          (mxData->maWindowTextColor         == rSet.mxData->maWindowTextColor)          &&
2598          (mxData->maDialogColor             == rSet.mxData->maDialogColor)              &&
2599          (mxData->maDialogTextColor         == rSet.mxData->maDialogTextColor)          &&
2600          (mxData->maWorkspaceColor          == rSet.mxData->maWorkspaceColor)           &&
2601          (mxData->maMonoColor               == rSet.mxData->maMonoColor)                &&
2602          (mxData->maFieldColor              == rSet.mxData->maFieldColor)               &&
2603          (mxData->maFieldTextColor          == rSet.mxData->maFieldTextColor)           &&
2604          (mxData->maActiveColor             == rSet.mxData->maActiveColor)              &&
2605          (mxData->maActiveTextColor         == rSet.mxData->maActiveTextColor)          &&
2606          (mxData->maActiveBorderColor       == rSet.mxData->maActiveBorderColor)        &&
2607          (mxData->maDeactiveColor           == rSet.mxData->maDeactiveColor)            &&
2608          (mxData->maDeactiveTextColor       == rSet.mxData->maDeactiveTextColor)        &&
2609          (mxData->maDeactiveBorderColor     == rSet.mxData->maDeactiveBorderColor)      &&
2610          (mxData->maMenuColor               == rSet.mxData->maMenuColor)                &&
2611          (mxData->maMenuBarColor            == rSet.mxData->maMenuBarColor)             &&
2612          (mxData->maMenuBarRolloverColor    == rSet.mxData->maMenuBarRolloverColor)     &&
2613          (mxData->maMenuBorderColor         == rSet.mxData->maMenuBorderColor)          &&
2614          (mxData->maMenuTextColor           == rSet.mxData->maMenuTextColor)            &&
2615          (mxData->maListBoxWindowBackgroundColor == rSet.mxData->maListBoxWindowBackgroundColor) &&
2616          (mxData->maListBoxWindowTextColor       == rSet.mxData->maListBoxWindowTextColor) &&
2617          (mxData->maListBoxWindowHighlightColor  == rSet.mxData->maListBoxWindowHighlightColor) &&
2618          (mxData->maListBoxWindowHighlightTextColor == rSet.mxData->maListBoxWindowHighlightTextColor) &&
2619          (mxData->maMenuBarTextColor        == rSet.mxData->maMenuBarTextColor)         &&
2620          (mxData->maMenuBarRolloverTextColor == rSet.mxData->maMenuBarRolloverTextColor) &&
2621          (mxData->maMenuHighlightColor      == rSet.mxData->maMenuHighlightColor)       &&
2622          (mxData->maMenuHighlightTextColor  == rSet.mxData->maMenuHighlightTextColor)   &&
2623          (mxData->maAccentColor             == rSet.mxData->maAccentColor)              &&
2624          (mxData->maHighlightColor          == rSet.mxData->maHighlightColor)           &&
2625          (mxData->maHighlightTextColor      == rSet.mxData->maHighlightTextColor)       &&
2626          (mxData->maTabTextColor            == rSet.mxData->maTabTextColor)             &&
2627          (mxData->maTabRolloverTextColor    == rSet.mxData->maTabRolloverTextColor)     &&
2628          (mxData->maTabHighlightTextColor   == rSet.mxData->maTabHighlightTextColor)    &&
2629          (mxData->maActiveTabColor          == rSet.mxData->maActiveTabColor)           &&
2630          (mxData->maInactiveTabColor        == rSet.mxData->maInactiveTabColor)         &&
2631          (mxData->maDisableColor            == rSet.mxData->maDisableColor)             &&
2632          (mxData->maHelpColor               == rSet.mxData->maHelpColor)                &&
2633          (mxData->maHelpTextColor           == rSet.mxData->maHelpTextColor)            &&
2634          (mxData->maLinkColor               == rSet.mxData->maLinkColor)                &&
2635          (mxData->maVisitedLinkColor        == rSet.mxData->maVisitedLinkColor)         &&
2636          (mxData->maToolTextColor           == rSet.mxData->maToolTextColor)            &&
2637          (mxData->maAppFont                 == rSet.mxData->maAppFont)                  &&
2638          (mxData->maHelpFont                == rSet.mxData->maHelpFont)                 &&
2639          (mxData->maTitleFont               == rSet.mxData->maTitleFont)                &&
2640          (mxData->maFloatTitleFont          == rSet.mxData->maFloatTitleFont)           &&
2641          (mxData->maMenuFont                == rSet.mxData->maMenuFont)                 &&
2642          (mxData->maToolFont                == rSet.mxData->maToolFont)                 &&
2643          (mxData->maGroupFont               == rSet.mxData->maGroupFont)                &&
2644          (mxData->maLabelFont               == rSet.mxData->maLabelFont)                &&
2645          (mxData->maRadioCheckFont          == rSet.mxData->maRadioCheckFont)           &&
2646          (mxData->maPushButtonFont          == rSet.mxData->maPushButtonFont)           &&
2647          (mxData->maFieldFont               == rSet.mxData->maFieldFont)                &&
2648          (mxData->maIconFont                == rSet.mxData->maIconFont)                 &&
2649          (mxData->maTabFont                 == rSet.mxData->maTabFont)                  &&
2650          (mxData->meUseImagesInMenus        == rSet.mxData->meUseImagesInMenus)         &&
2651          (mxData->mbPreferredUseImagesInMenus == rSet.mxData->mbPreferredUseImagesInMenus) &&
2652          (mxData->mbSkipDisabledInMenus     == rSet.mxData->mbSkipDisabledInMenus)      &&
2653          (mxData->mbHideDisabledMenuItems   == rSet.mxData->mbHideDisabledMenuItems)    &&
2654          (mxData->mbPreferredContextMenuShortcuts  == rSet.mxData->mbPreferredContextMenuShortcuts)&&
2655          (mxData->meContextMenuShortcuts    == rSet.mxData->meContextMenuShortcuts)     &&
2656          (mxData->mbPrimaryButtonWarpsSlider == rSet.mxData->mbPrimaryButtonWarpsSlider) &&
2657          (mxData->mnEdgeBlending                    == rSet.mxData->mnEdgeBlending)                     &&
2658          (mxData->maEdgeBlendingTopLeftColor        == rSet.mxData->maEdgeBlendingTopLeftColor)         &&
2659          (mxData->maEdgeBlendingBottomRightColor    == rSet.mxData->maEdgeBlendingBottomRightColor)     &&
2660          (mxData->mnListBoxMaximumLineCount         == rSet.mxData->mnListBoxMaximumLineCount)          &&
2661          (mxData->mnColorValueSetColumnCount        == rSet.mxData->mnColorValueSetColumnCount)         &&
2662          (mxData->maListBoxPreviewDefaultLogicSize  == rSet.mxData->maListBoxPreviewDefaultLogicSize)   &&
2663          (mxData->maListBoxPreviewDefaultPixelSize  == rSet.mxData->maListBoxPreviewDefaultPixelSize)   &&
2664          (mxData->mbPreviewUsesCheckeredBackground == rSet.mxData->mbPreviewUsesCheckeredBackground);
2665 }
2666 
ImplMiscData()2667 ImplMiscData::ImplMiscData() :
2668     mnEnableATT(TRISTATE_INDET),
2669     mnDisablePrinting(TRISTATE_INDET)
2670 {
2671     static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI
2672     mbEnableLocalizedDecimalSep = (pEnv != nullptr);
2673 }
2674 
MiscSettings()2675 MiscSettings::MiscSettings()
2676     : mxData(std::make_shared<ImplMiscData>())
2677 {
2678 }
2679 
operator ==(const MiscSettings & rSet) const2680 bool MiscSettings::operator ==( const MiscSettings& rSet ) const
2681 {
2682     if ( mxData == rSet.mxData )
2683         return true;
2684 
2685     return (mxData->mnEnableATT           == rSet.mxData->mnEnableATT ) &&
2686          (mxData->mnDisablePrinting     == rSet.mxData->mnDisablePrinting ) &&
2687          (mxData->mbEnableLocalizedDecimalSep == rSet.mxData->mbEnableLocalizedDecimalSep );
2688 }
2689 
2690 bool
operator !=(const MiscSettings & rSet) const2691 MiscSettings::operator !=( const MiscSettings& rSet ) const
2692 {
2693     return !(*this == rSet);
2694 }
2695 
GetDisablePrinting() const2696 bool MiscSettings::GetDisablePrinting() const
2697 {
2698     if( mxData->mnDisablePrinting == TRISTATE_INDET )
2699     {
2700         OUString aEnable =
2701             vcl::SettingsConfigItem::get()->
2702             getValue( u"DesktopManagement"_ustr,
2703                       u"DisablePrinting"_ustr );
2704         mxData->mnDisablePrinting = aEnable.equalsIgnoreAsciiCase("true") ? TRISTATE_TRUE : TRISTATE_FALSE;
2705     }
2706 
2707     return mxData->mnDisablePrinting != TRISTATE_FALSE;
2708 }
2709 
GetEnableATToolSupport() const2710 bool MiscSettings::GetEnableATToolSupport() const
2711 {
2712 
2713 #ifdef _WIN32
2714     if( mxData->mnEnableATT == TRISTATE_INDET )
2715     {
2716         // Check in the Windows registry if an AT tool wants Accessibility support to
2717         // be activated ..
2718         HKEY hkey;
2719 
2720         if( ERROR_SUCCESS == RegOpenKeyW(HKEY_CURRENT_USER,
2721             L"Software\\LibreOffice\\Accessibility\\AtToolSupport",
2722             &hkey) )
2723         {
2724             DWORD dwType;
2725             wchar_t Data[6]; // possible values: "true", "false", "1", "0", DWORD
2726             DWORD cbData = sizeof(Data);
2727 
2728             if( ERROR_SUCCESS == RegQueryValueExW(hkey, L"SupportAssistiveTechnology",
2729                 nullptr, &dwType, reinterpret_cast<LPBYTE>(Data), &cbData) )
2730             {
2731                 switch (dwType)
2732                 {
2733                     case REG_SZ:
2734                         mxData->mnEnableATT = ((0 == wcsicmp(Data, L"1")) || (0 == wcsicmp(Data, L"true"))) ? TRISTATE_TRUE : TRISTATE_FALSE;
2735                         break;
2736                     case REG_DWORD:
2737                         switch (reinterpret_cast<DWORD *>(Data)[0]) {
2738                         case 0:
2739                             mxData->mnEnableATT = TRISTATE_FALSE;
2740                             break;
2741                         case 1:
2742                             mxData->mnEnableATT = TRISTATE_TRUE;
2743                             break;
2744                         default:
2745                             mxData->mnEnableATT = TRISTATE_INDET;
2746                                 //TODO: or TRISTATE_TRUE?
2747                             break;
2748                         }
2749                         break;
2750                     default:
2751                         // Unsupported registry type
2752                         break;
2753                 }
2754             }
2755 
2756             RegCloseKey(hkey);
2757         }
2758     }
2759 #endif
2760 
2761     if( mxData->mnEnableATT == TRISTATE_INDET )
2762     {
2763         static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" );
2764         if( !pEnv || !*pEnv )
2765         {
2766             OUString aEnable =
2767                 vcl::SettingsConfigItem::get()->
2768                 getValue( u"Accessibility"_ustr,
2769                           u"EnableATToolSupport"_ustr );
2770             mxData->mnEnableATT = aEnable.equalsIgnoreAsciiCase("true") ? TRISTATE_TRUE : TRISTATE_FALSE;
2771         }
2772         else
2773         {
2774             mxData->mnEnableATT = TRISTATE_TRUE;
2775         }
2776     }
2777 
2778     return mxData->mnEnableATT != TRISTATE_FALSE;
2779 }
2780 
2781 #ifdef _WIN32
SetEnableATToolSupport(bool bEnable)2782 void MiscSettings::SetEnableATToolSupport( bool bEnable )
2783 {
2784     if ( (bEnable ? TRISTATE_TRUE : TRISTATE_FALSE) != mxData->mnEnableATT )
2785     {
2786         if( bEnable && !ImplInitAccessBridge() )
2787             return;
2788 
2789         mxData->mnEnableATT = bEnable ? TRISTATE_TRUE : TRISTATE_FALSE;
2790 
2791         if (getenv("LO_TESTNAME") != nullptr)
2792             return; // No registry changing; no SettingsConfigItem modification
2793 
2794         HKEY hkey;
2795 
2796         // If the accessibility key in the Windows registry exists, change it synchronously
2797         if( ERROR_SUCCESS == RegOpenKeyW(HKEY_CURRENT_USER,
2798             L"Software\\LibreOffice\\Accessibility\\AtToolSupport",
2799             &hkey) )
2800         {
2801             DWORD dwType;
2802             wchar_t Data[6]; // possible values: "true", "false", 1, 0
2803             DWORD cbData = sizeof(Data);
2804 
2805             if( ERROR_SUCCESS == RegQueryValueExW(hkey, L"SupportAssistiveTechnology",
2806                 nullptr,   &dwType, reinterpret_cast<LPBYTE>(Data), &cbData) )
2807             {
2808                 switch (dwType)
2809                 {
2810                     case REG_SZ:
2811                         RegSetValueExW(hkey, L"SupportAssistiveTechnology",
2812                             0, dwType,
2813                             reinterpret_cast<const BYTE*>(bEnable ? L"true" : L"false"),
2814                             bEnable ? sizeof(L"true") : sizeof(L"false"));
2815                         break;
2816                     case REG_DWORD:
2817                         reinterpret_cast<DWORD *>(Data)[0] = bEnable ? 1 : 0;
2818                         RegSetValueExW(hkey, L"SupportAssistiveTechnology",
2819                             0, dwType, reinterpret_cast<const BYTE*>(Data), sizeof(DWORD));
2820                         break;
2821                     default:
2822                         // Unsupported registry type
2823                         break;
2824                 }
2825             }
2826 
2827             RegCloseKey(hkey);
2828         }
2829 
2830         vcl::SettingsConfigItem::get()->
2831             setValue( "Accessibility",
2832                       "EnableATToolSupport",
2833                       bEnable ? OUString("true") : OUString("false" ) );
2834     }
2835 }
2836 #endif
2837 
SetEnableLocalizedDecimalSep(bool bEnable)2838 void MiscSettings::SetEnableLocalizedDecimalSep( bool bEnable )
2839 {
2840     // copy if other references exist
2841     if (mxData.use_count() > 1)
2842     {
2843         mxData = std::make_shared<ImplMiscData>(*mxData);
2844     }
2845     mxData->mbEnableLocalizedDecimalSep = bEnable;
2846 }
2847 
GetEnableLocalizedDecimalSep() const2848 bool MiscSettings::GetEnableLocalizedDecimalSep() const
2849 {
2850     return mxData->mbEnableLocalizedDecimalSep;
2851 }
2852 
GetDarkMode()2853 int MiscSettings::GetDarkMode()
2854 {
2855     return officecfg::Office::Common::Misc::Appearance::get();
2856 }
2857 
SetDarkMode(int nMode)2858 void MiscSettings::SetDarkMode(int nMode)
2859 {
2860     std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
2861     officecfg::Office::Common::Misc::Appearance::set(nMode, batch);
2862     batch->commit();
2863 
2864     vcl::Window *pWin = Application::GetFirstTopLevelWindow();
2865     while (pWin)
2866     {
2867         pWin->ImplGetFrame()->UpdateDarkMode();
2868         pWin = Application::GetNextTopLevelWindow(pWin);
2869     }
2870 }
2871 
GetUseDarkMode()2872 bool MiscSettings::GetUseDarkMode()
2873 {
2874     vcl::Window* pDefWindow = ImplGetDefaultWindow();
2875     if (pDefWindow == nullptr)
2876         return false;
2877     return pDefWindow->ImplGetFrame()->GetUseDarkMode();
2878 }
2879 
GetAppColorMode()2880 int MiscSettings::GetAppColorMode()
2881 {
2882     if (comphelper::IsFuzzing())
2883         return 0;
2884     return officecfg::Office::Common::Misc::ApplicationAppearance::get();
2885 }
2886 
SetAppColorMode(int nMode)2887 void MiscSettings::SetAppColorMode(int nMode)
2888 {
2889     std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
2890     officecfg::Office::Common::Misc::ApplicationAppearance::set(nMode, batch);
2891     batch->commit();
2892 }
2893 
GetUseReducedAnimation()2894 bool MiscSettings::GetUseReducedAnimation()
2895 {
2896     vcl::Window* pDefWindow = ImplGetDefaultWindow();
2897     if (pDefWindow == nullptr)
2898         return false;
2899     return pDefWindow->ImplGetFrame()->GetUseReducedAnimation();
2900 }
2901 
HelpSettings()2902 HelpSettings::HelpSettings()
2903     : mxData(std::make_shared<ImplHelpData>())
2904 {
2905 }
2906 
operator ==(const HelpSettings & rSet) const2907 bool HelpSettings::operator ==( const HelpSettings& rSet ) const
2908 {
2909     if ( mxData == rSet.mxData )
2910         return true;
2911 
2912     return (mxData->mnTipTimeout      == rSet.mxData->mnTipTimeout );
2913 }
2914 
2915 sal_Int32
GetTipDelay()2916 HelpSettings::GetTipDelay()
2917 {
2918     return 500;
2919 }
2920 
2921 void
SetTipTimeout(sal_Int32 nTipTimeout)2922 HelpSettings::SetTipTimeout( sal_Int32 nTipTimeout )
2923 {
2924     // copy if other references exist
2925     if (mxData.use_count() > 1)
2926     {
2927         mxData = std::make_shared<ImplHelpData>(*mxData);
2928     }
2929     mxData->mnTipTimeout = nTipTimeout;
2930 }
2931 
2932 sal_Int32
GetTipTimeout() const2933 HelpSettings::GetTipTimeout() const
2934 {
2935     return mxData->mnTipTimeout;
2936 }
2937 
2938 sal_Int32
GetBalloonDelay()2939 HelpSettings::GetBalloonDelay()
2940 {
2941     return 1500;
2942 }
2943 
2944 bool
operator !=(const HelpSettings & rSet) const2945 HelpSettings::operator !=( const HelpSettings& rSet ) const
2946 {
2947     return !(*this == rSet);
2948 }
2949 
ImplAllSettingsData()2950 ImplAllSettingsData::ImplAllSettingsData()
2951     :
2952         maLocale( LANGUAGE_SYSTEM ),
2953         maUILocale( LANGUAGE_SYSTEM )
2954 {
2955     if (!comphelper::IsFuzzing())
2956         maMiscSettings.SetEnableLocalizedDecimalSep( maSysLocale.GetOptions().IsDecimalSeparatorAsLocale() );
2957 }
2958 
ImplAllSettingsData(const ImplAllSettingsData & rData)2959 ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) :
2960     maMouseSettings( rData.maMouseSettings ),
2961     maStyleSettings( rData.maStyleSettings ),
2962     maMiscSettings( rData.maMiscSettings ),
2963     maHelpSettings( rData.maHelpSettings ),
2964     maLocale( rData.maLocale ),
2965     maUILocale( rData.maUILocale )
2966 {
2967     // Create the cache objects new when their getter is called.
2968 }
2969 
~ImplAllSettingsData()2970 ImplAllSettingsData::~ImplAllSettingsData()
2971 {
2972     mpLocaleDataWrapper.reset();
2973     mpUILocaleDataWrapper.reset();
2974     mpNeutralLocaleDataWrapper.reset();
2975     mpI18nHelper.reset();
2976     mpUII18nHelper.reset();
2977 }
2978 
AllSettings()2979 AllSettings::AllSettings()
2980     : mxData(std::make_shared<ImplAllSettingsData>())
2981 {
2982 }
2983 
CopyData()2984 void AllSettings::CopyData()
2985 {
2986     // copy if other references exist
2987     if (mxData.use_count() > 1)
2988     {
2989         mxData = std::make_shared<ImplAllSettingsData>(*mxData);
2990     }
2991 
2992 }
2993 
Update(AllSettingsFlags nFlags,const AllSettings & rSet)2994 AllSettingsFlags AllSettings::Update( AllSettingsFlags nFlags, const AllSettings& rSet )
2995 {
2996 
2997     AllSettingsFlags nChangeFlags = AllSettingsFlags::NONE;
2998 
2999     if ( nFlags & AllSettingsFlags::MOUSE )
3000     {
3001         if ( mxData->maMouseSettings != rSet.mxData->maMouseSettings )
3002         {
3003             CopyData();
3004             mxData->maMouseSettings = rSet.mxData->maMouseSettings;
3005             nChangeFlags |= AllSettingsFlags::MOUSE;
3006         }
3007     }
3008 
3009     if ( nFlags & AllSettingsFlags::STYLE )
3010     {
3011         if ( mxData->maStyleSettings != rSet.mxData->maStyleSettings )
3012         {
3013             CopyData();
3014             mxData->maStyleSettings = rSet.mxData->maStyleSettings;
3015             nChangeFlags |= AllSettingsFlags::STYLE;
3016         }
3017     }
3018 
3019     if ( nFlags & AllSettingsFlags::MISC )
3020     {
3021         if ( mxData->maMiscSettings != rSet.mxData->maMiscSettings )
3022         {
3023             CopyData();
3024             mxData->maMiscSettings = rSet.mxData->maMiscSettings;
3025             nChangeFlags |= AllSettingsFlags::MISC;
3026         }
3027     }
3028 
3029     if ( nFlags & AllSettingsFlags::LOCALE )
3030     {
3031         if ( mxData->maLocale != rSet.mxData->maLocale )
3032         {
3033             SetLanguageTag( rSet.mxData->maLocale );
3034             nChangeFlags |= AllSettingsFlags::LOCALE;
3035         }
3036     }
3037 
3038     return nChangeFlags;
3039 }
3040 
GetChangeFlags(const AllSettings & rSet) const3041 AllSettingsFlags AllSettings::GetChangeFlags( const AllSettings& rSet ) const
3042 {
3043 
3044     AllSettingsFlags nChangeFlags = AllSettingsFlags::NONE;
3045 
3046     if ( mxData->maStyleSettings != rSet.mxData->maStyleSettings )
3047         nChangeFlags |= AllSettingsFlags::STYLE;
3048 
3049     if ( mxData->maMiscSettings != rSet.mxData->maMiscSettings )
3050         nChangeFlags |= AllSettingsFlags::MISC;
3051 
3052     if ( mxData->maLocale != rSet.mxData->maLocale )
3053         nChangeFlags |= AllSettingsFlags::LOCALE;
3054 
3055     return nChangeFlags;
3056 }
3057 
operator ==(const AllSettings & rSet) const3058 bool AllSettings::operator ==( const AllSettings& rSet ) const
3059 {
3060     if ( mxData == rSet.mxData )
3061         return true;
3062 
3063     if ( (mxData->maMouseSettings           == rSet.mxData->maMouseSettings)        &&
3064          (mxData->maStyleSettings           == rSet.mxData->maStyleSettings)        &&
3065          (mxData->maMiscSettings            == rSet.mxData->maMiscSettings)         &&
3066          (mxData->maHelpSettings            == rSet.mxData->maHelpSettings)         &&
3067          (mxData->maLocale                  == rSet.mxData->maLocale) )
3068     {
3069         return true;
3070     }
3071 
3072     return false;
3073 }
3074 
SetLanguageTag(const OUString & rLanguage,bool bCanonicalize)3075 void AllSettings::SetLanguageTag(const OUString& rLanguage, bool bCanonicalize)
3076 {
3077     SetLanguageTag(LanguageTag(rLanguage, bCanonicalize));
3078 }
3079 
SetLanguageTag(const LanguageTag & rLanguageTag)3080 void AllSettings::SetLanguageTag( const LanguageTag& rLanguageTag )
3081 {
3082     if (mxData->maLocale == rLanguageTag)
3083         return;
3084 
3085     CopyData();
3086 
3087     mxData->maLocale = rLanguageTag;
3088 
3089     if ( mxData->mpLocaleDataWrapper )
3090     {
3091         mxData->mpLocaleDataWrapper.reset();
3092     }
3093     if ( mxData->mpI18nHelper )
3094     {
3095         mxData->mpI18nHelper.reset();
3096     }
3097 }
3098 
3099 namespace
3100 {
GetConfigLayoutRTL(bool bMath)3101     bool GetConfigLayoutRTL(bool bMath)
3102     {
3103         static const char* pEnv = getenv("SAL_RTL_ENABLED" );
3104         static int  nUIMirroring = -1;   // -1: undef, 0: auto, 1: on 2: off
3105 
3106         // environment always overrides
3107         if( pEnv )
3108             return true;
3109 
3110         bool bRTL = false;
3111 
3112         if( nUIMirroring == -1 )
3113         {
3114             nUIMirroring = 0; // ask configuration only once
3115             utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithComponentContext(
3116                 comphelper::getProcessComponentContext(),
3117                 u"org.openoffice.Office.Common/I18N/CTL"_ustr );    // note: case sensitive !
3118             if ( aNode.isValid() )
3119             {
3120                 bool bTmp = bool();
3121                 css::uno::Any aValue = aNode.getNodeValue( u"UIMirroring"_ustr );
3122                 if( aValue >>= bTmp )
3123                 {
3124                     // found true or false; if it was nil, nothing is changed
3125                     nUIMirroring = bTmp ? 1 : 2;
3126                 }
3127             }
3128         }
3129 
3130         if( nUIMirroring == 0 )  // no config found (eg, setup) or default (nil) was set: check language
3131         {
3132             LanguageType aLang = SvtSysLocaleOptions().GetRealUILanguageTag().getLanguageType();
3133             if (bMath)
3134                 bRTL = MsLangId::isRightToLeftMath( aLang );
3135             else
3136                 bRTL = MsLangId::isRightToLeft( aLang );
3137         }
3138         else
3139             bRTL = (nUIMirroring == 1);
3140 
3141         return bRTL;
3142     }
3143 }
3144 
GetLayoutRTL()3145 bool AllSettings::GetLayoutRTL()
3146 {
3147     if (comphelper::IsFuzzing())
3148         return false;
3149     return GetConfigLayoutRTL(false);
3150 }
3151 
GetMathLayoutRTL()3152 bool AllSettings::GetMathLayoutRTL()
3153 {
3154     if (comphelper::IsFuzzing())
3155         return false;
3156     return GetConfigLayoutRTL(true);
3157 }
3158 
GetLanguageTag() const3159 const LanguageTag& AllSettings::GetLanguageTag() const
3160 {
3161     if (comphelper::IsFuzzing())
3162     {
3163         static LanguageTag aRet(u"en-US"_ustr);
3164         return aRet;
3165     }
3166 
3167     if (comphelper::LibreOfficeKit::isActive())
3168         return comphelper::LibreOfficeKit::getLanguageTag();
3169 
3170     // SYSTEM locale means: use settings from SvtSysLocale that is resolved
3171     if ( mxData->maLocale.isSystemLocale() )
3172         mxData->maLocale = mxData->maSysLocale.GetLanguageTag();
3173 
3174     return mxData->maLocale;
3175 }
3176 
GetUILanguageTag() const3177 const LanguageTag& AllSettings::GetUILanguageTag() const
3178 {
3179     if (comphelper::IsFuzzing())
3180     {
3181         static LanguageTag aRet(u"en-US"_ustr);
3182         return aRet;
3183     }
3184 
3185     if (comphelper::LibreOfficeKit::isActive())
3186         return comphelper::LibreOfficeKit::getLanguageTag();
3187 
3188     // the UILocale is never changed
3189     if ( mxData->maUILocale.isSystemLocale() )
3190         mxData->maUILocale = mxData->maSysLocale.GetUILanguageTag();
3191 
3192     return mxData->maUILocale;
3193 }
3194 
GetLocaleDataWrapper() const3195 const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const
3196 {
3197     if ( !mxData->mpLocaleDataWrapper )
3198         const_cast<AllSettings*>(this)->mxData->mpLocaleDataWrapper.reset( new LocaleDataWrapper(
3199             comphelper::getProcessComponentContext(), GetLanguageTag() ) );
3200     return *mxData->mpLocaleDataWrapper;
3201 }
3202 
GetUILocaleDataWrapper() const3203 const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const
3204 {
3205     if ( !mxData->mpUILocaleDataWrapper )
3206         const_cast<AllSettings*>(this)->mxData->mpUILocaleDataWrapper.reset( new LocaleDataWrapper(
3207             comphelper::getProcessComponentContext(), GetUILanguageTag() ) );
3208     return *mxData->mpUILocaleDataWrapper;
3209 }
3210 
GetNeutralLocaleDataWrapper() const3211 const LocaleDataWrapper& AllSettings::GetNeutralLocaleDataWrapper() const
3212 {
3213     if ( !mxData->mpNeutralLocaleDataWrapper )
3214         const_cast<AllSettings*>(this)->mxData->mpNeutralLocaleDataWrapper.reset( new LocaleDataWrapper(
3215             comphelper::getProcessComponentContext(), LanguageTag(u"en-US"_ustr) ) );
3216     return *mxData->mpNeutralLocaleDataWrapper;
3217 }
3218 
GetLocaleI18nHelper() const3219 const vcl::I18nHelper& AllSettings::GetLocaleI18nHelper() const
3220 {
3221     if ( !mxData->mpI18nHelper ) {
3222         const_cast<AllSettings*>(this)->mxData->mpI18nHelper.reset( new vcl::I18nHelper(
3223             comphelper::getProcessComponentContext(), GetLanguageTag() ) );
3224     }
3225     return *mxData->mpI18nHelper;
3226 }
3227 
GetUILocaleI18nHelper() const3228 const vcl::I18nHelper& AllSettings::GetUILocaleI18nHelper() const
3229 {
3230     if ( !mxData->mpUII18nHelper ) {
3231         const_cast<AllSettings*>(this)->mxData->mpUII18nHelper.reset( new vcl::I18nHelper(
3232             comphelper::getProcessComponentContext(), GetUILanguageTag() ) );
3233     }
3234     return *mxData->mpUII18nHelper;
3235 }
3236 
LocaleSettingsChanged(ConfigurationHints nHint)3237 void AllSettings::LocaleSettingsChanged( ConfigurationHints nHint )
3238 {
3239     AllSettings aAllSettings( Application::GetSettings() );
3240     if ( nHint & ConfigurationHints::DecSep )
3241     {
3242         MiscSettings aMiscSettings = aAllSettings.GetMiscSettings();
3243         bool bIsDecSepAsLocale = aAllSettings.mxData->maSysLocale.GetOptions().IsDecimalSeparatorAsLocale();
3244         if ( aMiscSettings.GetEnableLocalizedDecimalSep() != bIsDecSepAsLocale )
3245         {
3246             aMiscSettings.SetEnableLocalizedDecimalSep( bIsDecSepAsLocale );
3247             aAllSettings.SetMiscSettings( aMiscSettings );
3248         }
3249     }
3250 
3251     if ( nHint & ConfigurationHints::Locale )
3252         aAllSettings.SetLanguageTag( aAllSettings.mxData->maSysLocale.GetOptions().GetLanguageTag() );
3253 
3254     Application::SetSettings( aAllSettings );
3255 }
3256 
3257 const StyleSettings&
GetStyleSettings() const3258 AllSettings::GetStyleSettings() const
3259 {
3260     return mxData->maStyleSettings;
3261 }
3262 
3263 StyleSettingsOptions
GetOptions() const3264 StyleSettings::GetOptions() const
3265 {
3266     return mxData->mnOptions;
3267 }
3268 
3269 std::vector<vcl::IconThemeInfo> const &
GetInstalledIconThemes() const3270 StyleSettings::GetInstalledIconThemes() const
3271 {
3272     if (!mxData->mIconThemeScanner) {
3273         const_cast<StyleSettings*>(this)->mxData->mIconThemeScanner = vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath());
3274     }
3275     return mxData->mIconThemeScanner->GetFoundIconThemes();
3276 }
3277 
3278 /*static*/ OUString
GetAutomaticallyChosenIconTheme() const3279 StyleSettings::GetAutomaticallyChosenIconTheme() const
3280 {
3281     OUString desktopEnvironment = Application::GetDesktopEnvironment();
3282     if (!mxData->mIconThemeScanner) {
3283         const_cast<StyleSettings*>(this)->mxData->mIconThemeScanner = vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath());
3284     }
3285     OUString themeName = mxData->mIconThemeSelector->SelectIconThemeForDesktopEnvironment(
3286             mxData->mIconThemeScanner->GetFoundIconThemes(),
3287             desktopEnvironment
3288             );
3289     return themeName;
3290 }
3291 
3292 void
SetIconTheme(const OUString & theme)3293 StyleSettings::SetIconTheme(const OUString& theme)
3294 {
3295     CopyData();
3296     mxData->mIconTheme = theme;
3297 }
3298 
3299 OUString
DetermineIconTheme() const3300 StyleSettings::DetermineIconTheme() const
3301 {
3302     OUString sTheme(mxData->mIconTheme);
3303     if (sTheme.isEmpty())
3304     {
3305         if (comphelper::IsFuzzing())
3306             sTheme = "colibre";
3307         else
3308         {
3309             // read from the configuration, or fallback to what the desktop wants
3310             sTheme = officecfg::Office::Common::Misc::SymbolStyle::get();
3311 
3312             if (sTheme.isEmpty() || sTheme == "auto")
3313                 sTheme = GetAutomaticallyChosenIconTheme();
3314         }
3315     }
3316 
3317     if (!mxData->mIconThemeScanner) {
3318         const_cast<StyleSettings*>(this)->mxData->mIconThemeScanner = vcl::IconThemeScanner::Create(vcl::IconThemeScanner::GetStandardIconThemePath());
3319     }
3320     OUString r = mxData->mIconThemeSelector->SelectIconTheme(
3321                         mxData->mIconThemeScanner->GetFoundIconThemes(),
3322                         sTheme);
3323     return r;
3324 }
3325 
3326 void
SetHighContrastMode(bool bHighContrast)3327 StyleSettings::SetHighContrastMode(bool bHighContrast )
3328 {
3329     if (mxData->mbHighContrast == bHighContrast) {
3330         return;
3331     }
3332 
3333     CopyData();
3334     mxData->mbHighContrast = bHighContrast;
3335     mxData->mIconThemeSelector->SetUseHighContrastTheme(bHighContrast);
3336 }
3337 
3338 bool
GetHighContrastMode() const3339 StyleSettings::GetHighContrastMode() const
3340 {
3341     return mxData->mbHighContrast;
3342 }
3343 
3344 void
SetPreferredIconTheme(const OUString & theme,bool bDarkIconTheme)3345 StyleSettings::SetPreferredIconTheme(const OUString& theme, bool bDarkIconTheme)
3346 {
3347     const bool bChanged = mxData->mIconThemeSelector->SetPreferredIconTheme(theme, bDarkIconTheme);
3348     if (bChanged)
3349     {
3350         // clear this so it is recalculated if it was selected as the automatic theme
3351         mxData->mIconTheme.clear();
3352     }
3353 }
3354 
3355 void
SetMouseSettings(const MouseSettings & rSet)3356 AllSettings::SetMouseSettings( const MouseSettings& rSet )
3357 {
3358     CopyData();
3359     mxData->maMouseSettings = rSet;
3360 }
3361 
3362 const MouseSettings&
GetMouseSettings() const3363 AllSettings::GetMouseSettings() const
3364 {
3365     return mxData->maMouseSettings;
3366 }
3367 
3368 void
SetStyleSettings(const StyleSettings & rSet)3369 AllSettings::SetStyleSettings( const StyleSettings& rSet )
3370 {
3371     CopyData();
3372     mxData->maStyleSettings = rSet;
3373 }
3374 
3375 void
SetMiscSettings(const MiscSettings & rSet)3376 AllSettings::SetMiscSettings( const MiscSettings& rSet )
3377 {
3378     CopyData();
3379     mxData->maMiscSettings = rSet;
3380 }
3381 
3382 const MiscSettings&
GetMiscSettings() const3383 AllSettings::GetMiscSettings() const
3384 {
3385     return mxData->maMiscSettings;
3386 }
3387 
3388 void
SetHelpSettings(const HelpSettings & rSet)3389 AllSettings::SetHelpSettings( const HelpSettings& rSet )
3390 {
3391     CopyData();
3392     mxData->maHelpSettings = rSet;
3393 }
3394 
3395 const HelpSettings&
GetHelpSettings() const3396 AllSettings::GetHelpSettings() const
3397 {
3398     return mxData->maHelpSettings;
3399 }
3400 
3401 bool
operator !=(const AllSettings & rSet) const3402 AllSettings::operator !=( const AllSettings& rSet ) const
3403 {
3404     return !(*this == rSet);
3405 }
3406 
3407 SvtSysLocale&
GetSysLocale()3408 AllSettings::GetSysLocale()
3409 {
3410     return mxData->maSysLocale;
3411 }
3412 
3413 
BatchSetBackgrounds(const Color & aBackColor,bool bCheckedColorSpecialCase)3414 void StyleSettings::BatchSetBackgrounds( const Color &aBackColor,
3415                                          bool bCheckedColorSpecialCase )
3416 {
3417     Set3DColors( aBackColor );
3418     SetFaceColor( aBackColor );
3419     SetDialogColor( aBackColor );
3420     SetWorkspaceColor( aBackColor );
3421 
3422     if (bCheckedColorSpecialCase)
3423         SetCheckedColorSpecialCase();
3424 }
3425 
BatchSetFonts(const vcl::Font & aAppFont,const vcl::Font & aLabelFont)3426 void StyleSettings::BatchSetFonts( const vcl::Font& aAppFont,
3427                                    const vcl::Font& aLabelFont )
3428 {
3429     SetAppFont( aAppFont );
3430     SetPushButtonFont( aAppFont );
3431     SetToolFont( aAppFont );
3432     SetHelpFont( aAppFont );
3433 
3434     SetMenuFont( aLabelFont );
3435     SetTabFont( aLabelFont );
3436     SetLabelFont( aLabelFont );
3437     SetRadioCheckFont( aLabelFont );
3438     SetFieldFont( aLabelFont );
3439     SetGroupFont( aLabelFont );
3440     SetIconFont( aLabelFont );
3441 }
3442 
3443 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
3444