--- framework/source/accelerators/acceleratorconfiguration.cxx 2006-04-24 17:17:46.000000000 +0000 +++ framework/source/accelerators/acceleratorconfiguration.cxx 2006-04-24 17:59:05.000000000 +0000 @@ -340,9 +340,16 @@ void SAL_CALL AcceleratorConfiguration:: throw(css::uno::Exception , css::uno::RuntimeException) { + css::uno::Reference< css::io::XStream > xStreamNoLang; + // SAFE -> ---------------------------------- ReadGuard aReadLock(m_aLock); css::uno::Reference< css::io::XStream > xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), sal_True); // TRUE => open or create! + try + { + xStreamNoLang = m_aPresetHandler.openPreset(PresetHandler::PRESET_DEFAULT(), sal_True); + } + catch(const css::io::IOException&) {} // does not have to exist aReadLock.unlock(); // <- SAFE ---------------------------------- @@ -354,7 +361,19 @@ void SAL_CALL AcceleratorConfiguration:: ::rtl::OUString::createFromAscii("Could not open accelerator configuration for reading."), static_cast< ::cppu::OWeakObject* >(this)); + // impl_ts_load() does not clear the cache + m_aReadCache = AcceleratorCache(); + impl_ts_load(xIn); + + // Load also the general language independent default accelerators + // (ignoring the already defined accelerators) + if (xStreamNoLang.is()) + { + xIn = xStreamNoLang->getInputStream(); + if (xIn.is()) + impl_ts_load(xIn); + } } //----------------------------------------------- @@ -519,12 +535,15 @@ void AcceleratorConfiguration::impl_ts_l if (xSeek.is()) xSeek->seek(0); + // add accelerators to the cache (the cache is not cleared) + // SAFE -> ---------------------------------- + aWriteLock.lock(); + // create the parser queue // Note: Use special filter object between parser and reader // to get filtered xml with right namespaces ... // Use further a temp cache for reading! - AcceleratorCache aCache ; - AcceleratorConfigurationReader* pReader = new AcceleratorConfigurationReader(aCache); + AcceleratorConfigurationReader* pReader = new AcceleratorConfigurationReader(m_aReadCache); css::uno::Reference< css::xml::sax::XDocumentHandler > xReader (static_cast< ::cppu::OWeakObject* >(pReader), css::uno::UNO_QUERY_THROW); SaxNamespaceFilter* pFilter = new SaxNamespaceFilter(xReader); css::uno::Reference< css::xml::sax::XDocumentHandler > xFilter (static_cast< ::cppu::OWeakObject* >(pFilter), css::uno::UNO_QUERY_THROW); @@ -539,10 +558,6 @@ void AcceleratorConfiguration::impl_ts_l // TODO think about error handling xParser->parseStream(aSource); - // take over the filled cache - // SAFE -> ---------------------------------- - aWriteLock.lock(); - m_aReadCache = aCache; aWriteLock.unlock(); // <- SAFE ---------------------------------- } --- framework/source/accelerators/presethandler.cxx 2005-09-30 10:11:22.000000000 +0000 +++ framework/source/accelerators/presethandler.cxx 2006-04-24 17:48:53.000000000 +0000 @@ -175,12 +175,14 @@ PresetHandler::PresetHandler(const Prese m_sModule = rCopy.m_sModule; m_aSharedStorages = rCopy.m_aSharedStorages; m_xWorkingStorageShare = rCopy.m_xWorkingStorageShare; + m_xWorkingStorageNoLang = rCopy.m_xWorkingStorageNoLang; m_xWorkingStorageUser = rCopy.m_xWorkingStorageUser; m_lPresets = rCopy.m_lPresets; m_lTargets = rCopy.m_lTargets; m_aLocale = rCopy.m_aLocale; m_lDocumentStorages = rCopy.m_lDocumentStorages; m_sRelPathShare = rCopy.m_sRelPathShare; + m_sRelPathNoLang = rCopy.m_sRelPathNoLang; m_sRelPathUser = rCopy.m_sRelPathUser; } @@ -188,6 +190,7 @@ PresetHandler::PresetHandler(const Prese PresetHandler::~PresetHandler() { m_xWorkingStorageShare.clear(); + m_xWorkingStorageNoLang.clear(); m_xWorkingStorageUser.clear(); /* #i46497# @@ -219,6 +223,7 @@ void PresetHandler::forgetCachedStorages if (m_eConfigType == E_DOCUMENT) { m_xWorkingStorageShare.clear(); + m_xWorkingStorageNoLang.clear(); m_xWorkingStorageUser.clear(); } @@ -379,6 +384,7 @@ void PresetHandler::connectToResource( // <- SAFE ---------------------------------- css::uno::Reference< css::embed::XStorage > xShare; + css::uno::Reference< css::embed::XStorage > xNoLang; css::uno::Reference< css::embed::XStorage > xUser; // special case for documents @@ -408,6 +414,7 @@ void PresetHandler::connectToResource( ::rtl::OUStringBuffer sRelPathBuf(1024); ::rtl::OUString sRelPathShare; + ::rtl::OUString sRelPathNoLang; ::rtl::OUString sRelPathUser; switch(eConfigType) { @@ -462,6 +469,10 @@ void PresetHandler::connectToResource( break; } + // Non-localized global share + xNoLang = xShare; + sRelPathNoLang = sRelPathShare; + if ( (aLocale != ::comphelper::Locale::X_NOTRANSLATE()) && // localized level? (eConfigType != E_DOCUMENT ) // no localization in document mode! @@ -535,10 +546,12 @@ void PresetHandler::connectToResource( aWriteLock.lock(); m_xWorkingStorageShare = xShare ; + m_xWorkingStorageNoLang= xNoLang; m_xWorkingStorageUser = xUser ; m_lPresets = lPresets; m_lTargets = lTargets; m_sRelPathShare = sRelPathShare; + m_sRelPathNoLang = sRelPathNoLang; m_sRelPathUser = sRelPathUser; aWriteLock.unlock(); @@ -591,6 +604,7 @@ void PresetHandler::copyPresetToTarget(c // SAFE -> ---------------------------------- ReadGuard aReadLock(m_aLock); css::uno::Reference< css::embed::XStorage > xWorkingShare = m_xWorkingStorageShare; + css::uno::Reference< css::embed::XStorage > xWorkingNoLang= m_xWorkingStorageNoLang; css::uno::Reference< css::embed::XStorage > xWorkingUser = m_xWorkingStorageUser ; aReadLock.unlock(); // <- SAFE ---------------------------------- @@ -638,11 +654,12 @@ css::uno::Reference< css::io::XStream > } //----------------------------------------------- -css::uno::Reference< css::io::XStream > PresetHandler::openPreset(const ::rtl::OUString& sPreset) +css::uno::Reference< css::io::XStream > PresetHandler::openPreset(const ::rtl::OUString& sPreset, + sal_Bool bUseNoLangGlobal) { // SAFE -> ---------------------------------- ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::embed::XStorage > xFolder = m_xWorkingStorageShare; + css::uno::Reference< css::embed::XStorage > xFolder = bUseNoLangGlobal? m_xWorkingStorageNoLang: m_xWorkingStorageShare; aReadLock.unlock(); // <- SAFE ---------------------------------- --- framework/source/inc/accelerators/presethandler.hxx 2005-09-09 01:30:19.000000000 +0000 +++ framework/source/inc/accelerators/presethandler.hxx 2006-04-24 17:48:27.000000000 +0000 @@ -224,6 +226,11 @@ class PresetHandler : private ThreadHelp is equals to m_xWorkingStorageShare then! */ css::uno::Reference< css::embed::XStorage > m_xWorkingStorageShare; + + //--------------------------------------- + /** @short global language-independent storage + */ + css::uno::Reference< css::embed::XStorage > m_xWorkingStorageNoLang; //--------------------------------------- /** @short holds the folder storage of the user layer alive, @@ -259,6 +264,7 @@ class PresetHandler : private ThreadHelp //--------------------------------------- /** @short knows the relative path from the root. */ ::rtl::OUString m_sRelPathShare; + ::rtl::OUString m_sRelPathNoLang; ::rtl::OUString m_sRelPathUser; //------------------------------------------- @@ -456,10 +462,14 @@ class PresetHandler : private ThreadHelp @param sPreset the ALIAS name of an existing preset. + + @param bNoLangGlobal + access the global language-independent storage instead of the preset storage @return The opened preset stream ... or NULL if the preset does not exists. */ - css::uno::Reference< css::io::XStream > openPreset(const ::rtl::OUString& sPreset); + css::uno::Reference< css::io::XStream > openPreset(const ::rtl::OUString& sPreset, + sal_Bool bUseNoLangGlobal = sal_False); //--------------------------------------- /** @short open the specified target as stream object