1*9f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9f62ea84SAndrew Rist * distributed with this work for additional information 6*9f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 9*9f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10*9f62ea84SAndrew Rist * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*9f62ea84SAndrew Rist * 13*9f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9f62ea84SAndrew Rist * software distributed under the License is distributed on an 15*9f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 17*9f62ea84SAndrew Rist * specific language governing permissions and limitations 18*9f62ea84SAndrew Rist * under the License. 19*9f62ea84SAndrew Rist * 20*9f62ea84SAndrew Rist *************************************************************/ 21*9f62ea84SAndrew Rist 22*9f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_vcl.hxx" 26cdf0e10cSrcweir #include <vcl/mnemonicengine.hxx> 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <vcl/i18nhelp.hxx> 29cdf0e10cSrcweir #include <vcl/svapp.hxx> 30cdf0e10cSrcweir #include <vcl/event.hxx> 31cdf0e10cSrcweir 32cdf0e10cSrcweir //........................................................................ 33cdf0e10cSrcweir namespace vcl 34cdf0e10cSrcweir { 35cdf0e10cSrcweir //........................................................................ 36cdf0e10cSrcweir 37cdf0e10cSrcweir //==================================================================== 38cdf0e10cSrcweir //= MnemonicEngine_Data 39cdf0e10cSrcweir //==================================================================== 40cdf0e10cSrcweir struct MnemonicEngine_Data 41cdf0e10cSrcweir { 42cdf0e10cSrcweir IMnemonicEntryList& rEntryList; 43cdf0e10cSrcweir MnemonicEngine_Datavcl::MnemonicEngine_Data44cdf0e10cSrcweir MnemonicEngine_Data( IMnemonicEntryList& _rEntryList ) 45cdf0e10cSrcweir :rEntryList( _rEntryList ) 46cdf0e10cSrcweir { 47cdf0e10cSrcweir } 48cdf0e10cSrcweir }; 49cdf0e10cSrcweir 50cdf0e10cSrcweir //-------------------------------------------------------------------- 51cdf0e10cSrcweir namespace 52cdf0e10cSrcweir { lcl_getEntryForMnemonic(IMnemonicEntryList & _rEntryList,sal_Unicode _cMnemonic,bool & _rbAmbiguous)53cdf0e10cSrcweir const void* lcl_getEntryForMnemonic( IMnemonicEntryList& _rEntryList, sal_Unicode _cMnemonic, bool& _rbAmbiguous ) 54cdf0e10cSrcweir { 55cdf0e10cSrcweir _rbAmbiguous = false; 56cdf0e10cSrcweir 57cdf0e10cSrcweir const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper(); 58cdf0e10cSrcweir 59cdf0e10cSrcweir String sEntryText; 60cdf0e10cSrcweir const void* pSearchEntry = _rEntryList.FirstSearchEntry( sEntryText ); 61cdf0e10cSrcweir 62cdf0e10cSrcweir const void* pFirstFoundEntry = NULL; 63cdf0e10cSrcweir bool bCheckingAmbiguity = false; 64cdf0e10cSrcweir const void* pStartedWith = pSearchEntry; 65cdf0e10cSrcweir while ( pSearchEntry ) 66cdf0e10cSrcweir { 67cdf0e10cSrcweir if ( rI18nHelper.MatchMnemonic( sEntryText, _cMnemonic ) ) 68cdf0e10cSrcweir { 69cdf0e10cSrcweir if ( bCheckingAmbiguity ) 70cdf0e10cSrcweir { 71cdf0e10cSrcweir // that's the second (at least) entry with this mnemonic 72cdf0e10cSrcweir _rbAmbiguous = true; 73cdf0e10cSrcweir return pFirstFoundEntry; 74cdf0e10cSrcweir } 75cdf0e10cSrcweir 76cdf0e10cSrcweir pFirstFoundEntry = pSearchEntry; 77cdf0e10cSrcweir bCheckingAmbiguity = true; 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir pSearchEntry = _rEntryList.NextSearchEntry( pSearchEntry, sEntryText ); 81cdf0e10cSrcweir if ( pSearchEntry == pStartedWith ) 82cdf0e10cSrcweir break; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir return pFirstFoundEntry; 86cdf0e10cSrcweir } 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir //==================================================================== 90cdf0e10cSrcweir //= MnemonicEngine 91cdf0e10cSrcweir //==================================================================== 92cdf0e10cSrcweir //-------------------------------------------------------------------- MnemonicEngine(IMnemonicEntryList & _rEntryList)93cdf0e10cSrcweir MnemonicEngine::MnemonicEngine( IMnemonicEntryList& _rEntryList ) 94cdf0e10cSrcweir :m_pData( new MnemonicEngine_Data( _rEntryList ) ) 95cdf0e10cSrcweir { 96cdf0e10cSrcweir } 97cdf0e10cSrcweir 98cdf0e10cSrcweir //-------------------------------------------------------------------- HandleKeyEvent(const KeyEvent & _rKEvt)99cdf0e10cSrcweir bool MnemonicEngine::HandleKeyEvent( const KeyEvent& _rKEvt ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir sal_Bool bAccelKey = _rKEvt.GetKeyCode().IsMod2(); 102cdf0e10cSrcweir if ( !bAccelKey ) 103cdf0e10cSrcweir return false; 104cdf0e10cSrcweir 105cdf0e10cSrcweir sal_Unicode cChar = _rKEvt.GetCharCode(); 106cdf0e10cSrcweir bool bAmbiguous = false; 107cdf0e10cSrcweir const void* pEntry = lcl_getEntryForMnemonic( m_pData->rEntryList, cChar, bAmbiguous ); 108cdf0e10cSrcweir if ( !pEntry ) 109cdf0e10cSrcweir return false; 110cdf0e10cSrcweir 111cdf0e10cSrcweir m_pData->rEntryList.SelectSearchEntry( pEntry ); 112cdf0e10cSrcweir if ( !bAmbiguous ) 113cdf0e10cSrcweir m_pData->rEntryList.ExecuteSearchEntry( pEntry ); 114cdf0e10cSrcweir 115cdf0e10cSrcweir // handled 116cdf0e10cSrcweir return true; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir //-------------------------------------------------------------------- ~MnemonicEngine()120cdf0e10cSrcweir MnemonicEngine::~MnemonicEngine() 121cdf0e10cSrcweir { 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir //........................................................................ 125cdf0e10cSrcweir } // namespace vcl 126cdf0e10cSrcweir //........................................................................ 127