1*6d739b60SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*6d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*6d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*6d739b60SAndrew Rist * distributed with this work for additional information 6*6d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*6d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*6d739b60SAndrew Rist * "License"); you may not use this file except in compliance 9*6d739b60SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*6d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*6d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*6d739b60SAndrew Rist * software distributed under the License is distributed on an 15*6d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*6d739b60SAndrew Rist * KIND, either express or implied. See the License for the 17*6d739b60SAndrew Rist * specific language governing permissions and limitations 18*6d739b60SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*6d739b60SAndrew Rist *************************************************************/ 21*6d739b60SAndrew Rist 22*6d739b60SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_framework.hxx" 26cdf0e10cSrcweir #include <uiconfigurationmanagerimpl.hxx> 27cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx> 28cdf0e10cSrcweir #include <services.h> 29cdf0e10cSrcweir #include <uielement/constitemcontainer.hxx> 30cdf0e10cSrcweir #include <uielement/rootitemcontainer.hxx> 31cdf0e10cSrcweir #include <uielement/uielementtypenames.hxx> 32cdf0e10cSrcweir #include <framework/menuconfiguration.hxx> 33cdf0e10cSrcweir #include <framework/toolboxconfiguration.hxx> 34cdf0e10cSrcweir #include <uiconfiguration/imagemanager.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir #ifndef __FRAMEWORK_XML_STATUSBARCONFIGURATION_HXX_ 37cdf0e10cSrcweir #include <framework/statusbarconfiguration.hxx> 38cdf0e10cSrcweir #endif 39cdf0e10cSrcweir 40cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 41cdf0e10cSrcweir // interface includes 42cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 43cdf0e10cSrcweir #include <com/sun/star/ui/UIElementType.hpp> 44cdf0e10cSrcweir #include <com/sun/star/ui/ConfigurationEvent.hpp> 45cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp> 46cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 47cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp> 48cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 49cdf0e10cSrcweir #include <com/sun/star/io/XStream.hpp> 50cdf0e10cSrcweir 51cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 52cdf0e10cSrcweir // other includes 53cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 54cdf0e10cSrcweir 55cdf0e10cSrcweir #include <vcl/svapp.hxx> 56cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 57cdf0e10cSrcweir #include <comphelper/sequenceashashmap.hxx> 58cdf0e10cSrcweir #include <boost/bind.hpp> 59cdf0e10cSrcweir 60cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 61cdf0e10cSrcweir // namespaces 62cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 63cdf0e10cSrcweir 64cdf0e10cSrcweir using rtl::OUString; 65cdf0e10cSrcweir using namespace com::sun::star::uno; 66cdf0e10cSrcweir using namespace com::sun::star::io; 67cdf0e10cSrcweir using namespace com::sun::star::embed; 68cdf0e10cSrcweir using namespace com::sun::star::lang; 69cdf0e10cSrcweir using namespace com::sun::star::container; 70cdf0e10cSrcweir using namespace com::sun::star::beans; 71cdf0e10cSrcweir using namespace ::com::sun::star::ui; 72cdf0e10cSrcweir using namespace ::cppu; 73cdf0e10cSrcweir 74cdf0e10cSrcweir namespace framework 75cdf0e10cSrcweir { 76cdf0e10cSrcweir 77cdf0e10cSrcweir 78cdf0e10cSrcweir // important: The order and position of the elements must match the constant 79cdf0e10cSrcweir // definition of "::com::sun::star::ui::UIElementType" 80cdf0e10cSrcweir static const char* UIELEMENTTYPENAMES[] = 81cdf0e10cSrcweir { 82cdf0e10cSrcweir "", // Dummy value for unknown! 83cdf0e10cSrcweir UIELEMENTTYPE_MENUBAR_NAME, 84cdf0e10cSrcweir UIELEMENTTYPE_POPUPMENU_NAME, 85cdf0e10cSrcweir UIELEMENTTYPE_TOOLBAR_NAME, 86cdf0e10cSrcweir UIELEMENTTYPE_STATUSBAR_NAME, 87cdf0e10cSrcweir UIELEMENTTYPE_FLOATINGWINDOW_NAME, 88cdf0e10cSrcweir UIELEMENTTYPE_PROGRESSBAR_NAME 89cdf0e10cSrcweir }; 90cdf0e10cSrcweir 91cdf0e10cSrcweir static const char RESOURCEURL_PREFIX[] = "private:resource/"; 92cdf0e10cSrcweir static const sal_Int32 RESOURCEURL_PREFIX_SIZE = 17; 93cdf0e10cSrcweir static const char RESOURCEURL_CUSTOM_ELEMENT[] = "custom_"; 94cdf0e10cSrcweir 95cdf0e10cSrcweir static sal_Int16 RetrieveTypeFromResourceURL( const rtl::OUString& aResourceURL ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir 98cdf0e10cSrcweir if (( aResourceURL.indexOf( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( RESOURCEURL_PREFIX ))) == 0 ) && 99cdf0e10cSrcweir ( aResourceURL.getLength() > RESOURCEURL_PREFIX_SIZE )) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir rtl::OUString aTmpStr = aResourceURL.copy( RESOURCEURL_PREFIX_SIZE ); 102cdf0e10cSrcweir sal_Int32 nIndex = aTmpStr.indexOf( '/' ); 103cdf0e10cSrcweir if (( nIndex > 0 ) && ( aTmpStr.getLength() > nIndex )) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir rtl::OUString aTypeStr( aTmpStr.copy( 0, nIndex )); 106cdf0e10cSrcweir for ( int i = 0; i < UIElementType::COUNT; i++ ) 107cdf0e10cSrcweir { 108cdf0e10cSrcweir if ( aTypeStr.equalsAscii( UIELEMENTTYPENAMES[i] )) 109cdf0e10cSrcweir return sal_Int16( i ); 110cdf0e10cSrcweir } 111cdf0e10cSrcweir } 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir return UIElementType::UNKNOWN; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir static rtl::OUString RetrieveNameFromResourceURL( const rtl::OUString& aResourceURL ) 118cdf0e10cSrcweir { 119cdf0e10cSrcweir if (( aResourceURL.indexOf( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( RESOURCEURL_PREFIX ))) == 0 ) && 120cdf0e10cSrcweir ( aResourceURL.getLength() > RESOURCEURL_PREFIX_SIZE )) 121cdf0e10cSrcweir { 122cdf0e10cSrcweir sal_Int32 nIndex = aResourceURL.lastIndexOf( '/' ); 123cdf0e10cSrcweir if (( nIndex > 0 ) && (( nIndex+1 ) < aResourceURL.getLength())) 124cdf0e10cSrcweir return aResourceURL.copy( nIndex+1 ); 125cdf0e10cSrcweir } 126cdf0e10cSrcweir 127cdf0e10cSrcweir return rtl::OUString(); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir 130cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_fillSequenceWithElementTypeInfo( UIElementInfoHashMap& aUIElementInfoCollection, sal_Int16 nElementType ) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir // preload list of element types on demand 133cdf0e10cSrcweir impl_preloadUIElementTypeList( LAYER_USERDEFINED, nElementType ); 134cdf0e10cSrcweir if ( m_bUseDefault ) 135cdf0e10cSrcweir impl_preloadUIElementTypeList( LAYER_DEFAULT, nElementType ); 136cdf0e10cSrcweir 137cdf0e10cSrcweir UIElementDataHashMap& rUserElements = m_aUIElements[LAYER_USERDEFINED][nElementType].aElementsHashMap; 138cdf0e10cSrcweir UIElementDataHashMap::const_iterator pUserIter = rUserElements.begin(); 139cdf0e10cSrcweir 140cdf0e10cSrcweir rtl::OUString aCustomUrlPrefix( RTL_CONSTASCII_USTRINGPARAM( RESOURCEURL_CUSTOM_ELEMENT )); 141cdf0e10cSrcweir while ( pUserIter != rUserElements.end() ) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir sal_Int32 nIndex = pUserIter->second.aResourceURL.indexOf( aCustomUrlPrefix, RESOURCEURL_PREFIX_SIZE ); 144cdf0e10cSrcweir if ( nIndex > RESOURCEURL_PREFIX_SIZE ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir // Performance: Retrieve user interface name only for custom user interface elements. 147cdf0e10cSrcweir // It's only used by them! 148cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( pUserIter->second.aResourceURL, nElementType ); 149cdf0e10cSrcweir if ( pDataSettings && ( m_bUseDefault || !pDataSettings->bDefault )) 150cdf0e10cSrcweir { 151cdf0e10cSrcweir // Retrieve user interface name from XPropertySet interface 152cdf0e10cSrcweir rtl::OUString aUIName; 153cdf0e10cSrcweir Reference< XPropertySet > xPropSet( pDataSettings->xSettings, UNO_QUERY ); 154cdf0e10cSrcweir if ( xPropSet.is() ) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir xPropSet->getPropertyValue( m_aPropUIName ) >>= aUIName; 157cdf0e10cSrcweir } 158cdf0e10cSrcweir 159cdf0e10cSrcweir UIElementInfo aInfo( pUserIter->second.aResourceURL, aUIName ); 160cdf0e10cSrcweir aUIElementInfoCollection.insert( UIElementInfoHashMap::value_type( pUserIter->second.aResourceURL, aInfo )); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir else 164cdf0e10cSrcweir { 165cdf0e10cSrcweir // The user interface name for standard user interface elements is stored in the WindowState.xcu file 166cdf0e10cSrcweir UIElementInfo aInfo( pUserIter->second.aResourceURL, rtl::OUString() ); 167cdf0e10cSrcweir aUIElementInfoCollection.insert( UIElementInfoHashMap::value_type( pUserIter->second.aResourceURL, aInfo )); 168cdf0e10cSrcweir } 169cdf0e10cSrcweir ++pUserIter; 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir if ( m_bUseDefault ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir UIElementDataHashMap& rDefaultElements = m_aUIElements[LAYER_DEFAULT][nElementType].aElementsHashMap; 175cdf0e10cSrcweir UIElementDataHashMap::const_iterator pDefIter = rDefaultElements.begin(); 176cdf0e10cSrcweir 177cdf0e10cSrcweir while ( pDefIter != rDefaultElements.end() ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir UIElementInfoHashMap::const_iterator pIterInfo = aUIElementInfoCollection.find( pDefIter->second.aResourceURL ); 180cdf0e10cSrcweir if ( pIterInfo == aUIElementInfoCollection.end() ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir sal_Int32 nIndex = pDefIter->second.aResourceURL.indexOf( aCustomUrlPrefix, RESOURCEURL_PREFIX_SIZE ); 183cdf0e10cSrcweir if ( nIndex > RESOURCEURL_PREFIX_SIZE ) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir // Performance: Retrieve user interface name only for custom user interface elements. 186cdf0e10cSrcweir // It's only used by them! 187cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( pDefIter->second.aResourceURL, nElementType ); 188cdf0e10cSrcweir if ( pDataSettings ) 189cdf0e10cSrcweir { 190cdf0e10cSrcweir // Retrieve user interface name from XPropertySet interface 191cdf0e10cSrcweir rtl::OUString aUIName; 192cdf0e10cSrcweir Reference< XPropertySet > xPropSet( pDataSettings->xSettings, UNO_QUERY ); 193cdf0e10cSrcweir if ( xPropSet.is() ) 194cdf0e10cSrcweir { 195cdf0e10cSrcweir xPropSet->getPropertyValue( m_aPropUIName ) >>= aUIName; 196cdf0e10cSrcweir } 197cdf0e10cSrcweir 198cdf0e10cSrcweir UIElementInfo aInfo( pDefIter->second.aResourceURL, aUIName ); 199cdf0e10cSrcweir aUIElementInfoCollection.insert( UIElementInfoHashMap::value_type( pDefIter->second.aResourceURL, aInfo )); 200cdf0e10cSrcweir } 201cdf0e10cSrcweir } 202cdf0e10cSrcweir else 203cdf0e10cSrcweir { 204cdf0e10cSrcweir // The user interface name for standard user interface elements is stored in the WindowState.xcu file 205cdf0e10cSrcweir UIElementInfo aInfo( pDefIter->second.aResourceURL, rtl::OUString() ); 206cdf0e10cSrcweir aUIElementInfoCollection.insert( UIElementInfoHashMap::value_type( pDefIter->second.aResourceURL, aInfo )); 207cdf0e10cSrcweir } 208cdf0e10cSrcweir } 209cdf0e10cSrcweir 210cdf0e10cSrcweir ++pDefIter; 211cdf0e10cSrcweir } // while ( pDefIter != rDefaultElements.end() ) 212cdf0e10cSrcweir } 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_preloadUIElementTypeList( Layer eLayer, sal_Int16 nElementType ) 216cdf0e10cSrcweir { 217cdf0e10cSrcweir UIElementType& rElementTypeData = m_aUIElements[eLayer][nElementType]; 218cdf0e10cSrcweir 219cdf0e10cSrcweir if ( !rElementTypeData.bLoaded ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir Reference< XStorage > xElementTypeStorage = rElementTypeData.xStorage; 222cdf0e10cSrcweir if ( xElementTypeStorage.is() ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir rtl::OUStringBuffer aBuf( RESOURCEURL_PREFIX_SIZE ); 225cdf0e10cSrcweir aBuf.appendAscii( RESOURCEURL_PREFIX ); 226cdf0e10cSrcweir aBuf.appendAscii( UIELEMENTTYPENAMES[ nElementType ] ); 227cdf0e10cSrcweir aBuf.appendAscii( "/" ); 228cdf0e10cSrcweir rtl::OUString aResURLPrefix( aBuf.makeStringAndClear() ); 229cdf0e10cSrcweir 230cdf0e10cSrcweir UIElementDataHashMap& rHashMap = rElementTypeData.aElementsHashMap; 231cdf0e10cSrcweir Reference< XNameAccess > xNameAccess( xElementTypeStorage, UNO_QUERY ); 232cdf0e10cSrcweir Sequence< rtl::OUString > aUIElementNames = xNameAccess->getElementNames(); 233cdf0e10cSrcweir for ( sal_Int32 n = 0; n < aUIElementNames.getLength(); n++ ) 234cdf0e10cSrcweir { 235cdf0e10cSrcweir UIElementData aUIElementData; 236cdf0e10cSrcweir 237cdf0e10cSrcweir // Resource name must be without ".xml" 238cdf0e10cSrcweir sal_Int32 nIndex = aUIElementNames[n].lastIndexOf( '.' ); 239cdf0e10cSrcweir if (( nIndex > 0 ) && ( nIndex < aUIElementNames[n].getLength() )) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir rtl::OUString aExtension( aUIElementNames[n].copy( nIndex+1 )); 242cdf0e10cSrcweir rtl::OUString aUIElementName( aUIElementNames[n].copy( 0, nIndex )); 243cdf0e10cSrcweir 244cdf0e10cSrcweir if (( aUIElementName.getLength() > 0 ) && 245cdf0e10cSrcweir ( aExtension.equalsIgnoreAsciiCaseAsciiL( "xml", 3 ))) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir aUIElementData.aResourceURL = aResURLPrefix + aUIElementName; 248cdf0e10cSrcweir aUIElementData.aName = aUIElementNames[n]; 249cdf0e10cSrcweir 250cdf0e10cSrcweir if ( eLayer == LAYER_USERDEFINED ) 251cdf0e10cSrcweir { 252cdf0e10cSrcweir aUIElementData.bModified = false; 253cdf0e10cSrcweir aUIElementData.bDefault = false; 254cdf0e10cSrcweir aUIElementData.bDefaultNode = false; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir // Create hash_map entries for all user interface elements inside the storage. We don't load the 258cdf0e10cSrcweir // settings to speed up the process. 259cdf0e10cSrcweir rHashMap.insert( UIElementDataHashMap::value_type( aUIElementData.aResourceURL, aUIElementData )); 260cdf0e10cSrcweir } 261cdf0e10cSrcweir } 262cdf0e10cSrcweir } 263cdf0e10cSrcweir } 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir rElementTypeData.bLoaded = true; 267cdf0e10cSrcweir } 268cdf0e10cSrcweir 269cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_requestUIElementData( sal_Int16 nElementType, Layer eLayer, UIElementData& aUIElementData ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir UIElementType& rElementTypeData = m_aUIElements[eLayer][nElementType]; 272cdf0e10cSrcweir 273cdf0e10cSrcweir Reference< XStorage > xElementTypeStorage = rElementTypeData.xStorage; 274cdf0e10cSrcweir if ( xElementTypeStorage.is() && aUIElementData.aName.getLength() ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir try 277cdf0e10cSrcweir { 278cdf0e10cSrcweir Reference< XStream > xStream = xElementTypeStorage->openStreamElement( aUIElementData.aName, ElementModes::READ ); 279cdf0e10cSrcweir Reference< XInputStream > xInputStream = xStream->getInputStream(); 280cdf0e10cSrcweir 281cdf0e10cSrcweir if ( xInputStream.is() ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir switch ( nElementType ) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::UNKNOWN: 286cdf0e10cSrcweir break; 287cdf0e10cSrcweir 288cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::MENUBAR: 289cdf0e10cSrcweir { 290cdf0e10cSrcweir try 291cdf0e10cSrcweir { 292cdf0e10cSrcweir MenuConfiguration aMenuCfg( m_xServiceManager ); 293cdf0e10cSrcweir Reference< XIndexAccess > xContainer( aMenuCfg.CreateMenuBarConfigurationFromXML( xInputStream )); 294cdf0e10cSrcweir RootItemContainer* pRootItemContainer = RootItemContainer::GetImplementation( xContainer ); 295cdf0e10cSrcweir if ( pRootItemContainer ) 296cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( pRootItemContainer, sal_True ) ), UNO_QUERY ); 297cdf0e10cSrcweir else 298cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( xContainer, sal_True ) ), UNO_QUERY ); 299cdf0e10cSrcweir return; 300cdf0e10cSrcweir } 301cdf0e10cSrcweir catch ( ::com::sun::star::lang::WrappedTargetException& ) 302cdf0e10cSrcweir { 303cdf0e10cSrcweir } 304cdf0e10cSrcweir } 305cdf0e10cSrcweir break; 306cdf0e10cSrcweir 307cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::POPUPMENU: 308cdf0e10cSrcweir { 309cdf0e10cSrcweir break; 310cdf0e10cSrcweir } 311cdf0e10cSrcweir 312cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::TOOLBAR: 313cdf0e10cSrcweir { 314cdf0e10cSrcweir try 315cdf0e10cSrcweir { 316cdf0e10cSrcweir Reference< XIndexContainer > xIndexContainer( static_cast< OWeakObject * >( new RootItemContainer() ), UNO_QUERY ); 317cdf0e10cSrcweir ToolBoxConfiguration::LoadToolBox( m_xServiceManager, xInputStream, xIndexContainer ); 318cdf0e10cSrcweir RootItemContainer* pRootItemContainer = RootItemContainer::GetImplementation( xIndexContainer ); 319cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( pRootItemContainer, sal_True ) ), UNO_QUERY ); 320cdf0e10cSrcweir return; 321cdf0e10cSrcweir } 322cdf0e10cSrcweir catch ( ::com::sun::star::lang::WrappedTargetException& ) 323cdf0e10cSrcweir { 324cdf0e10cSrcweir } 325cdf0e10cSrcweir 326cdf0e10cSrcweir break; 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::STATUSBAR: 330cdf0e10cSrcweir { 331cdf0e10cSrcweir try 332cdf0e10cSrcweir { 333cdf0e10cSrcweir Reference< XIndexContainer > xIndexContainer( static_cast< OWeakObject * >( new RootItemContainer() ), UNO_QUERY ); 334cdf0e10cSrcweir StatusBarConfiguration::LoadStatusBar( m_xServiceManager, xInputStream, xIndexContainer ); 335cdf0e10cSrcweir RootItemContainer* pRootItemContainer = RootItemContainer::GetImplementation( xIndexContainer ); 336cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( pRootItemContainer, sal_True ) ), UNO_QUERY ); 337cdf0e10cSrcweir return; 338cdf0e10cSrcweir } 339cdf0e10cSrcweir catch ( ::com::sun::star::lang::WrappedTargetException& ) 340cdf0e10cSrcweir { 341cdf0e10cSrcweir } 342cdf0e10cSrcweir 343cdf0e10cSrcweir break; 344cdf0e10cSrcweir } 345cdf0e10cSrcweir 346cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::FLOATINGWINDOW: 347cdf0e10cSrcweir { 348cdf0e10cSrcweir break; 349cdf0e10cSrcweir } 350cdf0e10cSrcweir } 351cdf0e10cSrcweir } 352cdf0e10cSrcweir } 353cdf0e10cSrcweir catch ( ::com::sun::star::embed::InvalidStorageException& ) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir } 356cdf0e10cSrcweir catch ( ::com::sun::star::lang::IllegalArgumentException& ) 357cdf0e10cSrcweir { 358cdf0e10cSrcweir } 359cdf0e10cSrcweir catch ( ::com::sun::star::io::IOException& ) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir } 362cdf0e10cSrcweir catch ( ::com::sun::star::embed::StorageWrappedTargetException& ) 363cdf0e10cSrcweir { 364cdf0e10cSrcweir } 365cdf0e10cSrcweir } 366cdf0e10cSrcweir 367cdf0e10cSrcweir // At least we provide an empty settings container! 368cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer() ), UNO_QUERY ); 369cdf0e10cSrcweir } 370cdf0e10cSrcweir 371cdf0e10cSrcweir UIConfigurationManagerImpl::UIElementData* UIConfigurationManagerImpl::impl_findUIElementData( const rtl::OUString& aResourceURL, sal_Int16 nElementType, bool bLoad ) 372cdf0e10cSrcweir { 373cdf0e10cSrcweir // preload list of element types on demand 374cdf0e10cSrcweir impl_preloadUIElementTypeList( LAYER_USERDEFINED, nElementType ); 375cdf0e10cSrcweir if ( m_bUseDefault ) 376cdf0e10cSrcweir impl_preloadUIElementTypeList( LAYER_DEFAULT, nElementType ); 377cdf0e10cSrcweir 378cdf0e10cSrcweir // first try to look into our user-defined vector/hash_map combination 379cdf0e10cSrcweir UIElementDataHashMap& rUserHashMap = m_aUIElements[LAYER_USERDEFINED][nElementType].aElementsHashMap; 380cdf0e10cSrcweir UIElementDataHashMap::iterator pIter = rUserHashMap.find( aResourceURL ); 381cdf0e10cSrcweir if ( pIter != rUserHashMap.end() ) 382cdf0e10cSrcweir { 383cdf0e10cSrcweir // Default data settings data must be retrieved from the default layer! 384cdf0e10cSrcweir if ( !pIter->second.bDefault ) 385cdf0e10cSrcweir { 386cdf0e10cSrcweir if ( !pIter->second.xSettings.is() && bLoad ) 387cdf0e10cSrcweir impl_requestUIElementData( nElementType, LAYER_USERDEFINED, pIter->second ); 388cdf0e10cSrcweir return &(pIter->second); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir } 391cdf0e10cSrcweir 392cdf0e10cSrcweir if ( m_bUseDefault ) 393cdf0e10cSrcweir { 394cdf0e10cSrcweir // Not successfull, we have to look into our default vector/hash_map combination 395cdf0e10cSrcweir UIElementDataHashMap& rDefaultHashMap = m_aUIElements[LAYER_DEFAULT][nElementType].aElementsHashMap; 396cdf0e10cSrcweir pIter = rDefaultHashMap.find( aResourceURL ); 397cdf0e10cSrcweir if ( pIter != rDefaultHashMap.end() ) 398cdf0e10cSrcweir { 399cdf0e10cSrcweir if ( !pIter->second.xSettings.is() && bLoad ) 400cdf0e10cSrcweir impl_requestUIElementData( nElementType, LAYER_DEFAULT, pIter->second ); 401cdf0e10cSrcweir return &(pIter->second); 402cdf0e10cSrcweir } // if ( pIter != rDefaultHashMap.end() ) 403cdf0e10cSrcweir } 404cdf0e10cSrcweir 405cdf0e10cSrcweir // Nothing has been found! 406cdf0e10cSrcweir return NULL; 407cdf0e10cSrcweir } 408cdf0e10cSrcweir 409cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_storeElementTypeData( Reference< XStorage > xStorage, UIElementType& rElementType, bool bResetModifyState ) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir UIElementDataHashMap& rHashMap = rElementType.aElementsHashMap; 412cdf0e10cSrcweir UIElementDataHashMap::iterator pIter = rHashMap.begin(); 413cdf0e10cSrcweir 414cdf0e10cSrcweir while ( pIter != rHashMap.end() ) 415cdf0e10cSrcweir { 416cdf0e10cSrcweir UIElementData& rElement = pIter->second; 417cdf0e10cSrcweir if ( rElement.bModified ) 418cdf0e10cSrcweir { 419cdf0e10cSrcweir if ( rElement.bDefault ) 420cdf0e10cSrcweir { 421cdf0e10cSrcweir xStorage->removeElement( rElement.aName ); 422cdf0e10cSrcweir rElement.bModified = sal_False; // mark as not modified 423cdf0e10cSrcweir } 424cdf0e10cSrcweir else 425cdf0e10cSrcweir { 426cdf0e10cSrcweir Reference< XStream > xStream( xStorage->openStreamElement( rElement.aName, ElementModes::WRITE|ElementModes::TRUNCATE ), UNO_QUERY ); 427cdf0e10cSrcweir Reference< XOutputStream > xOutputStream( xStream->getOutputStream() ); 428cdf0e10cSrcweir 429cdf0e10cSrcweir if ( xOutputStream.is() ) 430cdf0e10cSrcweir { 431cdf0e10cSrcweir switch( rElementType.nElementType ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::MENUBAR: 434cdf0e10cSrcweir { 435cdf0e10cSrcweir try 436cdf0e10cSrcweir { 437cdf0e10cSrcweir MenuConfiguration aMenuCfg( m_xServiceManager ); 438cdf0e10cSrcweir aMenuCfg.StoreMenuBarConfigurationToXML( rElement.xSettings, xOutputStream ); 439cdf0e10cSrcweir } 440cdf0e10cSrcweir catch ( ::com::sun::star::lang::WrappedTargetException& ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir } 443cdf0e10cSrcweir } 444cdf0e10cSrcweir break; 445cdf0e10cSrcweir 446cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::TOOLBAR: 447cdf0e10cSrcweir { 448cdf0e10cSrcweir try 449cdf0e10cSrcweir { 450cdf0e10cSrcweir ToolBoxConfiguration::StoreToolBox( m_xServiceManager, xOutputStream, rElement.xSettings ); 451cdf0e10cSrcweir } 452cdf0e10cSrcweir catch ( ::com::sun::star::lang::WrappedTargetException& ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir } 455cdf0e10cSrcweir } 456cdf0e10cSrcweir break; 457cdf0e10cSrcweir 458cdf0e10cSrcweir case ::com::sun::star::ui::UIElementType::STATUSBAR: 459cdf0e10cSrcweir { 460cdf0e10cSrcweir try 461cdf0e10cSrcweir { 462cdf0e10cSrcweir StatusBarConfiguration::StoreStatusBar( m_xServiceManager, xOutputStream, rElement.xSettings ); 463cdf0e10cSrcweir } 464cdf0e10cSrcweir catch ( ::com::sun::star::lang::WrappedTargetException& ) 465cdf0e10cSrcweir { 466cdf0e10cSrcweir } 467cdf0e10cSrcweir } 468cdf0e10cSrcweir break; 469cdf0e10cSrcweir 470cdf0e10cSrcweir default: 471cdf0e10cSrcweir break; 472cdf0e10cSrcweir } 473cdf0e10cSrcweir } 474cdf0e10cSrcweir 475cdf0e10cSrcweir // mark as not modified if we store to our own storage 476cdf0e10cSrcweir if ( bResetModifyState ) 477cdf0e10cSrcweir rElement.bModified = sal_False; 478cdf0e10cSrcweir } 479cdf0e10cSrcweir } 480cdf0e10cSrcweir 481cdf0e10cSrcweir ++pIter; 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir // commit element type storage 485cdf0e10cSrcweir Reference< XTransactedObject > xTransactedObject( xStorage, UNO_QUERY ); 486cdf0e10cSrcweir if ( xTransactedObject.is() ) 487cdf0e10cSrcweir xTransactedObject->commit(); 488cdf0e10cSrcweir 489cdf0e10cSrcweir // mark UIElementType as not modified if we store to our own storage 490cdf0e10cSrcweir if ( bResetModifyState ) 491cdf0e10cSrcweir rElementType.bModified = sal_False; 492cdf0e10cSrcweir } 493cdf0e10cSrcweir 494cdf0e10cSrcweir // This is only allowed to be called on the LAYER_USER_DEFINED! 495cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_resetElementTypeData( 496cdf0e10cSrcweir UIElementType& rUserElementType, 497cdf0e10cSrcweir UIElementType& rDefaultElementType, 498cdf0e10cSrcweir ConfigEventNotifyContainer& rRemoveNotifyContainer, 499cdf0e10cSrcweir ConfigEventNotifyContainer& rReplaceNotifyContainer ) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir UIElementDataHashMap& rHashMap = rUserElementType.aElementsHashMap; 502cdf0e10cSrcweir UIElementDataHashMap::iterator pIter = rHashMap.begin(); 503cdf0e10cSrcweir 504cdf0e10cSrcweir Reference< XUIConfigurationManager > xThis( m_xOwner, UNO_QUERY ); 505cdf0e10cSrcweir Reference< XNameAccess > xDefaultNameAccess( rDefaultElementType.xStorage, UNO_QUERY ); 506cdf0e10cSrcweir sal_Int16 nType = rUserElementType.nElementType; 507cdf0e10cSrcweir 508cdf0e10cSrcweir // Make copies of the event structures to be thread-safe. We have to unlock our mutex before calling 509cdf0e10cSrcweir // our listeners! 510cdf0e10cSrcweir while ( pIter != rHashMap.end() ) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir UIElementData& rElement = pIter->second; 513cdf0e10cSrcweir if ( !rElement.bDefault ) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir if ( m_bUseDefault && xDefaultNameAccess->hasByName( rElement.aName )) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir // Replace settings with data from default layer 518cdf0e10cSrcweir Reference< XIndexAccess > xOldSettings( rElement.xSettings ); 519cdf0e10cSrcweir impl_requestUIElementData( nType, LAYER_DEFAULT, rElement ); 520cdf0e10cSrcweir 521cdf0e10cSrcweir ConfigurationEvent aReplaceEvent; 522cdf0e10cSrcweir aReplaceEvent.ResourceURL = rElement.aResourceURL; 523cdf0e10cSrcweir aReplaceEvent.Accessor <<= xThis; 524cdf0e10cSrcweir aReplaceEvent.Source = m_xOwner; 525cdf0e10cSrcweir aReplaceEvent.ReplacedElement <<= xOldSettings; 526cdf0e10cSrcweir aReplaceEvent.Element <<= rElement.xSettings; 527cdf0e10cSrcweir 528cdf0e10cSrcweir rReplaceNotifyContainer.push_back( aReplaceEvent ); 529cdf0e10cSrcweir 530cdf0e10cSrcweir // Mark element as default and not modified. That means "not active" 531cdf0e10cSrcweir // in the user layer anymore. 532cdf0e10cSrcweir rElement.bModified = false; 533cdf0e10cSrcweir rElement.bDefault = true; 534cdf0e10cSrcweir } 535cdf0e10cSrcweir else 536cdf0e10cSrcweir { 537cdf0e10cSrcweir // Remove user-defined settings from user layer 538cdf0e10cSrcweir ConfigurationEvent aEvent; 539cdf0e10cSrcweir aEvent.ResourceURL = rElement.aResourceURL; 540cdf0e10cSrcweir aEvent.Accessor <<= xThis; 541cdf0e10cSrcweir aEvent.Source = m_xOwner; 542cdf0e10cSrcweir aEvent.Element <<= rElement.xSettings; 543cdf0e10cSrcweir 544cdf0e10cSrcweir rRemoveNotifyContainer.push_back( aEvent ); 545cdf0e10cSrcweir 546cdf0e10cSrcweir // Mark element as default and not modified. That means "not active" 547cdf0e10cSrcweir // in the user layer anymore. 548cdf0e10cSrcweir rElement.bModified = false; 549cdf0e10cSrcweir rElement.bDefault = true; 550cdf0e10cSrcweir } 551cdf0e10cSrcweir } // if ( !rElement.bDefault ) 552cdf0e10cSrcweir else 553cdf0e10cSrcweir rElement.bModified = false; 554cdf0e10cSrcweir 555cdf0e10cSrcweir ++pIter; 556cdf0e10cSrcweir } 557cdf0e10cSrcweir 558cdf0e10cSrcweir // Remove all settings from our user interface elements 559cdf0e10cSrcweir rHashMap.clear(); 560cdf0e10cSrcweir } 561cdf0e10cSrcweir 562cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_reloadElementTypeData( 563cdf0e10cSrcweir UIElementType& rUserElementType, 564cdf0e10cSrcweir UIElementType& rDefaultElementType, 565cdf0e10cSrcweir ConfigEventNotifyContainer& rRemoveNotifyContainer, 566cdf0e10cSrcweir ConfigEventNotifyContainer& rReplaceNotifyContainer ) 567cdf0e10cSrcweir { 568cdf0e10cSrcweir UIElementDataHashMap& rHashMap = rUserElementType.aElementsHashMap; 569cdf0e10cSrcweir UIElementDataHashMap::iterator pIter = rHashMap.begin(); 570cdf0e10cSrcweir Reference< XStorage > xUserStorage( rUserElementType.xStorage ); 571cdf0e10cSrcweir Reference< XStorage > xDefaultStorage( rDefaultElementType.xStorage ); 572cdf0e10cSrcweir Reference< XNameAccess > xUserNameAccess( rUserElementType.xStorage, UNO_QUERY ); 573cdf0e10cSrcweir Reference< XNameAccess > xDefaultNameAccess( rDefaultElementType.xStorage, UNO_QUERY ); 574cdf0e10cSrcweir 575cdf0e10cSrcweir Reference< XUIConfigurationManager > xThis( m_xOwner, UNO_QUERY ); 576cdf0e10cSrcweir sal_Int16 nType = rUserElementType.nElementType; 577cdf0e10cSrcweir 578cdf0e10cSrcweir while ( pIter != rHashMap.end() ) 579cdf0e10cSrcweir { 580cdf0e10cSrcweir UIElementData& rElement = pIter->second; 581cdf0e10cSrcweir if ( rElement.bModified ) 582cdf0e10cSrcweir { 583cdf0e10cSrcweir if ( xUserNameAccess->hasByName( rElement.aName )) 584cdf0e10cSrcweir { 585cdf0e10cSrcweir // Replace settings with data from user layer 586cdf0e10cSrcweir Reference< XIndexAccess > xOldSettings( rElement.xSettings ); 587cdf0e10cSrcweir 588cdf0e10cSrcweir impl_requestUIElementData( nType, LAYER_USERDEFINED, rElement ); 589cdf0e10cSrcweir 590cdf0e10cSrcweir ConfigurationEvent aReplaceEvent; 591cdf0e10cSrcweir 592cdf0e10cSrcweir aReplaceEvent.ResourceURL = rElement.aResourceURL; 593cdf0e10cSrcweir aReplaceEvent.Accessor <<= xThis; 594cdf0e10cSrcweir aReplaceEvent.Source = m_xOwner; 595cdf0e10cSrcweir aReplaceEvent.ReplacedElement <<= xOldSettings; 596cdf0e10cSrcweir aReplaceEvent.Element <<= rElement.xSettings; 597cdf0e10cSrcweir rReplaceNotifyContainer.push_back( aReplaceEvent ); 598cdf0e10cSrcweir 599cdf0e10cSrcweir rElement.bModified = false; 600cdf0e10cSrcweir } 601cdf0e10cSrcweir else if ( m_bUseDefault && xDefaultNameAccess->hasByName( rElement.aName )) 602cdf0e10cSrcweir { 603cdf0e10cSrcweir // Replace settings with data from default layer 604cdf0e10cSrcweir Reference< XIndexAccess > xOldSettings( rElement.xSettings ); 605cdf0e10cSrcweir 606cdf0e10cSrcweir impl_requestUIElementData( nType, LAYER_DEFAULT, rElement ); 607cdf0e10cSrcweir 608cdf0e10cSrcweir ConfigurationEvent aReplaceEvent; 609cdf0e10cSrcweir 610cdf0e10cSrcweir aReplaceEvent.ResourceURL = rElement.aResourceURL; 611cdf0e10cSrcweir aReplaceEvent.Accessor <<= xThis; 612cdf0e10cSrcweir aReplaceEvent.Source = m_xOwner; 613cdf0e10cSrcweir aReplaceEvent.ReplacedElement <<= xOldSettings; 614cdf0e10cSrcweir aReplaceEvent.Element <<= rElement.xSettings; 615cdf0e10cSrcweir rReplaceNotifyContainer.push_back( aReplaceEvent ); 616cdf0e10cSrcweir 617cdf0e10cSrcweir // Mark element as default and not modified. That means "not active" 618cdf0e10cSrcweir // in the user layer anymore. 619cdf0e10cSrcweir rElement.bModified = false; 620cdf0e10cSrcweir rElement.bDefault = true; 621cdf0e10cSrcweir } 622cdf0e10cSrcweir else 623cdf0e10cSrcweir { 624cdf0e10cSrcweir // Element settings are not in any storage => remove 625cdf0e10cSrcweir ConfigurationEvent aRemoveEvent; 626cdf0e10cSrcweir 627cdf0e10cSrcweir aRemoveEvent.ResourceURL = rElement.aResourceURL; 628cdf0e10cSrcweir aRemoveEvent.Accessor <<= xThis; 629cdf0e10cSrcweir aRemoveEvent.Source = m_xOwner; 630cdf0e10cSrcweir aRemoveEvent.Element <<= rElement.xSettings; 631cdf0e10cSrcweir 632cdf0e10cSrcweir rRemoveNotifyContainer.push_back( aRemoveEvent ); 633cdf0e10cSrcweir 634cdf0e10cSrcweir // Mark element as default and not modified. That means "not active" 635cdf0e10cSrcweir // in the user layer anymore. 636cdf0e10cSrcweir rElement.bModified = false; 637cdf0e10cSrcweir rElement.bDefault = true; 638cdf0e10cSrcweir } 639cdf0e10cSrcweir } 640cdf0e10cSrcweir ++pIter; 641cdf0e10cSrcweir } 642cdf0e10cSrcweir 643cdf0e10cSrcweir rUserElementType.bModified = sal_False; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir 646cdf0e10cSrcweir void UIConfigurationManagerImpl::impl_Initialize() 647cdf0e10cSrcweir { 648cdf0e10cSrcweir // Initialize the top-level structures with the storage data 649cdf0e10cSrcweir if ( m_xUserConfigStorage.is() ) 650cdf0e10cSrcweir { 651cdf0e10cSrcweir // Try to access our module sub folder 652cdf0e10cSrcweir for ( sal_Int16 i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; 653cdf0e10cSrcweir i++ ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir Reference< XStorage > xElementTypeStorage; 656cdf0e10cSrcweir try 657cdf0e10cSrcweir { 658cdf0e10cSrcweir if ( m_pStorageHandler[i] ) 659cdf0e10cSrcweir xElementTypeStorage = m_pStorageHandler[i]->getWorkingStorageUser(); 660cdf0e10cSrcweir } 661cdf0e10cSrcweir catch ( com::sun::star::container::NoSuchElementException& ) 662cdf0e10cSrcweir { 663cdf0e10cSrcweir } 664cdf0e10cSrcweir catch ( ::com::sun::star::embed::InvalidStorageException& ) 665cdf0e10cSrcweir { 666cdf0e10cSrcweir } 667cdf0e10cSrcweir catch ( ::com::sun::star::lang::IllegalArgumentException& ) 668cdf0e10cSrcweir { 669cdf0e10cSrcweir } 670cdf0e10cSrcweir catch ( ::com::sun::star::io::IOException& ) 671cdf0e10cSrcweir { 672cdf0e10cSrcweir } 673cdf0e10cSrcweir catch ( ::com::sun::star::embed::StorageWrappedTargetException& ) 674cdf0e10cSrcweir { 675cdf0e10cSrcweir } 676cdf0e10cSrcweir 677cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED][i].nElementType = i; 678cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED][i].bModified = false; 679cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED][i].xStorage = xElementTypeStorage; 680cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED][i].bDefaultLayer = false; 681cdf0e10cSrcweir } 682cdf0e10cSrcweir } // if ( m_xUserConfigStorage.is() ) 683cdf0e10cSrcweir else if ( !m_bUseDefault ) 684cdf0e10cSrcweir { 685cdf0e10cSrcweir // We have no storage, just initialize ui element types with empty storage! 686cdf0e10cSrcweir for ( int i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 687cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED][i].xStorage.clear(); 688cdf0e10cSrcweir } 689cdf0e10cSrcweir 690cdf0e10cSrcweir if ( m_bUseDefault && m_xUserConfigStorage.is() ) 691cdf0e10cSrcweir { 692cdf0e10cSrcweir Reference< XNameAccess > xNameAccess( m_xDefaultConfigStorage, UNO_QUERY_THROW ); 693cdf0e10cSrcweir 694cdf0e10cSrcweir // Try to access our module sub folder 695cdf0e10cSrcweir for ( sal_Int16 i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; 696cdf0e10cSrcweir i++ ) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir Reference< XStorage > xElementTypeStorage; 699cdf0e10cSrcweir try 700cdf0e10cSrcweir { 701cdf0e10cSrcweir xNameAccess->getByName( rtl::OUString::createFromAscii( UIELEMENTTYPENAMES[i] )) >>= xElementTypeStorage; 702cdf0e10cSrcweir } 703cdf0e10cSrcweir catch ( com::sun::star::container::NoSuchElementException& ) 704cdf0e10cSrcweir { 705cdf0e10cSrcweir } 706cdf0e10cSrcweir 707cdf0e10cSrcweir m_aUIElements[LAYER_DEFAULT][i].nElementType = i; 708cdf0e10cSrcweir m_aUIElements[LAYER_DEFAULT][i].bModified = false; 709cdf0e10cSrcweir m_aUIElements[LAYER_DEFAULT][i].xStorage = xElementTypeStorage; 710cdf0e10cSrcweir m_aUIElements[LAYER_DEFAULT][i].bDefaultLayer = true; 711cdf0e10cSrcweir } 712cdf0e10cSrcweir } 713cdf0e10cSrcweir } 714cdf0e10cSrcweir 715cdf0e10cSrcweir UIConfigurationManagerImpl::UIConfigurationManagerImpl( const Reference< com::sun::star::lang::XMultiServiceFactory >& xServiceManager 716cdf0e10cSrcweir ,const Reference< XInterface >& _xOwner 717cdf0e10cSrcweir , bool _bUseDefault) : 718cdf0e10cSrcweir ThreadHelpBase( &Application::GetSolarMutex() ) 719cdf0e10cSrcweir , m_xOwner( _xOwner ) 720cdf0e10cSrcweir , m_bUseDefault(_bUseDefault) 721cdf0e10cSrcweir , m_bReadOnly( true ) 722cdf0e10cSrcweir , m_bInitialized( false ) 723cdf0e10cSrcweir , m_bModified( false ) 724cdf0e10cSrcweir , m_bConfigRead( false ) 725cdf0e10cSrcweir , m_bDisposed( false ) 726cdf0e10cSrcweir , m_aXMLPostfix( RTL_CONSTASCII_USTRINGPARAM( ".xml" )) 727cdf0e10cSrcweir , m_aPropUIName( RTL_CONSTASCII_USTRINGPARAM( "UIName" )) 728cdf0e10cSrcweir , m_aPropResourceURL( RTL_CONSTASCII_USTRINGPARAM( "ResourceURL" )) 729cdf0e10cSrcweir , m_xServiceManager( xServiceManager ) 730cdf0e10cSrcweir , m_aListenerContainer( m_aLock.getShareableOslMutex() ) 731cdf0e10cSrcweir { 732cdf0e10cSrcweir for ( int i = 0; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 733cdf0e10cSrcweir m_pStorageHandler[i] = 0; 734cdf0e10cSrcweir 735cdf0e10cSrcweir // Make sure we have a default initialized entry for every layer and user interface element type! 736cdf0e10cSrcweir // The following code depends on this! 737cdf0e10cSrcweir m_aUIElements[LAYER_DEFAULT].resize( ::com::sun::star::ui::UIElementType::COUNT ); 738cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED].resize( ::com::sun::star::ui::UIElementType::COUNT ); 739cdf0e10cSrcweir } 740cdf0e10cSrcweir 741cdf0e10cSrcweir UIConfigurationManagerImpl::~UIConfigurationManagerImpl() 742cdf0e10cSrcweir { 743cdf0e10cSrcweir for ( int i = 0; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 744cdf0e10cSrcweir delete m_pStorageHandler[i]; 745cdf0e10cSrcweir } 746cdf0e10cSrcweir 747cdf0e10cSrcweir // XComponent 748cdf0e10cSrcweir void UIConfigurationManagerImpl::dispose() throw (::com::sun::star::uno::RuntimeException) 749cdf0e10cSrcweir { 750cdf0e10cSrcweir css::lang::EventObject aEvent( m_xOwner ); 751cdf0e10cSrcweir m_aListenerContainer.disposeAndClear( aEvent ); 752cdf0e10cSrcweir 753cdf0e10cSrcweir { 754cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 755cdf0e10cSrcweir try 756cdf0e10cSrcweir { 757cdf0e10cSrcweir if ( m_xModuleImageManager.is() ) 758cdf0e10cSrcweir m_xModuleImageManager->dispose(); 759cdf0e10cSrcweir } 760cdf0e10cSrcweir catch ( Exception& ) 761cdf0e10cSrcweir { 762cdf0e10cSrcweir } 763cdf0e10cSrcweir 764cdf0e10cSrcweir m_xModuleImageManager.clear(); 765cdf0e10cSrcweir m_aUIElements[LAYER_USERDEFINED].clear(); 766cdf0e10cSrcweir m_aUIElements[LAYER_DEFAULT].clear(); 767cdf0e10cSrcweir m_xDefaultConfigStorage.clear(); 768cdf0e10cSrcweir m_xUserConfigStorage.clear(); 769cdf0e10cSrcweir m_xUserRootCommit.clear(); 770cdf0e10cSrcweir m_bConfigRead = false; 771cdf0e10cSrcweir m_bModified = false; 772cdf0e10cSrcweir m_bDisposed = true; 773cdf0e10cSrcweir } 774cdf0e10cSrcweir } 775cdf0e10cSrcweir 776cdf0e10cSrcweir void UIConfigurationManagerImpl::addEventListener( const Reference< XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException) 777cdf0e10cSrcweir { 778cdf0e10cSrcweir { 779cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 780cdf0e10cSrcweir 781cdf0e10cSrcweir /* SAFE AREA ----------------------------------------------------------------------------------------------- */ 782cdf0e10cSrcweir if ( m_bDisposed ) 783cdf0e10cSrcweir throw DisposedException(); 784cdf0e10cSrcweir } 785cdf0e10cSrcweir 786cdf0e10cSrcweir m_aListenerContainer.addInterface( ::getCppuType( ( const Reference< XEventListener >* ) NULL ), xListener ); 787cdf0e10cSrcweir } 788cdf0e10cSrcweir 789cdf0e10cSrcweir void UIConfigurationManagerImpl::removeEventListener( const Reference< XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException) 790cdf0e10cSrcweir { 791cdf0e10cSrcweir /* SAFE AREA ----------------------------------------------------------------------------------------------- */ 792cdf0e10cSrcweir m_aListenerContainer.removeInterface( ::getCppuType( ( const Reference< XEventListener >* ) NULL ), xListener ); 793cdf0e10cSrcweir } 794cdf0e10cSrcweir 795cdf0e10cSrcweir // XInitialization 796cdf0e10cSrcweir void UIConfigurationManagerImpl::initialize( const Sequence< Any >& aArguments ) throw ( Exception, RuntimeException ) 797cdf0e10cSrcweir { 798cdf0e10cSrcweir ResetableGuard aLock( m_aLock ); 799cdf0e10cSrcweir 800cdf0e10cSrcweir if ( !m_bInitialized ) 801cdf0e10cSrcweir { 802cdf0e10cSrcweir ::comphelper::SequenceAsHashMap lArgs(aArguments); 803cdf0e10cSrcweir m_aModuleIdentifier = lArgs.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("ModuleIdentifier"), ::rtl::OUString()); 804cdf0e10cSrcweir m_aModuleShortName = lArgs.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("ModuleShortName"), ::rtl::OUString()); 805cdf0e10cSrcweir 806cdf0e10cSrcweir for ( int i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 807cdf0e10cSrcweir { 808cdf0e10cSrcweir rtl::OUString aResourceType; 809cdf0e10cSrcweir if ( i == ::com::sun::star::ui::UIElementType::MENUBAR ) 810cdf0e10cSrcweir aResourceType = PresetHandler::RESOURCETYPE_MENUBAR(); 811cdf0e10cSrcweir else if ( i == ::com::sun::star::ui::UIElementType::TOOLBAR ) 812cdf0e10cSrcweir aResourceType = PresetHandler::RESOURCETYPE_TOOLBAR(); 813cdf0e10cSrcweir else if ( i == ::com::sun::star::ui::UIElementType::STATUSBAR ) 814cdf0e10cSrcweir aResourceType = PresetHandler::RESOURCETYPE_STATUSBAR(); 815cdf0e10cSrcweir 816cdf0e10cSrcweir if ( aResourceType.getLength() > 0 ) 817cdf0e10cSrcweir { 818cdf0e10cSrcweir m_pStorageHandler[i] = new PresetHandler( m_xServiceManager ); 819cdf0e10cSrcweir m_pStorageHandler[i]->connectToResource( PresetHandler::E_MODULES, 820cdf0e10cSrcweir aResourceType, // this path wont be used later ... seee next lines! 821cdf0e10cSrcweir m_aModuleShortName, 822cdf0e10cSrcweir css::uno::Reference< css::embed::XStorage >()); // no document root used here! 823cdf0e10cSrcweir } 824cdf0e10cSrcweir } 825cdf0e10cSrcweir 826cdf0e10cSrcweir // initialize root storages for all resource types 827cdf0e10cSrcweir m_xUserRootCommit = css::uno::Reference< css::embed::XTransactedObject >( 828cdf0e10cSrcweir m_pStorageHandler[::com::sun::star::ui::UIElementType::MENUBAR]->getOrCreateRootStorageUser(), css::uno::UNO_QUERY); // can be empty 829cdf0e10cSrcweir m_xDefaultConfigStorage = m_pStorageHandler[::com::sun::star::ui::UIElementType::MENUBAR]->getParentStorageShare( 830cdf0e10cSrcweir m_pStorageHandler[::com::sun::star::ui::UIElementType::MENUBAR]->getWorkingStorageShare()); 831cdf0e10cSrcweir m_xUserConfigStorage = m_pStorageHandler[::com::sun::star::ui::UIElementType::MENUBAR]->getParentStorageUser( 832cdf0e10cSrcweir m_pStorageHandler[::com::sun::star::ui::UIElementType::MENUBAR]->getWorkingStorageUser()); 833cdf0e10cSrcweir 834cdf0e10cSrcweir if ( m_xUserConfigStorage.is() ) 835cdf0e10cSrcweir { 836cdf0e10cSrcweir Reference< XPropertySet > xPropSet( m_xUserConfigStorage, UNO_QUERY ); 837cdf0e10cSrcweir if ( xPropSet.is() ) 838cdf0e10cSrcweir { 839cdf0e10cSrcweir long nOpenMode = 0; 840cdf0e10cSrcweir if ( xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenMode" ))) >>= nOpenMode ) 841cdf0e10cSrcweir m_bReadOnly = !( nOpenMode & ElementModes::WRITE ); 842cdf0e10cSrcweir } 843cdf0e10cSrcweir } 844cdf0e10cSrcweir 845cdf0e10cSrcweir impl_Initialize(); 846cdf0e10cSrcweir 847cdf0e10cSrcweir m_bInitialized = true; 848cdf0e10cSrcweir } 849cdf0e10cSrcweir } 850cdf0e10cSrcweir 851cdf0e10cSrcweir // XUIConfiguration 852cdf0e10cSrcweir void UIConfigurationManagerImpl::addConfigurationListener( const Reference< ::com::sun::star::ui::XUIConfigurationListener >& xListener ) throw (::com::sun::star::uno::RuntimeException) 853cdf0e10cSrcweir { 854cdf0e10cSrcweir { 855cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 856cdf0e10cSrcweir 857cdf0e10cSrcweir /* SAFE AREA ----------------------------------------------------------------------------------------------- */ 858cdf0e10cSrcweir if ( m_bDisposed ) 859cdf0e10cSrcweir throw DisposedException(); 860cdf0e10cSrcweir } 861cdf0e10cSrcweir 862cdf0e10cSrcweir m_aListenerContainer.addInterface( ::getCppuType( ( const Reference< XUIConfigurationListener >* ) NULL ), xListener ); 863cdf0e10cSrcweir } 864cdf0e10cSrcweir 865cdf0e10cSrcweir void UIConfigurationManagerImpl::removeConfigurationListener( const Reference< ::com::sun::star::ui::XUIConfigurationListener >& xListener ) throw (::com::sun::star::uno::RuntimeException) 866cdf0e10cSrcweir { 867cdf0e10cSrcweir /* SAFE AREA ----------------------------------------------------------------------------------------------- */ 868cdf0e10cSrcweir m_aListenerContainer.removeInterface( ::getCppuType( ( const Reference< XUIConfigurationListener >* ) NULL ), xListener ); 869cdf0e10cSrcweir } 870cdf0e10cSrcweir 871cdf0e10cSrcweir 872cdf0e10cSrcweir // XUIConfigurationManager 873cdf0e10cSrcweir void UIConfigurationManagerImpl::reset() throw (::com::sun::star::uno::RuntimeException) 874cdf0e10cSrcweir { 875cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 876cdf0e10cSrcweir 877cdf0e10cSrcweir /* SAFE AREA ----------------------------------------------------------------------------------------------- */ 878cdf0e10cSrcweir if ( m_bDisposed ) 879cdf0e10cSrcweir throw DisposedException(); 880cdf0e10cSrcweir 881cdf0e10cSrcweir bool bResetStorage( false ); 882cdf0e10cSrcweir 883cdf0e10cSrcweir if ( !isReadOnly() ) 884cdf0e10cSrcweir { 885cdf0e10cSrcweir // Remove all elements from our user-defined storage! 886cdf0e10cSrcweir try 887cdf0e10cSrcweir { 888cdf0e10cSrcweir for ( int i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 889cdf0e10cSrcweir { 890cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][i]; 891cdf0e10cSrcweir Reference< XStorage > xSubStorage( rElementType.xStorage, UNO_QUERY ); 892cdf0e10cSrcweir 893cdf0e10cSrcweir if ( xSubStorage.is() ) 894cdf0e10cSrcweir { 895cdf0e10cSrcweir bool bCommitSubStorage( false ); 896cdf0e10cSrcweir Reference< XNameAccess > xSubStorageNameAccess( xSubStorage, UNO_QUERY ); 897cdf0e10cSrcweir Sequence< rtl::OUString > aUIElementStreamNames = xSubStorageNameAccess->getElementNames(); 898cdf0e10cSrcweir for ( sal_Int32 j = 0; j < aUIElementStreamNames.getLength(); j++ ) 899cdf0e10cSrcweir { 900cdf0e10cSrcweir xSubStorage->removeElement( aUIElementStreamNames[j] ); 901cdf0e10cSrcweir bCommitSubStorage = true; 902cdf0e10cSrcweir } 903cdf0e10cSrcweir 904cdf0e10cSrcweir if ( bCommitSubStorage ) 905cdf0e10cSrcweir { 906cdf0e10cSrcweir Reference< XTransactedObject > xTransactedObject( xSubStorage, UNO_QUERY ); 907cdf0e10cSrcweir if ( xTransactedObject.is() ) 908cdf0e10cSrcweir xTransactedObject->commit(); 909cdf0e10cSrcweir m_pStorageHandler[i]->commitUserChanges(); 910cdf0e10cSrcweir } 911cdf0e10cSrcweir } 912cdf0e10cSrcweir } 913cdf0e10cSrcweir 914cdf0e10cSrcweir bResetStorage = true; 915cdf0e10cSrcweir 916cdf0e10cSrcweir // remove settings from user defined layer and notify listener about removed settings data! 917cdf0e10cSrcweir ConfigEventNotifyContainer aRemoveEventNotifyContainer; 918cdf0e10cSrcweir ConfigEventNotifyContainer aReplaceEventNotifyContainer; 919cdf0e10cSrcweir for ( sal_Int16 j = 1; j < ::com::sun::star::ui::UIElementType::COUNT; j++ ) 920cdf0e10cSrcweir { 921cdf0e10cSrcweir try 922cdf0e10cSrcweir { 923cdf0e10cSrcweir UIElementType& rUserElementType = m_aUIElements[LAYER_USERDEFINED][j]; 924cdf0e10cSrcweir UIElementType& rDefaultElementType = m_aUIElements[LAYER_DEFAULT][j]; 925cdf0e10cSrcweir 926cdf0e10cSrcweir impl_resetElementTypeData( rUserElementType, rDefaultElementType, aRemoveEventNotifyContainer, aReplaceEventNotifyContainer ); 927cdf0e10cSrcweir rUserElementType.bModified = sal_False; 928cdf0e10cSrcweir } 929cdf0e10cSrcweir catch ( Exception& ) 930cdf0e10cSrcweir { 931cdf0e10cSrcweir throw IOException(); 932cdf0e10cSrcweir } 933cdf0e10cSrcweir } 934cdf0e10cSrcweir 935cdf0e10cSrcweir m_bModified = sal_False; 936cdf0e10cSrcweir 937cdf0e10cSrcweir // Unlock mutex before notify our listeners 938cdf0e10cSrcweir aGuard.unlock(); 939cdf0e10cSrcweir 940cdf0e10cSrcweir // Notify our listeners 941cdf0e10cSrcweir ::std::for_each(aRemoveEventNotifyContainer.begin(),aRemoveEventNotifyContainer.end(),::boost::bind(&UIConfigurationManagerImpl::implts_notifyContainerListener,this,_1,NotifyOp_Remove)); 942cdf0e10cSrcweir ::std::for_each(aReplaceEventNotifyContainer.begin(),aReplaceEventNotifyContainer.end(),::boost::bind(&UIConfigurationManagerImpl::implts_notifyContainerListener,this,_1,NotifyOp_Replace)); 943cdf0e10cSrcweir } 944cdf0e10cSrcweir catch ( ::com::sun::star::lang::IllegalArgumentException& ) 945cdf0e10cSrcweir { 946cdf0e10cSrcweir } 947cdf0e10cSrcweir catch ( ::com::sun::star::container::NoSuchElementException& ) 948cdf0e10cSrcweir { 949cdf0e10cSrcweir } 950cdf0e10cSrcweir catch ( ::com::sun::star::embed::InvalidStorageException& ) 951cdf0e10cSrcweir { 952cdf0e10cSrcweir } 953cdf0e10cSrcweir catch ( ::com::sun::star::embed::StorageWrappedTargetException& ) 954cdf0e10cSrcweir { 955cdf0e10cSrcweir } 956cdf0e10cSrcweir } 957cdf0e10cSrcweir } 958cdf0e10cSrcweir 959cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > UIConfigurationManagerImpl::getUIElementsInfo( sal_Int16 ElementType ) 960cdf0e10cSrcweir throw ( IllegalArgumentException, RuntimeException ) 961cdf0e10cSrcweir { 962cdf0e10cSrcweir if (( ElementType < 0 ) || ( ElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 963cdf0e10cSrcweir throw IllegalArgumentException(); 964cdf0e10cSrcweir 965cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 966cdf0e10cSrcweir if ( m_bDisposed ) 967cdf0e10cSrcweir throw DisposedException(); 968cdf0e10cSrcweir 969cdf0e10cSrcweir Sequence< Sequence< PropertyValue > > aElementInfoSeq; 970cdf0e10cSrcweir UIElementInfoHashMap aUIElementInfoCollection; 971cdf0e10cSrcweir 972cdf0e10cSrcweir if ( ElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) 973cdf0e10cSrcweir { 974cdf0e10cSrcweir for ( sal_Int16 i = 0; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 975cdf0e10cSrcweir impl_fillSequenceWithElementTypeInfo( aUIElementInfoCollection, sal_Int16( i ) ); 976cdf0e10cSrcweir } 977cdf0e10cSrcweir else 978cdf0e10cSrcweir impl_fillSequenceWithElementTypeInfo( aUIElementInfoCollection, ElementType ); 979cdf0e10cSrcweir 980cdf0e10cSrcweir Sequence< PropertyValue > aUIElementInfo( 2 ); 981cdf0e10cSrcweir aUIElementInfo[0].Name = m_aPropResourceURL; 982cdf0e10cSrcweir aUIElementInfo[1].Name = m_aPropUIName; 983cdf0e10cSrcweir 984cdf0e10cSrcweir aElementInfoSeq.realloc( aUIElementInfoCollection.size() ); 985cdf0e10cSrcweir UIElementInfoHashMap::const_iterator pIter = aUIElementInfoCollection.begin(); 986cdf0e10cSrcweir 987cdf0e10cSrcweir sal_Int32 n = 0; 988cdf0e10cSrcweir while ( pIter != aUIElementInfoCollection.end() ) 989cdf0e10cSrcweir { 990cdf0e10cSrcweir aUIElementInfo[0].Value <<= pIter->second.aResourceURL; 991cdf0e10cSrcweir aUIElementInfo[1].Value <<= pIter->second.aUIName; 992cdf0e10cSrcweir aElementInfoSeq[n++] = aUIElementInfo; 993cdf0e10cSrcweir ++pIter; 994cdf0e10cSrcweir } 995cdf0e10cSrcweir 996cdf0e10cSrcweir return aElementInfoSeq; 997cdf0e10cSrcweir } 998cdf0e10cSrcweir 999cdf0e10cSrcweir Reference< XIndexContainer > UIConfigurationManagerImpl::createSettings() throw (::com::sun::star::uno::RuntimeException) 1000cdf0e10cSrcweir { 1001cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir if ( m_bDisposed ) 1004cdf0e10cSrcweir throw DisposedException(); 1005cdf0e10cSrcweir 1006cdf0e10cSrcweir // Creates an empty item container which can be filled from outside 1007cdf0e10cSrcweir return Reference< XIndexContainer >( static_cast< OWeakObject * >( new RootItemContainer() ), UNO_QUERY ); 1008cdf0e10cSrcweir } 1009cdf0e10cSrcweir 1010cdf0e10cSrcweir sal_Bool UIConfigurationManagerImpl::hasSettings( const ::rtl::OUString& ResourceURL ) 1011cdf0e10cSrcweir throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 1012cdf0e10cSrcweir { 1013cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( ResourceURL ); 1014cdf0e10cSrcweir 1015cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1016cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1017cdf0e10cSrcweir throw IllegalArgumentException(); 1018cdf0e10cSrcweir else 1019cdf0e10cSrcweir { 1020cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1021cdf0e10cSrcweir 1022cdf0e10cSrcweir if ( m_bDisposed ) 1023cdf0e10cSrcweir throw DisposedException(); 1024cdf0e10cSrcweir 1025cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( ResourceURL, nElementType, false ); 1026cdf0e10cSrcweir if ( pDataSettings && ( m_bUseDefault || !pDataSettings->bDefault) ) 1027cdf0e10cSrcweir return sal_True; 1028cdf0e10cSrcweir } 1029cdf0e10cSrcweir 1030cdf0e10cSrcweir return sal_False; 1031cdf0e10cSrcweir } 1032cdf0e10cSrcweir 1033cdf0e10cSrcweir Reference< XIndexAccess > UIConfigurationManagerImpl::getSettings( const ::rtl::OUString& ResourceURL, sal_Bool bWriteable ) 1034cdf0e10cSrcweir throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 1035cdf0e10cSrcweir { 1036cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( ResourceURL ); 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1039cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1040cdf0e10cSrcweir throw IllegalArgumentException(); 1041cdf0e10cSrcweir else 1042cdf0e10cSrcweir { 1043cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1044cdf0e10cSrcweir 1045cdf0e10cSrcweir if ( m_bDisposed ) 1046cdf0e10cSrcweir throw DisposedException(); 1047cdf0e10cSrcweir 1048cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( ResourceURL, nElementType ); 1049cdf0e10cSrcweir if ( pDataSettings && ( m_bUseDefault || !pDataSettings->bDefault) ) 1050cdf0e10cSrcweir { 1051cdf0e10cSrcweir // Create a copy of our data if someone wants to change the data. 1052cdf0e10cSrcweir if ( bWriteable ) 1053cdf0e10cSrcweir return Reference< XIndexAccess >( static_cast< OWeakObject * >( new RootItemContainer( pDataSettings->xSettings ) ), UNO_QUERY ); 1054cdf0e10cSrcweir else 1055cdf0e10cSrcweir return pDataSettings->xSettings; 1056cdf0e10cSrcweir } 1057cdf0e10cSrcweir } 1058cdf0e10cSrcweir 1059cdf0e10cSrcweir throw NoSuchElementException(); 1060cdf0e10cSrcweir } 1061cdf0e10cSrcweir 1062cdf0e10cSrcweir void UIConfigurationManagerImpl::replaceSettings( const ::rtl::OUString& ResourceURL, const Reference< ::com::sun::star::container::XIndexAccess >& aNewData ) 1063cdf0e10cSrcweir throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException) 1064cdf0e10cSrcweir { 1065cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( ResourceURL ); 1066cdf0e10cSrcweir 1067cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1068cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1069cdf0e10cSrcweir throw IllegalArgumentException(); 1070cdf0e10cSrcweir else if ( m_bReadOnly ) 1071cdf0e10cSrcweir throw IllegalAccessException(); 1072cdf0e10cSrcweir else 1073cdf0e10cSrcweir { 1074cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir if ( m_bDisposed ) 1077cdf0e10cSrcweir throw DisposedException(); 1078cdf0e10cSrcweir 1079cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( ResourceURL, nElementType ); 1080cdf0e10cSrcweir if ( pDataSettings && ( m_bUseDefault || !pDataSettings->bDefault) ) 1081cdf0e10cSrcweir { 1082cdf0e10cSrcweir if ( !m_bUseDefault || !pDataSettings->bDefaultNode ) 1083cdf0e10cSrcweir { 1084cdf0e10cSrcweir // we have a settings entry in our user-defined layer - replace 1085cdf0e10cSrcweir Reference< XIndexAccess > xOldSettings = pDataSettings->xSettings; 1086cdf0e10cSrcweir 1087cdf0e10cSrcweir // Create a copy of the data if the container is not const 1088cdf0e10cSrcweir Reference< XIndexReplace > xReplace( aNewData, UNO_QUERY ); 1089cdf0e10cSrcweir if ( xReplace.is() ) 1090cdf0e10cSrcweir pDataSettings->xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( aNewData ) ), UNO_QUERY ); 1091cdf0e10cSrcweir else 1092cdf0e10cSrcweir pDataSettings->xSettings = aNewData; 1093cdf0e10cSrcweir pDataSettings->bDefault = false; 1094cdf0e10cSrcweir pDataSettings->bModified = true; 1095cdf0e10cSrcweir m_bModified = true; 1096cdf0e10cSrcweir 1097cdf0e10cSrcweir // Modify type container 1098cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][nElementType]; 1099cdf0e10cSrcweir rElementType.bModified = true; 1100cdf0e10cSrcweir 1101cdf0e10cSrcweir Reference< XUIConfigurationManager > xThis( m_xOwner, UNO_QUERY ); 1102cdf0e10cSrcweir 1103cdf0e10cSrcweir // Create event to notify listener about replaced element settings 1104cdf0e10cSrcweir ConfigurationEvent aEvent; 1105cdf0e10cSrcweir 1106cdf0e10cSrcweir aEvent.ResourceURL = ResourceURL; 1107cdf0e10cSrcweir aEvent.Accessor <<= xThis; 1108cdf0e10cSrcweir aEvent.Source = m_xOwner; 1109cdf0e10cSrcweir aEvent.ReplacedElement <<= xOldSettings; 1110cdf0e10cSrcweir aEvent.Element <<= pDataSettings->xSettings; 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir aGuard.unlock(); 1113cdf0e10cSrcweir 1114cdf0e10cSrcweir implts_notifyContainerListener( aEvent, NotifyOp_Replace ); 1115cdf0e10cSrcweir } 1116cdf0e10cSrcweir else 1117cdf0e10cSrcweir { 1118cdf0e10cSrcweir // we have no settings in our user-defined layer - insert 1119cdf0e10cSrcweir UIElementData aUIElementData; 1120cdf0e10cSrcweir 1121cdf0e10cSrcweir aUIElementData.bDefault = false; 1122cdf0e10cSrcweir aUIElementData.bDefaultNode = false; 1123cdf0e10cSrcweir aUIElementData.bModified = true; 1124cdf0e10cSrcweir 1125cdf0e10cSrcweir // Create a copy of the data if the container is not const 1126cdf0e10cSrcweir Reference< XIndexReplace > xReplace( aNewData, UNO_QUERY ); 1127cdf0e10cSrcweir if ( xReplace.is() ) 1128cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( aNewData ) ), UNO_QUERY ); 1129cdf0e10cSrcweir else 1130cdf0e10cSrcweir aUIElementData.xSettings = aNewData; 1131cdf0e10cSrcweir aUIElementData.aName = RetrieveNameFromResourceURL( ResourceURL ) + m_aXMLPostfix; 1132cdf0e10cSrcweir aUIElementData.aResourceURL = ResourceURL; 1133cdf0e10cSrcweir m_bModified = true; 1134cdf0e10cSrcweir 1135cdf0e10cSrcweir // Modify type container 1136cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][nElementType]; 1137cdf0e10cSrcweir rElementType.bModified = true; 1138cdf0e10cSrcweir 1139cdf0e10cSrcweir UIElementDataHashMap& rElements = rElementType.aElementsHashMap; 1140cdf0e10cSrcweir 1141cdf0e10cSrcweir // Check our user element settings hash map as it can already contain settings that have been set to default! 1142cdf0e10cSrcweir // If no node can be found, we have to insert it. 1143cdf0e10cSrcweir UIElementDataHashMap::iterator pIter = rElements.find( ResourceURL ); 1144cdf0e10cSrcweir if ( pIter != rElements.end() ) 1145cdf0e10cSrcweir pIter->second = aUIElementData; 1146cdf0e10cSrcweir else 1147cdf0e10cSrcweir rElements.insert( UIElementDataHashMap::value_type( ResourceURL, aUIElementData )); 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir Reference< XUIConfigurationManager > xThis( m_xOwner, UNO_QUERY ); 1150cdf0e10cSrcweir 1151cdf0e10cSrcweir // Create event to notify listener about replaced element settings 1152cdf0e10cSrcweir ConfigurationEvent aEvent; 1153cdf0e10cSrcweir 1154cdf0e10cSrcweir aEvent.ResourceURL = ResourceURL; 1155cdf0e10cSrcweir aEvent.Accessor <<= xThis; 1156cdf0e10cSrcweir aEvent.Source = m_xOwner; 1157cdf0e10cSrcweir aEvent.ReplacedElement <<= pDataSettings->xSettings; 1158cdf0e10cSrcweir aEvent.Element <<= aUIElementData.xSettings; 1159cdf0e10cSrcweir 1160cdf0e10cSrcweir aGuard.unlock(); 1161cdf0e10cSrcweir 1162cdf0e10cSrcweir implts_notifyContainerListener( aEvent, NotifyOp_Replace ); 1163cdf0e10cSrcweir } 1164cdf0e10cSrcweir } 1165cdf0e10cSrcweir else 1166cdf0e10cSrcweir throw NoSuchElementException(); 1167cdf0e10cSrcweir } 1168cdf0e10cSrcweir } 1169cdf0e10cSrcweir 1170cdf0e10cSrcweir void UIConfigurationManagerImpl::removeSettings( const ::rtl::OUString& ResourceURL ) 1171cdf0e10cSrcweir throw ( NoSuchElementException, IllegalArgumentException, IllegalAccessException, RuntimeException) 1172cdf0e10cSrcweir { 1173cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( ResourceURL ); 1174cdf0e10cSrcweir 1175cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1176cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1177cdf0e10cSrcweir throw IllegalArgumentException(); 1178cdf0e10cSrcweir else if ( m_bReadOnly ) 1179cdf0e10cSrcweir throw IllegalAccessException(); 1180cdf0e10cSrcweir else 1181cdf0e10cSrcweir { 1182cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1183cdf0e10cSrcweir 1184cdf0e10cSrcweir if ( m_bDisposed ) 1185cdf0e10cSrcweir throw DisposedException(); 1186cdf0e10cSrcweir 1187cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( ResourceURL, nElementType ); 1188cdf0e10cSrcweir if ( pDataSettings ) 1189cdf0e10cSrcweir { 1190cdf0e10cSrcweir // If element settings are default, we don't need to change anything! 1191cdf0e10cSrcweir if ( pDataSettings->bDefault ) 1192cdf0e10cSrcweir return; 1193cdf0e10cSrcweir else 1194cdf0e10cSrcweir { 1195cdf0e10cSrcweir Reference< XIndexAccess > xRemovedSettings = pDataSettings->xSettings; 1196cdf0e10cSrcweir pDataSettings->bDefault = true; 1197cdf0e10cSrcweir 1198cdf0e10cSrcweir // check if this is a default layer node 1199cdf0e10cSrcweir if ( !m_bUseDefault || !pDataSettings->bDefaultNode ) 1200cdf0e10cSrcweir pDataSettings->bModified = true; // we have to remove this node from the user layer! 1201cdf0e10cSrcweir pDataSettings->xSettings.clear(); 1202cdf0e10cSrcweir m_bModified = true; // user layer must be written 1203cdf0e10cSrcweir 1204cdf0e10cSrcweir // Modify type container 1205cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][nElementType]; 1206cdf0e10cSrcweir rElementType.bModified = true; 1207cdf0e10cSrcweir 1208cdf0e10cSrcweir Reference< XUIConfigurationManager > xThis( m_xOwner, UNO_QUERY ); 1209cdf0e10cSrcweir // Check if we have settings in the default layer which replaces the user-defined one! 1210cdf0e10cSrcweir UIElementData* pDefaultDataSettings = m_bUseDefault ? impl_findUIElementData( ResourceURL, nElementType ) : NULL; 1211cdf0e10cSrcweir if ( pDefaultDataSettings ) 1212cdf0e10cSrcweir { 1213cdf0e10cSrcweir // Create event to notify listener about replaced element settings 1214cdf0e10cSrcweir ConfigurationEvent aEvent; 1215cdf0e10cSrcweir 1216cdf0e10cSrcweir aEvent.ResourceURL = ResourceURL; 1217cdf0e10cSrcweir aEvent.Accessor <<= xThis; 1218cdf0e10cSrcweir aEvent.Source = m_xOwner; 1219cdf0e10cSrcweir aEvent.Element <<= xRemovedSettings; 1220cdf0e10cSrcweir aEvent.ReplacedElement <<= pDefaultDataSettings->xSettings; 1221cdf0e10cSrcweir 1222cdf0e10cSrcweir aGuard.unlock(); 1223cdf0e10cSrcweir 1224cdf0e10cSrcweir implts_notifyContainerListener( aEvent, NotifyOp_Replace ); 1225cdf0e10cSrcweir } 1226cdf0e10cSrcweir else 1227cdf0e10cSrcweir { 1228cdf0e10cSrcweir // Create event to notify listener about removed element settings 1229cdf0e10cSrcweir ConfigurationEvent aEvent; 1230cdf0e10cSrcweir 1231cdf0e10cSrcweir aEvent.ResourceURL = ResourceURL; 1232cdf0e10cSrcweir aEvent.Accessor <<= xThis; 1233cdf0e10cSrcweir aEvent.Source = m_xOwner; 1234cdf0e10cSrcweir aEvent.Element <<= xRemovedSettings; 1235cdf0e10cSrcweir 1236cdf0e10cSrcweir aGuard.unlock(); 1237cdf0e10cSrcweir 1238cdf0e10cSrcweir implts_notifyContainerListener( aEvent, NotifyOp_Remove ); 1239cdf0e10cSrcweir } 1240cdf0e10cSrcweir } 1241cdf0e10cSrcweir } 1242cdf0e10cSrcweir else 1243cdf0e10cSrcweir throw NoSuchElementException(); 1244cdf0e10cSrcweir } 1245cdf0e10cSrcweir } 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir void UIConfigurationManagerImpl::insertSettings( const ::rtl::OUString& NewResourceURL, const Reference< XIndexAccess >& aNewData ) 1248cdf0e10cSrcweir throw ( ElementExistException, IllegalArgumentException, IllegalAccessException, RuntimeException ) 1249cdf0e10cSrcweir { 1250cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( NewResourceURL ); 1251cdf0e10cSrcweir 1252cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1253cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1254cdf0e10cSrcweir throw IllegalArgumentException(); 1255cdf0e10cSrcweir else if ( m_bReadOnly ) 1256cdf0e10cSrcweir throw IllegalAccessException(); 1257cdf0e10cSrcweir else 1258cdf0e10cSrcweir { 1259cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1260cdf0e10cSrcweir 1261cdf0e10cSrcweir if ( m_bDisposed ) 1262cdf0e10cSrcweir throw DisposedException(); 1263cdf0e10cSrcweir 1264cdf0e10cSrcweir bool bInsertData( false ); 1265cdf0e10cSrcweir UIElementData aUIElementData; 1266cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( NewResourceURL, nElementType ); 1267cdf0e10cSrcweir if ( !m_bUseDefault ) 1268cdf0e10cSrcweir { 1269cdf0e10cSrcweir if ( pDataSettings && !pDataSettings->bDefault ) 1270cdf0e10cSrcweir throw ElementExistException(); 1271cdf0e10cSrcweir if ( !pDataSettings ) 1272cdf0e10cSrcweir { 1273cdf0e10cSrcweir pDataSettings = &aUIElementData; 1274cdf0e10cSrcweir bInsertData = true; 1275cdf0e10cSrcweir } 1276cdf0e10cSrcweir } 1277cdf0e10cSrcweir if ( !pDataSettings || !m_bUseDefault ) 1278cdf0e10cSrcweir { 1279cdf0e10cSrcweir aUIElementData.bDefault = false; 1280cdf0e10cSrcweir if ( !m_bUseDefault ) 1281cdf0e10cSrcweir aUIElementData.bDefaultNode = false; 1282cdf0e10cSrcweir aUIElementData.bModified = true; 1283cdf0e10cSrcweir 1284cdf0e10cSrcweir // Create a copy of the data if the container is not const 1285cdf0e10cSrcweir Reference< XIndexReplace > xReplace( aNewData, UNO_QUERY ); 1286cdf0e10cSrcweir if ( xReplace.is() ) 1287cdf0e10cSrcweir aUIElementData.xSettings = Reference< XIndexAccess >( static_cast< OWeakObject * >( new ConstItemContainer( aNewData ) ), UNO_QUERY ); 1288cdf0e10cSrcweir else 1289cdf0e10cSrcweir aUIElementData.xSettings = aNewData; 1290cdf0e10cSrcweir 1291cdf0e10cSrcweir m_bModified = true; 1292cdf0e10cSrcweir 1293cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][nElementType]; 1294cdf0e10cSrcweir rElementType.bModified = true; 1295cdf0e10cSrcweir 1296cdf0e10cSrcweir if ( bInsertData ) 1297cdf0e10cSrcweir { 1298cdf0e10cSrcweir aUIElementData.aName = RetrieveNameFromResourceURL( NewResourceURL ) + m_aXMLPostfix; 1299cdf0e10cSrcweir aUIElementData.aResourceURL = NewResourceURL; 1300cdf0e10cSrcweir UIElementDataHashMap& rElements = rElementType.aElementsHashMap; 1301cdf0e10cSrcweir rElements.insert( UIElementDataHashMap::value_type( NewResourceURL, aUIElementData )); 1302cdf0e10cSrcweir } 1303cdf0e10cSrcweir 1304cdf0e10cSrcweir Reference< XIndexAccess > xInsertSettings( aUIElementData.xSettings ); 1305cdf0e10cSrcweir Reference< XUIConfigurationManager > xThis( m_xOwner, UNO_QUERY ); 1306cdf0e10cSrcweir 1307cdf0e10cSrcweir // Create event to notify listener about removed element settings 1308cdf0e10cSrcweir ConfigurationEvent aEvent; 1309cdf0e10cSrcweir 1310cdf0e10cSrcweir aEvent.ResourceURL = NewResourceURL; 1311cdf0e10cSrcweir aEvent.Accessor <<= xThis; 1312cdf0e10cSrcweir aEvent.Source = m_xOwner; 1313cdf0e10cSrcweir aEvent.Element <<= xInsertSettings; 1314cdf0e10cSrcweir 1315cdf0e10cSrcweir aGuard.unlock(); 1316cdf0e10cSrcweir 1317cdf0e10cSrcweir implts_notifyContainerListener( aEvent, NotifyOp_Insert ); 1318cdf0e10cSrcweir } 1319cdf0e10cSrcweir else 1320cdf0e10cSrcweir throw ElementExistException(); 1321cdf0e10cSrcweir } 1322cdf0e10cSrcweir } 1323cdf0e10cSrcweir 1324cdf0e10cSrcweir Reference< XInterface > UIConfigurationManagerImpl::getImageManager() throw (::com::sun::star::uno::RuntimeException) 1325cdf0e10cSrcweir { 1326cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1327cdf0e10cSrcweir 1328cdf0e10cSrcweir if ( m_bDisposed ) 1329cdf0e10cSrcweir throw DisposedException(); 1330cdf0e10cSrcweir 1331cdf0e10cSrcweir if ( !m_xModuleImageManager.is() ) 1332cdf0e10cSrcweir { 1333cdf0e10cSrcweir if ( m_bUseDefault ) 1334cdf0e10cSrcweir m_xModuleImageManager = Reference< XComponent >( static_cast< cppu::OWeakObject *>( new ModuleImageManager( m_xServiceManager )), 1335cdf0e10cSrcweir UNO_QUERY ); 1336cdf0e10cSrcweir else 1337cdf0e10cSrcweir m_xModuleImageManager = Reference< XComponent >( static_cast< cppu::OWeakObject *>( new ImageManager( m_xServiceManager )), 1338cdf0e10cSrcweir UNO_QUERY ); 1339cdf0e10cSrcweir Reference< XInitialization > xInit( m_xModuleImageManager, UNO_QUERY ); 1340cdf0e10cSrcweir 1341cdf0e10cSrcweir Sequence< Any > aPropSeq( m_bUseDefault ? 3 : 2 ); 1342cdf0e10cSrcweir PropertyValue aPropValue; 1343cdf0e10cSrcweir aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UserConfigStorage" )); 1344cdf0e10cSrcweir aPropValue.Value <<= m_xUserConfigStorage; 1345cdf0e10cSrcweir aPropSeq[0] <<= aPropValue; 1346cdf0e10cSrcweir aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ModuleIdentifier" )); 1347cdf0e10cSrcweir aPropValue.Value <<= m_aModuleIdentifier; 1348cdf0e10cSrcweir aPropSeq[1] <<= aPropValue; 1349cdf0e10cSrcweir if ( m_bUseDefault ) 1350cdf0e10cSrcweir { 1351cdf0e10cSrcweir aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UserRootCommit" )); 1352cdf0e10cSrcweir aPropValue.Value <<= m_xUserRootCommit; 1353cdf0e10cSrcweir aPropSeq[2] <<= aPropValue; 1354cdf0e10cSrcweir } 1355cdf0e10cSrcweir 1356cdf0e10cSrcweir xInit->initialize( aPropSeq ); 1357cdf0e10cSrcweir } 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir return Reference< XInterface >( m_xModuleImageManager, UNO_QUERY ); 1360cdf0e10cSrcweir 1361cdf0e10cSrcweir // return Reference< XInterface >(); 1362cdf0e10cSrcweir } 1363cdf0e10cSrcweir 1364cdf0e10cSrcweir Reference< XInterface > UIConfigurationManagerImpl::getShortCutManager() throw (::com::sun::star::uno::RuntimeException) 1365cdf0e10cSrcweir { 1366cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1367cdf0e10cSrcweir if ( !m_bUseDefault && m_xAccConfig.is()) 1368cdf0e10cSrcweir return m_xAccConfig; 1369cdf0e10cSrcweir 1370cdf0e10cSrcweir Reference< XMultiServiceFactory > xSMGR = m_xServiceManager; 1371cdf0e10cSrcweir ::rtl::OUString aModule = m_aModuleIdentifier; 1372cdf0e10cSrcweir Reference< XStorage > xDocumentRoot = m_xUserConfigStorage; 1373cdf0e10cSrcweir aGuard.unlock(); 1374cdf0e10cSrcweir Reference< XInterface > xManager = xSMGR->createInstance(m_bUseDefault ? SERVICENAME_MODULEACCELERATORCONFIGURATION : SERVICENAME_DOCUMENTACCELERATORCONFIGURATION ); 1375cdf0e10cSrcweir Reference< XInitialization > xInit (xManager, UNO_QUERY_THROW); 1376cdf0e10cSrcweir 1377cdf0e10cSrcweir PropertyValue aProp; 1378cdf0e10cSrcweir Sequence< Any > lArgs(1); 1379cdf0e10cSrcweir if ( m_bUseDefault ) 1380cdf0e10cSrcweir { 1381cdf0e10cSrcweir aProp.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ModuleIdentifier")); 1382cdf0e10cSrcweir aProp.Value <<= aModule; 1383cdf0e10cSrcweir } // if ( m_bUseDefault ) 1384cdf0e10cSrcweir else 1385cdf0e10cSrcweir { 1386cdf0e10cSrcweir aProp.Name = ::rtl::OUString::createFromAscii("DocumentRoot"); 1387cdf0e10cSrcweir aProp.Value <<= xDocumentRoot; 1388cdf0e10cSrcweir } 1389cdf0e10cSrcweir lArgs[0] <<= aProp; 1390cdf0e10cSrcweir xInit->initialize(lArgs); 1391cdf0e10cSrcweir 1392cdf0e10cSrcweir if ( !m_bUseDefault ) 1393cdf0e10cSrcweir { 1394cdf0e10cSrcweir // SAFE -> 1395cdf0e10cSrcweir aGuard.lock(); 1396cdf0e10cSrcweir m_xAccConfig = xManager; 1397cdf0e10cSrcweir aGuard.unlock(); 1398cdf0e10cSrcweir // <- SAFE 1399cdf0e10cSrcweir } 1400cdf0e10cSrcweir 1401cdf0e10cSrcweir return xManager; 1402cdf0e10cSrcweir } 1403cdf0e10cSrcweir 1404cdf0e10cSrcweir Reference< XInterface > UIConfigurationManagerImpl::getEventsManager() throw (::com::sun::star::uno::RuntimeException) 1405cdf0e10cSrcweir { 1406cdf0e10cSrcweir return Reference< XInterface >(); 1407cdf0e10cSrcweir } 1408cdf0e10cSrcweir // XUIConfigurationStorage 1409cdf0e10cSrcweir void UIConfigurationManagerImpl::setStorage( const Reference< XStorage >& Storage ) throw (::com::sun::star::uno::RuntimeException) 1410cdf0e10cSrcweir { 1411cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1412cdf0e10cSrcweir 1413cdf0e10cSrcweir if ( m_bDisposed ) 1414cdf0e10cSrcweir throw DisposedException(); 1415cdf0e10cSrcweir 1416cdf0e10cSrcweir if ( m_xUserConfigStorage.is() ) 1417cdf0e10cSrcweir { 1418cdf0e10cSrcweir try 1419cdf0e10cSrcweir { 1420cdf0e10cSrcweir // Dispose old storage to be sure that it will be closed 1421cdf0e10cSrcweir Reference< XComponent > xComponent( m_xUserConfigStorage, UNO_QUERY ); 1422cdf0e10cSrcweir if ( xComponent.is() ) 1423cdf0e10cSrcweir xComponent->dispose(); 1424cdf0e10cSrcweir } 1425cdf0e10cSrcweir catch ( Exception& ) 1426cdf0e10cSrcweir { 1427cdf0e10cSrcweir } 1428cdf0e10cSrcweir } 1429cdf0e10cSrcweir 1430cdf0e10cSrcweir // We store the new storage. Be careful it could be an empty reference! 1431cdf0e10cSrcweir m_xUserConfigStorage = Storage; 1432cdf0e10cSrcweir m_bReadOnly = sal_True; 1433cdf0e10cSrcweir 1434cdf0e10cSrcweir Reference< XUIConfigurationStorage > xAccUpdate(m_xAccConfig, UNO_QUERY); 1435cdf0e10cSrcweir if ( xAccUpdate.is() ) 1436cdf0e10cSrcweir xAccUpdate->setStorage( m_xUserConfigStorage ); 1437cdf0e10cSrcweir 1438cdf0e10cSrcweir if ( m_xModuleImageManager.is() ) 1439cdf0e10cSrcweir { 1440cdf0e10cSrcweir ImageManager* pImageManager = (ImageManager*)m_xModuleImageManager.get(); 1441cdf0e10cSrcweir if ( pImageManager ) 1442cdf0e10cSrcweir pImageManager->setStorage( m_xUserConfigStorage ); 1443cdf0e10cSrcweir } 1444cdf0e10cSrcweir 1445cdf0e10cSrcweir if ( m_xUserConfigStorage.is() ) 1446cdf0e10cSrcweir { 1447cdf0e10cSrcweir ::rtl::OUString sEmpty; 1448cdf0e10cSrcweir for ( int i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 1449cdf0e10cSrcweir { 1450cdf0e10cSrcweir rtl::OUString aResourceType; 1451cdf0e10cSrcweir if ( i == ::com::sun::star::ui::UIElementType::MENUBAR ) 1452cdf0e10cSrcweir aResourceType = PresetHandler::RESOURCETYPE_MENUBAR(); 1453cdf0e10cSrcweir else if ( i == ::com::sun::star::ui::UIElementType::TOOLBAR ) 1454cdf0e10cSrcweir aResourceType = PresetHandler::RESOURCETYPE_TOOLBAR(); 1455cdf0e10cSrcweir else if ( i == ::com::sun::star::ui::UIElementType::STATUSBAR ) 1456cdf0e10cSrcweir aResourceType = PresetHandler::RESOURCETYPE_STATUSBAR(); 1457cdf0e10cSrcweir 1458cdf0e10cSrcweir //if ( aResourceType.getLength() > 0 ) 1459cdf0e10cSrcweir { 1460cdf0e10cSrcweir m_pStorageHandler[i] = new PresetHandler( m_xServiceManager ); 1461cdf0e10cSrcweir m_pStorageHandler[i]->connectToResource( PresetHandler::E_DOCUMENT, 1462cdf0e10cSrcweir rtl::OUString::createFromAscii( UIELEMENTTYPENAMES[i] ), // this path wont be used later ... seee next lines! 1463cdf0e10cSrcweir sEmpty, 1464cdf0e10cSrcweir m_xUserConfigStorage); 1465cdf0e10cSrcweir } 1466cdf0e10cSrcweir } 1467cdf0e10cSrcweir Reference< XPropertySet > xPropSet( m_xUserConfigStorage, UNO_QUERY ); 1468cdf0e10cSrcweir if ( xPropSet.is() ) 1469cdf0e10cSrcweir { 1470cdf0e10cSrcweir try 1471cdf0e10cSrcweir { 1472cdf0e10cSrcweir long nOpenMode = 0; 1473cdf0e10cSrcweir if ( xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OpenMode" ))) >>= nOpenMode ) 1474cdf0e10cSrcweir m_bReadOnly = !( nOpenMode & ElementModes::WRITE ); 1475cdf0e10cSrcweir } 1476cdf0e10cSrcweir catch ( com::sun::star::beans::UnknownPropertyException& ) 1477cdf0e10cSrcweir { 1478cdf0e10cSrcweir } 1479cdf0e10cSrcweir catch ( com::sun::star::lang::WrappedTargetException& ) 1480cdf0e10cSrcweir { 1481cdf0e10cSrcweir } 1482cdf0e10cSrcweir } 1483cdf0e10cSrcweir } 1484cdf0e10cSrcweir 1485cdf0e10cSrcweir impl_Initialize(); 1486cdf0e10cSrcweir } 1487cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1488cdf0e10cSrcweir sal_Bool UIConfigurationManagerImpl::hasStorage() throw (::com::sun::star::uno::RuntimeException) 1489cdf0e10cSrcweir { 1490cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1491cdf0e10cSrcweir 1492cdf0e10cSrcweir if ( m_bDisposed ) 1493cdf0e10cSrcweir throw DisposedException(); 1494cdf0e10cSrcweir 1495cdf0e10cSrcweir return ( m_xUserConfigStorage.is() ); 1496cdf0e10cSrcweir } 1497cdf0e10cSrcweir 1498cdf0e10cSrcweir // XUIConfigurationManagerImpl 1499cdf0e10cSrcweir sal_Bool UIConfigurationManagerImpl::isDefaultSettings( const ::rtl::OUString& ResourceURL ) 1500cdf0e10cSrcweir throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 1501cdf0e10cSrcweir { 1502cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( ResourceURL ); 1503cdf0e10cSrcweir 1504cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1505cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1506cdf0e10cSrcweir throw IllegalArgumentException(); 1507cdf0e10cSrcweir else 1508cdf0e10cSrcweir { 1509cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1510cdf0e10cSrcweir 1511cdf0e10cSrcweir if ( m_bDisposed ) 1512cdf0e10cSrcweir throw DisposedException(); 1513cdf0e10cSrcweir 1514cdf0e10cSrcweir UIElementData* pDataSettings = impl_findUIElementData( ResourceURL, nElementType, false ); 1515cdf0e10cSrcweir if ( pDataSettings && pDataSettings->bDefaultNode ) 1516cdf0e10cSrcweir return sal_True; 1517cdf0e10cSrcweir } 1518cdf0e10cSrcweir 1519cdf0e10cSrcweir return sal_False; 1520cdf0e10cSrcweir } 1521cdf0e10cSrcweir 1522cdf0e10cSrcweir Reference< XIndexAccess > UIConfigurationManagerImpl::getDefaultSettings( const ::rtl::OUString& ResourceURL ) 1523cdf0e10cSrcweir throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) 1524cdf0e10cSrcweir { 1525cdf0e10cSrcweir sal_Int16 nElementType = RetrieveTypeFromResourceURL( ResourceURL ); 1526cdf0e10cSrcweir 1527cdf0e10cSrcweir if (( nElementType == ::com::sun::star::ui::UIElementType::UNKNOWN ) || 1528cdf0e10cSrcweir ( nElementType >= ::com::sun::star::ui::UIElementType::COUNT )) 1529cdf0e10cSrcweir throw IllegalArgumentException(); 1530cdf0e10cSrcweir else 1531cdf0e10cSrcweir { 1532cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1533cdf0e10cSrcweir 1534cdf0e10cSrcweir if ( m_bDisposed ) 1535cdf0e10cSrcweir throw DisposedException(); 1536cdf0e10cSrcweir 1537cdf0e10cSrcweir // preload list of element types on demand 1538cdf0e10cSrcweir impl_preloadUIElementTypeList( LAYER_DEFAULT, nElementType ); 1539cdf0e10cSrcweir 1540cdf0e10cSrcweir // Look into our default vector/hash_map combination 1541cdf0e10cSrcweir UIElementDataHashMap& rDefaultHashMap = m_aUIElements[LAYER_DEFAULT][nElementType].aElementsHashMap; 1542cdf0e10cSrcweir UIElementDataHashMap::iterator pIter = rDefaultHashMap.find( ResourceURL ); 1543cdf0e10cSrcweir if ( pIter != rDefaultHashMap.end() ) 1544cdf0e10cSrcweir { 1545cdf0e10cSrcweir if ( !pIter->second.xSettings.is() ) 1546cdf0e10cSrcweir impl_requestUIElementData( nElementType, LAYER_DEFAULT, pIter->second ); 1547cdf0e10cSrcweir return pIter->second.xSettings; 1548cdf0e10cSrcweir } 1549cdf0e10cSrcweir } 1550cdf0e10cSrcweir 1551cdf0e10cSrcweir // Nothing has been found! 1552cdf0e10cSrcweir throw NoSuchElementException(); 1553cdf0e10cSrcweir } 1554cdf0e10cSrcweir 1555cdf0e10cSrcweir // XUIConfigurationPersistence 1556cdf0e10cSrcweir void UIConfigurationManagerImpl::reload() throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) 1557cdf0e10cSrcweir { 1558cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1559cdf0e10cSrcweir 1560cdf0e10cSrcweir if ( m_bDisposed ) 1561cdf0e10cSrcweir throw DisposedException(); 1562cdf0e10cSrcweir 1563cdf0e10cSrcweir if ( m_xUserConfigStorage.is() && m_bModified && !m_bReadOnly ) 1564cdf0e10cSrcweir { 1565cdf0e10cSrcweir // Try to access our module sub folder 1566cdf0e10cSrcweir ConfigEventNotifyContainer aRemoveNotifyContainer; 1567cdf0e10cSrcweir ConfigEventNotifyContainer aReplaceNotifyContainer; 1568cdf0e10cSrcweir for ( sal_Int16 i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 1569cdf0e10cSrcweir { 1570cdf0e10cSrcweir try 1571cdf0e10cSrcweir { 1572cdf0e10cSrcweir UIElementType& rUserElementType = m_aUIElements[LAYER_USERDEFINED][i]; 1573cdf0e10cSrcweir UIElementType& rDefaultElementType = m_aUIElements[LAYER_DEFAULT][i]; 1574cdf0e10cSrcweir 1575cdf0e10cSrcweir if ( rUserElementType.bModified ) 1576cdf0e10cSrcweir impl_reloadElementTypeData( rUserElementType, rDefaultElementType, aRemoveNotifyContainer, aReplaceNotifyContainer ); 1577cdf0e10cSrcweir } 1578cdf0e10cSrcweir catch ( Exception& ) 1579cdf0e10cSrcweir { 1580cdf0e10cSrcweir throw IOException(); 1581cdf0e10cSrcweir } 1582cdf0e10cSrcweir } 1583cdf0e10cSrcweir 1584cdf0e10cSrcweir m_bModified = sal_False; 1585cdf0e10cSrcweir 1586cdf0e10cSrcweir // Unlock mutex before notify our listeners 1587cdf0e10cSrcweir aGuard.unlock(); 1588cdf0e10cSrcweir 1589cdf0e10cSrcweir // Notify our listeners 1590cdf0e10cSrcweir ::std::for_each(aRemoveNotifyContainer.begin(),aRemoveNotifyContainer.end(),::boost::bind(&UIConfigurationManagerImpl::implts_notifyContainerListener,this,_1,NotifyOp_Remove)); 1591cdf0e10cSrcweir ::std::for_each(aReplaceNotifyContainer.begin(),aReplaceNotifyContainer.end(),::boost::bind(&UIConfigurationManagerImpl::implts_notifyContainerListener,this,_1,NotifyOp_Replace)); 1592cdf0e10cSrcweir } 1593cdf0e10cSrcweir } 1594cdf0e10cSrcweir 1595cdf0e10cSrcweir void UIConfigurationManagerImpl::store() throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) 1596cdf0e10cSrcweir { 1597cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1598cdf0e10cSrcweir 1599cdf0e10cSrcweir if ( m_bDisposed ) 1600cdf0e10cSrcweir throw DisposedException(); 1601cdf0e10cSrcweir 1602cdf0e10cSrcweir if ( m_xUserConfigStorage.is() && m_bModified && !m_bReadOnly ) 1603cdf0e10cSrcweir { 1604cdf0e10cSrcweir // Try to access our module sub folder 1605cdf0e10cSrcweir for ( int i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 1606cdf0e10cSrcweir { 1607cdf0e10cSrcweir try 1608cdf0e10cSrcweir { 1609cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][i]; 1610cdf0e10cSrcweir Reference< XStorage > xStorage( rElementType.xStorage, UNO_QUERY ); 1611cdf0e10cSrcweir 1612cdf0e10cSrcweir if ( rElementType.bModified && xStorage.is() ) 1613cdf0e10cSrcweir { 1614cdf0e10cSrcweir impl_storeElementTypeData( xStorage, rElementType ); 1615cdf0e10cSrcweir m_pStorageHandler[i]->commitUserChanges(); 1616cdf0e10cSrcweir } 1617cdf0e10cSrcweir } 1618cdf0e10cSrcweir catch ( Exception& ) 1619cdf0e10cSrcweir { 1620cdf0e10cSrcweir throw IOException(); 1621cdf0e10cSrcweir } 1622cdf0e10cSrcweir } 1623cdf0e10cSrcweir 1624cdf0e10cSrcweir m_bModified = false; 1625cdf0e10cSrcweir } 1626cdf0e10cSrcweir } 1627cdf0e10cSrcweir 1628cdf0e10cSrcweir void UIConfigurationManagerImpl::storeToStorage( const Reference< XStorage >& Storage ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) 1629cdf0e10cSrcweir { 1630cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1631cdf0e10cSrcweir 1632cdf0e10cSrcweir if ( m_bDisposed ) 1633cdf0e10cSrcweir throw DisposedException(); 1634cdf0e10cSrcweir 1635cdf0e10cSrcweir if ( m_xUserConfigStorage.is() && m_bModified && !m_bReadOnly ) 1636cdf0e10cSrcweir { 1637cdf0e10cSrcweir // Try to access our module sub folder 1638cdf0e10cSrcweir for ( int i = 1; i < ::com::sun::star::ui::UIElementType::COUNT; i++ ) 1639cdf0e10cSrcweir { 1640cdf0e10cSrcweir try 1641cdf0e10cSrcweir { 1642cdf0e10cSrcweir Reference< XStorage > xElementTypeStorage( Storage->openStorageElement( 1643cdf0e10cSrcweir rtl::OUString::createFromAscii( UIELEMENTTYPENAMES[i] ), ElementModes::READWRITE )); 1644cdf0e10cSrcweir UIElementType& rElementType = m_aUIElements[LAYER_USERDEFINED][i]; 1645cdf0e10cSrcweir 1646cdf0e10cSrcweir if ( rElementType.bModified && xElementTypeStorage.is() ) 1647cdf0e10cSrcweir impl_storeElementTypeData( xElementTypeStorage, rElementType, false ); // store data to storage, but don't reset modify flag! 1648cdf0e10cSrcweir } 1649cdf0e10cSrcweir catch ( Exception& ) 1650cdf0e10cSrcweir { 1651cdf0e10cSrcweir throw IOException(); 1652cdf0e10cSrcweir } 1653cdf0e10cSrcweir } 1654cdf0e10cSrcweir 1655cdf0e10cSrcweir Reference< XTransactedObject > xTransactedObject( Storage, UNO_QUERY ); 1656cdf0e10cSrcweir if ( xTransactedObject.is() ) 1657cdf0e10cSrcweir xTransactedObject->commit(); 1658cdf0e10cSrcweir } 1659cdf0e10cSrcweir } 1660cdf0e10cSrcweir 1661cdf0e10cSrcweir sal_Bool UIConfigurationManagerImpl::isModified() throw (::com::sun::star::uno::RuntimeException) 1662cdf0e10cSrcweir { 1663cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1664cdf0e10cSrcweir 1665cdf0e10cSrcweir return m_bModified; 1666cdf0e10cSrcweir } 1667cdf0e10cSrcweir 1668cdf0e10cSrcweir sal_Bool UIConfigurationManagerImpl::isReadOnly() throw (::com::sun::star::uno::RuntimeException) 1669cdf0e10cSrcweir { 1670cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 1671cdf0e10cSrcweir 1672cdf0e10cSrcweir return m_bReadOnly; 1673cdf0e10cSrcweir } 1674cdf0e10cSrcweir 1675cdf0e10cSrcweir void UIConfigurationManagerImpl::implts_notifyContainerListener( const ConfigurationEvent& aEvent, NotifyOp eOp ) 1676cdf0e10cSrcweir { 1677cdf0e10cSrcweir ::cppu::OInterfaceContainerHelper* pContainer = m_aListenerContainer.getContainer( ::getCppuType( ( const css::uno::Reference< ::com::sun::star::ui::XUIConfigurationListener >*) NULL ) ); 1678cdf0e10cSrcweir if ( pContainer != NULL ) 1679cdf0e10cSrcweir { 1680cdf0e10cSrcweir ::cppu::OInterfaceIteratorHelper pIterator( *pContainer ); 1681cdf0e10cSrcweir while ( pIterator.hasMoreElements() ) 1682cdf0e10cSrcweir { 1683cdf0e10cSrcweir try 1684cdf0e10cSrcweir { 1685cdf0e10cSrcweir switch ( eOp ) 1686cdf0e10cSrcweir { 1687cdf0e10cSrcweir case NotifyOp_Replace: 1688cdf0e10cSrcweir ((::com::sun::star::ui::XUIConfigurationListener*)pIterator.next())->elementReplaced( aEvent ); 1689cdf0e10cSrcweir break; 1690cdf0e10cSrcweir case NotifyOp_Insert: 1691cdf0e10cSrcweir ((::com::sun::star::ui::XUIConfigurationListener*)pIterator.next())->elementInserted( aEvent ); 1692cdf0e10cSrcweir break; 1693cdf0e10cSrcweir case NotifyOp_Remove: 1694cdf0e10cSrcweir ((::com::sun::star::ui::XUIConfigurationListener*)pIterator.next())->elementRemoved( aEvent ); 1695cdf0e10cSrcweir break; 1696cdf0e10cSrcweir } 1697cdf0e10cSrcweir } 1698cdf0e10cSrcweir catch( css::uno::RuntimeException& ) 1699cdf0e10cSrcweir { 1700cdf0e10cSrcweir pIterator.remove(); 1701cdf0e10cSrcweir } 1702cdf0e10cSrcweir } 1703cdf0e10cSrcweir } 1704cdf0e10cSrcweir } 1705cdf0e10cSrcweir 1706cdf0e10cSrcweir } // namespace framework 1707