LibreOffice Module vcl (master)  1
mnemonicengine.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <vcl/mnemonicengine.hxx>
21 
22 #include <vcl/i18nhelp.hxx>
23 #include <vcl/svapp.hxx>
24 #include <vcl/event.hxx>
25 #include <vcl/settings.hxx>
26 
27 namespace vcl
28 {
30  {
32 
33  explicit MnemonicEngine_Data( IMnemonicEntryList& _rEntryList )
34  :rEntryList( _rEntryList )
35  {
36  }
37  };
38 
39  namespace
40  {
41  const void* lcl_getEntryForMnemonic( IMnemonicEntryList const & _rEntryList, sal_Unicode _cMnemonic, bool& _rbAmbiguous )
42  {
43  _rbAmbiguous = false;
44 
46 
47  OUString sEntryText;
48  const void* pSearchEntry = _rEntryList.FirstSearchEntry( sEntryText );
49 
50  const void* pFirstFoundEntry = nullptr;
51  bool bCheckingAmbiguity = false;
52  const void* pStartedWith = pSearchEntry;
53  while ( pSearchEntry )
54  {
55  if ( rI18nHelper.MatchMnemonic( sEntryText, _cMnemonic ) )
56  {
57  if ( bCheckingAmbiguity )
58  {
59  // that's the second (at least) entry with this mnemonic
60  _rbAmbiguous = true;
61  return pFirstFoundEntry;
62  }
63 
64  pFirstFoundEntry = pSearchEntry;
65  bCheckingAmbiguity = true;
66  }
67 
68  pSearchEntry = _rEntryList.NextSearchEntry( pSearchEntry, sEntryText );
69  if ( pSearchEntry == pStartedWith )
70  break;
71  }
72 
73  return pFirstFoundEntry;
74  }
75  }
76 
78  :m_pData( new MnemonicEngine_Data( _rEntryList ) )
79  {
80  }
81 
83  {
84  bool bAccelKey = _rKEvt.GetKeyCode().IsMod2();
85  if ( !bAccelKey )
86  return false;
87 
88  sal_Unicode cChar = _rKEvt.GetCharCode();
89  bool bAmbiguous = false;
90  const void* pEntry = lcl_getEntryForMnemonic( m_pData->rEntryList, cChar, bAmbiguous );
91  if ( !pEntry )
92  return false;
93 
94  m_pData->rEntryList.SelectSearchEntry( pEntry );
95  if ( !bAmbiguous )
96  m_pData->rEntryList.ExecuteSearchEntry( pEntry );
97 
98  // handled
99  return true;
100  }
101 
103  {
104  }
105 
106 } // namespace vcl
107 
108 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
static const AllSettings & GetSettings()
Gets the application's settings.
Definition: svapp.cxx:704
const vcl::I18nHelper & GetUILocaleI18nHelper() const
sal_uInt16 sal_Unicode
MnemonicEngine(IMnemonicEntryList &_rEntryList)
callback for a MnemonicEngine
MnemonicEngine_Data(IMnemonicEntryList &_rEntryList)
bool MatchMnemonic(const OUString &rString, sal_Unicode cMnemonicChar) const
Definition: i18nhelp.cxx:141
IMnemonicEntryList & rEntryList
const vcl::KeyCode & GetKeyCode() const
Definition: event.hxx:53
bool HandleKeyEvent(const KeyEvent &_rKEvt)
handles a key event
sal_Unicode GetCharCode() const
Definition: event.hxx:52
::std::unique_ptr< MnemonicEngine_Data > m_pData
bool IsMod2() const
Definition: keycod.hxx:62