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