Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <svtools/miscopt.hxx>
21 : #include <unotools/configmgr.hxx>
22 : #include <unotools/configitem.hxx>
23 : #include <tools/debug.hxx>
24 : #include <com/sun/star/uno/Any.hxx>
25 : #include <com/sun/star/uno/Sequence.hxx>
26 : #include <tools/link.hxx>
27 :
28 : #include <rtl/instance.hxx>
29 : #include "itemholder2.hxx"
30 :
31 : #include <svtools/imgdef.hxx>
32 : #include <vcl/svapp.hxx>
33 : #include <vcl/settings.hxx>
34 :
35 : #include <list>
36 :
37 : using namespace ::utl ;
38 : using namespace ::osl ;
39 : using namespace ::com::sun::star::uno ;
40 : using namespace ::com::sun::star;
41 :
42 : #define ROOTNODE_MISC "Office.Common/Misc"
43 :
44 : // PROPERTYHANDLE defines must be sequential from zero for Commit/Load
45 : #define PROPERTYNAME_PLUGINSENABLED "PluginsEnabled"
46 : #define PROPERTYHANDLE_PLUGINSENABLED 0
47 : #define PROPERTYNAME_SYMBOLSET "SymbolSet"
48 : #define PROPERTYHANDLE_SYMBOLSET 1
49 : #define PROPERTYNAME_TOOLBOXSTYLE "ToolboxStyle"
50 : #define PROPERTYHANDLE_TOOLBOXSTYLE 2
51 : #define PROPERTYNAME_USESYSTEMFILEDIALOG "UseSystemFileDialog"
52 : #define PROPERTYHANDLE_USESYSTEMFILEDIALOG 3
53 : #define PROPERTYNAME_ICONTHEME "SymbolStyle"
54 : #define PROPERTYHANDLE_SYMBOLSTYLE 4
55 : #define PROPERTYNAME_USESYSTEMPRINTDIALOG "UseSystemPrintDialog"
56 : #define PROPERTYHANDLE_USESYSTEMPRINTDIALOG 5
57 : #define PROPERTYNAME_SHOWLINKWARNINGDIALOG "ShowLinkWarningDialog"
58 : #define PROPERTYHANDLE_SHOWLINKWARNINGDIALOG 6
59 : #define PROPERTYNAME_DISABLEUICUSTOMIZATION "DisableUICustomization"
60 : #define PROPERTYHANDLE_DISABLEUICUSTOMIZATION 7
61 : #define PROPERTYNAME_ALWAYSALLOWSAVE "AlwaysAllowSave"
62 : #define PROPERTYHANDLE_ALWAYSALLOWSAVE 8
63 : #define PROPERTYNAME_EXPERIMENTALMODE "ExperimentalMode"
64 : #define PROPERTYHANDLE_EXPERIMENTALMODE 9
65 : #define PROPERTYNAME_MACRORECORDERMODE "MacroRecorderMode"
66 : #define PROPERTYHANDLE_MACRORECORDERMODE 10
67 :
68 : #define VCL_TOOLBOX_STYLE_FLAT ((sal_uInt16)0x0004) // from <vcl/toolbox.hxx>
69 :
70 : class SvtMiscOptions_Impl : public ConfigItem
71 : {
72 : private:
73 : ::std::list<Link> aList;
74 : bool m_bUseSystemFileDialog;
75 : bool m_bIsUseSystemFileDialogRO;
76 : bool m_bPluginsEnabled;
77 : bool m_bIsPluginsEnabledRO;
78 : sal_Int16 m_nSymbolsSize;
79 : bool m_bIsSymbolsSizeRO;
80 : bool m_bIsSymbolsStyleRO;
81 : sal_Int16 m_nToolboxStyle;
82 : bool m_bIsToolboxStyleRO;
83 : bool m_bUseSystemPrintDialog;
84 : bool m_bIsUseSystemPrintDialogRO;
85 : bool m_bShowLinkWarningDialog;
86 : bool m_bIsShowLinkWarningDialogRO;
87 : bool m_bDisableUICustomization;
88 : bool m_bAlwaysAllowSave;
89 : bool m_bExperimentalMode;
90 : bool m_bMacroRecorderMode;
91 : bool m_bIconThemeWasSetAutomatically;
92 :
93 : public:
94 :
95 : SvtMiscOptions_Impl();
96 : virtual ~SvtMiscOptions_Impl();
97 :
98 : /*-****************************************************************************************************
99 : @short called for notify of configmanager
100 : @descr These method is called from the ConfigManager before application ends or from the
101 : PropertyChangeListener if the sub tree broadcasts changes. You must update your
102 : internal values.
103 :
104 : @seealso baseclass ConfigItem
105 :
106 : @param "seqPropertyNames" is the list of properties which should be updated.
107 : *//*-*****************************************************************************************************/
108 :
109 : virtual void Notify( const Sequence< OUString >& seqPropertyNames ) SAL_OVERRIDE;
110 :
111 : /** loads required data from the configuration. It's called in the constructor to
112 : read all entries and form ::Notify to re-read changed settings
113 :
114 : */
115 : void Load( const Sequence< OUString >& rPropertyNames );
116 :
117 : /*-****************************************************************************************************
118 : @short write changes to configuration
119 : @descr These method writes the changed values into the sub tree
120 : and should always called in our destructor to guarantee consistency of config data.
121 :
122 : @seealso baseclass ConfigItem
123 : *//*-*****************************************************************************************************/
124 :
125 : virtual void Commit() SAL_OVERRIDE;
126 :
127 :
128 : // public interface
129 :
130 :
131 164 : inline bool UseSystemFileDialog() const
132 164 : { return m_bUseSystemFileDialog; }
133 :
134 320 : inline void SetUseSystemFileDialog( bool bSet )
135 320 : { m_bUseSystemFileDialog = bSet; SetModified(); }
136 :
137 0 : inline bool IsUseSystemFileDialogReadOnly() const
138 0 : { return m_bIsUseSystemFileDialogRO; }
139 :
140 2411 : inline bool DisableUICustomization() const
141 2411 : { return m_bDisableUICustomization; }
142 :
143 0 : inline void SetSaveAlwaysAllowed( bool bSet )
144 0 : { m_bAlwaysAllowSave = bSet; SetModified(); }
145 :
146 1532 : inline bool IsSaveAlwaysAllowed() const
147 1532 : { return m_bAlwaysAllowSave; }
148 :
149 4 : inline void SetExperimentalMode( bool bSet )
150 4 : { m_bExperimentalMode = bSet; SetModified(); }
151 :
152 1396 : inline bool IsExperimentalMode() const
153 1396 : { return m_bExperimentalMode; }
154 :
155 0 : inline void SetMacroRecorderMode( bool bSet )
156 0 : { m_bMacroRecorderMode = bSet; SetModified(); }
157 :
158 0 : inline bool IsMacroRecorderMode() const
159 0 : { return m_bMacroRecorderMode; }
160 :
161 0 : inline bool IsPluginsEnabled() const
162 0 : { return m_bPluginsEnabled; }
163 :
164 25557 : inline sal_Int16 GetSymbolsSize()
165 25557 : { return m_nSymbolsSize; }
166 :
167 : void SetSymbolsSize( sal_Int16 nSet );
168 :
169 : OUString GetIconTheme() const;
170 :
171 : enum SetModifiedFlag { SET_MODIFIED, DONT_SET_MODIFIED };
172 :
173 : /** Set the icon theme
174 : *
175 : * @param theme
176 : * The name of the icon theme to use.
177 : *
178 : * @param setModified
179 : * Whether to call SetModified() and CallListeners().
180 : *
181 : * @internal
182 : * The @p setModified flag was introduced because the unittests fail if we call SetModified()
183 : * during initialization in the constructor.
184 : */
185 : void
186 : SetIconTheme(const OUString &theme, SetModifiedFlag setModified = SET_MODIFIED );
187 :
188 0 : bool IconThemeWasSetAutomatically()
189 0 : {return m_bIconThemeWasSetAutomatically;}
190 :
191 : /** Set the icon theme automatically by detecting the best theme for the desktop environment.
192 : * The parameter setModified controls whether SetModified() will be called.
193 : */
194 : void SetIconThemeAutomatically(SetModifiedFlag = SET_MODIFIED);
195 :
196 : // translate to VCL settings ( "0" = 3D, "1" = FLAT )
197 16268 : inline sal_Int16 GetToolboxStyle()
198 16268 : { return m_nToolboxStyle ? VCL_TOOLBOX_STYLE_FLAT : 0; }
199 :
200 : // translate from VCL settings
201 : void SetToolboxStyle( sal_Int16 nStyle, bool _bSetModified );
202 :
203 0 : inline bool UseSystemPrintDialog() const
204 0 : { return m_bUseSystemPrintDialog; }
205 :
206 0 : inline void SetUseSystemPrintDialog( bool bSet )
207 0 : { m_bUseSystemPrintDialog = bSet; SetModified(); }
208 :
209 0 : inline bool ShowLinkWarningDialog() const
210 0 : { return m_bShowLinkWarningDialog; }
211 :
212 0 : void SetShowLinkWarningDialog( bool bSet )
213 0 : { m_bShowLinkWarningDialog = bSet; SetModified(); }
214 :
215 0 : bool IsShowLinkWarningDialogReadOnly() const
216 0 : { return m_bIsShowLinkWarningDialogRO; }
217 :
218 : void AddListenerLink( const Link& rLink );
219 : void RemoveListenerLink( const Link& rLink );
220 : void CallListeners();
221 :
222 :
223 : // private methods
224 :
225 :
226 : private:
227 :
228 : /*-****************************************************************************************************
229 : @short return list of key names of our configuration management which represent oue module tree
230 : @descr These methods return a static const list of key names. We need it to get needed values from our
231 : configuration management.
232 : @return A list of needed configuration keys is returned.
233 : *//*-*****************************************************************************************************/
234 :
235 : static Sequence< OUString > GetPropertyNames();
236 : };
237 :
238 :
239 : // constructor
240 :
241 272 : SvtMiscOptions_Impl::SvtMiscOptions_Impl()
242 : // Init baseclasses first
243 : : ConfigItem( ROOTNODE_MISC )
244 :
245 : , m_bUseSystemFileDialog( false )
246 : , m_bIsUseSystemFileDialogRO( false )
247 : , m_bPluginsEnabled( false )
248 : , m_bIsPluginsEnabledRO( false )
249 : , m_nSymbolsSize( 0 )
250 : , m_bIsSymbolsSizeRO( false )
251 : , m_bIsSymbolsStyleRO( false )
252 : , m_nToolboxStyle( 1 )
253 : , m_bIsToolboxStyleRO( false )
254 : , m_bUseSystemPrintDialog( false )
255 : , m_bIsUseSystemPrintDialogRO( false )
256 : , m_bShowLinkWarningDialog( true )
257 : , m_bIsShowLinkWarningDialogRO( false )
258 : , m_bAlwaysAllowSave( false )
259 : , m_bExperimentalMode( false )
260 : , m_bMacroRecorderMode( false )
261 272 : , m_bIconThemeWasSetAutomatically( false )
262 : {
263 : // Use our static list of configuration keys to get his values.
264 272 : Sequence< OUString > seqNames = GetPropertyNames ( );
265 272 : Load( seqNames );
266 544 : Sequence< Any > seqValues = GetProperties ( seqNames );
267 544 : Sequence< sal_Bool > seqRO = GetReadOnlyStates ( seqNames );
268 :
269 : // Safe impossible cases.
270 : // We need values from ALL configuration keys.
271 : // Follow assignment use order of values in relation to our list of key names!
272 : DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtMiscOptions_Impl::SvtMiscOptions_Impl()\nI miss some values of configuration keys!\n" );
273 :
274 : // Copy values from list in right order to our internal member.
275 272 : sal_Int32 nPropertyCount = seqValues.getLength();
276 3264 : for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
277 : {
278 2992 : if (!seqValues[nProperty].hasValue())
279 0 : continue;
280 2992 : switch( nProperty )
281 : {
282 : case PROPERTYHANDLE_PLUGINSENABLED :
283 : {
284 272 : if( !(seqValues[nProperty] >>= m_bPluginsEnabled) )
285 : {
286 : OSL_FAIL("Wrong type of \"Misc\\PluginsEnabled\"!" );
287 : }
288 272 : m_bIsPluginsEnabledRO = seqRO[nProperty];
289 272 : break;
290 : }
291 :
292 : case PROPERTYHANDLE_SYMBOLSET :
293 : {
294 272 : if( !(seqValues[nProperty] >>= m_nSymbolsSize) )
295 : {
296 : OSL_FAIL("Wrong type of \"Misc\\SymbolSet\"!" );
297 : }
298 272 : m_bIsSymbolsSizeRO = seqRO[nProperty];
299 272 : break;
300 : }
301 :
302 : case PROPERTYHANDLE_TOOLBOXSTYLE :
303 : {
304 272 : if( !(seqValues[nProperty] >>= m_nToolboxStyle) )
305 : {
306 : OSL_FAIL("Wrong type of \"Misc\\ToolboxStyle\"!" );
307 : }
308 272 : m_bIsToolboxStyleRO = seqRO[nProperty];
309 272 : break;
310 : }
311 :
312 : case PROPERTYHANDLE_USESYSTEMFILEDIALOG :
313 : {
314 272 : if( !(seqValues[nProperty] >>= m_bUseSystemFileDialog) )
315 : {
316 : OSL_FAIL("Wrong type of \"Misc\\UseSystemFileDialog\"!" );
317 : }
318 272 : m_bIsUseSystemFileDialogRO = seqRO[nProperty];
319 272 : break;
320 : }
321 :
322 : case PROPERTYHANDLE_USESYSTEMPRINTDIALOG :
323 : {
324 272 : if( !(seqValues[nProperty] >>= m_bUseSystemPrintDialog) )
325 : {
326 : OSL_FAIL("Wrong type of \"Misc\\UseSystemPrintDialog\"!" );
327 : }
328 272 : m_bIsUseSystemPrintDialogRO = seqRO[nProperty];
329 272 : break;
330 : }
331 :
332 : case PROPERTYHANDLE_SHOWLINKWARNINGDIALOG :
333 : {
334 272 : if( !(seqValues[nProperty] >>= m_bShowLinkWarningDialog) )
335 : {
336 : OSL_FAIL("Wrong type of \"Misc\\ShowLinkWarningDialog\"!" );
337 : }
338 272 : m_bIsShowLinkWarningDialogRO = seqRO[nProperty];
339 272 : break;
340 : }
341 :
342 : case PROPERTYHANDLE_SYMBOLSTYLE :
343 : {
344 272 : OUString aIconTheme;
345 272 : if( seqValues[nProperty] >>= aIconTheme ) {
346 272 : if (aIconTheme == "auto") {
347 272 : SetIconThemeAutomatically(DONT_SET_MODIFIED);
348 : }
349 : else {
350 0 : SetIconTheme(aIconTheme, DONT_SET_MODIFIED);
351 : }
352 : }
353 : else
354 : {
355 : OSL_FAIL("Wrong type of \"Misc\\SymbolStyle\"!" );
356 : }
357 272 : m_bIsSymbolsStyleRO = seqRO[nProperty];
358 272 : break;
359 : }
360 :
361 : case PROPERTYHANDLE_DISABLEUICUSTOMIZATION :
362 : {
363 272 : if( !(seqValues[nProperty] >>= m_bDisableUICustomization) )
364 : OSL_FAIL("Wrong type of \"Misc\\DisableUICustomization\"!" );
365 272 : break;
366 : }
367 : case PROPERTYHANDLE_ALWAYSALLOWSAVE :
368 : {
369 272 : if( !(seqValues[nProperty] >>= m_bAlwaysAllowSave) )
370 : OSL_FAIL("Wrong type of \"Misc\\AlwaysAllowSave\"!" );
371 272 : break;
372 : }
373 : case PROPERTYHANDLE_EXPERIMENTALMODE :
374 : {
375 272 : if( !(seqValues[nProperty] >>= m_bExperimentalMode) )
376 : OSL_FAIL("Wrong type of \"Misc\\ExperimentalMode\"!" );
377 272 : break;
378 : }
379 : case PROPERTYHANDLE_MACRORECORDERMODE :
380 : {
381 272 : if( !(seqValues[nProperty] >>= m_bMacroRecorderMode) )
382 : OSL_FAIL("Wrong type of \"Misc\\MacroRecorderMode\"!" );
383 272 : break;
384 : }
385 : }
386 : }
387 :
388 : // Enable notification mechanism of our baseclass.
389 : // We need it to get information about changes outside these class on our used configuration keys!
390 544 : EnableNotification( seqNames );
391 272 : }
392 :
393 :
394 : // destructor
395 :
396 804 : SvtMiscOptions_Impl::~SvtMiscOptions_Impl()
397 : {
398 : // We must save our current values .. if user forgets it!
399 268 : if( IsModified() )
400 : {
401 0 : Commit();
402 : }
403 536 : }
404 :
405 2992 : static int lcl_MapPropertyName( const OUString& rCompare,
406 : const uno::Sequence< OUString>& aInternalPropertyNames)
407 : {
408 17952 : for(int nProp = 0; nProp < aInternalPropertyNames.getLength(); ++nProp)
409 : {
410 17952 : if( aInternalPropertyNames[nProp] == rCompare )
411 2992 : return nProp;
412 : }
413 0 : return -1;
414 : }
415 :
416 272 : void SvtMiscOptions_Impl::Load( const Sequence< OUString >& rPropertyNames )
417 : {
418 272 : const uno::Sequence< OUString> aInternalPropertyNames( GetPropertyNames());
419 544 : Sequence< Any > seqValues = GetProperties( rPropertyNames );
420 :
421 : // Safe impossible cases.
422 : // We need values from ALL configuration keys.
423 : // Follow assignment use order of values in relation to our list of key names!
424 : DBG_ASSERT( !(rPropertyNames.getLength()!=seqValues.getLength()), "SvtSecurityOptions_Impl::SvtSecurityOptions_Impl()\nI miss some values of configuration keys!\n" );
425 :
426 : // Copy values from list in right order to our internal member.
427 272 : sal_Int32 nPropertyCount = seqValues.getLength();
428 3264 : for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty )
429 : {
430 2992 : if (!seqValues[nProperty].hasValue())
431 0 : continue;
432 2992 : switch( lcl_MapPropertyName(rPropertyNames[nProperty], aInternalPropertyNames) )
433 : {
434 : case PROPERTYHANDLE_PLUGINSENABLED : {
435 272 : if( !(seqValues[nProperty] >>= m_bPluginsEnabled) )
436 : {
437 : OSL_FAIL("Wrong type of \"Misc\\PluginsEnabled\"!" );
438 : }
439 : }
440 272 : break;
441 : case PROPERTYHANDLE_SYMBOLSET : {
442 272 : if( !(seqValues[nProperty] >>= m_nSymbolsSize) )
443 : {
444 : OSL_FAIL("Wrong type of \"Misc\\SymbolSet\"!" );
445 : }
446 : }
447 272 : break;
448 : case PROPERTYHANDLE_TOOLBOXSTYLE : {
449 272 : if( !(seqValues[nProperty] >>= m_nToolboxStyle) )
450 : {
451 : OSL_FAIL("Wrong type of \"Misc\\ToolboxStyle\"!" );
452 : }
453 : }
454 272 : break;
455 : case PROPERTYHANDLE_USESYSTEMFILEDIALOG : {
456 272 : if( !(seqValues[nProperty] >>= m_bUseSystemFileDialog) )
457 : {
458 : OSL_FAIL("Wrong type of \"Misc\\UseSystemFileDialog\"!" );
459 : }
460 : }
461 272 : break;
462 : case PROPERTYHANDLE_USESYSTEMPRINTDIALOG : {
463 272 : if( !(seqValues[nProperty] >>= m_bUseSystemPrintDialog) )
464 : {
465 : OSL_FAIL("Wrong type of \"Misc\\UseSystemPrintDialog\"!" );
466 : }
467 : }
468 272 : break;
469 : case PROPERTYHANDLE_SHOWLINKWARNINGDIALOG : {
470 272 : if( !(seqValues[nProperty] >>= m_bShowLinkWarningDialog) )
471 : {
472 : OSL_FAIL("Wrong type of \"Misc\\ShowLinkWarningDialog\"!" );
473 : }
474 : }
475 272 : break;
476 : case PROPERTYHANDLE_SYMBOLSTYLE : {
477 272 : OUString aIconTheme;
478 272 : if( seqValues[nProperty] >>= aIconTheme ) {
479 272 : if (aIconTheme == "auto") {
480 272 : SetIconThemeAutomatically(DONT_SET_MODIFIED);
481 : }
482 : else {
483 0 : SetIconTheme(aIconTheme, DONT_SET_MODIFIED);
484 : }
485 : }
486 : else {
487 : OSL_FAIL("Wrong type of \"Misc\\SymbolStyle\"!" );
488 272 : }
489 : }
490 272 : break;
491 : case PROPERTYHANDLE_DISABLEUICUSTOMIZATION : {
492 272 : if( !(seqValues[nProperty] >>= m_bDisableUICustomization) )
493 : OSL_FAIL("Wrong type of \"Misc\\DisableUICustomization\"!" );
494 : }
495 272 : break;
496 : case PROPERTYHANDLE_ALWAYSALLOWSAVE:
497 : {
498 272 : if( !(seqValues[nProperty] >>= m_bAlwaysAllowSave) )
499 : OSL_FAIL("Wrong type of \"Misc\\AlwaysAllowSave\"!" );
500 : }
501 272 : break;
502 : }
503 272 : }
504 272 : }
505 :
506 16330 : void SvtMiscOptions_Impl::AddListenerLink( const Link& rLink )
507 : {
508 16330 : aList.push_back( rLink );
509 16330 : }
510 :
511 16324 : void SvtMiscOptions_Impl::RemoveListenerLink( const Link& rLink )
512 : {
513 29391 : for ( ::std::list<Link>::iterator iter = aList.begin(); iter != aList.end(); ++iter )
514 : {
515 29391 : if ( *iter == rLink )
516 : {
517 16324 : aList.erase(iter);
518 16324 : break;
519 : }
520 : }
521 16324 : }
522 :
523 544 : void SvtMiscOptions_Impl::CallListeners()
524 : {
525 544 : for ( ::std::list<Link>::const_iterator iter = aList.begin(); iter != aList.end(); ++iter )
526 0 : iter->Call( this );
527 544 : }
528 :
529 0 : void SvtMiscOptions_Impl::SetToolboxStyle( sal_Int16 nStyle, bool _bSetModified )
530 : {
531 0 : m_nToolboxStyle = nStyle ? 1 : 0;
532 0 : if ( _bSetModified )
533 0 : SetModified();
534 0 : CallListeners();
535 0 : }
536 :
537 0 : void SvtMiscOptions_Impl::SetSymbolsSize( sal_Int16 nSet )
538 : {
539 0 : m_nSymbolsSize = nSet;
540 0 : SetModified();
541 0 : CallListeners();
542 0 : }
543 :
544 205130 : OUString SvtMiscOptions_Impl::GetIconTheme() const
545 : {
546 205130 : return Application::GetSettings().GetStyleSettings().DetermineIconTheme();
547 : }
548 :
549 : void
550 544 : SvtMiscOptions_Impl::SetIconTheme(const OUString &rName, SetModifiedFlag setModified)
551 : {
552 544 : AllSettings aAllSettings = Application::GetSettings();
553 1088 : StyleSettings aStyleSettings = aAllSettings.GetStyleSettings();
554 544 : aStyleSettings.SetIconTheme( rName );
555 544 : m_bIconThemeWasSetAutomatically = false;
556 :
557 544 : aAllSettings.SetStyleSettings(aStyleSettings);
558 544 : Application::MergeSystemSettings( aAllSettings );
559 544 : Application::SetSettings(aAllSettings);
560 :
561 544 : if (setModified == SET_MODIFIED) {
562 0 : SetModified();
563 : }
564 1088 : CallListeners();
565 544 : }
566 :
567 :
568 : // public method
569 :
570 0 : void SvtMiscOptions_Impl::Notify( const Sequence< OUString >& rPropertyNames )
571 : {
572 0 : Load( rPropertyNames );
573 0 : CallListeners();
574 0 : }
575 :
576 :
577 : // public method
578 :
579 322 : void SvtMiscOptions_Impl::Commit()
580 : {
581 : // Get names of supported properties, create a list for values and copy current values to it.
582 322 : Sequence< OUString > seqNames = GetPropertyNames ();
583 322 : sal_Int32 nCount = seqNames.getLength();
584 644 : Sequence< Any > seqValues ( nCount );
585 3864 : for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
586 : {
587 3542 : switch( nProperty )
588 : {
589 : case PROPERTYHANDLE_PLUGINSENABLED :
590 : {
591 322 : if ( !m_bIsPluginsEnabledRO )
592 322 : seqValues[nProperty] <<= m_bPluginsEnabled;
593 322 : break;
594 : }
595 :
596 : case PROPERTYHANDLE_SYMBOLSET :
597 : {
598 322 : if ( !m_bIsSymbolsSizeRO )
599 322 : seqValues[nProperty] <<= m_nSymbolsSize;
600 322 : break;
601 : }
602 :
603 : case PROPERTYHANDLE_TOOLBOXSTYLE :
604 : {
605 322 : if ( !m_bIsToolboxStyleRO )
606 322 : seqValues[nProperty] <<= m_nToolboxStyle;
607 322 : break;
608 : }
609 :
610 : case PROPERTYHANDLE_USESYSTEMFILEDIALOG :
611 : {
612 322 : if ( !m_bIsUseSystemFileDialogRO )
613 322 : seqValues[nProperty] <<= m_bUseSystemFileDialog;
614 322 : break;
615 : }
616 :
617 : case PROPERTYHANDLE_SYMBOLSTYLE :
618 : {
619 322 : if ( !m_bIsSymbolsStyleRO ) {
620 322 : OUString value;
621 322 : if (m_bIconThemeWasSetAutomatically) {
622 322 : value = "auto";
623 : }
624 : else {
625 0 : value = GetIconTheme();
626 : }
627 322 : seqValues[nProperty] <<= value;
628 : }
629 322 : break;
630 : }
631 :
632 : case PROPERTYHANDLE_USESYSTEMPRINTDIALOG :
633 : {
634 322 : if ( !m_bIsUseSystemPrintDialogRO )
635 322 : seqValues[nProperty] <<= m_bUseSystemPrintDialog;
636 322 : break;
637 : }
638 :
639 : case PROPERTYHANDLE_SHOWLINKWARNINGDIALOG :
640 : {
641 322 : if ( !m_bIsShowLinkWarningDialogRO )
642 322 : seqValues[nProperty] <<= m_bShowLinkWarningDialog;
643 322 : break;
644 : }
645 :
646 : case PROPERTYHANDLE_DISABLEUICUSTOMIZATION :
647 : {
648 322 : seqValues[nProperty] <<= m_bDisableUICustomization;
649 322 : break;
650 : }
651 : case PROPERTYHANDLE_ALWAYSALLOWSAVE :
652 : {
653 322 : seqValues[nProperty] <<= m_bAlwaysAllowSave;
654 322 : break;
655 : }
656 : case PROPERTYHANDLE_EXPERIMENTALMODE :
657 : {
658 322 : seqValues[nProperty] <<= m_bExperimentalMode;
659 322 : break;
660 : }
661 : case PROPERTYHANDLE_MACRORECORDERMODE :
662 : {
663 322 : seqValues[nProperty] <<= m_bMacroRecorderMode;
664 322 : break;
665 : }
666 : }
667 : }
668 : // Set properties in configuration.
669 644 : PutProperties( seqNames, seqValues );
670 322 : }
671 :
672 :
673 : // private method
674 :
675 866 : Sequence< OUString > SvtMiscOptions_Impl::GetPropertyNames()
676 : {
677 : // Build list of configuration key names.
678 : const OUString pProperties[] =
679 : {
680 : OUString(PROPERTYNAME_PLUGINSENABLED),
681 : OUString(PROPERTYNAME_SYMBOLSET),
682 : OUString(PROPERTYNAME_TOOLBOXSTYLE),
683 : OUString(PROPERTYNAME_USESYSTEMFILEDIALOG),
684 : OUString(PROPERTYNAME_ICONTHEME),
685 : OUString(PROPERTYNAME_USESYSTEMPRINTDIALOG),
686 : OUString(PROPERTYNAME_SHOWLINKWARNINGDIALOG),
687 : OUString(PROPERTYNAME_DISABLEUICUSTOMIZATION),
688 : OUString(PROPERTYNAME_ALWAYSALLOWSAVE),
689 : OUString(PROPERTYNAME_EXPERIMENTALMODE),
690 : OUString(PROPERTYNAME_MACRORECORDERMODE)
691 10392 : };
692 :
693 : // Initialize return sequence with these list ...
694 866 : const Sequence< OUString > seqPropertyNames( pProperties, SAL_N_ELEMENTS( pProperties ) );
695 : // ... and return it.
696 10392 : return seqPropertyNames;
697 : }
698 :
699 :
700 : // initialize static member
701 : // DON'T DO IT IN YOUR HEADER!
702 : // see definition for further information
703 :
704 : SvtMiscOptions_Impl* SvtMiscOptions::m_pDataContainer = NULL ;
705 : sal_Int32 SvtMiscOptions::m_nRefCount = 0 ;
706 :
707 :
708 : // constructor
709 :
710 284216 : SvtMiscOptions::SvtMiscOptions()
711 : {
712 : // SvtMiscOptions_Impl ctor indirectly calls code that requires locked
713 : // SolarMutex; lock it first:
714 284216 : SolarMutexGuard g;
715 : // Global access, must be guarded (multithreading!).
716 568432 : MutexGuard aGuard( GetInitMutex() );
717 : // Increase our refcount ...
718 284216 : ++m_nRefCount;
719 : // ... and initialize our data container only if it not already exist!
720 284216 : if( m_pDataContainer == NULL )
721 : {
722 272 : m_pDataContainer = new SvtMiscOptions_Impl;
723 272 : svtools::ItemHolder2::holdConfigItem(E_MISCOPTIONS);
724 284216 : }
725 284216 : }
726 :
727 :
728 : // destructor
729 :
730 568692 : SvtMiscOptions::~SvtMiscOptions()
731 : {
732 : // Global access, must be guarded (multithreading!)
733 284212 : MutexGuard aGuard( GetInitMutex() );
734 : // Decrease our refcount.
735 284212 : --m_nRefCount;
736 : // If last instance was deleted ...
737 : // we must destroy our static data container!
738 284212 : if( m_nRefCount <= 0 )
739 : {
740 268 : delete m_pDataContainer;
741 268 : m_pDataContainer = NULL;
742 284212 : }
743 284480 : }
744 :
745 164 : bool SvtMiscOptions::UseSystemFileDialog() const
746 : {
747 164 : return m_pDataContainer->UseSystemFileDialog();
748 : }
749 :
750 320 : void SvtMiscOptions::SetUseSystemFileDialog( bool bEnable )
751 : {
752 320 : m_pDataContainer->SetUseSystemFileDialog( bEnable );
753 320 : }
754 :
755 0 : bool SvtMiscOptions::IsUseSystemFileDialogReadOnly() const
756 : {
757 0 : return m_pDataContainer->IsUseSystemFileDialogReadOnly();
758 : }
759 :
760 0 : bool SvtMiscOptions::IsPluginsEnabled() const
761 : {
762 0 : return m_pDataContainer->IsPluginsEnabled();
763 : }
764 :
765 0 : sal_Int16 SvtMiscOptions::GetSymbolsSize() const
766 : {
767 0 : return m_pDataContainer->GetSymbolsSize();
768 : }
769 :
770 0 : void SvtMiscOptions::SetSymbolsSize( sal_Int16 nSet )
771 : {
772 0 : m_pDataContainer->SetSymbolsSize( nSet );
773 0 : }
774 :
775 25557 : sal_Int16 SvtMiscOptions::GetCurrentSymbolsSize() const
776 : {
777 25557 : sal_Int16 eOptSymbolsSize = m_pDataContainer->GetSymbolsSize();
778 :
779 25557 : if ( eOptSymbolsSize == SFX_SYMBOLS_SIZE_AUTO )
780 : {
781 : // Use system settings, we have to retrieve the toolbar icon size from the
782 : // Application class
783 25557 : sal_uLong nStyleIconSize = Application::GetSettings().GetStyleSettings().GetToolbarIconSize();
784 25557 : if ( nStyleIconSize == STYLE_TOOLBAR_ICONSIZE_LARGE )
785 0 : eOptSymbolsSize = SFX_SYMBOLS_SIZE_LARGE;
786 : else
787 25557 : eOptSymbolsSize = SFX_SYMBOLS_SIZE_SMALL;
788 : }
789 :
790 25557 : return eOptSymbolsSize;
791 : }
792 :
793 25495 : bool SvtMiscOptions::AreCurrentSymbolsLarge() const
794 : {
795 25495 : return ( GetCurrentSymbolsSize() == SFX_SYMBOLS_SIZE_LARGE );
796 : }
797 :
798 205130 : OUString SvtMiscOptions::GetIconTheme() const
799 : {
800 205130 : return m_pDataContainer->GetIconTheme();
801 : }
802 :
803 0 : void SvtMiscOptions::SetIconTheme(const OUString& iconTheme)
804 : {
805 0 : m_pDataContainer->SetIconTheme(iconTheme);
806 0 : }
807 :
808 2411 : bool SvtMiscOptions::DisableUICustomization() const
809 : {
810 2411 : return m_pDataContainer->DisableUICustomization();
811 : }
812 :
813 16268 : sal_Int16 SvtMiscOptions::GetToolboxStyle() const
814 : {
815 16268 : return m_pDataContainer->GetToolboxStyle();
816 : }
817 :
818 0 : void SvtMiscOptions::SetToolboxStyle( sal_Int16 nStyle )
819 : {
820 0 : m_pDataContainer->SetToolboxStyle( nStyle, true );
821 0 : }
822 :
823 0 : bool SvtMiscOptions::UseSystemPrintDialog() const
824 : {
825 0 : return m_pDataContainer->UseSystemPrintDialog();
826 : }
827 :
828 0 : void SvtMiscOptions::SetUseSystemPrintDialog( bool bEnable )
829 : {
830 0 : m_pDataContainer->SetUseSystemPrintDialog( bEnable );
831 0 : }
832 :
833 0 : bool SvtMiscOptions::ShowLinkWarningDialog() const
834 : {
835 0 : return m_pDataContainer->ShowLinkWarningDialog();
836 : }
837 :
838 0 : void SvtMiscOptions::SetShowLinkWarningDialog( bool bSet )
839 : {
840 0 : m_pDataContainer->SetShowLinkWarningDialog( bSet );
841 0 : }
842 :
843 0 : bool SvtMiscOptions::IsShowLinkWarningDialogReadOnly() const
844 : {
845 0 : return m_pDataContainer->IsShowLinkWarningDialogReadOnly();
846 : }
847 :
848 0 : void SvtMiscOptions::SetSaveAlwaysAllowed( bool bSet )
849 : {
850 0 : m_pDataContainer->SetSaveAlwaysAllowed( bSet );
851 0 : }
852 :
853 1532 : bool SvtMiscOptions::IsSaveAlwaysAllowed() const
854 : {
855 1532 : return m_pDataContainer->IsSaveAlwaysAllowed();
856 : }
857 :
858 4 : void SvtMiscOptions::SetExperimentalMode( bool bSet )
859 : {
860 4 : m_pDataContainer->SetExperimentalMode( bSet );
861 4 : }
862 :
863 1396 : bool SvtMiscOptions::IsExperimentalMode() const
864 : {
865 1396 : return m_pDataContainer->IsExperimentalMode();
866 : }
867 :
868 0 : void SvtMiscOptions::SetMacroRecorderMode( bool bSet )
869 : {
870 0 : m_pDataContainer->SetMacroRecorderMode( bSet );
871 0 : }
872 :
873 0 : bool SvtMiscOptions::IsMacroRecorderMode() const
874 : {
875 0 : return m_pDataContainer->IsMacroRecorderMode();
876 : }
877 :
878 : namespace
879 : {
880 : class theSvtMiscOptionsMutex :
881 : public rtl::Static< osl::Mutex, theSvtMiscOptionsMutex > {};
882 : }
883 :
884 568428 : Mutex & SvtMiscOptions::GetInitMutex()
885 : {
886 568428 : return theSvtMiscOptionsMutex::get();
887 : }
888 :
889 16330 : void SvtMiscOptions::AddListenerLink( const Link& rLink )
890 : {
891 16330 : m_pDataContainer->AddListenerLink( rLink );
892 16330 : }
893 :
894 16324 : void SvtMiscOptions::RemoveListenerLink( const Link& rLink )
895 : {
896 16324 : m_pDataContainer->RemoveListenerLink( rLink );
897 16324 : }
898 :
899 : void
900 544 : SvtMiscOptions_Impl::SetIconThemeAutomatically(enum SetModifiedFlag setModified)
901 : {
902 544 : OUString theme = Application::GetSettings().GetStyleSettings().GetAutomaticallyChosenIconTheme();
903 544 : SetIconTheme(theme, setModified);
904 544 : m_bIconThemeWasSetAutomatically = true;
905 544 : }
906 :
907 : void
908 0 : SvtMiscOptions::SetIconThemeAutomatically()
909 : {
910 0 : m_pDataContainer->SetIconThemeAutomatically();
911 0 : }
912 :
913 : bool
914 0 : SvtMiscOptions::IconThemeWasSetAutomatically()
915 : {
916 0 : return m_pDataContainer->IconThemeWasSetAutomatically();
917 1227 : }
918 :
919 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|