2010-10-12 15:53:47 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2012-11-12 17:21:24 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
#include <accelerators/acceleratorconfiguration.hxx>
|
|
|
|
|
|
|
|
#include <pattern/configuration.hxx>
|
|
|
|
#include <accelerators/presethandler.hxx>
|
|
|
|
|
|
|
|
#include <xml/saxnamespacefilter.hxx>
|
|
|
|
#include <xml/acceleratorconfigurationreader.hxx>
|
|
|
|
#include <xml/acceleratorconfigurationwriter.hxx>
|
|
|
|
|
|
|
|
#include <threadhelp/readguard.hxx>
|
|
|
|
#include <threadhelp/writeguard.hxx>
|
|
|
|
|
|
|
|
#include <acceleratorconst.h>
|
|
|
|
#include <services.h>
|
|
|
|
|
2012-10-03 13:30:43 +02:00
|
|
|
#include <com/sun/star/xml/sax/Parser.hpp>
|
2009-02-20 10:24:14 +00:00
|
|
|
#include <com/sun/star/xml/sax/InputSource.hpp>
|
2012-10-16 09:45:07 +02:00
|
|
|
#include <com/sun/star/xml/sax/Writer.hpp>
|
2009-02-20 10:24:14 +00:00
|
|
|
#include <com/sun/star/io/XActiveDataSource.hpp>
|
|
|
|
#include <com/sun/star/embed/ElementModes.hpp>
|
|
|
|
#include <com/sun/star/io/XSeekable.hpp>
|
|
|
|
#include <com/sun/star/io/XTruncate.hpp>
|
|
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
|
|
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#include <com/sun/star/container/XNamed.hpp>
|
|
|
|
#include <com/sun/star/container/XNameContainer.hpp>
|
|
|
|
#include <com/sun/star/awt/KeyEvent.hpp>
|
|
|
|
#include <com/sun/star/awt/KeyModifier.hpp>
|
|
|
|
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
|
|
|
|
#include <com/sun/star/util/XChangesNotifier.hpp>
|
|
|
|
#include <comphelper/configurationhelper.hxx>
|
2012-04-09 13:43:22 +03:00
|
|
|
#include <unotools/configpaths.hxx>
|
2009-02-20 10:24:14 +00:00
|
|
|
#include <svtools/acceleratorexecute.hxx>
|
2010-08-04 13:56:16 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
namespace framework
|
|
|
|
{
|
2012-03-24 14:00:06 +00:00
|
|
|
const char CFG_ENTRY_SECONDARY[] = "SecondaryKeys";
|
|
|
|
const char CFG_PROP_COMMAND[] = "Command";
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
#ifdef fpc
|
|
|
|
#error "Who exports this define? I use it as namespace alias ..."
|
|
|
|
#else
|
|
|
|
namespace fpc = ::framework::pattern::configuration;
|
|
|
|
#endif
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString lcl_getKeyString(salhelper::SingletonRef<framework::KeyMapping>& _rKeyMapping, const css::awt::KeyEvent& aKeyEvent)
|
2009-09-08 04:57:32 +00:00
|
|
|
{
|
|
|
|
const sal_Int32 nBeginIndex = 4; // "KEY_" is the prefix of a identifier...
|
2013-04-07 12:06:47 +02:00
|
|
|
OUStringBuffer sKeyBuffer((_rKeyMapping->mapCodeToIdentifier(aKeyEvent.KeyCode)).copy(nBeginIndex));
|
2009-09-08 04:57:32 +00:00
|
|
|
|
|
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT )
|
|
|
|
sKeyBuffer.appendAscii("_SHIFT");
|
|
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::MOD1 ) == css::awt::KeyModifier::MOD1 )
|
|
|
|
sKeyBuffer.appendAscii("_MOD1");
|
|
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::MOD2 ) == css::awt::KeyModifier::MOD2 )
|
|
|
|
sKeyBuffer.appendAscii("_MOD2");
|
|
|
|
if ( (aKeyEvent.Modifiers & css::awt::KeyModifier::MOD3 ) == css::awt::KeyModifier::MOD3 )
|
|
|
|
sKeyBuffer.appendAscii("_MOD3");
|
|
|
|
|
|
|
|
return sKeyBuffer.makeStringAndClear();
|
|
|
|
}
|
|
|
|
|
2009-02-20 10:24:14 +00:00
|
|
|
//-----------------------------------------------
|
2013-05-27 15:15:03 +02:00
|
|
|
XMLBasedAcceleratorConfiguration::XMLBasedAcceleratorConfiguration(const css::uno::Reference< css::uno::XComponentContext >& xContext)
|
2009-02-20 10:24:14 +00:00
|
|
|
: ThreadHelpBase (&Application::GetSolarMutex())
|
2013-05-27 15:15:03 +02:00
|
|
|
, m_xContext (xContext )
|
|
|
|
, m_aPresetHandler(xContext )
|
2009-02-20 10:24:14 +00:00
|
|
|
, m_pWriteCache (0 )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
XMLBasedAcceleratorConfiguration::~XMLBasedAcceleratorConfiguration()
|
|
|
|
{
|
|
|
|
LOG_ASSERT(!m_pWriteCache, "XMLBasedAcceleratorConfiguration::~XMLBasedAcceleratorConfiguration()\nChanges not flushed. Ignore it ...")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XMLBasedAcceleratorConfiguration::getAllKeyEvents()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getAllKeys();
|
|
|
|
return lKeys.getAsConstList();
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString SAL_CALL XMLBasedAcceleratorConfiguration::getCommandByKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
|
|
if (!rCache.hasKey(aKeyEvent))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString(),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
return rCache.getCommandByKey(aKeyEvent);
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::setKeyEvent(const css::awt::KeyEvent& aKeyEvent,
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString& sCommand )
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
if (
|
|
|
|
(aKeyEvent.KeyCode == 0) &&
|
|
|
|
(aKeyEvent.KeyChar == 0) &&
|
|
|
|
(aKeyEvent.KeyFunc == 0) &&
|
|
|
|
(aKeyEvent.Modifiers == 0)
|
|
|
|
)
|
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Such key event seams not to be supported by any operating system."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
0);
|
|
|
|
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
1);
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
AcceleratorCache& rCache = impl_getCFG(sal_True); // sal_True => force getting of a writeable cache!
|
2009-02-20 10:24:14 +00:00
|
|
|
rCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
|
|
|
throw(css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rCache = impl_getCFG(sal_True); // true => force using of a writeable cache
|
|
|
|
if (!rCache.hasKey(aKeyEvent))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString(),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
rCache.removeKey(aKeyEvent);
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XMLBasedAcceleratorConfiguration::getKeyEventsByCommand(const OUString& sCommand)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException ,
|
|
|
|
css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
1);
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
|
|
if (!rCache.hasCommand(sCommand))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString(),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getKeysByCommand(sCommand);
|
|
|
|
return lKeys.getAsConstList();
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< css::uno::Any > SAL_CALL XMLBasedAcceleratorConfiguration::getPreferredKeyEventsForCommandList(const css::uno::Sequence< OUString >& lCommandList)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException ,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
sal_Int32 i = 0;
|
|
|
|
sal_Int32 c = lCommandList.getLength();
|
|
|
|
css::uno::Sequence< css::uno::Any > lPreferredOnes (c); // dont pack list!
|
|
|
|
AcceleratorCache& rCache = impl_getCFG();
|
|
|
|
|
|
|
|
for (i=0; i<c; ++i)
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString& rCommand = lCommandList[i];
|
2011-12-26 14:20:50 -02:00
|
|
|
if (rCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
(sal_Int16)i);
|
|
|
|
|
|
|
|
if (!rCache.hasCommand(rCommand))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getKeysByCommand(rCommand);
|
2009-09-08 04:57:32 +00:00
|
|
|
if ( lKeys.empty() )
|
2009-02-20 10:24:14 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
css::uno::Any& rAny = lPreferredOnes[i];
|
|
|
|
rAny <<= *(lKeys.begin());
|
|
|
|
}
|
|
|
|
|
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
return lPreferredOnes;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeCommandFromAllKeyEvents(const OUString& sCommand)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException ,
|
|
|
|
css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
0);
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
AcceleratorCache& rCache = impl_getCFG(sal_True); // sal_True => force getting of a writeable cache!
|
2009-02-20 10:24:14 +00:00
|
|
|
if (!rCache.hasCommand(sCommand))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Command does not exists inside this container."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
rCache.removeCommand(sCommand);
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::reload()
|
|
|
|
throw(css::uno::Exception ,
|
|
|
|
css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
css::uno::Reference< css::io::XStream > xStreamNoLang;
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
2010-11-05 10:31:15 +08:00
|
|
|
css::uno::Reference< css::io::XStream > xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), sal_True); // sal_True => open or create!
|
2009-02-20 10:24:14 +00:00
|
|
|
try
|
|
|
|
{
|
|
|
|
xStreamNoLang = m_aPresetHandler.openPreset(PresetHandler::PRESET_DEFAULT(), sal_True);
|
|
|
|
}
|
|
|
|
catch(const css::io::IOException&) {} // does not have to exist
|
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
css::uno::Reference< css::io::XInputStream > xIn;
|
|
|
|
if (xStream.is())
|
|
|
|
xIn = xStream->getInputStream();
|
|
|
|
if (!xIn.is())
|
|
|
|
throw css::io::IOException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Could not open accelerator configuration for reading."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
// impl_ts_load() does not clear the cache
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
m_aReadCache = AcceleratorCache();
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::store()
|
|
|
|
throw(css::uno::Exception ,
|
|
|
|
css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
2010-11-05 10:31:15 +08:00
|
|
|
css::uno::Reference< css::io::XStream > xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), sal_True); // sal_True => open or create!
|
2009-02-20 10:24:14 +00:00
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
|
|
if (xStream.is())
|
|
|
|
xOut = xStream->getOutputStream();
|
|
|
|
|
|
|
|
if (!xOut.is())
|
|
|
|
throw css::io::IOException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Could not open accelerator configuration for saving."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
impl_ts_save(xOut);
|
|
|
|
|
|
|
|
xOut.clear();
|
|
|
|
xStream.clear();
|
|
|
|
|
|
|
|
m_aPresetHandler.commitUserChanges();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::storeToStorage(const css::uno::Reference< css::embed::XStorage >& xStorage)
|
|
|
|
throw(css::uno::Exception ,
|
|
|
|
css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
css::uno::Reference< css::io::XStream > xStream = StorageHolder::openSubStreamWithFallback(
|
|
|
|
xStorage,
|
|
|
|
PresetHandler::TARGET_CURRENT(),
|
|
|
|
css::embed::ElementModes::READWRITE,
|
|
|
|
sal_False); // False => no fallback from read/write to readonly!
|
|
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
|
|
if (xStream.is())
|
|
|
|
xOut = xStream->getOutputStream();
|
|
|
|
|
|
|
|
if (!xOut.is())
|
|
|
|
throw css::io::IOException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Could not open accelerator configuration for saving."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
impl_ts_save(xOut);
|
|
|
|
|
|
|
|
// TODO inform listener about success, so it can flush the root and sub storage of this stream!
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
::sal_Bool SAL_CALL XMLBasedAcceleratorConfiguration::isModified()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
return (m_pWriteCache != 0);
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
::sal_Bool SAL_CALL XMLBasedAcceleratorConfiguration::isReadOnly()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
2010-11-05 10:31:15 +08:00
|
|
|
css::uno::Reference< css::io::XStream > xStream = m_aPresetHandler.openTarget(PresetHandler::TARGET_CURRENT(), sal_True); // sal_True => open or create!
|
2009-02-20 10:24:14 +00:00
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
|
|
if (xStream.is())
|
|
|
|
xOut = xStream->getOutputStream();
|
|
|
|
return !(xOut.is());
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::setStorage(const css::uno::Reference< css::embed::XStorage >& /*xStorage*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XMLBasedAcceleratorConfiguration::setStorage()", "TODO implement this HACK .-)")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
::sal_Bool SAL_CALL XMLBasedAcceleratorConfiguration::hasStorage()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XMLBasedAcceleratorConfiguration::hasStorage()", "TODO implement this HACK .-)")
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::addConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XMLBasedAcceleratorConfiguration::addConfigurationListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XMLBasedAcceleratorConfiguration::removeConfigurationListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::reset()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
m_aPresetHandler.copyPresetToTarget(PresetHandler::PRESET_DEFAULT(), PresetHandler::TARGET_CURRENT());
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
reload();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::addResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XMLBasedAcceleratorConfiguration::addResetListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XMLBasedAcceleratorConfiguration::removeResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XMLBasedAcceleratorConfiguration::removeResetListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
// IStorageListener
|
2013-04-07 12:06:47 +02:00
|
|
|
void XMLBasedAcceleratorConfiguration::changesOccurred(const OUString& /*sPath*/)
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
reload();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void XMLBasedAcceleratorConfiguration::impl_ts_load(const css::uno::Reference< css::io::XInputStream >& xStream)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::uno::XComponentContext > xContext = m_xContext;
|
2009-02-20 10:24:14 +00:00
|
|
|
if (m_pWriteCache)
|
|
|
|
{
|
|
|
|
// be aware of reentrance problems - use temp variable for calling delete ... :-)
|
|
|
|
AcceleratorCache* pTemp = m_pWriteCache;
|
|
|
|
m_pWriteCache = 0;
|
|
|
|
delete pTemp;
|
|
|
|
}
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
css::uno::Reference< css::io::XSeekable > xSeek(xStream, css::uno::UNO_QUERY);
|
|
|
|
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!
|
|
|
|
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);
|
|
|
|
|
|
|
|
// connect parser, filter and stream
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::xml::sax::XParser > xParser = css::xml::sax::Parser::create(xContext);
|
2009-02-20 10:24:14 +00:00
|
|
|
xParser->setDocumentHandler(xFilter);
|
|
|
|
|
|
|
|
css::xml::sax::InputSource aSource;
|
|
|
|
aSource.aInputStream = xStream;
|
|
|
|
|
|
|
|
// TODO think about error handling
|
|
|
|
xParser->parseStream(aSource);
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void XMLBasedAcceleratorConfiguration::impl_ts_save(const css::uno::Reference< css::io::XOutputStream >& xStream)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache aCache;
|
|
|
|
sal_Bool bChanged = (m_pWriteCache != 0);
|
|
|
|
if (bChanged)
|
|
|
|
aCache.takeOver(*m_pWriteCache);
|
|
|
|
else
|
|
|
|
aCache.takeOver(m_aReadCache);
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::uno::XComponentContext > xContext = m_xContext;
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
css::uno::Reference< css::io::XTruncate > xClearable(xStream, css::uno::UNO_QUERY_THROW);
|
|
|
|
xClearable->truncate();
|
|
|
|
|
|
|
|
// TODO can be removed if seek(0) is done by truncate() automaticly!
|
|
|
|
css::uno::Reference< css::io::XSeekable > xSeek(xStream, css::uno::UNO_QUERY);
|
|
|
|
if (xSeek.is())
|
|
|
|
xSeek->seek(0);
|
|
|
|
|
|
|
|
// combine writer/cache/stream etcpp.
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::xml::sax::XWriter > xWriter = css::xml::sax::Writer::create(xContext);
|
2012-10-16 09:45:07 +02:00
|
|
|
xWriter->setOutputStream(xStream);
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
// write into the stream
|
2012-10-16 09:45:07 +02:00
|
|
|
css::uno::Reference< css::xml::sax::XDocumentHandler > xHandler(xWriter, css::uno::UNO_QUERY_THROW);
|
|
|
|
AcceleratorConfigurationWriter aWriter(aCache, xHandler);
|
2009-02-20 10:24:14 +00:00
|
|
|
aWriter.flush();
|
|
|
|
|
|
|
|
// take over all changes into the original container
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
// take over all changes into the readonly cache ...
|
|
|
|
// and forget the copy-on-write copied cache
|
|
|
|
if (bChanged)
|
|
|
|
{
|
|
|
|
m_aReadCache.takeOver(*m_pWriteCache);
|
|
|
|
// live with reentrance .-)
|
|
|
|
AcceleratorCache* pTemp = m_pWriteCache;
|
|
|
|
m_pWriteCache = 0;
|
|
|
|
delete pTemp;
|
|
|
|
}
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
AcceleratorCache& XMLBasedAcceleratorConfiguration::impl_getCFG(sal_Bool bWriteAccessRequested)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
//create copy of our readonly-cache, if write access is forced ... but
|
|
|
|
//not still possible!
|
|
|
|
if (
|
|
|
|
(bWriteAccessRequested) &&
|
|
|
|
(!m_pWriteCache )
|
|
|
|
)
|
|
|
|
{
|
|
|
|
m_pWriteCache = new AcceleratorCache(m_aReadCache);
|
|
|
|
}
|
|
|
|
|
|
|
|
// in case, we have a writeable cache, we use it for reading too!
|
|
|
|
// Otherwhise the API user cant find its own changes ...
|
|
|
|
if (m_pWriteCache)
|
|
|
|
return *m_pWriteCache;
|
|
|
|
else
|
|
|
|
return m_aReadCache;
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-03-28 00:39:06 +01:00
|
|
|
OUString XMLBasedAcceleratorConfiguration::impl_ts_getLocale() const
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::uno::XComponentContext > xContext = m_xContext;
|
2009-02-20 10:24:14 +00:00
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::uno::XInterface > xCFG = fpc::ConfigurationHelper::openConfig( xContext,
|
2012-06-25 12:50:46 +01:00
|
|
|
"/org.openoffice.Setup", "L10N", fpc::ConfigurationHelper::E_READONLY);
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::Reference< css::beans::XPropertySet > xProp (xCFG, css::uno::UNO_QUERY_THROW);
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sISOLocale;
|
2012-06-25 12:50:46 +01:00
|
|
|
xProp->getPropertyValue("ooLocale") >>= sISOLocale;
|
2009-02-20 10:24:14 +00:00
|
|
|
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sISOLocale.isEmpty())
|
2013-03-28 00:39:06 +01:00
|
|
|
return OUString("en-US");
|
|
|
|
return sISOLocale;
|
2009-02-20 10:24:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
*
|
|
|
|
* XCU based accelerator configuration
|
|
|
|
*
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-05-27 15:15:03 +02:00
|
|
|
XCUBasedAcceleratorConfiguration::XCUBasedAcceleratorConfiguration(const css::uno::Reference< css::uno::XComponentContext >& xContext)
|
2009-02-20 10:24:14 +00:00
|
|
|
: ThreadHelpBase (&Application::GetSolarMutex())
|
2013-05-27 15:15:03 +02:00
|
|
|
, m_xContext (xContext )
|
2009-02-20 10:24:14 +00:00
|
|
|
, m_pPrimaryWriteCache(0 )
|
|
|
|
, m_pSecondaryWriteCache(0 )
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString CFG_ENTRY_ACCELERATORS("org.openoffice.Office.Accelerators");
|
2009-02-20 10:24:14 +00:00
|
|
|
m_xCfg = css::uno::Reference< css::container::XNameAccess > (
|
2013-05-27 15:15:03 +02:00
|
|
|
::comphelper::ConfigurationHelper::openConfig( m_xContext, CFG_ENTRY_ACCELERATORS, ::comphelper::ConfigurationHelper::E_ALL_LOCALES ),
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::UNO_QUERY );
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
XCUBasedAcceleratorConfiguration::~XCUBasedAcceleratorConfiguration()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XCUBasedAcceleratorConfiguration::getAllKeyEvents()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lKeys = impl_getCFG(sal_True).getAllKeys(); //get keys from PrimaryKeys set
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lSecondaryKeys = impl_getCFG(sal_False).getAllKeys(); //get keys from SecondaryKeys set
|
2009-09-08 04:57:32 +00:00
|
|
|
lKeys.reserve(lKeys.size()+lSecondaryKeys.size());
|
2009-02-20 10:24:14 +00:00
|
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
2009-09-08 04:57:32 +00:00
|
|
|
AcceleratorCache::TKeyList::const_iterator pEnd = lSecondaryKeys.end();
|
|
|
|
for ( pIt = lSecondaryKeys.begin(); pIt != pEnd; ++pIt )
|
2009-02-20 10:24:14 +00:00
|
|
|
lKeys.push_back(*pIt);
|
|
|
|
|
|
|
|
return lKeys.getAsConstList();
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString SAL_CALL XCUBasedAcceleratorConfiguration::getCommandByKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(sal_True );
|
|
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(sal_False);
|
|
|
|
|
|
|
|
if (!rPrimaryCache.hasKey(aKeyEvent) && !rSecondaryCache.hasKey(aKeyEvent))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString(),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
if (rPrimaryCache.hasKey(aKeyEvent))
|
|
|
|
return rPrimaryCache.getCommandByKey(aKeyEvent);
|
|
|
|
else
|
|
|
|
return rSecondaryCache.getCommandByKey(aKeyEvent);
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::setKeyEvent(const css::awt::KeyEvent& aKeyEvent,
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString& sCommand )
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
2013-07-21 20:58:49 +02:00
|
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::setKeyEvent" );
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
if (
|
|
|
|
(aKeyEvent.KeyCode == 0) &&
|
|
|
|
(aKeyEvent.KeyChar == 0) &&
|
|
|
|
(aKeyEvent.KeyFunc == 0) &&
|
|
|
|
(aKeyEvent.Modifiers == 0)
|
|
|
|
)
|
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Such key event seams not to be supported by any operating system."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
0);
|
|
|
|
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
1);
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
2010-11-05 10:31:15 +08:00
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(sal_True, sal_True ); // sal_True => force getting of a writeable cache!
|
|
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(sal_False, sal_True); // sal_True => force getting of a writeable cache!
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
if ( rPrimaryCache.hasKey(aKeyEvent) )
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sOriginalCommand = rPrimaryCache.getCommandByKey(aKeyEvent);
|
2009-02-20 10:24:14 +00:00
|
|
|
if ( sCommand != sOriginalCommand )
|
|
|
|
{
|
|
|
|
if (rSecondaryCache.hasCommand(sOriginalCommand))
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList lSecondaryKeys = rSecondaryCache.getKeysByCommand(sOriginalCommand);
|
|
|
|
rSecondaryCache.removeKey(lSecondaryKeys[0]);
|
|
|
|
rPrimaryCache.setKeyCommandPair(lSecondaryKeys[0], sOriginalCommand);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList lPrimaryKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
|
|
rPrimaryCache.removeKey(lPrimaryKeys[0]);
|
|
|
|
rSecondaryCache.setKeyCommandPair(lPrimaryKeys[0], sCommand);
|
|
|
|
}
|
|
|
|
|
|
|
|
rPrimaryCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if ( rSecondaryCache.hasKey(aKeyEvent) )
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sOriginalCommand = rSecondaryCache.getCommandByKey(aKeyEvent);
|
2009-02-20 10:24:14 +00:00
|
|
|
if (sCommand != sOriginalCommand)
|
|
|
|
{
|
|
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList lPrimaryKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
|
|
rPrimaryCache.removeKey(lPrimaryKeys[0]);
|
|
|
|
rSecondaryCache.setKeyCommandPair(lPrimaryKeys[0], sCommand);
|
|
|
|
}
|
|
|
|
|
|
|
|
rSecondaryCache.removeKey(aKeyEvent);
|
|
|
|
rPrimaryCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList lPrimaryKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
|
|
rPrimaryCache.removeKey(lPrimaryKeys[0]);
|
|
|
|
rSecondaryCache.setKeyCommandPair(lPrimaryKeys[0], sCommand);
|
|
|
|
}
|
|
|
|
|
|
|
|
rPrimaryCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
}
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeKeyEvent(const css::awt::KeyEvent& aKeyEvent)
|
|
|
|
throw(css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(sal_True, sal_True );
|
|
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(sal_False, sal_True);
|
|
|
|
|
|
|
|
if (!rPrimaryCache.hasKey(aKeyEvent) && !rSecondaryCache.hasKey(aKeyEvent))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString(),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
if (rPrimaryCache.hasKey(aKeyEvent))
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sDelCommand = rPrimaryCache.getCommandByKey(aKeyEvent);
|
2011-12-26 14:20:50 -02:00
|
|
|
if (!sDelCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sOriginalCommand = rPrimaryCache.getCommandByKey(aKeyEvent);
|
2009-02-20 10:24:14 +00:00
|
|
|
if (rSecondaryCache.hasCommand(sOriginalCommand))
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList lSecondaryKeys = rSecondaryCache.getKeysByCommand(sOriginalCommand);
|
|
|
|
rSecondaryCache.removeKey(lSecondaryKeys[0]);
|
|
|
|
rPrimaryCache.setKeyCommandPair(lSecondaryKeys[0], sOriginalCommand);
|
|
|
|
}
|
|
|
|
|
|
|
|
rPrimaryCache.removeKey(aKeyEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sDelCommand = rSecondaryCache.getCommandByKey(aKeyEvent);
|
2011-12-26 14:20:50 -02:00
|
|
|
if (!sDelCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
rSecondaryCache.removeKey(aKeyEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< css::awt::KeyEvent > SAL_CALL XCUBasedAcceleratorConfiguration::getKeyEventsByCommand(const OUString& sCommand)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException ,
|
|
|
|
css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
1);
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(sal_True );
|
|
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(sal_False);
|
|
|
|
|
|
|
|
if (!rPrimaryCache.hasCommand(sCommand) && !rSecondaryCache.hasCommand(sCommand))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString(),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lKeys = rPrimaryCache.getKeysByCommand(sCommand);
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lSecondaryKeys = rSecondaryCache.getKeysByCommand(sCommand);
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
|
|
for (pIt = lSecondaryKeys.begin(); pIt != lSecondaryKeys.end(); ++pIt)
|
|
|
|
lKeys.push_back(*pIt);
|
|
|
|
|
|
|
|
return lKeys.getAsConstList();
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
AcceleratorCache::TKeyList::const_iterator lcl_getPreferredKey(const AcceleratorCache::TKeyList& lKeys)
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
|
|
for ( pIt = lKeys.begin ();
|
|
|
|
pIt != lKeys.end ();
|
|
|
|
++pIt )
|
|
|
|
{
|
|
|
|
const css::awt::KeyEvent& rAWTKey = *pIt;
|
|
|
|
const KeyCode aVCLKey = ::svt::AcceleratorExecute::st_AWTKey2VCLKey(rAWTKey);
|
|
|
|
const String sName = aVCLKey.GetName();
|
|
|
|
|
|
|
|
if (sName.Len () > 0)
|
|
|
|
return pIt;
|
|
|
|
}
|
|
|
|
|
|
|
|
return lKeys.end ();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< css::uno::Any > SAL_CALL XCUBasedAcceleratorConfiguration::getPreferredKeyEventsForCommandList(const css::uno::Sequence< OUString >& lCommandList)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException ,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
sal_Int32 i = 0;
|
|
|
|
sal_Int32 c = lCommandList.getLength();
|
|
|
|
css::uno::Sequence< css::uno::Any > lPreferredOnes (c); // dont pack list!
|
|
|
|
AcceleratorCache& rCache = impl_getCFG(sal_True);
|
|
|
|
|
|
|
|
for (i=0; i<c; ++i)
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString& rCommand = lCommandList[i];
|
2011-12-26 14:20:50 -02:00
|
|
|
if (rCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
(sal_Int16)i);
|
|
|
|
|
|
|
|
if (!rCache.hasCommand(rCommand))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lKeys = rCache.getKeysByCommand(rCommand);
|
2009-09-08 04:57:32 +00:00
|
|
|
if ( lKeys.empty() )
|
2009-02-20 10:24:14 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pPreferredKey = lcl_getPreferredKey(lKeys);
|
|
|
|
if (pPreferredKey != lKeys.end ())
|
|
|
|
{
|
|
|
|
css::uno::Any& rAny = lPreferredOnes[i];
|
|
|
|
rAny <<= *(pPreferredKey);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
return lPreferredOnes;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeCommandFromAllKeyEvents(const OUString& sCommand)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::lang::IllegalArgumentException ,
|
|
|
|
css::container::NoSuchElementException,
|
|
|
|
css::uno::RuntimeException )
|
|
|
|
{
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
throw css::lang::IllegalArgumentException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Empty command strings are not allowed here."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this),
|
|
|
|
0);
|
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache& rPrimaryCache = impl_getCFG(sal_True, sal_True );
|
|
|
|
AcceleratorCache& rSecondaryCache = impl_getCFG(sal_False, sal_True);
|
|
|
|
|
|
|
|
if (!rPrimaryCache.hasCommand(sCommand) && !rSecondaryCache.hasCommand(sCommand))
|
|
|
|
throw css::container::NoSuchElementException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Command does not exists inside this container."),
|
2009-02-20 10:24:14 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
if (rPrimaryCache.hasCommand(sCommand))
|
|
|
|
rPrimaryCache.removeCommand(sCommand);
|
|
|
|
if (rSecondaryCache.hasCommand(sCommand))
|
|
|
|
rSecondaryCache.removeCommand(sCommand);
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::reload()
|
|
|
|
throw(css::uno::Exception ,
|
|
|
|
css::uno::RuntimeException)
|
|
|
|
{
|
2013-07-21 20:58:49 +02:00
|
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::reload()" );
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
sal_Bool bPreferred;
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
|
|
|
|
bPreferred = sal_True;
|
|
|
|
m_aPrimaryReadCache = AcceleratorCache();
|
|
|
|
if (m_pPrimaryWriteCache)
|
|
|
|
{
|
|
|
|
// be aware of reentrance problems - use temp variable for calling delete ... :-)
|
|
|
|
AcceleratorCache* pTemp = m_pPrimaryWriteCache;
|
|
|
|
m_pPrimaryWriteCache = 0;
|
|
|
|
delete pTemp;
|
|
|
|
}
|
|
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
|
|
impl_ts_load(bPreferred, xAccess); // load the preferred keys
|
|
|
|
|
|
|
|
bPreferred = sal_False;
|
|
|
|
m_aSecondaryReadCache = AcceleratorCache();
|
|
|
|
if (m_pSecondaryWriteCache)
|
|
|
|
{
|
|
|
|
// be aware of reentrance problems - use temp variable for calling delete ... :-)
|
|
|
|
AcceleratorCache* pTemp = m_pSecondaryWriteCache;
|
|
|
|
m_pSecondaryWriteCache = 0;
|
|
|
|
delete pTemp;
|
|
|
|
}
|
|
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
|
|
impl_ts_load(bPreferred, xAccess); // load the secondary keys
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::store()
|
|
|
|
throw(css::uno::Exception ,
|
|
|
|
css::uno::RuntimeException)
|
|
|
|
{
|
2013-07-21 20:58:49 +02:00
|
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::store()" );
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
|
|
|
|
|
|
|
sal_Bool bPreferred;
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
|
|
|
|
bPreferred = sal_True;
|
2009-05-07 13:54:35 +00:00
|
|
|
// on-demand creation of the primary write cache
|
|
|
|
impl_getCFG(bPreferred, sal_True);
|
2009-02-20 10:24:14 +00:00
|
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
|
|
impl_ts_save(bPreferred, xAccess);
|
|
|
|
|
|
|
|
bPreferred = sal_False;
|
2009-05-07 13:54:35 +00:00
|
|
|
// on-demand creation of the secondary write cache
|
|
|
|
impl_getCFG(bPreferred, sal_True);
|
2009-02-20 10:24:14 +00:00
|
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
|
|
impl_ts_save(bPreferred, xAccess);
|
|
|
|
|
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2009-09-09 03:41:07 +00:00
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::storeToStorage(const css::uno::Reference< css::embed::XStorage >& xStorage)
|
2009-02-20 10:24:14 +00:00
|
|
|
throw(css::uno::Exception ,
|
|
|
|
css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// use m_aCache + old AcceleratorXMLWriter to store data directly on storage given as parameter ...
|
2009-09-09 03:41:07 +00:00
|
|
|
if (!xStorage.is())
|
|
|
|
return;
|
|
|
|
|
|
|
|
long nOpenModes = css::embed::ElementModes::READWRITE;
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Reference< css::embed::XStorage > xAcceleratorTypeStorage = xStorage->openStorageElement(OUString("accelerator"), nOpenModes);
|
2009-09-09 03:41:07 +00:00
|
|
|
if (!xAcceleratorTypeStorage.is())
|
|
|
|
return;
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Reference< css::io::XStream > xStream = xAcceleratorTypeStorage->openStreamElement(OUString("current"), nOpenModes);
|
2009-09-09 03:41:07 +00:00
|
|
|
css::uno::Reference< css::io::XOutputStream > xOut;
|
|
|
|
if (xStream.is())
|
|
|
|
xOut = xStream->getOutputStream();
|
|
|
|
if (!xOut.is())
|
|
|
|
throw css::io::IOException(
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString("Could not open accelerator configuration for saving."),
|
2009-09-09 03:41:07 +00:00
|
|
|
static_cast< ::cppu::OWeakObject* >(this));
|
|
|
|
|
|
|
|
// the original m_aCache has been split into primay cache and secondary cache...
|
|
|
|
// we should merge them before storing to storage
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
AcceleratorCache aCache;
|
|
|
|
if (m_pPrimaryWriteCache != 0)
|
|
|
|
aCache.takeOver(*m_pPrimaryWriteCache);
|
|
|
|
else
|
|
|
|
aCache.takeOver(m_aPrimaryReadCache);
|
|
|
|
|
|
|
|
AcceleratorCache::TKeyList lKeys;
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
|
|
if (m_pSecondaryWriteCache!=0)
|
|
|
|
{
|
|
|
|
lKeys = m_pSecondaryWriteCache->getAllKeys();
|
|
|
|
for ( pIt=lKeys.begin(); pIt!=lKeys.end(); ++pIt )
|
|
|
|
aCache.setKeyCommandPair(*pIt, m_pSecondaryWriteCache->getCommandByKey(*pIt));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
lKeys = m_aSecondaryReadCache.getAllKeys();
|
|
|
|
for ( pIt=lKeys.begin(); pIt!=lKeys.end(); ++pIt )
|
|
|
|
aCache.setKeyCommandPair(*pIt, m_aSecondaryReadCache.getCommandByKey(*pIt));
|
|
|
|
}
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
|
|
|
css::uno::Reference< css::io::XTruncate > xClearable(xOut, css::uno::UNO_QUERY_THROW);
|
|
|
|
xClearable->truncate();
|
|
|
|
css::uno::Reference< css::io::XSeekable > xSeek(xOut, css::uno::UNO_QUERY);
|
|
|
|
if (xSeek.is())
|
|
|
|
xSeek->seek(0);
|
|
|
|
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::xml::sax::XWriter > xWriter = css::xml::sax::Writer::create(m_xContext);
|
2012-10-16 09:45:07 +02:00
|
|
|
xWriter->setOutputStream(xOut);
|
2009-09-09 03:41:07 +00:00
|
|
|
|
|
|
|
// write into the stream
|
2012-10-16 09:45:07 +02:00
|
|
|
css::uno::Reference< css::xml::sax::XDocumentHandler > xHandler(xWriter, css::uno::UNO_QUERY_THROW);
|
|
|
|
AcceleratorConfigurationWriter aWriter(aCache, xHandler);
|
2009-09-09 03:41:07 +00:00
|
|
|
aWriter.flush();
|
2009-02-20 10:24:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
::sal_Bool SAL_CALL XCUBasedAcceleratorConfiguration::isModified()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
::sal_Bool SAL_CALL XCUBasedAcceleratorConfiguration::isReadOnly()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::setStorage(const css::uno::Reference< css::embed::XStorage >& /*xStorage*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XCUBasedAcceleratorConfiguration::setStorage()", "TODO implement this HACK .-)")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
::sal_Bool SAL_CALL XCUBasedAcceleratorConfiguration::hasStorage()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XCUBasedAcceleratorConfiguration::hasStorage()", "TODO implement this HACK .-)")
|
|
|
|
return sal_False;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::addConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XCUBasedAcceleratorConfiguration::addConfigurationListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeConfigurationListener(const css::uno::Reference< css::ui::XUIConfigurationListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XCUBasedAcceleratorConfiguration::removeConfigurationListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::reset()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNamed > xNamed(m_xCfg, css::uno::UNO_QUERY);
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sConfig = xNamed->getName();
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( sConfig == "Global" )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
m_xCfg = css::uno::Reference< css::container::XNameAccess > (
|
2013-05-27 15:15:03 +02:00
|
|
|
::comphelper::ConfigurationHelper::openConfig( m_xContext, CFG_ENTRY_GLOBAL, ::comphelper::ConfigurationHelper::E_ALL_LOCALES ),
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::UNO_QUERY );
|
|
|
|
XCUBasedAcceleratorConfiguration::reload();
|
|
|
|
}
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sConfig == "Modules" )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
m_xCfg = css::uno::Reference< css::container::XNameAccess > (
|
2013-05-27 15:15:03 +02:00
|
|
|
::comphelper::ConfigurationHelper::openConfig( m_xContext, CFG_ENTRY_MODULES, ::comphelper::ConfigurationHelper::E_ALL_LOCALES ),
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::UNO_QUERY );
|
|
|
|
XCUBasedAcceleratorConfiguration::reload();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::addResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XCUBasedAcceleratorConfiguration::addResetListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeResetListener(const css::uno::Reference< css::form::XResetListener >& /*xListener*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
LOG_WARNING("XCUBasedAcceleratorConfiguration::removeResetListener()", "TODO implement me")
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::changesOccurred(const css::util::ChangesEvent& aEvent)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
2013-07-21 20:58:49 +02:00
|
|
|
SAL_INFO( "fwk.accelerators", "XCUBasedAcceleratorConfiguration::changesOccurred()" );
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
css::uno::Reference< css::container::XHierarchicalNameAccess > xHAccess;
|
|
|
|
aEvent.Base >>= xHAccess;
|
|
|
|
if (! xHAccess.is ())
|
|
|
|
return;
|
|
|
|
|
2010-08-18 10:52:09 +02:00
|
|
|
css::util::ChangesEvent aReceivedEvents( aEvent );
|
|
|
|
const sal_Int32 c = aReceivedEvents.Changes.getLength();
|
2009-02-20 10:24:14 +00:00
|
|
|
sal_Int32 i = 0;
|
|
|
|
for (i=0; i<c; ++i)
|
|
|
|
{
|
2010-08-18 10:52:09 +02:00
|
|
|
const css::util::ElementChange& aChange = aReceivedEvents.Changes[i];
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
// Only path of form "PrimaryKeys/Modules/Module['<module_name>']/Key['<command_url>']/Command[<locale>]" will
|
|
|
|
// be interesting for use. Sometimes short path values are given also by the broadcaster ... but they must be ignored :-)
|
|
|
|
// So we try to split the path into 3 parts (module isnt important here, because we already know it ... because
|
|
|
|
// these instance is bound to a specific module configuration ... or it''s the global configuration where no module is given at all.
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sOrgPath ;
|
|
|
|
OUString sPath ;
|
|
|
|
OUString sKey;
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
aChange.Accessor >>= sOrgPath;
|
|
|
|
sPath = sOrgPath;
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sPrimarySecondary = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
|
|
|
OUString sGlobalModules = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
2009-02-20 10:24:14 +00:00
|
|
|
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( sGlobalModules == CFG_ENTRY_GLOBAL )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sModule;
|
2010-07-27 18:11:00 +02:00
|
|
|
sKey = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
2011-12-26 14:20:50 -02:00
|
|
|
if ( !sKey.isEmpty() && !sPath.isEmpty() )
|
2009-04-01 16:11:30 +00:00
|
|
|
reloadChanged(sPrimarySecondary, sGlobalModules, sModule, sKey);
|
2009-02-20 10:24:14 +00:00
|
|
|
}
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sGlobalModules == CFG_ENTRY_MODULES )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sModule = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
2010-07-27 18:11:00 +02:00
|
|
|
sKey = ::utl::extractFirstFromConfigurationPath(sPath, &sPath);
|
2010-08-04 13:56:16 +02:00
|
|
|
|
2011-12-26 14:20:50 -02:00
|
|
|
if ( !sKey.isEmpty() && !sPath.isEmpty() )
|
2010-08-04 13:56:16 +02:00
|
|
|
{
|
2009-03-06 08:23:39 +00:00
|
|
|
reloadChanged(sPrimarySecondary, sGlobalModules, sModule, sKey);
|
2010-08-04 13:56:16 +02:00
|
|
|
}
|
2009-02-20 10:24:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::disposing(const css::lang::EventObject& /*aSource*/)
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2012-06-20 11:58:32 +00:00
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::dispose()
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// nop
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& /*xListener*/ )
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// nop
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void SAL_CALL XCUBasedAcceleratorConfiguration::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& /*xListener*/ )
|
|
|
|
throw(css::uno::RuntimeException)
|
|
|
|
{
|
|
|
|
// nop
|
|
|
|
}
|
|
|
|
|
2009-02-20 10:24:14 +00:00
|
|
|
//-----------------------------------------------
|
|
|
|
void XCUBasedAcceleratorConfiguration::impl_ts_load( sal_Bool bPreferred, const css::uno::Reference< css::container::XNameAccess >& xCfg )
|
|
|
|
{
|
|
|
|
AcceleratorCache aReadCache = AcceleratorCache();
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( m_sGlobalOrModules == "Global" )
|
2009-02-20 10:24:14 +00:00
|
|
|
xCfg->getByName(CFG_ENTRY_GLOBAL) >>= xAccess;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( m_sGlobalOrModules == "Modules" )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xModules;
|
|
|
|
xCfg->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
|
|
xModules->getByName(m_sModuleCFG) >>= xAccess;
|
|
|
|
}
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString sIsoLang = impl_ts_getLocale();
|
|
|
|
const OUString sDefaultLocale("en-US");
|
2009-04-01 16:11:30 +00:00
|
|
|
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::Reference< css::container::XNameAccess > xKey;
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xCommand;
|
|
|
|
if (xAccess.is())
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< OUString > lKeys = xAccess->getElementNames();
|
2009-02-20 10:24:14 +00:00
|
|
|
sal_Int32 nKeys = lKeys.getLength();
|
|
|
|
for ( sal_Int32 i=0; i<nKeys; ++i )
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sKey = lKeys[i];
|
2009-02-20 10:24:14 +00:00
|
|
|
xAccess->getByName(sKey) >>= xKey;
|
|
|
|
xKey->getByName(CFG_PROP_COMMAND) >>= xCommand;
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< OUString > lLocales = xCommand->getElementNames();
|
2009-02-20 10:24:14 +00:00
|
|
|
sal_Int32 nLocales = lLocales.getLength();
|
2013-04-07 12:06:47 +02:00
|
|
|
::std::vector< OUString > aLocales;
|
2009-02-20 10:24:14 +00:00
|
|
|
for ( sal_Int32 j=0; j<nLocales; ++j )
|
|
|
|
aLocales.push_back(lLocales[j]);
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
::std::vector< OUString >::const_iterator pFound;
|
2009-02-20 10:24:14 +00:00
|
|
|
for ( pFound = aLocales.begin(); pFound != aLocales.end(); ++pFound )
|
|
|
|
{
|
2009-04-01 16:11:30 +00:00
|
|
|
if ( *pFound == sIsoLang )
|
2009-02-20 10:24:14 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pFound == aLocales.end() )
|
|
|
|
{
|
|
|
|
for ( pFound = aLocales.begin(); pFound != aLocales.end(); ++pFound )
|
|
|
|
{
|
|
|
|
if ( *pFound == sDefaultLocale )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pFound == aLocales.end() )
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sLocale = *pFound;
|
|
|
|
OUString sCommand;
|
2009-02-20 10:24:14 +00:00
|
|
|
xCommand->getByName(sLocale) >>= sCommand;
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
css::awt::KeyEvent aKeyEvent;
|
|
|
|
|
|
|
|
sal_Int32 nIndex = 0;
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sKeyCommand = sKey.getToken(0, '_', nIndex);
|
|
|
|
OUString sPrefix("KEY_");
|
2009-09-09 03:41:07 +00:00
|
|
|
aKeyEvent.KeyCode = m_rKeyMapping->mapIdentifierToCode(sPrefix + sKeyCommand);
|
2009-02-20 10:24:14 +00:00
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< OUString > sToken(4);
|
2009-02-20 10:24:14 +00:00
|
|
|
const sal_Int32 nToken = 4;
|
|
|
|
sal_Bool bValid = sal_True;
|
|
|
|
sal_Int32 k;
|
|
|
|
for (k=0; k<nToken; ++k)
|
|
|
|
{
|
|
|
|
if (nIndex < 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
sToken[k] = sKey.getToken(0, '_', nIndex);
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sToken[k].isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
bValid = sal_False;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( sToken[k] == "SHIFT" )
|
2009-02-20 10:24:14 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::SHIFT;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sToken[k] == "MOD1" )
|
2009-02-20 10:24:14 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD1;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sToken[k] == "MOD2" )
|
2009-02-20 10:24:14 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD2;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sToken[k] == "MOD3" )
|
2010-08-04 13:56:16 +02:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD3;
|
2009-02-20 10:24:14 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
bValid = sal_False;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !aReadCache.hasKey(aKeyEvent) && bValid && k<nToken)
|
|
|
|
aReadCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bPreferred)
|
|
|
|
m_aPrimaryReadCache.takeOver(aReadCache);
|
|
|
|
else
|
|
|
|
m_aSecondaryReadCache.takeOver(aReadCache);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void XCUBasedAcceleratorConfiguration::impl_ts_save(sal_Bool bPreferred, const css::uno::Reference< css::container::XNameAccess >& /*xCfg*/)
|
|
|
|
{
|
|
|
|
if (bPreferred)
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
|
|
AcceleratorCache::TKeyList lPrimaryReadKeys = m_aPrimaryReadCache.getAllKeys();
|
|
|
|
AcceleratorCache::TKeyList lPrimaryWriteKeys = m_pPrimaryWriteCache->getAllKeys();
|
|
|
|
|
|
|
|
for ( pIt = lPrimaryReadKeys.begin(); pIt != lPrimaryReadKeys.end(); ++pIt )
|
|
|
|
{
|
|
|
|
if (!m_pPrimaryWriteCache->hasKey(*pIt))
|
|
|
|
removeKeyFromConfiguration(*pIt, sal_True);
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( pIt = lPrimaryWriteKeys.begin(); pIt != lPrimaryWriteKeys.end(); ++pIt )
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sCommand = m_pPrimaryWriteCache->getCommandByKey(*pIt);
|
2009-02-20 10:24:14 +00:00
|
|
|
if (!m_aPrimaryReadCache.hasKey(*pIt))
|
|
|
|
{
|
|
|
|
insertKeyToConfiguration(*pIt, sCommand, sal_True);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sReadCommand = m_aPrimaryReadCache.getCommandByKey(*pIt);
|
2009-02-20 10:24:14 +00:00
|
|
|
if (sReadCommand != sCommand)
|
|
|
|
insertKeyToConfiguration(*pIt, sCommand, sal_True);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// take over all changes into the original container
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
if (m_pPrimaryWriteCache)
|
|
|
|
{
|
|
|
|
m_aPrimaryReadCache.takeOver(*m_pPrimaryWriteCache);
|
|
|
|
AcceleratorCache* pTemp = m_pPrimaryWriteCache;
|
|
|
|
m_pPrimaryWriteCache = 0;
|
|
|
|
delete pTemp;
|
|
|
|
}
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
AcceleratorCache::TKeyList::const_iterator pIt;
|
|
|
|
AcceleratorCache::TKeyList lSecondaryReadKeys = m_aSecondaryReadCache.getAllKeys();
|
|
|
|
AcceleratorCache::TKeyList lSecondaryWriteKeys = m_pSecondaryWriteCache->getAllKeys();
|
|
|
|
|
|
|
|
for ( pIt = lSecondaryReadKeys.begin(); pIt != lSecondaryReadKeys.end(); ++pIt)
|
|
|
|
{
|
|
|
|
if (!m_pSecondaryWriteCache->hasKey(*pIt))
|
|
|
|
removeKeyFromConfiguration(*pIt, sal_False);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for ( pIt = lSecondaryWriteKeys.begin(); pIt != lSecondaryWriteKeys.end(); ++pIt )
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sCommand = m_pSecondaryWriteCache->getCommandByKey(*pIt);
|
2009-02-20 10:24:14 +00:00
|
|
|
if (!m_aSecondaryReadCache.hasKey(*pIt))
|
|
|
|
{
|
|
|
|
insertKeyToConfiguration(*pIt, sCommand, sal_False);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sReadCommand = m_aSecondaryReadCache.getCommandByKey(*pIt);
|
2009-02-20 10:24:14 +00:00
|
|
|
if (sReadCommand != sCommand)
|
|
|
|
insertKeyToConfiguration(*pIt, sCommand, sal_False);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// take over all changes into the original container
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
if (m_pSecondaryWriteCache)
|
|
|
|
{
|
|
|
|
m_aSecondaryReadCache.takeOver(*m_pSecondaryWriteCache);
|
|
|
|
AcceleratorCache* pTemp = m_pSecondaryWriteCache;
|
|
|
|
m_pSecondaryWriteCache = 0;
|
|
|
|
delete pTemp;
|
|
|
|
}
|
|
|
|
|
|
|
|
aWriteLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
::comphelper::ConfigurationHelper::flush(m_xCfg);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
void XCUBasedAcceleratorConfiguration::insertKeyToConfiguration( const css::awt::KeyEvent& aKeyEvent, const OUString& sCommand, const sal_Bool bPreferred )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
css::uno::Reference< css::container::XNameContainer > xContainer;
|
|
|
|
css::uno::Reference< css::lang::XSingleServiceFactory > xFac;
|
|
|
|
css::uno::Reference< css::uno::XInterface > xInst;
|
|
|
|
|
|
|
|
if ( bPreferred )
|
|
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
|
|
else
|
|
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
|
|
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( m_sGlobalOrModules == CFG_ENTRY_GLOBAL )
|
2009-02-20 10:24:14 +00:00
|
|
|
xAccess->getByName(CFG_ENTRY_GLOBAL) >>= xContainer;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( m_sGlobalOrModules == CFG_ENTRY_MODULES )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameContainer > xModules;
|
|
|
|
xAccess->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
|
|
if ( !xModules->hasByName(m_sModuleCFG) )
|
|
|
|
{
|
|
|
|
xFac = css::uno::Reference< css::lang::XSingleServiceFactory >(xModules, css::uno::UNO_QUERY);
|
|
|
|
xInst = xFac->createInstance();
|
|
|
|
xModules->insertByName(m_sModuleCFG, css::uno::makeAny(xInst));
|
|
|
|
}
|
|
|
|
xModules->getByName(m_sModuleCFG) >>= xContainer;
|
|
|
|
}
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString sKey = lcl_getKeyString(m_rKeyMapping,aKeyEvent);
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::Reference< css::container::XNameAccess > xKey;
|
|
|
|
css::uno::Reference< css::container::XNameContainer > xCommand;
|
|
|
|
if ( !xContainer->hasByName(sKey) )
|
|
|
|
{
|
|
|
|
xFac = css::uno::Reference< css::lang::XSingleServiceFactory >(xContainer, css::uno::UNO_QUERY);
|
|
|
|
xInst = xFac->createInstance();
|
|
|
|
xContainer->insertByName(sKey, css::uno::makeAny(xInst));
|
|
|
|
}
|
|
|
|
xContainer->getByName(sKey) >>= xKey;
|
|
|
|
|
|
|
|
xKey->getByName(CFG_PROP_COMMAND) >>= xCommand;
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sLocale = impl_ts_getLocale();
|
2009-02-20 10:24:14 +00:00
|
|
|
if ( !xCommand->hasByName(sLocale) )
|
|
|
|
xCommand->insertByName(sLocale, css::uno::makeAny(sCommand));
|
|
|
|
else
|
|
|
|
xCommand->replaceByName(sLocale, css::uno::makeAny(sCommand));
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
void XCUBasedAcceleratorConfiguration::removeKeyFromConfiguration( const css::awt::KeyEvent& aKeyEvent, const sal_Bool bPreferred )
|
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
css::uno::Reference< css::container::XNameContainer > xContainer;
|
|
|
|
|
|
|
|
if ( bPreferred )
|
|
|
|
m_xCfg->getByName(CFG_ENTRY_PRIMARY) >>= xAccess;
|
|
|
|
else
|
|
|
|
m_xCfg->getByName(CFG_ENTRY_SECONDARY) >>= xAccess;
|
|
|
|
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( m_sGlobalOrModules == CFG_ENTRY_GLOBAL )
|
2009-02-20 10:24:14 +00:00
|
|
|
xAccess->getByName(CFG_ENTRY_GLOBAL) >>= xContainer;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( m_sGlobalOrModules == CFG_ENTRY_MODULES )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xModules;
|
|
|
|
xAccess->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
|
|
if ( !xModules->hasByName(m_sModuleCFG) )
|
|
|
|
return;
|
|
|
|
xModules->getByName(m_sModuleCFG) >>= xContainer;
|
|
|
|
}
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
const OUString sKey = lcl_getKeyString(m_rKeyMapping,aKeyEvent);
|
2009-02-20 10:24:14 +00:00
|
|
|
xContainer->removeByName(sKey);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-04-07 12:06:47 +02:00
|
|
|
void XCUBasedAcceleratorConfiguration::reloadChanged( const OUString& sPrimarySecondary, const OUString& sGlobalModules, const OUString& sModule, const OUString& sKey )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xAccess;
|
|
|
|
css::uno::Reference< css::container::XNameContainer > xContainer;
|
|
|
|
|
|
|
|
m_xCfg->getByName(sPrimarySecondary) >>= xAccess;
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( sGlobalModules == CFG_ENTRY_GLOBAL )
|
2009-02-20 10:24:14 +00:00
|
|
|
xAccess->getByName(CFG_ENTRY_GLOBAL) >>= xContainer;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xModules;
|
|
|
|
xAccess->getByName(CFG_ENTRY_MODULES) >>= xModules;
|
|
|
|
if ( !xModules->hasByName(sModule) )
|
|
|
|
return;
|
|
|
|
xModules->getByName(sModule) >>= xContainer;
|
|
|
|
}
|
|
|
|
|
|
|
|
css::awt::KeyEvent aKeyEvent;
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sKeyIdentifier;
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
sal_Int32 nIndex = 0;
|
|
|
|
sKeyIdentifier = sKey.getToken(0, '_', nIndex);
|
2013-04-07 12:06:47 +02:00
|
|
|
aKeyEvent.KeyCode = m_rKeyMapping->mapIdentifierToCode(OUString("KEY_")+sKeyIdentifier);
|
2009-02-20 10:24:14 +00:00
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
css::uno::Sequence< OUString > sToken(3);
|
2009-02-20 10:24:14 +00:00
|
|
|
const sal_Int32 nToken = 3;
|
|
|
|
for (sal_Int32 i=0; i<nToken; ++i)
|
|
|
|
{
|
|
|
|
if ( nIndex < 0 )
|
|
|
|
break;
|
|
|
|
|
|
|
|
sToken[i] = sKey.getToken(0, '_', nIndex);
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( sToken[i] == "SHIFT" )
|
2009-02-20 10:24:14 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::SHIFT;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sToken[i] == "MOD1" )
|
2009-02-20 10:24:14 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD1;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sToken[i] == "MOD2" )
|
2009-02-20 10:24:14 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD2;
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sToken[i] == "MOD3" )
|
2009-04-12 04:24:43 +00:00
|
|
|
aKeyEvent.Modifiers |= css::awt::KeyModifier::MOD3;
|
2009-02-20 10:24:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xKey;
|
|
|
|
css::uno::Reference< css::container::XNameAccess > xCommand;
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sCommand;
|
2009-02-20 10:24:14 +00:00
|
|
|
|
|
|
|
if (xContainer->hasByName(sKey))
|
|
|
|
{
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sLocale = impl_ts_getLocale();
|
2009-02-20 10:24:14 +00:00
|
|
|
xContainer->getByName(sKey) >>= xKey;
|
|
|
|
xKey->getByName(CFG_PROP_COMMAND) >>= xCommand;
|
|
|
|
xCommand->getByName(sLocale) >>= sCommand;
|
|
|
|
}
|
|
|
|
|
2012-04-06 15:05:52 +02:00
|
|
|
if ( sPrimarySecondary == CFG_ENTRY_PRIMARY )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
m_aPrimaryReadCache.removeKey(aKeyEvent);
|
|
|
|
else
|
|
|
|
m_aPrimaryReadCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
}
|
2012-04-06 15:05:52 +02:00
|
|
|
else if ( sPrimarySecondary == CFG_ENTRY_SECONDARY )
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sCommand.isEmpty())
|
2009-02-20 10:24:14 +00:00
|
|
|
m_aSecondaryReadCache.removeKey(aKeyEvent);
|
|
|
|
else
|
|
|
|
m_aSecondaryReadCache.setKeyCommandPair(aKeyEvent, sCommand);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
|
|
|
AcceleratorCache& XCUBasedAcceleratorConfiguration::impl_getCFG(sal_Bool bPreferred, sal_Bool bWriteAccessRequested)
|
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
WriteGuard aWriteLock(m_aLock);
|
|
|
|
|
|
|
|
if (bPreferred)
|
|
|
|
{
|
|
|
|
//create copy of our readonly-cache, if write access is forced ... but
|
|
|
|
//not still possible!
|
|
|
|
if (
|
|
|
|
(bWriteAccessRequested) &&
|
|
|
|
(!m_pPrimaryWriteCache )
|
|
|
|
)
|
|
|
|
{
|
|
|
|
m_pPrimaryWriteCache = new AcceleratorCache(m_aPrimaryReadCache);
|
|
|
|
}
|
|
|
|
|
|
|
|
// in case, we have a writeable cache, we use it for reading too!
|
|
|
|
// Otherwhise the API user cant find its own changes ...
|
|
|
|
if (m_pPrimaryWriteCache)
|
|
|
|
return *m_pPrimaryWriteCache;
|
|
|
|
else
|
|
|
|
return m_aPrimaryReadCache;
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//create copy of our readonly-cache, if write access is forced ... but
|
|
|
|
//not still possible!
|
|
|
|
if (
|
|
|
|
(bWriteAccessRequested) &&
|
|
|
|
(!m_pSecondaryWriteCache )
|
|
|
|
)
|
|
|
|
{
|
|
|
|
m_pSecondaryWriteCache = new AcceleratorCache(m_aSecondaryReadCache);
|
|
|
|
}
|
|
|
|
|
|
|
|
// in case, we have a writeable cache, we use it for reading too!
|
|
|
|
// Otherwhise the API user cant find its own changes ...
|
|
|
|
if (m_pSecondaryWriteCache)
|
|
|
|
return *m_pSecondaryWriteCache;
|
|
|
|
else
|
|
|
|
return m_aSecondaryReadCache;
|
|
|
|
}
|
|
|
|
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------
|
2013-03-28 00:39:06 +01:00
|
|
|
OUString XCUBasedAcceleratorConfiguration::impl_ts_getLocale() const
|
2009-02-20 10:24:14 +00:00
|
|
|
{
|
|
|
|
// SAFE -> ----------------------------------
|
|
|
|
ReadGuard aReadLock(m_aLock);
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::uno::XComponentContext > xContext = m_xContext;
|
2009-02-20 10:24:14 +00:00
|
|
|
aReadLock.unlock();
|
|
|
|
// <- SAFE ----------------------------------
|
|
|
|
|
2013-05-27 15:15:03 +02:00
|
|
|
css::uno::Reference< css::uno::XInterface > xCFG = fpc::ConfigurationHelper::openConfig( xContext,
|
2012-06-25 12:50:46 +01:00
|
|
|
"/org.openoffice.Setup", "L10N", fpc::ConfigurationHelper::E_READONLY);
|
2009-02-20 10:24:14 +00:00
|
|
|
css::uno::Reference< css::beans::XPropertySet > xProp (xCFG, css::uno::UNO_QUERY_THROW);
|
2013-04-07 12:06:47 +02:00
|
|
|
OUString sISOLocale;
|
2012-06-25 12:50:46 +01:00
|
|
|
xProp->getPropertyValue("ooLocale") >>= sISOLocale;
|
2009-02-20 10:24:14 +00:00
|
|
|
|
2011-12-26 14:20:50 -02:00
|
|
|
if (sISOLocale.isEmpty())
|
2013-03-28 00:39:06 +01:00
|
|
|
return OUString("en-US");
|
|
|
|
return sISOLocale;
|
2009-02-20 10:24:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace framework
|
2010-10-12 15:53:47 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|