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