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