xref: /aoo41x/main/vcl/source/gdi/configsettings.cxx (revision 9f62ea84)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #include <vcl/configsettings.hxx>
28 
29 #include <svdata.hxx>
30 
31 #include <com/sun/star/uno/Any.hxx>
32 #include <com/sun/star/uno/Sequence.hxx>
33 #include <com/sun/star/beans/PropertyValue.hpp>
34 
35 using namespace rtl;
36 using namespace utl;
37 using namespace vcl;
38 using namespace com::sun::star::uno;
39 using namespace com::sun::star::lang;
40 using namespace com::sun::star::beans;
41 using namespace com::sun::star::container;
42 
43 #define SETTINGS_CONFIGNODE "VCL/Settings"
44 
45 /*
46  *	SettingsConfigItem::get
47  */
48 
49 SettingsConfigItem* SettingsConfigItem::get()
50 {
51     ImplSVData* pSVData = ImplGetSVData();
52     if( ! pSVData->mpSettingsConfigItem )
53         pSVData->mpSettingsConfigItem = new SettingsConfigItem();
54     return pSVData->mpSettingsConfigItem;
55 }
56 
57 /*
58  *  SettignsConfigItem constructor
59  */
60 
61 SettingsConfigItem::SettingsConfigItem()
62         :
63         ConfigItem( OUString( RTL_CONSTASCII_USTRINGPARAM( SETTINGS_CONFIGNODE ) ),
64                     CONFIG_MODE_DELAYED_UPDATE ),
65 	m_aSettings( 0 )
66 {
67     getValues();
68 }
69 
70 /*
71  *  SettingsConfigItem destructor
72  */
73 
74 SettingsConfigItem::~SettingsConfigItem()
75 {
76     if( IsModified() )
77         Commit();
78 }
79 
80 /*
81  *  SettingsConfigItem::Commit
82  */
83 
84 void SettingsConfigItem::Commit()
85 {
86     if( ! IsValidConfigMgr() )
87         return;
88 
89     std::hash_map< OUString, SmallOUStrMap, rtl::OUStringHash >::const_iterator group;
90 
91     for( group = m_aSettings.begin(); group != m_aSettings.end(); ++group )
92     {
93         String aKeyName( group->first );
94         /*sal_Bool bAdded =*/ AddNode( OUString(), aKeyName );
95         Sequence< PropertyValue > aValues( group->second.size() );
96         PropertyValue* pValues = aValues.getArray();
97         int nIndex = 0;
98         SmallOUStrMap::const_iterator it;
99         for( it = group->second.begin(); it != group->second.end(); ++it )
100         {
101             String aName( aKeyName );
102             aName.Append( '/' );
103             aName.Append( String( it->first ) );
104             pValues[nIndex].Name	= aName;
105             pValues[nIndex].Handle	= 0;
106             pValues[nIndex].Value <<= it->second;
107             pValues[nIndex].State	= PropertyState_DIRECT_VALUE;
108             nIndex++;
109         }
110         ReplaceSetProperties( aKeyName, aValues );
111     }
112 }
113 
114 /*
115  *  SettingsConfigItem::Notify
116  */
117 
118 void SettingsConfigItem::Notify( const Sequence< OUString >& )
119 {
120     getValues();
121 }
122 
123 /*
124  *  SettingsConfigItem::getValues
125  */
126 void SettingsConfigItem::getValues()
127 {
128     if( ! IsValidConfigMgr() )
129         return;
130 
131     m_aSettings.clear();
132 
133     Sequence< OUString > aNames( GetNodeNames( OUString() ) );
134     m_aSettings.resize( aNames.getLength() );
135 
136     for( int j = 0; j < aNames.getLength(); j++ )
137     {
138 #if OSL_DEBUG_LEVEL > 2
139         fprintf( stderr, "found settings data for \"%s\"\n",
140                  OUStringToOString( aNames.getConstArray()[j], RTL_TEXTENCODING_ASCII_US ).getStr()
141                  );
142 #endif
143         String aKeyName( aNames.getConstArray()[j] );
144         Sequence< OUString > aKeys( GetNodeNames( aKeyName ) );
145         Sequence< OUString > aSettingsKeys( aKeys.getLength() );
146         const OUString* pFrom = aKeys.getConstArray();
147         OUString* pTo = aSettingsKeys.getArray();
148         for( int m = 0; m < aKeys.getLength(); m++ )
149         {
150             String aName( aKeyName );
151             aName.Append( '/' );
152             aName.Append( String( pFrom[m] ) );
153             pTo[m] = aName;
154         }
155         Sequence< Any > aValues( GetProperties( aSettingsKeys ) );
156         const Any* pValue = aValues.getConstArray();
157         for( int i = 0; i < aValues.getLength(); i++, pValue++ )
158         {
159             if( pValue->getValueTypeClass() == TypeClass_STRING )
160             {
161                 const OUString* pLine = (const OUString*)pValue->getValue();
162                 if( pLine->getLength() )
163                     m_aSettings[ aKeyName ][ pFrom[i] ] = *pLine;
164 #if OSL_DEBUG_LEVEL > 2
165                 fprintf( stderr, "   \"%s\"=\"%.30s\"\n",
166                          OUStringToOString( aKeys.getConstArray()[i], RTL_TEXTENCODING_ASCII_US ).getStr(),
167                          OUStringToOString( *pLine, RTL_TEXTENCODING_ASCII_US ).getStr()
168                          );
169 #endif
170             }
171         }
172     }
173 }
174 
175 /*
176  *  SettingsConfigItem::getDefaultFont
177  */
178 
179 const OUString& SettingsConfigItem::getValue( const OUString& rGroup, const OUString& rKey ) const
180 {
181     ::std::hash_map< OUString, SmallOUStrMap, rtl::OUStringHash >::const_iterator group = m_aSettings.find( rGroup );
182     if( group == m_aSettings.end() || group->second.find( rKey ) == group->second.end() )
183     {
184         static OUString aEmpty;
185         return aEmpty;
186     }
187     return group->second.find(rKey)->second;
188 }
189 
190 /*
191  *  SettingsConfigItem::setDefaultFont
192  */
193 
194 void SettingsConfigItem::setValue( const OUString& rGroup, const OUString& rKey, const OUString& rValue )
195 {
196     bool bModified = m_aSettings[ rGroup ][ rKey ] != rValue;
197     if( bModified )
198     {
199         m_aSettings[ rGroup ][ rKey ] = rValue;
200         SetModified();
201     }
202 }
203 
204