Files
libreoffice/framework/source/accelerators/acceleratorcache.cxx

229 lines
6.9 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 .
*/
#include <accelerators/acceleratorcache.hxx>
#include <xml/acceleratorconfigurationreader.hxx>
#include <threadhelp/readguard.hxx>
#include <threadhelp/writeguard.hxx>
#include <com/sun/star/container/ElementExistException.hpp>
#include <com/sun/star/container/NoSuchElementException.hpp>
#include <vcl/svapp.hxx>
namespace framework
{
//-----------------------------------------------
AcceleratorCache::AcceleratorCache()
: ThreadHelpBase(&Application::GetSolarMutex())
{
}
//-----------------------------------------------
AcceleratorCache::AcceleratorCache(const AcceleratorCache& rCopy)
: ThreadHelpBase(&Application::GetSolarMutex())
{
m_lCommand2Keys = rCopy.m_lCommand2Keys;
m_lKey2Commands = rCopy.m_lKey2Commands;
}
//-----------------------------------------------
AcceleratorCache::~AcceleratorCache()
{
// Dont save anything automaticly here.
// The user has to do that explicitly!
}
//-----------------------------------------------
void AcceleratorCache::takeOver(const AcceleratorCache& rCopy)
{
// SAFE -> ----------------------------------
WriteGuard aWriteLock(m_aLock);
m_lCommand2Keys = rCopy.m_lCommand2Keys;
m_lKey2Commands = rCopy.m_lKey2Commands;
aWriteLock.unlock();
// <- SAFE ----------------------------------
}
//-----------------------------------------------
AcceleratorCache& AcceleratorCache::operator=(const AcceleratorCache& rCopy)
{
takeOver(rCopy);
return *this;
}
//-----------------------------------------------
sal_Bool AcceleratorCache::hasKey(const css::awt::KeyEvent& aKey) const
{
// SAFE -> ----------------------------------
ReadGuard aReadLock(m_aLock);
return (m_lKey2Commands.find(aKey) != m_lKey2Commands.end());
// <- SAFE ----------------------------------
}
//-----------------------------------------------
sal_Bool AcceleratorCache::hasCommand(const OUString& sCommand) const
{
// SAFE -> ----------------------------------
ReadGuard aReadLock(m_aLock);
return (m_lCommand2Keys.find(sCommand) != m_lCommand2Keys.end());
// <- SAFE ----------------------------------
}
//-----------------------------------------------
AcceleratorCache::TKeyList AcceleratorCache::getAllKeys() const
{
TKeyList lKeys;
// SAFE -> ----------------------------------
ReadGuard aReadLock(m_aLock);
CWS-TOOLING: integrate CWS oj18 2009-08-21 15:08:49 +0200 oj r275263 : wrong check 2009-08-21 08:56:01 +0200 oj r275215 : missing not 2009-08-20 07:27:13 +0200 oj r275164 : use new method from global 2009-08-19 10:22:35 +0200 oj r275138 : call GetLocale instead of pLocale 2009-08-18 10:39:32 +0200 oj r275082 : missing header include 2009-08-18 10:09:44 +0200 oj r275081 : new methods at global 2009-08-18 10:09:00 +0200 oj r275080 : unused var 2009-08-18 08:59:04 +0200 oj r275078 : move files from classes to xml 2009-08-17 14:58:16 +0200 oj r275056 : CWS-TOOLING: rebase CWS oj18 to trunk@275001 (milestone: DEV300:m55) 2009-08-17 13:29:44 +0200 oj r275047 : compile error 2009-08-17 13:27:47 +0200 oj r275045 : compile error 2009-08-17 11:44:54 +0200 oj r275040 : add dep 2009-07-22 14:26:05 +0200 oj r274240 : move unused services into fwl 2009-07-22 14:25:35 +0200 oj r274239 : move unused services into fwl 2009-07-22 13:47:45 +0200 oj r274233 : remove some unused code 2009-07-22 09:06:20 +0200 oj r274219 : export dbtoolsclient dbcharsethelper for sc 2009-07-22 08:48:58 +0200 oj r274218 : create NumberFormatter on demand 2009-07-22 08:39:23 +0200 oj r274217 : change char to sal_Char 2009-07-22 07:33:34 +0200 oj r274214 : export dbtoolsclient dbcharsethelper for sc 2009-07-22 07:30:04 +0200 oj r274213 : late init of numberformatter and breakiterator 2009-07-22 07:28:55 +0200 oj r274212 : export dbtoolsclient dbcharsethelper for sc 2009-07-21 13:43:28 +0200 oj r274196 : check if quick start is enbaled 2009-07-21 13:40:09 +0200 oj r274195 : check config entry for UiEventsLogger 2009-07-21 13:37:40 +0200 oj r274194 : code refactoring, remove of duplicate code and some late inits and removale of not needed files 2009-07-21 13:35:38 +0200 oj r274193 : code refactoring, remove of duplicate code and some late inits and removale of not needed files 2009-07-21 13:33:41 +0200 oj r274192 : doc meta data will now be created on demand 2009-07-21 13:13:40 +0200 oj r274187 : load ldap functions on demand 2009-07-21 13:03:17 +0200 oj r274183 : late init of TransliterationImpl 2009-07-21 12:36:10 +0200 oj r274180 : late init of charClass
2009-09-08 04:57:32 +00:00
lKeys.reserve(m_lKey2Commands.size());
TKey2Commands::const_iterator pIt;
CWS-TOOLING: integrate CWS oj18 2009-08-21 15:08:49 +0200 oj r275263 : wrong check 2009-08-21 08:56:01 +0200 oj r275215 : missing not 2009-08-20 07:27:13 +0200 oj r275164 : use new method from global 2009-08-19 10:22:35 +0200 oj r275138 : call GetLocale instead of pLocale 2009-08-18 10:39:32 +0200 oj r275082 : missing header include 2009-08-18 10:09:44 +0200 oj r275081 : new methods at global 2009-08-18 10:09:00 +0200 oj r275080 : unused var 2009-08-18 08:59:04 +0200 oj r275078 : move files from classes to xml 2009-08-17 14:58:16 +0200 oj r275056 : CWS-TOOLING: rebase CWS oj18 to trunk@275001 (milestone: DEV300:m55) 2009-08-17 13:29:44 +0200 oj r275047 : compile error 2009-08-17 13:27:47 +0200 oj r275045 : compile error 2009-08-17 11:44:54 +0200 oj r275040 : add dep 2009-07-22 14:26:05 +0200 oj r274240 : move unused services into fwl 2009-07-22 14:25:35 +0200 oj r274239 : move unused services into fwl 2009-07-22 13:47:45 +0200 oj r274233 : remove some unused code 2009-07-22 09:06:20 +0200 oj r274219 : export dbtoolsclient dbcharsethelper for sc 2009-07-22 08:48:58 +0200 oj r274218 : create NumberFormatter on demand 2009-07-22 08:39:23 +0200 oj r274217 : change char to sal_Char 2009-07-22 07:33:34 +0200 oj r274214 : export dbtoolsclient dbcharsethelper for sc 2009-07-22 07:30:04 +0200 oj r274213 : late init of numberformatter and breakiterator 2009-07-22 07:28:55 +0200 oj r274212 : export dbtoolsclient dbcharsethelper for sc 2009-07-21 13:43:28 +0200 oj r274196 : check if quick start is enbaled 2009-07-21 13:40:09 +0200 oj r274195 : check config entry for UiEventsLogger 2009-07-21 13:37:40 +0200 oj r274194 : code refactoring, remove of duplicate code and some late inits and removale of not needed files 2009-07-21 13:35:38 +0200 oj r274193 : code refactoring, remove of duplicate code and some late inits and removale of not needed files 2009-07-21 13:33:41 +0200 oj r274192 : doc meta data will now be created on demand 2009-07-21 13:13:40 +0200 oj r274187 : load ldap functions on demand 2009-07-21 13:03:17 +0200 oj r274183 : late init of TransliterationImpl 2009-07-21 12:36:10 +0200 oj r274180 : late init of charClass
2009-09-08 04:57:32 +00:00
TKey2Commands::const_iterator pEnd = m_lKey2Commands.end();
for ( pIt = m_lKey2Commands.begin();
CWS-TOOLING: integrate CWS oj18 2009-08-21 15:08:49 +0200 oj r275263 : wrong check 2009-08-21 08:56:01 +0200 oj r275215 : missing not 2009-08-20 07:27:13 +0200 oj r275164 : use new method from global 2009-08-19 10:22:35 +0200 oj r275138 : call GetLocale instead of pLocale 2009-08-18 10:39:32 +0200 oj r275082 : missing header include 2009-08-18 10:09:44 +0200 oj r275081 : new methods at global 2009-08-18 10:09:00 +0200 oj r275080 : unused var 2009-08-18 08:59:04 +0200 oj r275078 : move files from classes to xml 2009-08-17 14:58:16 +0200 oj r275056 : CWS-TOOLING: rebase CWS oj18 to trunk@275001 (milestone: DEV300:m55) 2009-08-17 13:29:44 +0200 oj r275047 : compile error 2009-08-17 13:27:47 +0200 oj r275045 : compile error 2009-08-17 11:44:54 +0200 oj r275040 : add dep 2009-07-22 14:26:05 +0200 oj r274240 : move unused services into fwl 2009-07-22 14:25:35 +0200 oj r274239 : move unused services into fwl 2009-07-22 13:47:45 +0200 oj r274233 : remove some unused code 2009-07-22 09:06:20 +0200 oj r274219 : export dbtoolsclient dbcharsethelper for sc 2009-07-22 08:48:58 +0200 oj r274218 : create NumberFormatter on demand 2009-07-22 08:39:23 +0200 oj r274217 : change char to sal_Char 2009-07-22 07:33:34 +0200 oj r274214 : export dbtoolsclient dbcharsethelper for sc 2009-07-22 07:30:04 +0200 oj r274213 : late init of numberformatter and breakiterator 2009-07-22 07:28:55 +0200 oj r274212 : export dbtoolsclient dbcharsethelper for sc 2009-07-21 13:43:28 +0200 oj r274196 : check if quick start is enbaled 2009-07-21 13:40:09 +0200 oj r274195 : check config entry for UiEventsLogger 2009-07-21 13:37:40 +0200 oj r274194 : code refactoring, remove of duplicate code and some late inits and removale of not needed files 2009-07-21 13:35:38 +0200 oj r274193 : code refactoring, remove of duplicate code and some late inits and removale of not needed files 2009-07-21 13:33:41 +0200 oj r274192 : doc meta data will now be created on demand 2009-07-21 13:13:40 +0200 oj r274187 : load ldap functions on demand 2009-07-21 13:03:17 +0200 oj r274183 : late init of TransliterationImpl 2009-07-21 12:36:10 +0200 oj r274180 : late init of charClass
2009-09-08 04:57:32 +00:00
pIt != pEnd ;
++pIt )
{
lKeys.push_back(pIt->first);
}
aReadLock.unlock();
// <- SAFE ----------------------------------
return lKeys;
}
//-----------------------------------------------
void AcceleratorCache::setKeyCommandPair(const css::awt::KeyEvent& aKey ,
const OUString& sCommand)
{
// SAFE -> ----------------------------------
WriteGuard aWriteLock(m_aLock);
// register command for the specified key
m_lKey2Commands[aKey] = sCommand;
// update optimized structure to bind multiple keys to one command
TKeyList& rKeyList = m_lCommand2Keys[sCommand];
rKeyList.push_back(aKey);
aWriteLock.unlock();
// <- SAFE ----------------------------------
}
//-----------------------------------------------
AcceleratorCache::TKeyList AcceleratorCache::getKeysByCommand(const OUString& sCommand) const
{
TKeyList lKeys;
// SAFE -> ----------------------------------
ReadGuard aReadLock(m_aLock);
TCommand2Keys::const_iterator pCommand = m_lCommand2Keys.find(sCommand);
if (pCommand == m_lCommand2Keys.end())
throw css::container::NoSuchElementException(
OUString(), css::uno::Reference< css::uno::XInterface >());
lKeys = pCommand->second;
aReadLock.unlock();
// <- SAFE ----------------------------------
return lKeys;
}
//-----------------------------------------------
OUString AcceleratorCache::getCommandByKey(const css::awt::KeyEvent& aKey) const
{
OUString sCommand;
// SAFE -> ----------------------------------
ReadGuard aReadLock(m_aLock);
TKey2Commands::const_iterator pKey = m_lKey2Commands.find(aKey);
if (pKey == m_lKey2Commands.end())
throw css::container::NoSuchElementException(
OUString(), css::uno::Reference< css::uno::XInterface >());
sCommand = pKey->second;
aReadLock.unlock();
// <- SAFE ----------------------------------
return sCommand;
}
//-----------------------------------------------
void AcceleratorCache::removeKey(const css::awt::KeyEvent& aKey)
{
// SAFE -> ----------------------------------
WriteGuard aWriteLock(m_aLock);
// check if key exists
TKey2Commands::const_iterator pKey = m_lKey2Commands.find(aKey);
if (pKey == m_lKey2Commands.end())
return;
// get its registered command
// Because we must know its place inside the optimized
// structure, which bind keys to commands, too!
OUString sCommand = pKey->second;
pKey = m_lKey2Commands.end(); // nobody should use an undefined value .-)
// remove key from primary list
m_lKey2Commands.erase(aKey);
// remove key from optimized command list
m_lCommand2Keys.erase(sCommand);
aWriteLock.unlock();
// <- SAFE ----------------------------------
}
//-----------------------------------------------
void AcceleratorCache::removeCommand(const OUString& sCommand)
{
// SAFE -> ----------------------------------
WriteGuard aWriteLock(m_aLock);
const TKeyList& lKeys = getKeysByCommand(sCommand);
AcceleratorCache::TKeyList::const_iterator pKey ;
for ( pKey = lKeys.begin();
pKey != lKeys.end() ;
++pKey )
{
const css::awt::KeyEvent& rKey = *pKey;
removeKey(rKey);
}
m_lCommand2Keys.erase(sCommand);
aWriteLock.unlock();
// <- SAFE ----------------------------------
}
} // namespace framework
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */