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