xref: /trunk/main/vcl/source/app/settings.cxx (revision 07f7d82b)
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     const ::rtl::OUString&      rDesktopEnvironment = Application::GetDesktopEnvironment();
782     sal_uLong                       nRet = STYLE_SYMBOLS_DEFAULT;
783     bool                        bCont = true;
784 
785     try
786     {
787         const ::com::sun::star::uno::Any aAny( ::utl::ConfigManager::GetDirectConfigProperty( ::utl::ConfigManager::OPENSOURCECONTEXT ) );
788         sal_Int32 nValue( 0 );
789 
790         aAny >>= nValue;
791 
792         if( 0 == nValue )
793             bCont = false;
794     }
795     catch ( ::com::sun::star::uno::Exception& )
796     {
797     }
798 
799     if( bCont )
800     {
801         if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "gnome" ) )
802             nRet = STYLE_SYMBOLS_TANGO;
803     }
804 
805     // falback to any existing style
806     if ( ! CheckSymbolStyle (nRet) )
807     {
808         for ( sal_uLong n = 0 ; n <= STYLE_SYMBOLS_THEMES_MAX  ; n++ )
809         {
810             sal_uLong nStyleToCheck = n;
811 
812             // auto is not a real theme => can't be fallback
813             if ( nStyleToCheck == STYLE_SYMBOLS_AUTO )
814                 continue;
815 
816             // will check hicontrast in the end
817             if ( nStyleToCheck == STYLE_SYMBOLS_HICONTRAST )
818                 continue;
819             if ( nStyleToCheck == STYLE_SYMBOLS_THEMES_MAX )
820                 nStyleToCheck = STYLE_SYMBOLS_HICONTRAST;
821 
822             if ( CheckSymbolStyle ( nStyleToCheck ) )
823             {
824                 nRet = nStyleToCheck;
825                 n = STYLE_SYMBOLS_THEMES_MAX;
826             }
827         }
828     }
829 
830     return nRet;
831 }
832 
833 // -----------------------------------------------------------------------
834 
835 bool StyleSettings::CheckSymbolStyle( sal_uLong nStyle ) const
836 {
837     static ImplImageTreeSingletonRef aImageTree;
838     return aImageTree->checkStyle( ImplSymbolsStyleToName( nStyle ) );
839 }
840 
841 // -----------------------------------------------------------------------
842 
843 void StyleSettings::SetStandardStyles()
844 {
845     CopyData();
846     mpData->SetStandardStyles();
847 }
848 
849 // -----------------------------------------------------------------------
850 
851 Color StyleSettings::GetFaceGradientColor() const
852 {
853     // compute a brighter face color that can be used in gradients
854     // for a convex look (eg toolbars)
855 
856     sal_uInt16 h, s, b;
857     GetFaceColor().RGBtoHSB( h, s, b );
858     if( s > 1) s=1;
859     if( b < 98) b=98;
860     return Color( Color::HSBtoRGB( h, s, b ) );
861 }
862 
863 // -----------------------------------------------------------------------
864 
865 Color StyleSettings::GetSeparatorColor() const
866 {
867     // compute a brighter shadow color for separators (used in toolbars or between menubar and toolbars on Windows XP)
868     sal_uInt16 h, s, b;
869     GetShadowColor().RGBtoHSB( h, s, b );
870     b += b/4;
871     s -= s/4;
872     return Color( Color::HSBtoRGB( h, s, b ) );
873 }
874 
875 // -----------------------------------------------------------------------
876 
877 const StyleSettings& StyleSettings::operator =( const StyleSettings& rSet )
878 {
879     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" );
880 
881     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
882     rSet.mpData->mnRefCount++;
883 
884     // Daten loeschen, wenn letzte Referenz
885     if ( mpData->mnRefCount == 1 )
886         delete mpData;
887     else
888         mpData->mnRefCount--;
889 
890     mpData = rSet.mpData;
891 
892     return *this;
893 }
894 
895 // -----------------------------------------------------------------------
896 
897 void StyleSettings::CopyData()
898 {
899     // Falls noch andere Referenzen bestehen, dann kopieren
900     if ( mpData->mnRefCount != 1 )
901     {
902         mpData->mnRefCount--;
903         mpData = new ImplStyleData( *mpData );
904     }
905 }
906 
907 // -----------------------------------------------------------------------
908 
909 inline sal_Bool ImplIsBackOrWhite( const Color& rColor )
910 {
911     sal_uInt8 nLuminance = rColor.GetLuminance();
912     return ( nLuminance < 8 ) || ( nLuminance > 250 );
913 }
914 
915 sal_Bool StyleSettings::IsHighContrastBlackAndWhite() const
916 {
917     sal_Bool bBWOnly = sal_True;
918 
919     // Only use B&W if fully B&W, like on GNOME.
920     // Some colors like CheckedColor and HighlightColor are not B&W in Windows Standard HC Black,
921     // and we don't want to be B&W then, so check these color first, very probably not B&W.
922 
923     // Unfortunately, GNOME uses a very very dark color (0x000033) instead of BLACK (0x000000)
924 
925     if ( !ImplIsBackOrWhite( GetFaceColor() ) )
926         bBWOnly = sal_False;
927     else if ( !ImplIsBackOrWhite( GetHighlightTextColor() ) )
928         bBWOnly = sal_False;
929     else if ( !ImplIsBackOrWhite( GetWindowColor() ) )
930         bBWOnly = sal_False;
931     else if ( !ImplIsBackOrWhite( GetWindowTextColor() ) )
932         bBWOnly = sal_False;
933     else if ( !ImplIsBackOrWhite( GetButtonTextColor() ) )
934         bBWOnly = sal_False;
935     else if ( !ImplIsBackOrWhite( GetButtonTextColor() ) )
936         bBWOnly = sal_False;
937     else if ( !ImplIsBackOrWhite( GetGroupTextColor() ) )
938         bBWOnly = sal_False;
939     else if ( !ImplIsBackOrWhite( GetLabelTextColor() ) )
940         bBWOnly = sal_False;
941     else if ( !ImplIsBackOrWhite( GetDialogColor() ) )
942         bBWOnly = sal_False;
943     else if ( !ImplIsBackOrWhite( GetFieldColor() ) )
944         bBWOnly = sal_False;
945     else if ( !ImplIsBackOrWhite( GetMenuColor() ) )
946         bBWOnly = sal_False;
947     else if ( !ImplIsBackOrWhite( GetMenuBarColor() ) )
948         bBWOnly = sal_False;
949     else if ( !ImplIsBackOrWhite( GetMenuHighlightColor() ) )
950         bBWOnly = sal_False;
951 
952     return bBWOnly;
953 }
954 
955 // -----------------------------------------------------------------------
956 
957 sal_Bool StyleSettings::operator ==( const StyleSettings& rSet ) const
958 {
959     if ( mpData == rSet.mpData )
960         return sal_True;
961 
962     if ( (mpData->mnOptions                 == rSet.mpData->mnOptions)                  &&
963          (mpData->mnAutoMnemonic			== rSet.mpData->mnAutoMnemonic)				&&
964          (mpData->mnLogoDisplayTime         == rSet.mpData->mnLogoDisplayTime)          &&
965          (mpData->mnDragFullOptions         == rSet.mpData->mnDragFullOptions)          &&
966          (mpData->mnAnimationOptions        == rSet.mpData->mnAnimationOptions)         &&
967          (mpData->mnSelectionOptions        == rSet.mpData->mnSelectionOptions)         &&
968          (mpData->mnDisplayOptions          == rSet.mpData->mnDisplayOptions)           &&
969          (mpData->mnCursorSize              == rSet.mpData->mnCursorSize)               &&
970          (mpData->mnCursorBlinkTime         == rSet.mpData->mnCursorBlinkTime)          &&
971          (mpData->mnBorderSize              == rSet.mpData->mnBorderSize)               &&
972          (mpData->mnTitleHeight             == rSet.mpData->mnTitleHeight)              &&
973          (mpData->mnFloatTitleHeight        == rSet.mpData->mnFloatTitleHeight)         &&
974          (mpData->mnTearOffTitleHeight      == rSet.mpData->mnTearOffTitleHeight)       &&
975          (mpData->mnMenuBarHeight           == rSet.mpData->mnMenuBarHeight)            &&
976          (mpData->mnScrollBarSize           == rSet.mpData->mnScrollBarSize)            &&
977          (mpData->mnMinThumbSize            == rSet.mpData->mnMinThumbSize)             &&
978          (mpData->mnSplitSize               == rSet.mpData->mnSplitSize)                &&
979          (mpData->mnSpinSize                == rSet.mpData->mnSpinSize)                 &&
980          (mpData->mnIconHorzSpace           == rSet.mpData->mnIconHorzSpace)            &&
981          (mpData->mnIconVertSpace           == rSet.mpData->mnIconVertSpace)            &&
982          (mpData->mnAntialiasedMin          == rSet.mpData->mnAntialiasedMin)           &&
983          (mpData->mnScreenZoom              == rSet.mpData->mnScreenZoom)               &&
984          (mpData->mnScreenFontZoom          == rSet.mpData->mnScreenFontZoom)           &&
985          (mpData->mnHighContrast			== rSet.mpData->mnHighContrast)             &&
986          (mpData->mnUseSystemUIFonts		== rSet.mpData->mnUseSystemUIFonts)         &&
987          (mpData->mnUseFlatBorders   		== rSet.mpData->mnUseFlatBorders)           &&
988          (mpData->mnUseFlatMenues   		== rSet.mpData->mnUseFlatMenues)            &&
989          (mpData->mnSymbolsStyle       		== rSet.mpData->mnSymbolsStyle)             &&
990          (mpData->mnPreferredSymbolsStyle   == rSet.mpData->mnPreferredSymbolsStyle)    &&
991          (mpData->maFaceColor               == rSet.mpData->maFaceColor)                &&
992          (mpData->maCheckedColor            == rSet.mpData->maCheckedColor)             &&
993          (mpData->maLightColor              == rSet.mpData->maLightColor)               &&
994          (mpData->maLightBorderColor        == rSet.mpData->maLightBorderColor)         &&
995          (mpData->maShadowColor             == rSet.mpData->maShadowColor)              &&
996          (mpData->maDarkShadowColor         == rSet.mpData->maDarkShadowColor)          &&
997          (mpData->maButtonTextColor         == rSet.mpData->maButtonTextColor)          &&
998          (mpData->maRadioCheckTextColor     == rSet.mpData->maRadioCheckTextColor)      &&
999          (mpData->maGroupTextColor          == rSet.mpData->maGroupTextColor)           &&
1000          (mpData->maLabelTextColor          == rSet.mpData->maLabelTextColor)           &&
1001          (mpData->maInfoTextColor           == rSet.mpData->maInfoTextColor)            &&
1002          (mpData->maWindowColor             == rSet.mpData->maWindowColor)              &&
1003          (mpData->maWindowTextColor         == rSet.mpData->maWindowTextColor)          &&
1004          (mpData->maDialogColor             == rSet.mpData->maDialogColor)              &&
1005          (mpData->maDialogTextColor         == rSet.mpData->maDialogTextColor)          &&
1006          (mpData->maWorkspaceColor          == rSet.mpData->maWorkspaceColor)           &&
1007          (mpData->maMonoColor               == rSet.mpData->maMonoColor)                &&
1008          (mpData->maFieldColor              == rSet.mpData->maFieldColor)               &&
1009          (mpData->maFieldTextColor          == rSet.mpData->maFieldTextColor)           &&
1010          (mpData->maActiveColor             == rSet.mpData->maActiveColor)              &&
1011          (mpData->maActiveColor2            == rSet.mpData->maActiveColor2)             &&
1012          (mpData->maActiveTextColor         == rSet.mpData->maActiveTextColor)          &&
1013          (mpData->maActiveBorderColor       == rSet.mpData->maActiveBorderColor)        &&
1014          (mpData->maDeactiveColor           == rSet.mpData->maDeactiveColor)            &&
1015          (mpData->maDeactiveColor2          == rSet.mpData->maDeactiveColor2)           &&
1016          (mpData->maDeactiveTextColor       == rSet.mpData->maDeactiveTextColor)        &&
1017          (mpData->maDeactiveBorderColor     == rSet.mpData->maDeactiveBorderColor)      &&
1018          (mpData->maMenuColor               == rSet.mpData->maMenuColor)                &&
1019          (mpData->maMenuBarColor            == rSet.mpData->maMenuBarColor)             &&
1020          (mpData->maMenuBorderColor         == rSet.mpData->maMenuBorderColor)          &&
1021          (mpData->maMenuTextColor           == rSet.mpData->maMenuTextColor)            &&
1022          (mpData->maMenuBarTextColor        == rSet.mpData->maMenuBarTextColor)         &&
1023          (mpData->maMenuHighlightColor      == rSet.mpData->maMenuHighlightColor)       &&
1024          (mpData->maMenuHighlightTextColor  == rSet.mpData->maMenuHighlightTextColor)   &&
1025          (mpData->maHighlightColor          == rSet.mpData->maHighlightColor)           &&
1026          (mpData->maHighlightTextColor      == rSet.mpData->maHighlightTextColor)       &&
1027          (mpData->maActiveTabColor          == rSet.mpData->maActiveTabColor)           &&
1028          (mpData->maInactiveTabColor        == rSet.mpData->maInactiveTabColor)         &&
1029          (mpData->maDisableColor            == rSet.mpData->maDisableColor)             &&
1030          (mpData->maHelpColor               == rSet.mpData->maHelpColor)                &&
1031          (mpData->maHelpTextColor           == rSet.mpData->maHelpTextColor)            &&
1032          (mpData->maLinkColor               == rSet.mpData->maLinkColor)                &&
1033          (mpData->maVisitedLinkColor        == rSet.mpData->maVisitedLinkColor)         &&
1034          (mpData->maHighlightLinkColor      == rSet.mpData->maHighlightLinkColor)       &&
1035          (mpData->maAppFont                 == rSet.mpData->maAppFont)                  &&
1036          (mpData->maHelpFont                == rSet.mpData->maHelpFont)                 &&
1037          (mpData->maTitleFont               == rSet.mpData->maTitleFont)                &&
1038          (mpData->maFloatTitleFont          == rSet.mpData->maFloatTitleFont)           &&
1039          (mpData->maMenuFont                == rSet.mpData->maMenuFont)                 &&
1040          (mpData->maToolFont                == rSet.mpData->maToolFont)                 &&
1041          (mpData->maGroupFont               == rSet.mpData->maGroupFont)                &&
1042          (mpData->maLabelFont               == rSet.mpData->maLabelFont)                &&
1043          (mpData->maInfoFont                == rSet.mpData->maInfoFont)                 &&
1044          (mpData->maRadioCheckFont          == rSet.mpData->maRadioCheckFont)           &&
1045          (mpData->maPushButtonFont          == rSet.mpData->maPushButtonFont)           &&
1046          (mpData->maFieldFont               == rSet.mpData->maFieldFont)                &&
1047          (mpData->maIconFont                == rSet.mpData->maIconFont)					&&
1048          (mpData->mnUseImagesInMenus		== rSet.mpData->mnUseImagesInMenus)			&&
1049          (mpData->mnSkipDisabledInMenus		== rSet.mpData->mnSkipDisabledInMenus)		&&
1050 		 (mpData->maFontColor				== rSet.mpData->maFontColor ))
1051         return sal_True;
1052     else
1053         return sal_False;
1054 }
1055 
1056 // =======================================================================
1057 
1058 ImplMiscData::ImplMiscData()
1059 {
1060     mnRefCount                  = 1;
1061     mnEnableATT					= sal::static_int_cast<sal_uInt16>(~0U);
1062     mnDisablePrinting			= sal::static_int_cast<sal_uInt16>(~0U);
1063     static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI
1064     mbEnableLocalizedDecimalSep = (pEnv != NULL) ? sal_True : sal_False;
1065 }
1066 
1067 // -----------------------------------------------------------------------
1068 
1069 ImplMiscData::ImplMiscData( const ImplMiscData& rData )
1070 {
1071     mnRefCount                  = 1;
1072     mnEnableATT					= rData.mnEnableATT;
1073     mnDisablePrinting			= rData.mnDisablePrinting;
1074     mbEnableLocalizedDecimalSep = rData.mbEnableLocalizedDecimalSep;
1075 }
1076 
1077 // -----------------------------------------------------------------------
1078 
1079 MiscSettings::MiscSettings()
1080 {
1081     mpData = new ImplMiscData();
1082 }
1083 
1084 // -----------------------------------------------------------------------
1085 
1086 MiscSettings::MiscSettings( const MiscSettings& rSet )
1087 {
1088     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" );
1089 
1090     // shared Instance Daten uebernehmen und Referenzcounter erhoehen
1091     mpData = rSet.mpData;
1092     mpData->mnRefCount++;
1093 }
1094 
1095 // -----------------------------------------------------------------------
1096 
1097 MiscSettings::~MiscSettings()
1098 {
1099     // Daten loeschen, wenn letzte Referenz
1100     if ( mpData->mnRefCount == 1 )
1101         delete mpData;
1102     else
1103         mpData->mnRefCount--;
1104 }
1105 
1106 // -----------------------------------------------------------------------
1107 
1108 const MiscSettings& MiscSettings::operator =( const MiscSettings& rSet )
1109 {
1110     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" );
1111 
1112     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
1113     rSet.mpData->mnRefCount++;
1114 
1115     // Daten loeschen, wenn letzte Referenz
1116     if ( mpData->mnRefCount == 1 )
1117         delete mpData;
1118     else
1119         mpData->mnRefCount--;
1120 
1121     mpData = rSet.mpData;
1122 
1123     return *this;
1124 }
1125 
1126 // -----------------------------------------------------------------------
1127 
1128 void MiscSettings::CopyData()
1129 {
1130     // Falls noch andere Referenzen bestehen, dann kopieren
1131     if ( mpData->mnRefCount != 1 )
1132     {
1133         mpData->mnRefCount--;
1134         mpData = new ImplMiscData( *mpData );
1135     }
1136 }
1137 
1138 // -----------------------------------------------------------------------
1139 
1140 sal_Bool MiscSettings::operator ==( const MiscSettings& rSet ) const
1141 {
1142     if ( mpData == rSet.mpData )
1143         return sal_True;
1144 
1145     if ( (mpData->mnEnableATT			== rSet.mpData->mnEnableATT ) &&
1146          (mpData->mnDisablePrinting		== rSet.mpData->mnDisablePrinting ) &&
1147          (mpData->mbEnableLocalizedDecimalSep == rSet.mpData->mbEnableLocalizedDecimalSep ) )
1148         return sal_True;
1149     else
1150         return sal_False;
1151 }
1152 
1153 // -----------------------------------------------------------------------
1154 
1155 sal_Bool MiscSettings::GetDisablePrinting() const
1156 {
1157     if( mpData->mnDisablePrinting == (sal_uInt16)~0 )
1158     {
1159         rtl::OUString aEnable =
1160             vcl::SettingsConfigItem::get()->
1161             getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DesktopManagement" ) ),
1162                       rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisablePrinting" ) ) );
1163         mpData->mnDisablePrinting = aEnable.equalsIgnoreAsciiCaseAscii( "true" ) ? 1 : 0;
1164     }
1165 
1166     return (sal_Bool)mpData->mnDisablePrinting;
1167 }
1168 // -----------------------------------------------------------------------
1169 
1170 sal_Bool MiscSettings::GetEnableATToolSupport() const
1171 {
1172 
1173 #ifdef WNT
1174     if( mpData->mnEnableATT == (sal_uInt16)~0 )
1175     {
1176         // Check in the Windows registry if an AT tool wants Accessibility support to
1177         // be activated ..
1178         HKEY hkey;
1179 
1180         if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER,
1181             "Software\\OpenOffice.org\\Accessibility\\AtToolSupport",
1182             &hkey) )
1183         {
1184             DWORD dwType;
1185             sal_uInt8 Data[6]; // possible values: "true", "false", "1", "0", DWORD
1186             DWORD cbData = sizeof(Data);
1187 
1188             if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology",
1189                 NULL, &dwType, Data, &cbData) )
1190             {
1191                 switch (dwType)
1192                 {
1193                     case REG_SZ:
1194                         mpData->mnEnableATT = ((0 == stricmp((const char *) Data, "1")) || (0 == stricmp((const char *) Data, "true")));
1195                         break;
1196                     case REG_DWORD:
1197                         mpData->mnEnableATT = (sal_uInt16) (((DWORD *) Data)[0]);
1198                         break;
1199                     default:
1200                         // Unsupported registry type
1201                         break;
1202                 }
1203             }
1204 
1205             RegCloseKey(hkey);
1206         }
1207     }
1208 #endif
1209 
1210 	if( mpData->mnEnableATT == (sal_uInt16)~0 )
1211     {
1212         static const char* pEnv = getenv("SAL_ACCESSIBILITY_ENABLED" );
1213         if( !pEnv || !*pEnv )
1214         {
1215             rtl::OUString aEnable =
1216                 vcl::SettingsConfigItem::get()->
1217                 getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Accessibility" ) ),
1218                           rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EnableATToolSupport" ) ) );
1219             mpData->mnEnableATT = aEnable.equalsIgnoreAsciiCaseAscii( "true" ) ? 1 : 0;
1220         }
1221         else
1222         {
1223             mpData->mnEnableATT = 1;
1224         }
1225     }
1226 
1227     return (sal_Bool)mpData->mnEnableATT;
1228 }
1229 
1230 // -----------------------------------------------------------------------
1231 
1232 void MiscSettings::SetDisablePrinting( sal_Bool bEnable )
1233 {
1234     if ( bEnable != mpData->mnDisablePrinting )
1235     {
1236         vcl::SettingsConfigItem::get()->
1237             setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DesktopManagement" ) ),
1238                       rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DisablePrinting" ) ),
1239                       rtl::OUString::createFromAscii( bEnable ? "true" : "false" ) );
1240         mpData->mnDisablePrinting = bEnable ? 1 : 0;
1241     }
1242 }
1243 
1244 // -----------------------------------------------------------------------
1245 
1246 void MiscSettings::SetEnableATToolSupport( sal_Bool bEnable )
1247 {
1248     if ( bEnable != mpData->mnEnableATT )
1249     {
1250         sal_Bool bDummy;
1251         if( bEnable && !ImplInitAccessBridge(false, bDummy) )
1252             return;
1253 
1254 #ifdef WNT
1255 		HKEY hkey;
1256 
1257         // If the accessibility key in the Windows registry exists, change it synchronously
1258 		if( ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER,
1259 			"Software\\OpenOffice.org\\Accessibility\\AtToolSupport",
1260 			&hkey) )
1261 		{
1262 			DWORD dwType;
1263 			sal_uInt8 Data[6]; // possible values: "true", "false", 1, 0
1264 			DWORD cbData = sizeof(Data);
1265 
1266 			if( ERROR_SUCCESS == RegQueryValueEx(hkey, "SupportAssistiveTechnology",
1267 				NULL,	&dwType, Data, &cbData) )
1268 			{
1269 				switch (dwType)
1270 				{
1271 					case REG_SZ:
1272 						RegSetValueEx(hkey, "SupportAssistiveTechnology",
1273 							NULL, dwType,
1274 							bEnable ? (sal_uInt8 *) "true" : (sal_uInt8 *) "false",
1275 							bEnable ? sizeof("true") : sizeof("false"));
1276 						break;
1277 					case REG_DWORD:
1278 						((DWORD *) Data)[0] = bEnable ? 1 : 0;
1279 						RegSetValueEx(hkey, "SupportAssistiveTechnology",
1280 							NULL, dwType, Data,	sizeof(DWORD));
1281 						break;
1282 					default:
1283 						// Unsupported registry type
1284 						break;
1285 				}
1286 			}
1287 
1288 			RegCloseKey(hkey);
1289         }
1290 
1291 #endif
1292         vcl::SettingsConfigItem::get()->
1293             setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Accessibility" ) ),
1294                       rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EnableATToolSupport" ) ),
1295                       rtl::OUString::createFromAscii( bEnable ? "true" : "false" ) );
1296         mpData->mnEnableATT = bEnable ? 1 : 0;
1297     }
1298 }
1299 
1300 void MiscSettings::SetEnableLocalizedDecimalSep( sal_Bool bEnable )
1301 {
1302     CopyData();
1303     mpData->mbEnableLocalizedDecimalSep = bEnable;
1304 }
1305 
1306 sal_Bool MiscSettings::GetEnableLocalizedDecimalSep() const
1307 {
1308     return mpData->mbEnableLocalizedDecimalSep;
1309 }
1310 
1311 // =======================================================================
1312 
1313 ImplNotificationData::ImplNotificationData()
1314 {
1315     mnRefCount                  = 1;
1316     mnOptions                   = 0;
1317 }
1318 
1319 // -----------------------------------------------------------------------
1320 
1321 ImplNotificationData::ImplNotificationData( const ImplNotificationData& rData )
1322 {
1323     mnRefCount                  = 1;
1324     mnOptions                   = rData.mnOptions;
1325 }
1326 
1327 // -----------------------------------------------------------------------
1328 
1329 NotificationSettings::NotificationSettings()
1330 {
1331     mpData = new ImplNotificationData();
1332 }
1333 
1334 // -----------------------------------------------------------------------
1335 
1336 NotificationSettings::NotificationSettings( const NotificationSettings& rSet )
1337 {
1338     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "NotificationSettings: RefCount overflow" );
1339 
1340     // shared Instance Daten uebernehmen und Referenzcounter erhoehen
1341     mpData = rSet.mpData;
1342     mpData->mnRefCount++;
1343 }
1344 
1345 // -----------------------------------------------------------------------
1346 
1347 NotificationSettings::~NotificationSettings()
1348 {
1349     // Daten loeschen, wenn letzte Referenz
1350     if ( mpData->mnRefCount == 1 )
1351         delete mpData;
1352     else
1353         mpData->mnRefCount--;
1354 }
1355 
1356 // -----------------------------------------------------------------------
1357 
1358 const NotificationSettings& NotificationSettings::operator =( const NotificationSettings& rSet )
1359 {
1360     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "NotificationSettings: RefCount overflow" );
1361 
1362     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
1363     rSet.mpData->mnRefCount++;
1364 
1365     // Daten loeschen, wenn letzte Referenz
1366     if ( mpData->mnRefCount == 1 )
1367         delete mpData;
1368     else
1369         mpData->mnRefCount--;
1370 
1371     mpData = rSet.mpData;
1372 
1373     return *this;
1374 }
1375 
1376 // -----------------------------------------------------------------------
1377 
1378 void NotificationSettings::CopyData()
1379 {
1380     // Falls noch andere Referenzen bestehen, dann kopieren
1381     if ( mpData->mnRefCount != 1 )
1382     {
1383         mpData->mnRefCount--;
1384         mpData = new ImplNotificationData( *mpData );
1385     }
1386 }
1387 
1388 // -----------------------------------------------------------------------
1389 
1390 sal_Bool NotificationSettings::operator ==( const NotificationSettings& rSet ) const
1391 {
1392     if ( mpData == rSet.mpData )
1393         return sal_True;
1394 
1395     if ( (mpData->mnOptions             == rSet.mpData->mnOptions) )
1396         return sal_True;
1397     else
1398         return sal_False;
1399 }
1400 
1401 // =======================================================================
1402 
1403 ImplHelpData::ImplHelpData()
1404 {
1405     mnRefCount                  = 1;
1406     mnOptions                   = 0;
1407     mnTipDelay                  = 500;
1408     mnTipTimeout                = 3000;
1409     mnBalloonDelay              = 1500;
1410 }
1411 
1412 // -----------------------------------------------------------------------
1413 
1414 ImplHelpData::ImplHelpData( const ImplHelpData& rData )
1415 {
1416     mnRefCount                  = 1;
1417     mnOptions                   = rData.mnOptions;
1418     mnTipDelay                  = rData.mnTipDelay;
1419     mnTipTimeout                = rData.mnTipTimeout;
1420     mnBalloonDelay              = rData.mnBalloonDelay;
1421 }
1422 
1423 // -----------------------------------------------------------------------
1424 
1425 HelpSettings::HelpSettings()
1426 {
1427     mpData = new ImplHelpData();
1428 }
1429 
1430 // -----------------------------------------------------------------------
1431 
1432 HelpSettings::HelpSettings( const HelpSettings& rSet )
1433 {
1434     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" );
1435 
1436     // shared Instance Daten uebernehmen und Referenzcounter erhoehen
1437     mpData = rSet.mpData;
1438     mpData->mnRefCount++;
1439 }
1440 
1441 // -----------------------------------------------------------------------
1442 
1443 HelpSettings::~HelpSettings()
1444 {
1445     // Daten loeschen, wenn letzte Referenz
1446     if ( mpData->mnRefCount == 1 )
1447         delete mpData;
1448     else
1449         mpData->mnRefCount--;
1450 }
1451 
1452 // -----------------------------------------------------------------------
1453 
1454 const HelpSettings& HelpSettings::operator =( const HelpSettings& rSet )
1455 {
1456     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" );
1457 
1458     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
1459     rSet.mpData->mnRefCount++;
1460 
1461     // Daten loeschen, wenn letzte Referenz
1462     if ( mpData->mnRefCount == 1 )
1463         delete mpData;
1464     else
1465         mpData->mnRefCount--;
1466 
1467     mpData = rSet.mpData;
1468 
1469     return *this;
1470 }
1471 
1472 // -----------------------------------------------------------------------
1473 
1474 void HelpSettings::CopyData()
1475 {
1476     // Falls noch andere Referenzen bestehen, dann kopieren
1477     if ( mpData->mnRefCount != 1 )
1478     {
1479         mpData->mnRefCount--;
1480         mpData = new ImplHelpData( *mpData );
1481     }
1482 }
1483 
1484 // -----------------------------------------------------------------------
1485 
1486 sal_Bool HelpSettings::operator ==( const HelpSettings& rSet ) const
1487 {
1488     if ( mpData == rSet.mpData )
1489         return sal_True;
1490 
1491     if ( (mpData->mnOptions         == rSet.mpData->mnOptions ) &&
1492          (mpData->mnTipDelay        == rSet.mpData->mnTipDelay ) &&
1493          (mpData->mnTipTimeout      == rSet.mpData->mnTipTimeout ) &&
1494          (mpData->mnBalloonDelay    == rSet.mpData->mnBalloonDelay ) )
1495         return sal_True;
1496     else
1497         return sal_False;
1498 }
1499 
1500 // =======================================================================
1501 
1502 ImplAllSettingsData::ImplAllSettingsData()
1503 {
1504     mnRefCount                  = 1;
1505     mnSystemUpdate              = SETTINGS_ALLSETTINGS;
1506     mnWindowUpdate              = SETTINGS_ALLSETTINGS;
1507     meLanguage                  = LANGUAGE_SYSTEM;
1508     meUILanguage                  = LANGUAGE_SYSTEM;
1509     mpLocaleDataWrapper         = NULL;
1510     mpUILocaleDataWrapper       = NULL;
1511     mpCollatorWrapper           = NULL;
1512     mpUICollatorWrapper         = NULL;
1513     mpI18nHelper                = NULL;
1514     mpUII18nHelper              = NULL;
1515 	maMiscSettings.SetEnableLocalizedDecimalSep( maSysLocale.GetOptions().IsDecimalSeparatorAsLocale() );
1516 }
1517 
1518 // -----------------------------------------------------------------------
1519 
1520 ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) :
1521     maMouseSettings( rData.maMouseSettings ),
1522     maKeyboardSettings( rData.maKeyboardSettings ),
1523     maStyleSettings( rData.maStyleSettings ),
1524     maMiscSettings( rData.maMiscSettings ),
1525     maNotificationSettings( rData.maNotificationSettings ),
1526     maHelpSettings( rData.maHelpSettings ),
1527     maLocale( rData.maLocale )
1528 {
1529     mnRefCount                  = 1;
1530     mnSystemUpdate              = rData.mnSystemUpdate;
1531     mnWindowUpdate              = rData.mnWindowUpdate;
1532     meLanguage                  = rData.meLanguage;
1533     // Pointer couldn't shared and objects haven't a copy ctor
1534     // So we create the cache objects new, if the GetFunction is
1535     // called
1536     mpLocaleDataWrapper         = NULL;
1537     mpUILocaleDataWrapper       = NULL;
1538     mpCollatorWrapper           = NULL;
1539     mpUICollatorWrapper         = NULL;
1540     mpI18nHelper                = NULL;
1541     mpUII18nHelper              = NULL;
1542 }
1543 
1544 // -----------------------------------------------------------------------
1545 
1546 ImplAllSettingsData::~ImplAllSettingsData()
1547 {
1548     if ( mpLocaleDataWrapper )
1549         delete mpLocaleDataWrapper;
1550     if ( mpUILocaleDataWrapper )
1551         delete mpUILocaleDataWrapper;
1552     if ( mpCollatorWrapper )
1553         delete mpCollatorWrapper;
1554     if ( mpUICollatorWrapper )
1555         delete mpUICollatorWrapper;
1556     if ( mpI18nHelper )
1557         delete mpI18nHelper;
1558     if ( mpUII18nHelper )
1559         delete mpUII18nHelper;
1560 }
1561 
1562 // -----------------------------------------------------------------------
1563 
1564 AllSettings::AllSettings()
1565 {
1566     DBG_CTOR( AllSettings, NULL );
1567 
1568     mpData = new ImplAllSettingsData();
1569 }
1570 
1571 // -----------------------------------------------------------------------
1572 
1573 AllSettings::AllSettings( const AllSettings& rSet )
1574 {
1575     DBG_CTOR( AllSettings, NULL );
1576     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "Settings: RefCount overflow" );
1577 
1578     // shared Instance Daten uebernehmen und Referenzcounter erhoehen
1579     mpData = rSet.mpData;
1580     mpData->mnRefCount++;
1581 }
1582 
1583 // -----------------------------------------------------------------------
1584 
1585 AllSettings::~AllSettings()
1586 {
1587     DBG_DTOR( AllSettings, NULL );
1588 
1589     // Daten loeschen, wenn letzte Referenz
1590     if ( mpData->mnRefCount == 1 )
1591         delete mpData;
1592     else
1593         mpData->mnRefCount--;
1594 }
1595 
1596 // -----------------------------------------------------------------------
1597 
1598 const AllSettings& AllSettings::operator =( const AllSettings& rSet )
1599 {
1600     DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "AllSettings: RefCount overflow" );
1601     DBG_CHKTHIS( AllSettings, NULL );
1602     DBG_CHKOBJ( &rSet, AllSettings, NULL );
1603 
1604     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
1605     rSet.mpData->mnRefCount++;
1606 
1607     // Daten loeschen, wenn letzte Referenz
1608     if ( mpData->mnRefCount == 1 )
1609         delete mpData;
1610     else
1611         mpData->mnRefCount--;
1612 
1613     mpData = rSet.mpData;
1614 
1615     return *this;
1616 }
1617 
1618 // -----------------------------------------------------------------------
1619 
1620 void AllSettings::CopyData()
1621 {
1622     DBG_CHKTHIS( AllSettings, NULL );
1623 
1624     // Falls noch andere Referenzen bestehen, dann kopieren
1625     if ( mpData->mnRefCount != 1 )
1626     {
1627         mpData->mnRefCount--;
1628         mpData = new ImplAllSettingsData( *mpData );
1629     }
1630 }
1631 
1632 // -----------------------------------------------------------------------
1633 
1634 sal_uLong AllSettings::Update( sal_uLong nFlags, const AllSettings& rSet )
1635 {
1636     DBG_CHKTHIS( AllSettings, NULL );
1637     DBG_CHKOBJ( &rSet, AllSettings, NULL );
1638 
1639     sal_uLong nChangeFlags = 0;
1640 
1641     if ( nFlags & SETTINGS_MACHINE )
1642     {
1643         if ( mpData->maMachineSettings != rSet.mpData->maMachineSettings )
1644         {
1645             CopyData();
1646             mpData->maMachineSettings = rSet.mpData->maMachineSettings;
1647             nChangeFlags |= SETTINGS_MACHINE;
1648         }
1649     }
1650 
1651     if ( nFlags & SETTINGS_MOUSE )
1652     {
1653         if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings )
1654         {
1655             CopyData();
1656             mpData->maMouseSettings = rSet.mpData->maMouseSettings;
1657             nChangeFlags |= SETTINGS_MOUSE;
1658         }
1659     }
1660 
1661     if ( nFlags & SETTINGS_KEYBOARD )
1662     {
1663         if ( mpData->maKeyboardSettings != rSet.mpData->maKeyboardSettings )
1664         {
1665             CopyData();
1666             mpData->maKeyboardSettings = rSet.mpData->maKeyboardSettings;
1667             nChangeFlags |= SETTINGS_KEYBOARD;
1668         }
1669     }
1670 
1671     if ( nFlags & SETTINGS_STYLE )
1672     {
1673         if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings )
1674         {
1675             CopyData();
1676             mpData->maStyleSettings = rSet.mpData->maStyleSettings;
1677             nChangeFlags |= SETTINGS_STYLE;
1678         }
1679     }
1680 
1681     if ( nFlags & SETTINGS_MISC )
1682     {
1683         if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings )
1684         {
1685             CopyData();
1686             mpData->maMiscSettings = rSet.mpData->maMiscSettings;
1687             nChangeFlags |= SETTINGS_MISC;
1688         }
1689     }
1690 
1691     if ( nFlags & SETTINGS_NOTIFICATION )
1692     {
1693         if ( mpData->maNotificationSettings != rSet.mpData->maNotificationSettings )
1694         {
1695             CopyData();
1696             mpData->maNotificationSettings = rSet.mpData->maNotificationSettings;
1697             nChangeFlags |= SETTINGS_NOTIFICATION;
1698         }
1699     }
1700 
1701     if ( nFlags & SETTINGS_HELP )
1702     {
1703         if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings )
1704         {
1705             CopyData();
1706             mpData->maHelpSettings = rSet.mpData->maHelpSettings;
1707             nChangeFlags |= SETTINGS_HELP;
1708         }
1709     }
1710 
1711     if ( nFlags & SETTINGS_INTERNATIONAL )
1712     {
1713         // Nothing, class International is gone.
1714         DBG_ERRORFILE("AllSettings::Update: who calls with SETTINGS_INTERNATIONAL and why? You're flogging a dead horse.");
1715     }
1716 
1717     if ( nFlags & SETTINGS_LOCALE )
1718     {
1719         if ( mpData->meLanguage || rSet.mpData->meLanguage )
1720         {
1721             SetLanguage( rSet.mpData->meLanguage );
1722             nChangeFlags |= SETTINGS_LOCALE;
1723         }
1724     }
1725 
1726     if ( nFlags & SETTINGS_UILOCALE )
1727     {
1728 		// UILocale can't be changed
1729     }
1730 
1731     return nChangeFlags;
1732 }
1733 
1734 // -----------------------------------------------------------------------
1735 
1736 sal_uLong AllSettings::GetChangeFlags( const AllSettings& rSet ) const
1737 {
1738     DBG_CHKTHIS( AllSettings, NULL );
1739     DBG_CHKOBJ( &rSet, AllSettings, NULL );
1740 
1741     sal_uLong nChangeFlags = 0;
1742 
1743     if ( mpData->maMachineSettings != rSet.mpData->maMachineSettings )
1744         nChangeFlags |= SETTINGS_MACHINE;
1745 
1746     if ( mpData->maMouseSettings != rSet.mpData->maMouseSettings )
1747         nChangeFlags |= SETTINGS_MOUSE;
1748 
1749     if ( mpData->maKeyboardSettings != rSet.mpData->maKeyboardSettings )
1750         nChangeFlags |= SETTINGS_KEYBOARD;
1751 
1752     if ( mpData->maStyleSettings != rSet.mpData->maStyleSettings )
1753         nChangeFlags |= SETTINGS_STYLE;
1754 
1755     if ( mpData->maMiscSettings != rSet.mpData->maMiscSettings )
1756         nChangeFlags |= SETTINGS_MISC;
1757 
1758     if ( mpData->maNotificationSettings != rSet.mpData->maNotificationSettings )
1759         nChangeFlags |= SETTINGS_NOTIFICATION;
1760 
1761     if ( mpData->maHelpSettings != rSet.mpData->maHelpSettings )
1762         nChangeFlags |= SETTINGS_HELP;
1763 
1764     if ( mpData->meLanguage || rSet.mpData->meLanguage )
1765         nChangeFlags |= SETTINGS_LOCALE;
1766 
1767     return nChangeFlags;
1768 }
1769 
1770 // -----------------------------------------------------------------------
1771 
1772 sal_Bool AllSettings::operator ==( const AllSettings& rSet ) const
1773 {
1774     DBG_CHKTHIS( AllSettings, NULL );
1775     DBG_CHKOBJ( &rSet, AllSettings, NULL );
1776 
1777     if ( mpData == rSet.mpData )
1778         return sal_True;
1779 
1780     if ( (mpData->maMachineSettings         == rSet.mpData->maMachineSettings)      &&
1781          (mpData->maMouseSettings           == rSet.mpData->maMouseSettings)        &&
1782          (mpData->maKeyboardSettings        == rSet.mpData->maKeyboardSettings)     &&
1783          (mpData->maStyleSettings           == rSet.mpData->maStyleSettings)        &&
1784          (mpData->maMiscSettings            == rSet.mpData->maMiscSettings)         &&
1785          (mpData->maNotificationSettings    == rSet.mpData->maNotificationSettings) &&
1786          (mpData->maHelpSettings            == rSet.mpData->maHelpSettings)         &&
1787          (mpData->mnSystemUpdate            == rSet.mpData->mnSystemUpdate)         &&
1788          (mpData->maLocale					== rSet.mpData->maLocale)				&&
1789          (mpData->mnWindowUpdate            == rSet.mpData->mnWindowUpdate) )
1790     {
1791         return sal_True;
1792     }
1793 	else
1794 		return sal_False;
1795 }
1796 
1797 // -----------------------------------------------------------------------
1798 
1799 void AllSettings::SetLocale( const ::com::sun::star::lang::Locale& rLocale )
1800 {
1801 	CopyData();
1802 
1803 	mpData->maLocale = rLocale;
1804 
1805 	if ( !rLocale.Language.getLength() )
1806 		mpData->meLanguage = LANGUAGE_SYSTEM;
1807 	else
1808 		mpData->meLanguage = MsLangId::convertLocaleToLanguage( rLocale );
1809 	if ( mpData->mpLocaleDataWrapper )
1810 	{
1811 		delete mpData->mpLocaleDataWrapper;
1812 		mpData->mpLocaleDataWrapper = NULL;
1813 	}
1814 	if ( mpData->mpI18nHelper )
1815 	{
1816 		delete mpData->mpI18nHelper;
1817 		mpData->mpI18nHelper = NULL;
1818 	}
1819 }
1820 
1821 // -----------------------------------------------------------------------
1822 
1823 void AllSettings::SetUILocale( const ::com::sun::star::lang::Locale& )
1824 {
1825 	// there is only one UILocale per process
1826 }
1827 
1828 // -----------------------------------------------------------------------
1829 
1830 void AllSettings::SetLanguage( LanguageType eLang )
1831 {
1832 	if ( eLang != mpData->meLanguage )
1833 	{
1834 		CopyData();
1835 
1836 		mpData->meLanguage = eLang;
1837 		MsLangId::convertLanguageToLocale( GetLanguage(), ((AllSettings*)this)->mpData->maLocale );
1838 		if ( mpData->mpLocaleDataWrapper )
1839 		{
1840 			delete mpData->mpLocaleDataWrapper;
1841 			mpData->mpLocaleDataWrapper = NULL;
1842 		}
1843 		if ( mpData->mpI18nHelper )
1844 		{
1845 			delete mpData->mpI18nHelper;
1846 			mpData->mpI18nHelper = NULL;
1847 		}
1848 	}
1849 }
1850 
1851 // -----------------------------------------------------------------------
1852 
1853 void AllSettings::SetUILanguage( LanguageType  )
1854 {
1855 	// there is only one UILanguage per process
1856 }
1857 
1858 // -----------------------------------------------------------------------
1859 
1860 sal_Bool AllSettings::GetLayoutRTL() const
1861 {
1862     static const char* pEnv = getenv("SAL_RTL_ENABLED" );
1863     static int  nUIMirroring = -1;   // -1: undef, 0: auto, 1: on 2: off
1864 
1865     // environment always overrides
1866     if( pEnv )
1867         return true;
1868 
1869     sal_Bool bRTL = sal_False;
1870 
1871     if( nUIMirroring == -1 )
1872     {
1873         nUIMirroring = 0; // ask configuration only once
1874         utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithServiceFactory(
1875             vcl::unohelper::GetMultiServiceFactory(),
1876             OUString::createFromAscii( "org.openoffice.Office.Common/I18N/CTL" ) );    // note: case sensisitive !
1877         if ( aNode.isValid() )
1878         {
1879             sal_Bool bTmp = sal_Bool();
1880             ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString::createFromAscii( "UIMirroring" ) );
1881             if( aValue >>= bTmp )
1882             {
1883                 // found true or false; if it was nil, nothing is changed
1884                 nUIMirroring = bTmp ? 1 : 2;
1885             }
1886         }
1887     }
1888 
1889     if( nUIMirroring == 0 )  // no config found (eg, setup) or default (nil) was set: check language
1890     {
1891         LanguageType aLang = LANGUAGE_DONTKNOW;
1892         ImplSVData* pSVData = ImplGetSVData();
1893         if ( pSVData->maAppData.mpSettings )
1894             aLang = pSVData->maAppData.mpSettings->GetUILanguage();
1895         bRTL = MsLangId::isRightToLeft( aLang );
1896     }
1897     else
1898         bRTL = (nUIMirroring == 1);
1899 
1900     return bRTL;
1901 }
1902 
1903 // -----------------------------------------------------------------------
1904 
1905 const ::com::sun::star::lang::Locale& AllSettings::GetLocale() const
1906 {
1907     if ( !mpData->maLocale.Language.getLength() )
1908 		mpData->maLocale = mpData->maSysLocale.GetLocale();
1909 
1910     return mpData->maLocale;
1911 }
1912 
1913 // -----------------------------------------------------------------------
1914 
1915 const ::com::sun::star::lang::Locale& AllSettings::GetUILocale() const
1916 {
1917 	// the UILocale is never changed
1918     if ( !mpData->maUILocale.Language.getLength() )
1919 		mpData->maUILocale = mpData->maSysLocale.GetUILocale();
1920 
1921     return mpData->maUILocale;
1922 }
1923 
1924 // -----------------------------------------------------------------------
1925 
1926 LanguageType AllSettings::GetLanguage() const
1927 {
1928 	// meLanguage == LANGUAGE_SYSTEM means: use settings from SvtSysLocale
1929     if ( mpData->meLanguage == LANGUAGE_SYSTEM )
1930         return mpData->maSysLocale.GetLanguage();
1931 
1932     return mpData->meLanguage;
1933 }
1934 
1935 // -----------------------------------------------------------------------
1936 
1937 LanguageType AllSettings::GetUILanguage() const
1938 {
1939 	// the UILanguage is never changed
1940 	return mpData->maSysLocale.GetUILanguage();
1941 }
1942 
1943 // -----------------------------------------------------------------------
1944 
1945 const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const
1946 {
1947     if ( !mpData->mpLocaleDataWrapper )
1948         ((AllSettings*)this)->mpData->mpLocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetLocale() );
1949     return *mpData->mpLocaleDataWrapper;
1950 }
1951 
1952 // -----------------------------------------------------------------------
1953 
1954 const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const
1955 {
1956     if ( !mpData->mpUILocaleDataWrapper )
1957         ((AllSettings*)this)->mpData->mpUILocaleDataWrapper = new LocaleDataWrapper( vcl::unohelper::GetMultiServiceFactory(), GetUILocale() );
1958     return *mpData->mpUILocaleDataWrapper;
1959 }
1960 
1961 // -----------------------------------------------------------------------
1962 
1963 const vcl::I18nHelper& AllSettings::GetLocaleI18nHelper() const
1964 {
1965     if ( !mpData->mpI18nHelper ) {
1966         ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> aFactory(vcl::unohelper::GetMultiServiceFactory());
1967         ((AllSettings*)this)->mpData->mpI18nHelper = new vcl::I18nHelper( aFactory, GetLocale() );
1968     }
1969     return *mpData->mpI18nHelper;
1970 }
1971 
1972 // -----------------------------------------------------------------------
1973 
1974 const vcl::I18nHelper& AllSettings::GetUILocaleI18nHelper() const
1975 {
1976     if ( !mpData->mpUII18nHelper ) {
1977         ::com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> aFactory(vcl::unohelper::GetMultiServiceFactory());
1978         ((AllSettings*)this)->mpData->mpUII18nHelper = new vcl::I18nHelper( aFactory, GetUILocale() );
1979     }
1980     return *mpData->mpUII18nHelper;
1981 }
1982 
1983 
1984 // -----------------------------------------------------------------------
1985 /*
1986 const CollatorWrapper& AllSettings::GetCollatorWrapper() const
1987 {
1988     if ( !mpData->mpCollatorWrapper )
1989     {
1990         ((AllSettings*)this)->mpData->mpCollatorWrapper = new CollatorWrapper( vcl::unohelper::GetMultiServiceFactory() );
1991         ((AllSettings*)this)->mpData->mpCollatorWrapper->loadDefaultCollator( GetLocale(), 0 );
1992     }
1993     return *mpData->mpCollatorWrapper;
1994 }
1995 */
1996 // -----------------------------------------------------------------------
1997 /*
1998 const CollatorWrapper& AllSettings::GetUICollatorWrapper() const
1999 {
2000     if ( !mpData->mpUICollatorWrapper )
2001     {
2002         ((AllSettings*)this)->mpData->mpUICollatorWrapper = new CollatorWrapper( vcl::unohelper::GetMultiServiceFactory() );
2003         ((AllSettings*)this)->mpData->mpUICollatorWrapper->loadDefaultCollator( GetUILocale(), 0 );
2004     }
2005     return *mpData->mpUICollatorWrapper;
2006 }
2007 */
2008 
2009 void AllSettings::LocaleSettingsChanged( sal_uInt32 nHint )
2010 {
2011 	AllSettings aAllSettings( Application::GetSettings() );
2012 	if ( nHint & SYSLOCALEOPTIONS_HINT_DECSEP )
2013 	{
2014 		MiscSettings aMiscSettings = aAllSettings.GetMiscSettings();
2015 		sal_Bool bIsDecSepAsLocale = aAllSettings.mpData->maSysLocale.GetOptions().IsDecimalSeparatorAsLocale();
2016 		if ( aMiscSettings.GetEnableLocalizedDecimalSep() != bIsDecSepAsLocale )
2017 		{
2018 			aMiscSettings.SetEnableLocalizedDecimalSep( bIsDecSepAsLocale );
2019 			aAllSettings.SetMiscSettings( aMiscSettings );
2020 		}
2021 	}
2022 
2023 	if ( (nHint & SYSLOCALEOPTIONS_HINT_LOCALE) )
2024 		aAllSettings.SetLocale( aAllSettings.mpData->maSysLocale.GetOptions().GetLocale() );
2025 
2026 	Application::SetSettings( aAllSettings );
2027 }
2028