1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx"
26*b1cdbd2cSJim Jagielski #ifndef GCC
27*b1cdbd2cSJim Jagielski #endif
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
30*b1cdbd2cSJim Jagielski //	includes
31*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <svtools/menuoptions.hxx>
34*b1cdbd2cSJim Jagielski #include <unotools/configmgr.hxx>
35*b1cdbd2cSJim Jagielski #include <unotools/configitem.hxx>
36*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Sequence.hxx>
39*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
42*b1cdbd2cSJim Jagielski #include "itemholder2.hxx"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
45*b1cdbd2cSJim Jagielski //	namespaces
46*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski using namespace ::utl					;
49*b1cdbd2cSJim Jagielski using namespace ::rtl					;
50*b1cdbd2cSJim Jagielski using namespace ::osl					;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno	;
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
54*b1cdbd2cSJim Jagielski //	const
55*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski #define	ROOTNODE_MENU							OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/View/Menu"	))
58*b1cdbd2cSJim Jagielski #define	DEFAULT_DONTHIDEDISABLEDENTRIES			sal_False
59*b1cdbd2cSJim Jagielski #define	DEFAULT_FOLLOWMOUSE						sal_True
60*b1cdbd2cSJim Jagielski #define	DEFAULT_MENUICONS						2
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski #define	PROPERTYNAME_DONTHIDEDISABLEDENTRIES	OUString(RTL_CONSTASCII_USTRINGPARAM("DontHideDisabledEntry"	))
63*b1cdbd2cSJim Jagielski #define	PROPERTYNAME_FOLLOWMOUSE				OUString(RTL_CONSTASCII_USTRINGPARAM("FollowMouse"				))
64*b1cdbd2cSJim Jagielski #define PROPERTYNAME_SHOWICONSINMENUES          OUString(RTL_CONSTASCII_USTRINGPARAM("ShowIconsInMenues"        ))
65*b1cdbd2cSJim Jagielski #define PROPERTYNAME_SYSTEMICONSINMENUES        OUString(RTL_CONSTASCII_USTRINGPARAM("IsSystemIconsInMenus"     ))
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski #define	PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES	0
68*b1cdbd2cSJim Jagielski #define	PROPERTYHANDLE_FOLLOWMOUSE				1
69*b1cdbd2cSJim Jagielski #define PROPERTYHANDLE_SHOWICONSINMENUES        2
70*b1cdbd2cSJim Jagielski #define PROPERTYHANDLE_SYSTEMICONSINMENUES      3
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski #define PROPERTYCOUNT                           4
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski #include <tools/link.hxx>
75*b1cdbd2cSJim Jagielski #include <tools/list.hxx>
76*b1cdbd2cSJim Jagielski DECLARE_LIST( LinkList, Link * )
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
79*b1cdbd2cSJim Jagielski //	private declarations!
80*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski class SvtMenuOptions_Impl : public ConfigItem
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
85*b1cdbd2cSJim Jagielski 	//	private member
86*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 	private:
89*b1cdbd2cSJim Jagielski         LinkList    aList;
90*b1cdbd2cSJim Jagielski 		sal_Bool	m_bDontHideDisabledEntries			;	/// cache "DontHideDisabledEntries" of Menu section
91*b1cdbd2cSJim Jagielski 		sal_Bool	m_bFollowMouse						;	/// cache "FollowMouse" of Menu section
92*b1cdbd2cSJim Jagielski 		sal_Int16	m_nMenuIcons						;	/// cache "MenuIcons" of Menu section
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
95*b1cdbd2cSJim Jagielski 	//	public methods
96*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 	public:
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
101*b1cdbd2cSJim Jagielski 		//	constructor / destructor
102*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 		 SvtMenuOptions_Impl();
105*b1cdbd2cSJim Jagielski 		~SvtMenuOptions_Impl();
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski         void AddListenerLink( const Link& rLink );
108*b1cdbd2cSJim Jagielski         void RemoveListenerLink( const Link& rLink );
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
111*b1cdbd2cSJim Jagielski 		//	overloaded methods of baseclass
112*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
115*b1cdbd2cSJim Jagielski 			@short		called for notify of configmanager
116*b1cdbd2cSJim Jagielski 			@descr		These method is called from the ConfigManager before application ends or from the
117*b1cdbd2cSJim Jagielski 			 			PropertyChangeListener if the sub tree broadcasts changes. You must update your
118*b1cdbd2cSJim Jagielski 						internal values.
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 			@seealso	baseclass ConfigItem
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 			@param		"seqPropertyNames" is the list of properties which should be updated.
123*b1cdbd2cSJim Jagielski 			@return		-
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 			@onerror	-
126*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski     	virtual void Notify( const Sequence< OUString >& seqPropertyNames );
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
131*b1cdbd2cSJim Jagielski 			@short		write changes to configuration
132*b1cdbd2cSJim Jagielski 			@descr		These method writes the changed values into the sub tree
133*b1cdbd2cSJim Jagielski 						and should always called in our destructor to guarantee consistency of config data.
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 			@seealso	baseclass ConfigItem
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 			@param		-
138*b1cdbd2cSJim Jagielski 			@return		-
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 			@onerror	-
141*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     	virtual void Commit();
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
146*b1cdbd2cSJim Jagielski 		//	public interface
147*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
150*b1cdbd2cSJim Jagielski 			@short		access method to get internal values
151*b1cdbd2cSJim Jagielski 			@descr		These method give us a chance to regulate acces to ouer internal values.
152*b1cdbd2cSJim Jagielski 						It's not used in the moment - but it's possible for the feature!
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 			@seealso	-
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 			@param		-
157*b1cdbd2cSJim Jagielski 			@return		-
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 			@onerror	-
160*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
161*b1cdbd2cSJim Jagielski 
IsEntryHidingEnabled() const162*b1cdbd2cSJim Jagielski 		sal_Bool	IsEntryHidingEnabled() const
163*b1cdbd2cSJim Jagielski 					{ return m_bDontHideDisabledEntries; }
164*b1cdbd2cSJim Jagielski 
IsFollowMouseEnabled() const165*b1cdbd2cSJim Jagielski 		sal_Bool	IsFollowMouseEnabled() const
166*b1cdbd2cSJim Jagielski 					{ return m_bFollowMouse; }
167*b1cdbd2cSJim Jagielski 
GetMenuIconsState() const168*b1cdbd2cSJim Jagielski 		sal_Int16	GetMenuIconsState() const
169*b1cdbd2cSJim Jagielski 					{ return m_nMenuIcons; }
170*b1cdbd2cSJim Jagielski 
SetEntryHidingState(sal_Bool bState)171*b1cdbd2cSJim Jagielski 		void		SetEntryHidingState	( sal_Bool bState )
172*b1cdbd2cSJim Jagielski                     {
173*b1cdbd2cSJim Jagielski                         m_bDontHideDisabledEntries = bState;
174*b1cdbd2cSJim Jagielski                         SetModified();
175*b1cdbd2cSJim Jagielski                         for ( sal_uInt16 n=0; n<aList.Count(); n++ )
176*b1cdbd2cSJim Jagielski                             aList.GetObject(n)->Call( this );
177*b1cdbd2cSJim Jagielski 						Commit();
178*b1cdbd2cSJim Jagielski                     }
179*b1cdbd2cSJim Jagielski 
SetFollowMouseState(sal_Bool bState)180*b1cdbd2cSJim Jagielski 		void		SetFollowMouseState	( sal_Bool bState )
181*b1cdbd2cSJim Jagielski                     {
182*b1cdbd2cSJim Jagielski                         m_bFollowMouse = bState;
183*b1cdbd2cSJim Jagielski                         SetModified();
184*b1cdbd2cSJim Jagielski                         for ( sal_uInt16 n=0; n<aList.Count(); n++ )
185*b1cdbd2cSJim Jagielski                             aList.GetObject(n)->Call( this );
186*b1cdbd2cSJim Jagielski 						Commit();
187*b1cdbd2cSJim Jagielski                     }
188*b1cdbd2cSJim Jagielski 
SetMenuIconsState(sal_Int16 bState)189*b1cdbd2cSJim Jagielski 		void		SetMenuIconsState ( sal_Int16 bState	)
190*b1cdbd2cSJim Jagielski                     {
191*b1cdbd2cSJim Jagielski                         m_nMenuIcons = bState;
192*b1cdbd2cSJim Jagielski                         SetModified();
193*b1cdbd2cSJim Jagielski                         for ( sal_uInt16 n=0; n<aList.Count(); n++ )
194*b1cdbd2cSJim Jagielski                             aList.GetObject(n)->Call( this );
195*b1cdbd2cSJim Jagielski 						Commit();
196*b1cdbd2cSJim Jagielski                     }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
199*b1cdbd2cSJim Jagielski 	//	private methods
200*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski 	private:
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
205*b1cdbd2cSJim Jagielski 			@short		return list of fix key names of ouer configuration management which represent oue module tree
206*b1cdbd2cSJim Jagielski 			@descr		These methods return a static const list of key names. We need it to get needed values from our
207*b1cdbd2cSJim Jagielski 						configuration management.
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 			@seealso	-
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 			@param		-
212*b1cdbd2cSJim Jagielski 			@return		A list of needed configuration keys is returned.
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 			@onerror	-
215*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 		static Sequence< OUString > impl_GetPropertyNames();
218*b1cdbd2cSJim Jagielski };
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
221*b1cdbd2cSJim Jagielski //	definitions
222*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
225*b1cdbd2cSJim Jagielski //	constructor
226*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SvtMenuOptions_Impl()227*b1cdbd2cSJim Jagielski SvtMenuOptions_Impl::SvtMenuOptions_Impl()
228*b1cdbd2cSJim Jagielski 	// Init baseclasses first
229*b1cdbd2cSJim Jagielski     :	ConfigItem					( ROOTNODE_MENU						)
230*b1cdbd2cSJim Jagielski 	// Init member then.
231*b1cdbd2cSJim Jagielski 	,	m_bDontHideDisabledEntries	( DEFAULT_DONTHIDEDISABLEDENTRIES	)
232*b1cdbd2cSJim Jagielski 	,	m_bFollowMouse				( DEFAULT_FOLLOWMOUSE				)
233*b1cdbd2cSJim Jagielski 	,   m_nMenuIcons				( DEFAULT_MENUICONS 				)
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski 	// Use our static list of configuration keys to get his values.
236*b1cdbd2cSJim Jagielski 	Sequence< OUString >	seqNames	= impl_GetPropertyNames();
237*b1cdbd2cSJim Jagielski 	Sequence< Any >			seqValues	= GetProperties( seqNames )	;
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 	// Safe impossible cases.
240*b1cdbd2cSJim Jagielski 	// We need values from ALL configuration keys.
241*b1cdbd2cSJim Jagielski 	// Follow assignment use order of values in relation to our list of key names!
242*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nI miss some values of configuration keys!\n" );
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski     sal_Bool bMenuIcons = true;
245*b1cdbd2cSJim Jagielski     sal_Bool bSystemMenuIcons = true;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	// Copy values from list in right order to ouer internal member.
248*b1cdbd2cSJim Jagielski 	sal_Int32 nPropertyCount	=	seqValues.getLength()	;
249*b1cdbd2cSJim Jagielski 	sal_Int32 nProperty			=	0						;
250*b1cdbd2cSJim Jagielski 	for( nProperty=0; nProperty<nPropertyCount; ++nProperty )
251*b1cdbd2cSJim Jagielski 	{
252*b1cdbd2cSJim Jagielski 		// Safe impossible cases.
253*b1cdbd2cSJim Jagielski 		// Check any for valid value.
254*b1cdbd2cSJim Jagielski 		DBG_ASSERT( !(seqValues[nProperty].hasValue()==sal_False), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nInvalid property value for property detected!\n" );
255*b1cdbd2cSJim Jagielski         switch( nProperty )
256*b1cdbd2cSJim Jagielski         {
257*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES	:	{
258*b1cdbd2cSJim Jagielski 																DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\DontHideDisabledEntry\"?" );
259*b1cdbd2cSJim Jagielski 																seqValues[nProperty] >>= m_bDontHideDisabledEntries;
260*b1cdbd2cSJim Jagielski 															}
261*b1cdbd2cSJim Jagielski 															break;
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_FOLLOWMOUSE				:	{
264*b1cdbd2cSJim Jagielski 																DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\FollowMouse\"?" );
265*b1cdbd2cSJim Jagielski 																seqValues[nProperty] >>= m_bFollowMouse;
266*b1cdbd2cSJim Jagielski 															}
267*b1cdbd2cSJim Jagielski 															break;
268*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_SHOWICONSINMENUES       :   {
269*b1cdbd2cSJim Jagielski                                                                 DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShowIconsInMenues\"?" );
270*b1cdbd2cSJim Jagielski                                                                 seqValues[nProperty] >>= bMenuIcons;
271*b1cdbd2cSJim Jagielski 															}
272*b1cdbd2cSJim Jagielski 															break;
273*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_SYSTEMICONSINMENUES		:   {
274*b1cdbd2cSJim Jagielski                                                                 DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\IsSystemIconsInMenus\"?" );
275*b1cdbd2cSJim Jagielski                                                                 seqValues[nProperty] >>= bSystemMenuIcons;
276*b1cdbd2cSJim Jagielski 															}
277*b1cdbd2cSJim Jagielski 															break;
278*b1cdbd2cSJim Jagielski         }
279*b1cdbd2cSJim Jagielski 	}
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	m_nMenuIcons = bSystemMenuIcons ? 2 : bMenuIcons;
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	EnableNotification( seqNames );
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
287*b1cdbd2cSJim Jagielski //	destructor
288*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
~SvtMenuOptions_Impl()289*b1cdbd2cSJim Jagielski SvtMenuOptions_Impl::~SvtMenuOptions_Impl()
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski 	// Flush data to configuration!
292*b1cdbd2cSJim Jagielski 	// User has no chance to do that.
293*b1cdbd2cSJim Jagielski 	if( IsModified() == sal_True )
294*b1cdbd2cSJim Jagielski 	{
295*b1cdbd2cSJim Jagielski 		Commit();
296*b1cdbd2cSJim Jagielski 	}
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski     for ( sal_uInt16 n=0; n<aList.Count(); )
299*b1cdbd2cSJim Jagielski         delete aList.Remove(n);
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
303*b1cdbd2cSJim Jagielski //	public method
304*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
Notify(const Sequence<OUString> & seqPropertyNames)305*b1cdbd2cSJim Jagielski void SvtMenuOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski 	// Use given list of updated properties to get his values from configuration directly!
308*b1cdbd2cSJim Jagielski 	Sequence< Any > seqValues = GetProperties( seqPropertyNames );
309*b1cdbd2cSJim Jagielski 	// Safe impossible cases.
310*b1cdbd2cSJim Jagielski 	// We need values from ALL notified configuration keys.
311*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtMenuOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 	sal_Bool bMenuSettingsChanged = sal_False;
314*b1cdbd2cSJim Jagielski     sal_Bool bMenuIcons = sal_True;
315*b1cdbd2cSJim Jagielski     sal_Bool bSystemMenuIcons = sal_True;
316*b1cdbd2cSJim Jagielski     if (m_nMenuIcons == 2)
317*b1cdbd2cSJim Jagielski         bMenuIcons = (sal_Bool)(Application::GetSettings().GetStyleSettings().GetUseImagesInMenus());
318*b1cdbd2cSJim Jagielski     else
319*b1cdbd2cSJim Jagielski     {
320*b1cdbd2cSJim Jagielski         bSystemMenuIcons = sal_False;
321*b1cdbd2cSJim Jagielski         bMenuIcons = m_nMenuIcons ? sal_True : sal_False;
322*b1cdbd2cSJim Jagielski     }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	// Step over list of property names and get right value from coreesponding value list to set it on internal members!
325*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = seqPropertyNames.getLength();
326*b1cdbd2cSJim Jagielski 	for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
327*b1cdbd2cSJim Jagielski 	{
328*b1cdbd2cSJim Jagielski 		if( seqPropertyNames[nProperty] == PROPERTYNAME_DONTHIDEDISABLEDENTRIES )
329*b1cdbd2cSJim Jagielski 		{
330*b1cdbd2cSJim Jagielski 			DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\View\\Menu\\DontHideDisabledEntry\"?" );
331*b1cdbd2cSJim Jagielski 			seqValues[nProperty] >>= m_bDontHideDisabledEntries;
332*b1cdbd2cSJim Jagielski 		}
333*b1cdbd2cSJim Jagielski 		else if( seqPropertyNames[nProperty] == PROPERTYNAME_FOLLOWMOUSE )
334*b1cdbd2cSJim Jagielski 		{
335*b1cdbd2cSJim Jagielski 			DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\View\\Menu\\FollowMouse\"?" );
336*b1cdbd2cSJim Jagielski 			seqValues[nProperty] >>= m_bFollowMouse;
337*b1cdbd2cSJim Jagielski 		}
338*b1cdbd2cSJim Jagielski         else if( seqPropertyNames[nProperty] == PROPERTYNAME_SHOWICONSINMENUES )
339*b1cdbd2cSJim Jagielski 		{
340*b1cdbd2cSJim Jagielski             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShowIconsInMenues\"?" );
341*b1cdbd2cSJim Jagielski             bMenuSettingsChanged = seqValues[nProperty] >>= bMenuIcons;
342*b1cdbd2cSJim Jagielski         }
343*b1cdbd2cSJim Jagielski         else if( seqPropertyNames[nProperty] == PROPERTYNAME_SYSTEMICONSINMENUES )
344*b1cdbd2cSJim Jagielski 		{
345*b1cdbd2cSJim Jagielski             DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\IsSystemIconsInMenus\"?" );
346*b1cdbd2cSJim Jagielski             bMenuSettingsChanged = seqValues[nProperty] >>= bSystemMenuIcons;
347*b1cdbd2cSJim Jagielski         }
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 1
350*b1cdbd2cSJim Jagielski 		else DBG_ASSERT( sal_False, "SvtMenuOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" );
351*b1cdbd2cSJim Jagielski 		#endif
352*b1cdbd2cSJim Jagielski 	}
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	if ( bMenuSettingsChanged )
355*b1cdbd2cSJim Jagielski 		m_nMenuIcons = bSystemMenuIcons ? 2 : bMenuIcons;
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski     for ( sal_uInt16 n=0; n<aList.Count(); n++ )
358*b1cdbd2cSJim Jagielski         aList.GetObject(n)->Call( this );
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
362*b1cdbd2cSJim Jagielski //	public method
363*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
Commit()364*b1cdbd2cSJim Jagielski void SvtMenuOptions_Impl::Commit()
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski 	// Get names of supported properties, create a list for values and copy current values to it.
367*b1cdbd2cSJim Jagielski 	Sequence< OUString >	seqNames	= impl_GetPropertyNames();
368*b1cdbd2cSJim Jagielski 	sal_Int32				nCount		= seqNames.getLength();
369*b1cdbd2cSJim Jagielski 	Sequence< Any >			seqValues	( nCount );
370*b1cdbd2cSJim Jagielski 	for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
371*b1cdbd2cSJim Jagielski 	{
372*b1cdbd2cSJim Jagielski         switch( nProperty )
373*b1cdbd2cSJim Jagielski         {
374*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES	:	{
375*b1cdbd2cSJim Jagielski                 												seqValues[nProperty] <<= m_bDontHideDisabledEntries;
376*b1cdbd2cSJim Jagielski 															}
377*b1cdbd2cSJim Jagielski                 											break;
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_FOLLOWMOUSE				:	{
380*b1cdbd2cSJim Jagielski                 												seqValues[nProperty] <<= m_bFollowMouse;
381*b1cdbd2cSJim Jagielski 															}
382*b1cdbd2cSJim Jagielski                 											break;
383*b1cdbd2cSJim Jagielski 			//Output cache of current setting as possibly modified by System Theme for older version
384*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_SHOWICONSINMENUES       :   {
385*b1cdbd2cSJim Jagielski                                                                 sal_Bool bValue = (sal_Bool)(Application::GetSettings().GetStyleSettings().GetUseImagesInMenus());
386*b1cdbd2cSJim Jagielski 																seqValues[nProperty] <<= bValue;
387*b1cdbd2cSJim Jagielski 															}
388*b1cdbd2cSJim Jagielski                 											break;
389*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_SYSTEMICONSINMENUES		:   {
390*b1cdbd2cSJim Jagielski 																sal_Bool bValue = (m_nMenuIcons == 2 ? sal_True : sal_False) ;
391*b1cdbd2cSJim Jagielski                                                                 seqValues[nProperty] <<= bValue;
392*b1cdbd2cSJim Jagielski 															}
393*b1cdbd2cSJim Jagielski                 											break;
394*b1cdbd2cSJim Jagielski         }
395*b1cdbd2cSJim Jagielski 	}
396*b1cdbd2cSJim Jagielski 	// Set properties in configuration.
397*b1cdbd2cSJim Jagielski 	PutProperties( seqNames, seqValues );
398*b1cdbd2cSJim Jagielski }
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
401*b1cdbd2cSJim Jagielski //	private method
402*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
impl_GetPropertyNames()403*b1cdbd2cSJim Jagielski Sequence< OUString > SvtMenuOptions_Impl::impl_GetPropertyNames()
404*b1cdbd2cSJim Jagielski {
405*b1cdbd2cSJim Jagielski 	// Build static list of configuration key names.
406*b1cdbd2cSJim Jagielski 	static const OUString pProperties[] =
407*b1cdbd2cSJim Jagielski 	{
408*b1cdbd2cSJim Jagielski 		PROPERTYNAME_DONTHIDEDISABLEDENTRIES	,
409*b1cdbd2cSJim Jagielski 		PROPERTYNAME_FOLLOWMOUSE				,
410*b1cdbd2cSJim Jagielski         PROPERTYNAME_SHOWICONSINMENUES			,
411*b1cdbd2cSJim Jagielski         PROPERTYNAME_SYSTEMICONSINMENUES
412*b1cdbd2cSJim Jagielski 	};
413*b1cdbd2cSJim Jagielski 	// Initialize return sequence with these list ...
414*b1cdbd2cSJim Jagielski 	static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
415*b1cdbd2cSJim Jagielski 	// ... and return it.
416*b1cdbd2cSJim Jagielski 	return seqPropertyNames;
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
AddListenerLink(const Link & rLink)419*b1cdbd2cSJim Jagielski void SvtMenuOptions_Impl::AddListenerLink( const Link& rLink )
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski     aList.Insert( new Link( rLink ) );
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
RemoveListenerLink(const Link & rLink)424*b1cdbd2cSJim Jagielski void SvtMenuOptions_Impl::RemoveListenerLink( const Link& rLink )
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski     for ( sal_uInt16 n=0; n<aList.Count(); n++ )
427*b1cdbd2cSJim Jagielski     {
428*b1cdbd2cSJim Jagielski         if ( (*aList.GetObject(n) ) == rLink )
429*b1cdbd2cSJim Jagielski         {
430*b1cdbd2cSJim Jagielski             delete aList.Remove(n);
431*b1cdbd2cSJim Jagielski             break;
432*b1cdbd2cSJim Jagielski         }
433*b1cdbd2cSJim Jagielski     }
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
437*b1cdbd2cSJim Jagielski //	initialize static member
438*b1cdbd2cSJim Jagielski //	DON'T DO IT IN YOUR HEADER!
439*b1cdbd2cSJim Jagielski //	see definition for further informations
440*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
441*b1cdbd2cSJim Jagielski SvtMenuOptions_Impl*	SvtMenuOptions::m_pDataContainer	= NULL	;
442*b1cdbd2cSJim Jagielski sal_Int32				SvtMenuOptions::m_nRefCount			= 0		;
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
445*b1cdbd2cSJim Jagielski //	constructor
446*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SvtMenuOptions()447*b1cdbd2cSJim Jagielski SvtMenuOptions::SvtMenuOptions()
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski     // Global access, must be guarded (multithreading!).
450*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
451*b1cdbd2cSJim Jagielski 	// Increase ouer refcount ...
452*b1cdbd2cSJim Jagielski 	++m_nRefCount;
453*b1cdbd2cSJim Jagielski 	// ... and initialize ouer data container only if it not already!
454*b1cdbd2cSJim Jagielski     if( m_pDataContainer == NULL )
455*b1cdbd2cSJim Jagielski 	{
456*b1cdbd2cSJim Jagielski         RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtMenuOptions_Impl::ctor()");
457*b1cdbd2cSJim Jagielski         m_pDataContainer = new SvtMenuOptions_Impl();
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski         ItemHolder2::holdConfigItem(E_MENUOPTIONS);
460*b1cdbd2cSJim Jagielski 	}
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
464*b1cdbd2cSJim Jagielski //	destructor
465*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
~SvtMenuOptions()466*b1cdbd2cSJim Jagielski SvtMenuOptions::~SvtMenuOptions()
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski     // Global access, must be guarded (multithreading!)
469*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
470*b1cdbd2cSJim Jagielski 	// Decrease ouer refcount.
471*b1cdbd2cSJim Jagielski 	--m_nRefCount;
472*b1cdbd2cSJim Jagielski 	// If last instance was deleted ...
473*b1cdbd2cSJim Jagielski 	// we must destroy ouer static data container!
474*b1cdbd2cSJim Jagielski     if( m_nRefCount <= 0 )
475*b1cdbd2cSJim Jagielski 	{
476*b1cdbd2cSJim Jagielski 		delete m_pDataContainer;
477*b1cdbd2cSJim Jagielski 		m_pDataContainer = NULL;
478*b1cdbd2cSJim Jagielski 	}
479*b1cdbd2cSJim Jagielski }
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
482*b1cdbd2cSJim Jagielski //	public method
483*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
IsEntryHidingEnabled() const484*b1cdbd2cSJim Jagielski sal_Bool SvtMenuOptions::IsEntryHidingEnabled() const
485*b1cdbd2cSJim Jagielski {
486*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
487*b1cdbd2cSJim Jagielski 	return m_pDataContainer->IsEntryHidingEnabled();
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
491*b1cdbd2cSJim Jagielski //	public method
492*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
IsFollowMouseEnabled() const493*b1cdbd2cSJim Jagielski sal_Bool SvtMenuOptions::IsFollowMouseEnabled() const
494*b1cdbd2cSJim Jagielski {
495*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
496*b1cdbd2cSJim Jagielski 	return m_pDataContainer->IsFollowMouseEnabled();
497*b1cdbd2cSJim Jagielski }
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
500*b1cdbd2cSJim Jagielski //	public method
501*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SetEntryHidingState(sal_Bool bState)502*b1cdbd2cSJim Jagielski void SvtMenuOptions::SetEntryHidingState( sal_Bool bState )
503*b1cdbd2cSJim Jagielski {
504*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
505*b1cdbd2cSJim Jagielski 	m_pDataContainer->SetEntryHidingState( bState );
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
509*b1cdbd2cSJim Jagielski //	public method
510*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SetFollowMouseState(sal_Bool bState)511*b1cdbd2cSJim Jagielski void SvtMenuOptions::SetFollowMouseState( sal_Bool bState )
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
514*b1cdbd2cSJim Jagielski 	m_pDataContainer->SetFollowMouseState( bState );
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
518*b1cdbd2cSJim Jagielski //	public method
519*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
GetMenuIconsState() const520*b1cdbd2cSJim Jagielski sal_Int16 SvtMenuOptions::GetMenuIconsState() const
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
523*b1cdbd2cSJim Jagielski 	return m_pDataContainer->GetMenuIconsState();
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
527*b1cdbd2cSJim Jagielski //	public method
528*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SetMenuIconsState(sal_Int16 bState)529*b1cdbd2cSJim Jagielski void SvtMenuOptions::SetMenuIconsState( sal_Int16 bState )
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
532*b1cdbd2cSJim Jagielski 	m_pDataContainer->SetMenuIconsState( bState );
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
536*b1cdbd2cSJim Jagielski //	private method
537*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
GetOwnStaticMutex()538*b1cdbd2cSJim Jagielski Mutex& SvtMenuOptions::GetOwnStaticMutex()
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski 	// Initialize static mutex only for one time!
541*b1cdbd2cSJim Jagielski     static Mutex* pMutex = NULL;
542*b1cdbd2cSJim Jagielski 	// If these method first called (Mutex not already exist!) ...
543*b1cdbd2cSJim Jagielski     if( pMutex == NULL )
544*b1cdbd2cSJim Jagielski     {
545*b1cdbd2cSJim Jagielski 		// ... we must create a new one. Protect follow code with the global mutex -
546*b1cdbd2cSJim Jagielski 		// It must be - we create a static variable!
547*b1cdbd2cSJim Jagielski         MutexGuard aGuard( Mutex::getGlobalMutex() );
548*b1cdbd2cSJim Jagielski 		// We must check our pointer again - because it can be that another instance of ouer class will be fastr then these!
549*b1cdbd2cSJim Jagielski         if( pMutex == NULL )
550*b1cdbd2cSJim Jagielski         {
551*b1cdbd2cSJim Jagielski 			// Create the new mutex and set it for return on static variable.
552*b1cdbd2cSJim Jagielski             static Mutex aMutex;
553*b1cdbd2cSJim Jagielski             pMutex = &aMutex;
554*b1cdbd2cSJim Jagielski         }
555*b1cdbd2cSJim Jagielski     }
556*b1cdbd2cSJim Jagielski 	// Return new created or already existing mutex object.
557*b1cdbd2cSJim Jagielski     return *pMutex;
558*b1cdbd2cSJim Jagielski }
559*b1cdbd2cSJim Jagielski 
AddListenerLink(const Link & rLink)560*b1cdbd2cSJim Jagielski void SvtMenuOptions::AddListenerLink( const Link& rLink )
561*b1cdbd2cSJim Jagielski {
562*b1cdbd2cSJim Jagielski     m_pDataContainer->AddListenerLink( rLink );
563*b1cdbd2cSJim Jagielski }
564*b1cdbd2cSJim Jagielski 
RemoveListenerLink(const Link & rLink)565*b1cdbd2cSJim Jagielski void SvtMenuOptions::RemoveListenerLink( const Link& rLink )
566*b1cdbd2cSJim Jagielski {
567*b1cdbd2cSJim Jagielski     m_pDataContainer->RemoveListenerLink( rLink );
568*b1cdbd2cSJim Jagielski }
569