diff -r 000000000000 -r eb1f2e154e89 textinput/peninputsplitqwerty/src/peninputsplitqwertywindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputsplitqwerty/src/peninputsplitqwertywindow.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1916 @@ +/* +* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0"" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of vkb window class +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "peninputsplitqwerty.hrh" +#include "peninputsplitqwertywindow.h" +#include "peninputsplitqwertyenum.h" +#include "peninputrangebarinfo.h" +#include "peninputsplitqwertylafdatamgr.h" +#include "peninputsplitqwertylangmeritpair.h" +#include "peninputsplitqwertylayout.h" + +// Constants +const TInt KPeninputVkbWndInvalidIndex = -1; +const TInt KInvalidImg = -1 ; + +_LIT( KVkbWindowResourceFile, "z:\\resource\\plugins\\peninputssqwin.rsc" ); +_LIT( KConfigurationResourceFile, "z:\\resource\\plugins\\peninputssqwinconfiginfo_" ); +_LIT( KResourceFileExtName, ".rsc" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Symbian constructor +// --------------------------------------------------------------------------- +// +CPeninputSplitQwertyWindow* CPeninputSplitQwertyWindow::NewL( + CFepUiLayout* aUiLayout, + MPeninputLayoutContext* aLayoutContext, + MPeninputUiStateMgr* aUiStateMgr ) + { + CPeninputSplitQwertyWindow* + self = new ( ELeave ) CPeninputSplitQwertyWindow( aUiLayout, + aLayoutContext, + aUiStateMgr ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// C++ destructor +// --------------------------------------------------------------------------- +// +CPeninputSplitQwertyWindow::~CPeninputSplitQwertyWindow() + { + delete iIdle; + iUnits.Close(); + + delete iLafMgr; + iLafMgr = NULL; + delete iBmpRotator; + + iAccentCmdList.Close(); + } + +// --------------------------------------------------------------------------- +// Get id of window config resource +// --------------------------------------------------------------------------- +// +TInt CPeninputSplitQwertyWindow::GetWindowConfigResId() + { + return R_PENINPUT_LAYOUT_CONFIG_INFO; + } + +// --------------------------------------------------------------------------- +// Get id of window resource +// --------------------------------------------------------------------------- +// +TInt CPeninputSplitQwertyWindow::GetWindowResId() + { + return R_PENINPUT_LAYOUT_FSQ_WINDOW_INFO; + } + +// --------------------------------------------------------------------------- +// Get resource id of numeric keymapping +// --------------------------------------------------------------------------- +// +TInt CPeninputSplitQwertyWindow::GetNumKeymappingResId() + { + return R_PENINPUT_LAYOUT_KEY_MAPPING_STRING_LIST; + } + +// --------------------------------------------------------------------------- +// Get file name of window config resource +// --------------------------------------------------------------------------- +// +const TDesC& CPeninputSplitQwertyWindow::GetWindowConfigResFileName( TInt aLangID ) + { + if ( aLangID <= 0 ) + { + return KNullDesC; + } + + iResourceFilename.Zero(); + // Generate resource file name according to language id + iResourceFilename = KConfigurationResourceFile(); + + if ( aLangID < 10 ) + { + iResourceFilename.AppendNum( 0 ); + iResourceFilename.AppendNum( aLangID ); + } + else + { + iResourceFilename.AppendNum( aLangID ); + } + iResourceFilename.Append( KResourceFileExtName ); + + return iResourceFilename; + } + +// --------------------------------------------------------------------------- +// Get file name of window resource +// --------------------------------------------------------------------------- +// +const TDesC& CPeninputSplitQwertyWindow::GetWindowResFileName() + { + return KVkbWindowResourceFile(); + } + +// --------------------------------------------------------------------------- +// Change unit size +// --------------------------------------------------------------------------- +// +const TRect CPeninputSplitQwertyWindow::ChangeUnitSize() + { + return TRect(); + } + +// --------------------------------------------------------------------------- +// Change size of client area +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ChangeClientSize() + { + if ( !iPopupWnd->Hiden() ) + { + iPopupWnd->CloseWindow(); + iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby ); + } + + HandlePopupSizeChange(); + + TInt clientLayoutId = IntContext( EPeninputDataTypeClientLayout ); + CPeninputClientLayoutInfo* + clientLayout = ConfigInfo()->FindClientLayoutInfo( clientLayoutId ); + + if ( clientLayout ) + { + ReorganizeControls( clientLayout->LayoutID(), EFalse ); + } + + UpdateArea( iVkbCtrl->Rect(), EFalse ); + } + +// --------------------------------------------------------------------------- +// Construct all controls specified in resource +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::CreateAllControlsL() + { + // Range bar + AddRangeBarL(); + + // Vkb control + iVkbCtrl = CPeninputVkbCtrlExt::NewL( TRect(), + UiLayout(), + EPeninutWindowCtrlIdVkbCtrl, + NULL ); + + iVkbCtrl->SetResourceId( R_PENINPUT_LAYOUT_VKB_KEYBOARD ); + iVkbCtrl->ConstructFromResourceL(); + iVkbCtrl->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 ); + iVkbLayout->SetVkbKeyboard( iVkbCtrl ); + + iVkbCtrl->SetIrregularKeyBoard( EFalse ); + iVkbLayout->SetNonIrregularResourceId( R_AKN_FEP_VKB_NONIRREGULAR_BITMAP ); + iVkbLayout->ConstructFromNonIrregularResourceL(); + + //todo split-view FSQ, bubble support + /* + iVkbCtrl->ShowBubble(ETrue); + iVkbCtrl->SetGowithPointerDown(ETrue); + iVkbCtrl->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); + */ + + //set key to be 9 piece graphics + iVkbCtrl->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal ); + iVkbCtrl->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed ); + iVkbCtrl->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive ); + + AddControlL( iVkbCtrl ); + iVkbCtrl->AddEventObserver( UiLayout() ); + + AddButtonL( EPeninutWindowCtrlIdEnterBtn, + EPeninputLayoutEventEnter, + R_PENINPUT_LAYOUT_VKB_ENTER, + EKeyEnter ); + + // Shift and capslock merged button + + CAknFepCtrlMultiModeButton* button = CAknFepCtrlMultiModeButton::NewLC( + UiLayout(), + EPeninutWindowCtrlIdShiftBtn ); + if ( button ) + { + // Read resource + TInt resid = R_PENINPUT_LAYOUT_VKB_SHIFT_CAPSLOCK; + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, resid ); + button->SetResourceId( resid ); + button->ConstructFromResourceL(); + + CleanupStack::PopAndDestroy( 1 ); //reader + + AddControlL( button ); + button->AddEventObserver( UiLayout() ); + } + CleanupStack::Pop( button ); + + + // Space button + CAknFepCtrlEventButton* spaceButton = EventButtonCtrl( + EPeninutWindowCtrlIdSpaceBtn ); + + // Create 3-pieces color icon for space button + CPenInput3PiecesColorIcons* colorIcons = NULL; + colorIcons = CPenInput3PiecesColorIcons::NewL( R_AKN_FEP_VKB_SPACE_ICON1, + R_AKN_FEP_VKB_SPACE_ICON2, + R_AKN_FEP_VKB_SPACE_ICON3 ); + + spaceButton->Set3PiecesColorIcons( colorIcons ); + + //set background of space button to be 9 piece graphics + spaceButton->SetImageFrameId( KAknsIIDQsnFrKeypadButtonFrNormal, + KAknsIIDQsnFrKeypadButtonFrPressed, + KAknsIIDQsnFrKeypadButtonFrInactive ); + + // Add popup window + AddPopupWindowL(); + + } + +// --------------------------------------------------------------------------- +// Set control fonts. Fonts info comes from resource +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SetControlsFont() + { + } + +// --------------------------------------------------------------------------- +// Pop up choice list +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::PopupChoiceList() + { + TRAP_IGNORE( PopupRangeListL() ); + } + +// --------------------------------------------------------------------------- +// Re-organize all controls in the assigned client area layout +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ReorganizeControls( TInt aClientLayoutId, + TBool aNeedReset ) + { + CPeninputClientLayoutInfo* clientLayout = + ConfigInfo()->FindClientLayoutInfo( aClientLayoutId ); + RPointerArray& controlList = + clientLayout->ControlInfoList(); + + const TInt keyColumns = clientLayout->Columns(); + const TInt keyRows = clientLayout->Rows(); + + if ( iLastUsedTotalColumns == keyColumns && iLastUsedTotalRows == keyRows ) + { + return; + } + + iLafMgr->SetLayoutType( + iLafMgr->LayoutTypeFromRowsColumns( keyRows, keyColumns ) + ); + + iLastUsedTotalColumns = keyColumns; + iLastUsedTotalRows = keyRows; + + TRect winRect( Rect().iTl, iLafMgr->EntirePaneRect().Size() ); + + SetWindowRect( winRect ); + ReorgnizeTitleBar(); + + const TInt count = controlList.Count(); + TInt controlID = 0; + CFepUiBaseCtrl* ctrl = NULL; + TRect rect; + TRect inRect; + TRect exRect; + + TPoint winPoint = Rect().iTl; + TPoint LafPoint = iLafMgr->EntirePaneRect().iTl; + + for ( TInt i = 0; i < count; i++ ) + { + controlID = controlList[i]->ControlID(); + ctrl = Control( controlID ); + + if ( !ctrl ) + { + continue; + } + + AddNotOwnedControl( ctrl ); + + if ( ( ctrl->ControlType() | ECtrlButton ) == ECtrlButton ) + { + + iLafMgr->GetButtonRect( + TPeninputCommonCtrlID(ctrl->ControlId() ), + exRect, inRect ); + + if( controlID == EPeninutWindowCtrlIdShiftBtn) + { + CAknFepCtrlMultiModeButton* btn = NULL; + btn = static_cast(ctrl); + btn->SizeChanged( exRect, inRect, ETrue ); + } + else + { + CAknFepCtrlCommonButton* btn = NULL; + btn = static_cast(ctrl); + + if ( ctrl->ControlId() == EPeninutWindowCtrlIdSpaceBtn ) + { + // config 3 pieces icon info + TRect frameRect, middleRect; + iLafMgr->GetSpaceButtonExLayoutInfo( frameRect, middleRect ); + inRect = frameRect; + + TDraw3PiecesFrame pic3frame( + KAknsIIDQgnIndiInputSpaceL, + KAknsIIDQgnIndiInputSpaceMiddle, + KAknsIIDQgnIndiInputSpaceR, + middleRect); + + btn->SetDraw3PieceFrameInfo( pic3frame ); + } + + btn->SizeChanged( exRect, inRect, ETrue ); + } + } + + else if ( ctrl->ControlId() == EPeninutWindowCtrlIdVkbCtrl ) + { + iVkbCtrl->SetFont( iLafMgr->KeyTextFont() ); + iVkbCtrl->SetTextLineLayout( iLafMgr->KeyTextLayout() ); + iVkbCtrl->SetTextFormat( iLafMgr->PreviewWndText() ); //Read laf + if ( aNeedReset ) + { + iVkbCtrl->Reset(); + } + + rect = iLafMgr->KeypadRect(); + CPeninputVkbCtrlExt* ctrlext = static_cast(ctrl); + ctrlext->SizeChanged(rect); + } + } + } + +// --------------------------------------------------------------------------- +// Do when case changed +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::DoCaseChange( TInt aNewCase ) + { + TInt curCase = IntContext( EPeninputDataTypeCase ); + + if ( aNewCase == curCase ) + { + return; + } + + TInt curRange = IntContext( EPeninputDataTypeCurrentRange ); + + if ( ( curRange == ERangeEnglish ) + || ( curRange == ERangeAccent ) + || ( curRange == ERangeNative && ConfigInfo()->CaseSensitive() ) + ) + { + // Set shift and caplock button + TInt shfit; + TInt capslock; + + CPeninputDataConverter::ShiftCapslockByCase( aNewCase, shfit, capslock ); + + iLayoutContext->SetData( EPeninputDataTypeShiftDown, &shfit ); + iLayoutContext->SetData( EPeninputDataTypeCapslockDown, &capslock ); + iLayoutContext->SetData( EPeninputDataTypeCase, &aNewCase ); + ChangeMergedButtonStatus( shfit, capslock ); + + TInt vkblayout = ConfigInfo()->ShiftCapsSingleVkbLayoutByCase( curRange, + aNewCase ); + + if ( curRange == ERangeAccent ) + { + TInt curAccentIndex = IntContext( EPeninputDataTypeCurrentAccent ); + vkblayout = vkblayout + curAccentIndex * 2; + } + + ChangeVkbLayout( vkblayout ); + } + } + +// --------------------------------------------------------------------------- +// Handle control event +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::HandleControlEvent( TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& aEventData ) + { + // Call this function in base class + CPeninputLayoutWindowExt::HandleControlEvent( aEventType, aCtrl, + aEventData ); + + TInt* data = (TInt*) aEventData.Ptr(); + TInt ctrlId = aCtrl ? aCtrl->ControlId() : -1; + + switch ( aEventType ) + { + case EEventButtonUp: + { + if ( ctrlId == EPeninutWindowCtrlIdRangeBtn ) + { + PopupChoiceList(); + } + } + break; + case EPeninputLayoutVkbEventResetShift: + { + HandleShiftAndCapslockBtnClicked(); + } + break; + case EPenInputLayoutEventClosePopup: + { + if ( iPopupWnd && !iPopupWnd->Hiden() ) + { + iPopupWnd->CloseWindow(); + iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby ); + } + } + break; + case EEventChoiceSelected: + { + CFepLayoutChoiceList::SEvent* event = NULL; + event = (CFepLayoutChoiceList::SEvent*) aEventData.Ptr(); + + if ( event->iIndex != KPeninputVkbWndInvalidIndex ) + { + if ( ctrlId == EPeninutWindowCtrlIdAccentPopupWindow ) + { + TRAP_IGNORE( HandleRangeListSelectedL( aCtrl, aEventData ) ); + } + } + iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby ); + } + break; + case EEventVirtualKeyLatched: + { + HandleVirtualKeyLatchedEvent( aEventType, aCtrl, aEventData ); + } + break; + case EEventVirtualKeyUnLatched: + { + UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf ); + TBool deadKeyChange = EFalse; + iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange ); + iNewDeadKeyBuf = KNullDesC; + } + break; + case EPeninputLayoutEventBack: + { + TInt latchedFlag = IntContext( EAkninputDataTypeLatchedSet ); + // If one DeadKey is latched, + // only unlatch the DeadKey and reset the iNewDeadKeyBuf + // Don't delete the visible charater in ICF + if ( latchedFlag ) + { + UnLatchDeadKey(iNewDeadKeyBuf); + + TBool deadKeyChange = EFalse; + iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange ); + iNewDeadKeyBuf = KNullDesC; + } + } + break; + case EPeninputLayoutEventEnter: + case EPeninputLayoutEventSpace: + { + TInt latchedFlag = IntContext( EAkninputDataTypeLatchedSet ); + if ( latchedFlag ) + { + TInt length = aEventData.Length() + iNewDeadKeyBuf.Length(); + HBufC* newCharBuf = HBufC::New( length ); + if ( newCharBuf ) + { + newCharBuf->Des().Append( iNewDeadKeyBuf ); + newCharBuf->Des().Append( aEventData ); + } + + UnLatchDeadKey( iNewDeadKeyBuf ); + + TBool deadKeyChange = EFalse; + iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange ); + + // Submit DeadKey + Space or Enter at the same time + UiLayout()->SignalOwner( ESignalKeyEvent, *newCharBuf ); + iNewDeadKeyBuf = KNullDesC; + delete newCharBuf; + } + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// load settings from resource +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ConstructFromResourceL() + { + CPeninputLayoutWindowExt::ConstructFromResourceL(); + if ( iVkbLayout && !iFirstConstruct ) + { + if ( iVkbCtrl->IsIrregularKeyBoard() ) + { + iVkbLayout->ConstructFromIrregularResourceL(); + } + else + { + iVkbLayout->ConstructFromNonIrregularResourceL(); + } + + SetVkbLayoutSize(); + + if ( IsRtoLLanguage( iLanguage ) ) + { + //Mirror backspace graphic + HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn ); + } + } + + iFirstConstruct = EFalse; + } + +// --------------------------------------------------------------------------- +// Callback function to do background construction +// --------------------------------------------------------------------------- +// +TInt CPeninputSplitQwertyWindow::BackgroundTaskL( TAny* aPtr ) + { + CPeninputSplitQwertyWindow* self = static_cast(aPtr); + self->DoIdleConstructL(); + return EFalse; // only run once + } + +// --------------------------------------------------------------------------- +// Set current language +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SetSwitchlistLanguage(TInt aLang) + { + ASSERT( IsValidLanguage( aLang ) ); + + //Check language input direction change + TBool isLangDirectionChange = EFalse; + if ( IsValidLanguage( iLanguage ) ) + { + isLangDirectionChange = IsRtoLLanguage( aLang ) ^ IsRtoLLanguage( iLanguage ); + } + else + { + isLangDirectionChange = IsRtoLLanguage( aLang ); + } + + TPeninputVkbLafOption option = iLafMgr->OptionType(); + if ( aLang ==ELangHebrew || aLang == ELangGreek || aLang == ELangHindi + || aLang == ELangMarathi ) + { + option = (TPeninputVkbLafOption)( option & ( ~EOption3CellRange ) ); + iLafMgr->SetLafOption( option ); + } + else + { + option = (TPeninputVkbLafOption)( option | EOption3CellRange ); + iLafMgr->SetLafOption( option ); + } + + if( isLangDirectionChange ) + { + //Mirror backspace graphic + HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn ); + } + + iLanguage = aLang; + } + +// --------------------------------------------------------------------------- +// Set current editor is secret +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SetSwitchlistSecretFlag( TBool aSecret ) + { + CFepUiBaseCtrl* ctrl = Control( EPeninutWindowCtrlIdSwitcherPopupWindow ); + CPeninputLayoutInputmodelChoice* choice = + static_cast( ctrl ); + if ( choice ) + { + choice->SetSecretEditor( aSecret ); + } + //disable or enable arrow keys of FSQ in secret editor. + } + +// --------------------------------------------------------------------------- +// Dim the arrow keys on qwerty when the editor is findpane or secret editor +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::DimArrowKeys( TBool aDimArrow ) + { + if ( iLayoutContext->LayoutType() == EPluginInputModeFSQ + && iArrowLeftButton && iArrowRightButton ) + { + iArrowLeftButton->SetDimmed( aDimArrow ); + iArrowRightButton->SetDimmed( aDimArrow ); + } + } + +// --------------------------------------------------------------------------- +// Handle accented char event +// --------------------------------------------------------------------------- +// +TBool CPeninputSplitQwertyWindow::HandleAccentCharEvent( TInt /*aEventType*/, + const TDesC& aEventData, + const TDesC& aDeadKey, + HBufC* anewCharBuf ) + { + // Get the unicode of virtual key char + TBuf<16> buf; + TKeyEvent* event = (TKeyEvent*) aEventData.Ptr(); + buf.Append( event->iCode ); + TBool rs = EFalse; + + // Caculate the accent char number + TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair); + + if ( aDeadKey.Compare( KNullDesC ) != 0 ) // One DeadKey is latched + { + for ( TInt i = 0; i < count; i++ ) + { + if ( ( aDeadKey[0] == KSupportLanguages[i].iDeadKey ) && + ( buf[0] == KSupportLanguages[i].iChar) ) + { + if ( anewCharBuf ) + { + anewCharBuf->Des().Append( KSupportLanguages[i].iAccentedChar ); + rs = ETrue; + } + break; + } + } + } + return rs; + } + +// --------------------------------------------------------------------------- +// Handle virtual key latched event +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::HandleVirtualKeyLatchedEvent(TInt /*aEventType*/, + CFepUiBaseCtrl* /*aCtrl*/, + const TDesC& aEventData ) + { + TBuf<16> deadKey(KNullDesC); + TKeyEvent* event = (TKeyEvent*) aEventData.Ptr(); + deadKey.Append(event->iCode); + + TInt latchedFlag = IntContext( EAkninputDataTypeLatchedSet ); + if ( latchedFlag ) + { + // Update the new and old DeadKey buffer + iOldDeadKeyBuf = iNewDeadKeyBuf; + iNewDeadKeyBuf = deadKey; + + // When type another DeadKey, submit the previous one. + UiLayout()->SignalOwner( ESignalKeyEvent, iOldDeadKeyBuf ); + // Unlatch the previous DeadKey + UnLatchDeadKey(iOldDeadKeyBuf); + } + else + { + iNewDeadKeyBuf = deadKey; + + // Set DeadKey state to latched + TBool deadKeyChange = ETrue; + iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange ); + } + + // Send the char to FEP + // Not submit the DeadKey when latch it. +// UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf ); + } + +// --------------------------------------------------------------------------- +// Handle virtual key up event +// --------------------------------------------------------------------------- +// +TBool CPeninputSplitQwertyWindow::HandleVirtualKeyUpEvent(TInt aEventType, + CFepUiBaseCtrl* /*aCtrl*/, + const TDesC& aEventData ) + { + // Get DeadKey state + TInt latchedFlag = IntContext( EAkninputDataTypeLatchedSet ); + if ( latchedFlag ) + { + TBool ret = EFalse; + + TRAP_IGNORE( ret = HandleDeadKeyL( aEventType, aEventData ) ); + + if ( ret ) + { + return ETrue; + } + else + { + // When the DeadKey can not combine with current character, + // Sumit current DeadKey + UiLayout()->SignalOwner( ESignalKeyEvent, iNewDeadKeyBuf ); + } + } + + iNewDeadKeyBuf = KNullDesC; + return EFalse; + } + +// --------------------------------------------------------------------------- +// Set dead key +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SetDeadKey() + { + // Get VKB list + RPointerArray vkbListInfo; + vkbListInfo = iVkbLayout->VkbLayoutInfoList(); + TInt vkbListNum = vkbListInfo.Count(); + + CPeninputVkbKeyInfo* keyinfo; + TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair); + for ( TInt i = 0; i < vkbListNum; i++ ) + { + for ( TInt j = 0; j < count; j++ ) + { + if ( vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeChar || + vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeCharShift ) + { + keyinfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey ); + if ( keyinfo ) + { + // Set the DeadKey as a latch button + CVirtualKey* key = keyinfo->Key(); + key->SetLatchKey( ETrue ); + } + } + } + } + } + + +// --------------------------------------------------------------------------- +// Unlatch a DeadKey by the key buffer +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::UnLatchDeadKey( const TDesC& abuf ) + { + RPointerArray vkbListInfo; + vkbListInfo = iVkbLayout->VkbLayoutInfoList(); + TInt vkbListNum = vkbListInfo.Count(); + + CPeninputVkbKeyInfo* keyinfo; + TInt count = sizeof(KSupportLanguages)/sizeof(TLangMeritPair); + for ( TInt i = 0; i < vkbListNum; i++ ) + { + for ( TInt j = 0; j < count; j++ ) + { + // Only NativeChar and NativeCharShift layout contain DeadKey + if(vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeChar || + vkbListInfo[i]->LayoutID() == EPeninputVkbLayoutNativeCharShift) + { + // Find the DeadKey in NativeChar or NativeCharShift layout + keyinfo = vkbListInfo[i]->FindKey( KSupportLanguages[j].iDeadKey ); + if ( keyinfo ) + { + CVirtualKey* key = keyinfo->Key(); + if ( key->Latched() ) + { + if ( abuf == KNullDesC ) + { + // When focus change, the latched key will be released + TBool deadKeyChange = EFalse; + iLayoutContext->SetData( EAkninputDataTypeLatchedSet, + &deadKeyChange ); + key->SetLatched( EFalse ); + TRect rect = key->Rect(); + rect.Move( iVkbCtrl->Rect().iTl ); + UpdateArea( rect, EFalse ); + return; + } + if ( abuf[0] == KSupportLanguages[j].iDeadKey ) + { + // When another DeadKey is clicked, the old one will be released + key->SetLatched( EFalse ); + TRect rect = key->Rect(); + rect.Move( iVkbCtrl->Rect().iTl ); + UpdateArea( rect, EFalse ); + return; + } + } + } + } + } + } + } + +// --------------------------------------------------------------------------- +// Update laf data +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::UpdateLafData() + { + TRAP_IGNORE( iLafMgr->UpdateLafDataL() ); + } + +// --------------------------------------------------------------------------- +// Load accent labels for range list +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ConstructAccentListL( TInt aLangId ) + { + iAccentCmdList.Reset(); + + TBool is10x3 = ( aLangId == ELangEnglish ) || ( aLangId == ELangAmerican ) + || ( aLangId == ELangDutch) || (aLangId == ELangTagalog ) + || ( aLangId == ELangIndonesian) || (aLangId == ELangMalay ); + + if ( aLangId == ELangVietnamese ) + { + _LIT( KVietAccentList1, "\x00E0 - \x013A" ); + _LIT( KVietAccentList2, "\x013C - \x017E" ); + + CFepLayoutChoiceList::SItem item; + + item.iCommand = EPeninputVkbLayoutAccented1; + item.iText.Copy( KVietAccentList1 ); + iAccentCmdList.Append( item ); + + item.iCommand = EPeninputVkbLayoutAccented2; + item.iText.Copy( KVietAccentList2 ); + iAccentCmdList.Append( item ); + } + + // 10X3 + else if ( is10x3 ) + { + _LIT( KVietAccentList1, "\x00E0 - \x0121" ); + _LIT( KVietAccentList2, "\x0123 - \x014F" ); + _LIT( KVietAccentList3, "\x0151 - \x017E" ); + + CFepLayoutChoiceList::SItem item; + + item.iCommand = EPeninputVkbLayoutAccented1; + item.iText.Copy( KVietAccentList1 ); + iAccentCmdList.Append( item ); + + item.iCommand = EPeninputVkbLayoutAccented2; + item.iText.Copy( KVietAccentList2 ); + iAccentCmdList.Append( item ); + + + item.iCommand = EPeninputVkbLayoutAccented3; + item.iText.Copy( KVietAccentList3 ); + iAccentCmdList.Append( item ); + } + //10X4 + else + { + // Add item + TResourceReader reader; + CFepLayoutChoiceList::SItem item; + + item.iCommand = EPeninputVkbLayoutAccented1; + CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT1 ); + TPtrC p1 = reader.ReadTPtrC(); + item.iText.Copy( p1 ); + iAccentCmdList.Append( item ); + CleanupStack::PopAndDestroy( 1 ); //reader + + item.iCommand = EPeninputVkbLayoutAccented2; + CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT2 ); + TPtrC p2 = reader.ReadTPtrC(); + item.iText.Copy( p2 ); + iAccentCmdList.Append( item ); + CleanupStack::PopAndDestroy( 1 ); //reader + + item.iCommand = EPeninputVkbLayoutAccented3; + CCoeEnv::Static()->CreateResourceReaderLC( reader, R_PENINPUT_VKB_ACCENT3 ); + TPtrC p3 = reader.ReadTPtrC(); + item.iText.Copy( p3 ); + iAccentCmdList.Append( item ); + CleanupStack::PopAndDestroy( 1 );//reader + } + + iPopupInited = ETrue; + iPopupSet = ETrue; + } + +// --------------------------------------------------------------------------- +// Load range labels for range list +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ConstructRangeLabelListL( TInt aLangId ) + { + iRangeLabels.iLabelNativeChar.Zero(); + iRangeLabels.iLabelNativeNumber.Zero(); + iRangeLabels.iLabelLatinChar.Zero(); + iRangeLabels.iLabelLatinNumber.Zero(); + iRangeLabels.iLabelSymbol.Zero(); + iRangeLabels.iLabelAccent.Zero(); + + TInt resid = -1; + switch ( aLangId ) + { + case 16: //Cyrillic + case 42: + case 93: + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_CYRILLIC; + } + break; + + case 54: //Greek + case 55: + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_GREEK; + } + break; + case 57: //Hebrew + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_HEBREW; + } + break; + case 37: //Arabic + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_ARABIC; + } + break; + case 50://Farsi + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_FARSI; + } + break; + case 94: //Urdu + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_URDU; + } + break; + case 33: //Thai + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_THAI; + } + break; + case 29: //chinese + case 30: + case 31: + break; + case 58: //Devanagiri + case 72: + { + resid = R_PENINPUT_LAYOUT_VKB_RANGES_DEVANAGIRI; + } + break; + default: //Latin + { + //1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + //11, 12, 13, 14, 15, 17, 18, 20, 21, 22, + //23, 24, 25, 26, 27, 28, 39, 44, 45, 46, + //47, 48, 49, 51, 59, 67, 68, 70, 76, 78, + //79, 82, 83, 85, 91, 96, 102, 103, 401, 402 + resid = R_PENINPUT_LAYOUT_VKB_RANGES_LATIN; + } + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, resid ); + TPtrC ptr1 = reader.ReadTPtrC(); + TPtrC ptr2 = reader.ReadTPtrC(); + TPtrC ptr3 = reader.ReadTPtrC(); + TPtrC ptr4 = reader.ReadTPtrC(); + TPtrC ptr5 = reader.ReadTPtrC(); + TPtrC ptr6 = reader.ReadTPtrC(); + + iRangeLabels.iLabelNativeChar.Copy( ptr1 ); + iRangeLabels.iLabelNativeNumber.Copy( ptr2 ); + iRangeLabels.iLabelLatinChar.Copy( ptr3 ); + iRangeLabels.iLabelLatinNumber.Copy( ptr4 ); + iRangeLabels.iLabelSymbol.Copy( ptr5 ); + iRangeLabels.iLabelAccent.Copy( ptr6 ); + + CleanupStack::PopAndDestroy( 1 ); //reader + } + +// --------------------------------------------------------------------------- +// Show or hide preview bubble +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ShowBubble( TInt aShow ) + { + iVkbCtrl->ShowBubble( EFalse ); + } + +// --------------------------------------------------------------------------- +// Update state of range button +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::UpdateRangeCtrlsL() + { + TInt currentRange = IntContext( EPeninputDataTypeCurrentRange ); + + TInt resid = ConfigInfo()->RangebarResId(); + + TResourceReader reader; + + CCoeEnv::Static()->CreateResourceReaderLC( reader, resid ); + + TInt count = reader.ReadInt16(); + for ( TInt i = 0; i < count; i++ ) + { + const TInt16 rangeId = reader.ReadInt16(); + const TInt16 rangeType = reader.ReadInt16(); + const TInt16 ctrlId = reader.ReadInt16(); + const TInt16 ctrlType = reader.ReadInt16(); + const TInt32 ctrlResId = reader.ReadInt32(); + const TInt actionStyle = reader.ReadInt16(); + TBool hide = reader.ReadInt16(); + TInt posidx = reader.ReadInt16(); + + if ( currentRange == rangeId ) + { + iRangeButton->SetResourceId( ctrlResId ); + iRangeButton->ConstructFromResourceL(); + break; + } + } + + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + + } + +// --------------------------------------------------------------------------- +// Update layout position and size +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::UpdateLayoutPosAndSize() + { + if ( iLafMgr ) + { + TRect rect = iLafMgr->ClientRect(); + TPoint pos = iLafMgr->EntirePaneRect().iTl; + + UiLayout()->SetRect( rect ); + UiLayout()->LayoutOwner()->SetPosition( pos ); + } + } + +// --------------------------------------------------------------------------- +// Set laf layout type +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SetLafLayOut( TInt aRows, TInt aColumns ) + { + iLafMgr->SetLayoutType( + iLafMgr->LayoutTypeFromRowsColumns( aRows, aColumns ) + ); + } + +// --------------------------------------------------------------------------- +// Create custom control +// --------------------------------------------------------------------------- +// +TBool CPeninputSplitQwertyWindow::CreateCustomControlL( TInt16 aControlId, + TInt32 aImageId ) + { + TBool create = ETrue; + switch ( aControlId ) + { + case EPeninupWindowCtrlIdArrowLeftBtn: + { + if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ ) + { + break; + } + + if ( !iArrowLeftButton ) + { + iArrowLeftButton = CAknFepCtrlRepeatButton::NewL( + UiLayout(), + aControlId, + EPeninputLayoutEventLeftArrow, + EKeyLeftArrow, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive ); + + AddControlL( iArrowLeftButton ); + iArrowLeftButton->AddEventObserver( UiLayout() ); + iArrowLeftButton->SetResourceId( aImageId ); + } + + iArrowLeftButton->ConstructFromResourceL(); + } + break; + case EPeninupWindowCtrlIdArrowRightBtn: + { + if ( iLayoutContext->LayoutType() != EPluginInputModeFSQ ) + { + break; + } + + if ( !iArrowRightButton ) + { + iArrowRightButton = CAknFepCtrlRepeatButton::NewL( + UiLayout(), + aControlId, + EPeninputLayoutEventRightArrow, + EKeyRightArrow, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive ); + + AddControlL( iArrowRightButton ); + iArrowRightButton->AddEventObserver( UiLayout() ); + iArrowRightButton->SetResourceId( aImageId ); + } + iArrowRightButton->ConstructFromResourceL(); + } + break; + default: + { + create = EFalse; + } + } + return create; + } + +// --------------------------------------------------------------------------- +// Add custom control to this group +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::AddCustomControlGroupL( CFepUiBaseCtrl* aCtrl ) + { + AddControlL( aCtrl ); + } + +// --------------------------------------------------------------------------- +// Set layout size +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SetVkbLayoutSize() + { + TRect outrect,innerrect; + iLafMgr->GetPreviewWndRect( outrect, innerrect ); + + iVkbCtrl->SetTextFormat( iLafMgr->PreviewWndText() ); //Read laf + + TSize bubbleSize( outrect.Width(), outrect.Height() ); + iVkbCtrl->SetBubbleSize( bubbleSize ); // Read laf + + iVkbCtrl->SetFrameDiff( innerrect.iTl.iX - outrect.iTl.iX, + innerrect.iTl.iY - outrect.iTl.iY, + outrect.iBr.iX - innerrect.iBr.iX, + outrect.iBr.iY - innerrect.iBr.iY ); + + TInt vkbLayoutid = IntContext( EPeninputDataTypeVkbLayout ); + CPeninputVkbLayoutInfo* vkbLayout = ConfigInfo()->FindVkbLayoutInfo( + vkbLayoutid ); + + // Calculate current vkblayout according current layout + if ( vkbLayout ) + { + const TInt columns = vkbLayout->Columns(); + const TInt rows = vkbLayout->Rows(); + TRect keyRect; + TRect charRect; + + //iLafMgr->SetLayoutType(iLafMgr->LayoutTypeFromRowsColumns(rows,columns)); + + for ( TInt exter = 0; exter < rows; exter++ ) + { + for ( TInt inter = 0; inter < columns; inter++ ) + { + iLafMgr->GetKeyRect( inter, exter, keyRect, charRect ); + vkbLayout->SetKeyInfo( exter, inter, keyRect, charRect, + iLafMgr->KeyTextFont() ); + } + } + + if ( iVkbCtrl->IsIrregularKeyBoard() ) + { + CFbsBitmap* bitmap = iVkbCtrl->IrregularKeyBitmap( EKeyLeftDown, + EKeyStateNormal ); + + TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size(); + TSize size = bitmap->SizeInPixels(); + if ( curSize != size ) + { + for ( TInt i = 0; i <= EKeyRightUp; i++ ) + { + for ( TInt j = 0; j <= EKeyStateDimmedMask; j++ ) + { + bitmap = iVkbCtrl->IrregularKeyBitmap( + (TVirtualKeyIrregularKeyType)i, + (TVirtualKeyIrregularKeyState)j ); + + AknIconUtils::SetSize( bitmap, curSize, + EAspectRatioNotPreserved ); + + } + } + } + } + else + { + CFbsBitmap* bitmap = iVkbCtrl->NonIrregularKeyBitmap( EKeyBmpNormal ); + TSize curSize = vkbLayout->KeyInfoList()[0]->Key()->Rect().Size(); + TSize size = bitmap->SizeInPixels(); + if( curSize != size ) + { + for ( TInt i = 0; i <= EKeyBmpLastType; i++ ) + { + bitmap = iVkbCtrl->NonIrregularKeyBitmap( (TVirtualKeyBmpType)i ); + if( bitmap ) + { + AknIconUtils::SetSize( bitmap, curSize, + EAspectRatioNotPreserved ); + } + } + } + } + } + } + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CPeninputSplitQwertyWindow::CPeninputSplitQwertyWindow( + CFepUiLayout* aUiLayout, + MPeninputLayoutContext* aLayoutContext, + MPeninputUiStateMgr* aUiStateMgr ) + : CPeninputLayoutWindowExt( aUiLayout, aLayoutContext ) + , iUiStateMgr( aUiStateMgr ) + , iPopupInited( EFalse ) + , iPopupSet( EFalse ) + , iFirstConstruct( ETrue ) + { + } + +// --------------------------------------------------------------------------- +// Symbian constructor +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ConstructL() + { + iBmpRotator = CPeninputSyncBitmapRotator::NewL(); + iLafMgr = CPeninputSplitQwertyLafMgr::NewL(); + iLafMgr->SetInputModeL( TPluginInputMode( iLayoutContext->LayoutType() ) ); + CPeninputLayoutWindowExt::ConstructL(); + } + +// --------------------------------------------------------------------------- +// Add range bar into client area +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::AddRangeBarL() + { + CAknFepCtrlCommonButton* button = CAknFepCtrlCommonButton::NewL( + UiLayout(), + EPeninutWindowCtrlIdRangeBtn, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrFunctionButtonInactive ); + + CleanupStack::PushL( button ); + button->SetResourceId( R_PENINPUT_LAYOUT_VKB_RANGE_DEFAULT ); + button->ConstructFromResourceL(); + AddControlL( button ); + CleanupStack::Pop( button ); + + button->AddEventObserver( UiLayout() ); + iRangeButton = button; + } + +// --------------------------------------------------------------------------- +// Add button to client area +// --------------------------------------------------------------------------- +// +CAknFepCtrlEventButton* CPeninputSplitQwertyWindow::AddButtonL( + const TInt aControlId, + const TInt aEventId, + const TInt aResId, + const TInt aUnicode, + const TBool aIsRepeat ) + { + CAknFepCtrlEventButton* button = NULL; + + if ( aIsRepeat ) + { + button = CAknFepCtrlRepeatButton::NewL( UiLayout(), + aControlId, + aEventId, + aUnicode ); + } + else + { + button = CAknFepCtrlEventButton::NewL( UiLayout(), + aControlId, + aEventId, + aUnicode ); + } + + CleanupStack::PushL( button ); + if ( button ) + { + // Read resource + TResourceReader reader; + + CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId ); + button->SetResourceId( aResId ); + button->ConstructFromResourceL(); + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + + // Add into the control pool + AddControlL( button ); + button->AddEventObserver(UiLayout()); + + } + CleanupStack::Pop( button ); + + return button; + } + +// --------------------------------------------------------------------------- +// Add popup window to display accented char list +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::AddPopupWindowL() + { + iPopupWnd = CPeninputCommonChoiceList::NewL( + UiLayout(), + EPeninutWindowCtrlIdAccentPopupWindow, + KAknsIIDQsnFrList, + KAknsIIDQsnFrPopupSub ); + + iPopupWnd->AddEventObserver( UiLayout() ); + + AddControlL( iPopupWnd ); + iIdle = CIdle::NewL( CActive::EPriorityIdle ); + iIdle ->Start( TCallBack( BackgroundTaskL, this ) ); + } + +// --------------------------------------------------------------------------- +// Reorgnize position and size of function buttons +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::ReorgnizeTitleBar() + { + TRect inner, bound; + + CAknFepCtrlEventButton* evtButton = NULL; + CAknFepCtrlCommonButton* cmmButton = NULL; + TBool bBKSizeChanged = EFalse; + + evtButton = EventButtonCtrl( EPeninutWindowCtrlIdOptionBtn ); + if ( evtButton ) + { + iLafMgr->GetButtonRect(EPeninutWindowCtrlIdOptionBtn, bound, inner ); + evtButton->SizeChanged( bound, inner, ETrue ); + } + + cmmButton = CommonButtonCtrl( EPeninutWindowCtrlIdCloseBtn ); + if ( cmmButton ) + { + iLafMgr->GetButtonRect(EPeninutWindowCtrlIdCloseBtn, bound ,inner ); + cmmButton->SizeChanged( bound, inner, ETrue ); + } + + cmmButton = CommonButtonCtrl( EPeninutWindowCtrlIdBackspaceBtn ); + if ( cmmButton ) + { + iLafMgr->GetButtonRect( EPeninutWindowCtrlIdBackspaceBtn, bound, inner ); + + if( bound.Size() != cmmButton->Rect().Size() && + inner.Size() != cmmButton->ForgroundBmpRect().Size() ) + { + bBKSizeChanged = ETrue; + } + cmmButton->SizeChanged( bound, inner, ETrue ); + } + + cmmButton = CommonButtonCtrl( EPeninutWindowCtrlIdSpaceBtn ); + if ( cmmButton ) + { + iLafMgr->GetButtonRect(EPeninutWindowCtrlIdSpaceBtn, bound, inner ); + inner = bound; + inner.Shrink( 10, 0 ); + + cmmButton->SizeChanged( bound, inner, ETrue ); + + TRect spaceIconRect = inner; + spaceIconRect.Shrink( 10, 0 ); + TDraw3PiecesFrame draw3pic( KAknsIIDQgnIndiInputSpaceL, + KAknsIIDQgnIndiInputSpaceMiddle, + KAknsIIDQgnIndiInputSpaceR, + spaceIconRect); + cmmButton->SetDraw3PieceFrameInfo( draw3pic ); + } + + if ( iRangeButton ) + { + iLafMgr->GetButtonRect( EPeninutWindowCtrlIdRangeBtn, bound, inner ); + iRangeButton->SetRect( bound ); + iRangeButton->SizeChanged( bound, inner, ETrue ); + } + + if ( iArrowLeftButton ) + { + iLafMgr->GetButtonRect( EPeninupWindowCtrlIdArrowLeftBtn, bound, inner ); + iArrowLeftButton->SizeChanged( bound, inner, ETrue ); + } + if ( iArrowRightButton ) + { + iLafMgr->GetButtonRect( EPeninupWindowCtrlIdArrowRightBtn, bound, inner ); + iArrowRightButton->SizeChanged( bound, inner, ETrue ); + } + + //If backspace size changed when language is RtoL mirror should be used + if ( bBKSizeChanged && IsRtoLLanguage( iLanguage ) ) + { + //Mirror backspace graphic + HandleButtonResOnLangDirChange( EPeninutWindowCtrlIdBackspaceBtn ); + } + } + + +// --------------------------------------------------------------------------- +// Show range list +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::PopupRangeListL() + { + TInt currentRange = IntContext( EPeninputDataTypeCurrentRange ); + TInt permittedRange = IntContext( EPeninputDataTypePermittedRange ); + TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent ); + + CFepUiBaseCtrl* btn = Control( EPeninutWindowCtrlIdRangeBtn ); + if( !btn ) + { + return; + } + + if ( !iPopupInited ) + { + TRAP_IGNORE( DoIdleConstructL() ); + } + + iPopupWnd->ClearItemsL(); + + CPeninputRangeBarInfo* rbinfo= ConfigInfo()->RangeBarInfo(); + CPeninputRangeInfo* rgninfo = NULL; + + //add accent items + if ( permittedRange & ERangeAccent ) + { + rgninfo = rbinfo->FindRange( ERangeAccent ); + if ( rgninfo ) + { + for ( TInt i = 0; i < iAccentCmdList.Count(); i++ ) + { + if( currentRange != ERangeAccent || currentAccent != i ) + { + iPopupWnd->AddItemL( iAccentCmdList[i] ); + } + } + } + } + + //add range items + + CFepLayoutChoiceList::SItem item; + + if ( permittedRange & ERangeNative ) + { + rgninfo = rbinfo->FindRange( ERangeNative ); + if ( rgninfo && currentRange != ERangeNative ) + { + item.iCommand = EPeninputVkbLayoutNativeChar; + item.iText.Copy( iRangeLabels.iLabelNativeChar ); + iPopupWnd->AddItemL( item ); + } + } + + if ( permittedRange & ERangeNativeNumber ) + { + rgninfo = rbinfo->FindRange( ERangeNativeNumber ); + if ( rgninfo && currentRange != ERangeNativeNumber ) + { + item.iCommand = EPeninputVkbLayoutNativeNumber; + item.iText.Copy( iRangeLabels.iLabelNativeNumber ); + iPopupWnd->AddItemL( item ); + } + } + + if ( permittedRange & ERangeEnglish ) + { + rgninfo = rbinfo->FindRange( ERangeEnglish ); + if ( rgninfo && currentRange != ERangeEnglish ) + { + item.iCommand = EPeninputVkbLayoutLatinChar; + item.iText.Copy( iRangeLabels.iLabelLatinChar ); + iPopupWnd->AddItemL( item ); + } + } + + if ( permittedRange & ERangeNumber ) + { + rgninfo = rbinfo->FindRange( ERangeNumber ); + if ( rgninfo && currentRange != ERangeNumber ) + { + item.iCommand = EPeninputVkbLayoutLatinNumber; + item.iText.Copy( iRangeLabels.iLabelLatinNumber ); + iPopupWnd->AddItemL( item ); + } + } + + /* + if ( permittedRange & ERangeSymbol ) + { + rgninfo = rbinfo->FindRange( ERangeSymbol ); + if ( rgninfo && currentRange != ERangeSymbol ) + { + item.iCommand = EPeninputVkbLayoutSymbol; + item.iText.Copy( _L("#*") ); + iPopupWnd->AddItemL( item ); + } + } + */ + + iPopupWnd->SetListColumnNumWithLafL( iPopupWnd->ItemsCount() ); + + iPopupWnd->SetCurrentFocusedIndex( - 1 ); //no active item + iPopupWnd->Display( btn->Rect() ); + iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStatePopup ); + } + +// --------------------------------------------------------------------------- +// get resource info of accented chars popup window +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::GetPopupWndInfoFromResL( TResourceReader aRes, + const TRect& aRect ) + { + TPtrC bmpFileName = aRes.ReadTPtrC(); + TInt32 imgMajorSkinId = aRes.ReadInt32(); + + TAknsItemID id; + + MAknsSkinInstance* skininstance = AknsUtils::SkinInstance(); + + TInt popWinBmpId = aRes.ReadInt16(); + TInt popWinBmpMaskId = aRes.ReadInt16(); + TInt popWinBmpSkinId = aRes.ReadInt16(); + + id.Set( TInt( imgMajorSkinId ), popWinBmpSkinId ); + + if ( popWinBmpId != KInvalidImg ) + { + AknsUtils::CreateIconL( skininstance, + id, + iPopupWndBgImg, + bmpFileName, + popWinBmpId ); + + AknIconUtils::SetSize( iPopupWndBgImg, TSize( aRect.Width(), + aRect.Height() * 3 ), EAspectRatioNotPreserved ); + iPopupWnd->SetBackgroundBitmapL( iPopupWndBgImg ); + } + + TInt focusBmpId = aRes.ReadInt16(); + TInt focusBmpMaskId = aRes.ReadInt16(); + TInt focusBmpSkinId = aRes.ReadInt16(); + + id.Set( TInt( imgMajorSkinId ), focusBmpSkinId ); + + if ( focusBmpId != KInvalidImg ) + { + AknsUtils::CreateIconL( skininstance, + id, + iPopupWndFocusImg, + bmpFileName, + focusBmpId ); + + AknIconUtils::SetSize( iPopupWndFocusImg, + TSize( aRect.Width(),aRect.Height() * 3 ), + EAspectRatioNotPreserved ); + + iPopupWnd->SetFocusBmp( iPopupWndFocusImg ); + } + } + +// --------------------------------------------------------------------------- +// Background constructor +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::DoIdleConstructL() + { + if( iPopupInited ) + { + return; + } + + // Read resource + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, + R_PENINPUT_LAYOUT_VKB_POPUP_WINDOW ); + + GetPopupWndInfoFromResL( reader, iPopupItemRect ); + + // Pop and destroy reader + CleanupStack::PopAndDestroy( 1 ); + + } + +// --------------------------------------------------------------------------- +// Simulate raw event +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::SimulateRawEvent( TInt aScanCode, + TRawEvent::TType aType ) + { + TRawEvent event; + event.Set( aType, aScanCode ); + + TPtrC eventPtr( reinterpret_cast(&event), + sizeof(event)/sizeof(TUint16) ); + + UiLayout()->SignalOwner(ESignalSimulateEvent,eventPtr); + } + +TInt CPeninputSplitQwertyWindow::IntContext( TPeninputDataType aDataIndex ) + { + return CPeninputDataConverter::AnyToInt( + iLayoutContext->RequestData( aDataIndex ) + ); + } + +// --------------------------------------------------------------------------- +// Handle size changed for range list +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::HandlePopupSizeChange() + { + if ( IntContext( EAkninputDataTypeSizeChanging ) || (!iPopupSet) ) + { + // if size changing, or popup window's property has not been set yet + TAknWindowLineLayout appWnd = AknLayoutScalable_Avkon::application_window(0).LayoutLine(); + iAppWndRect = appWnd.Rect(); + + TAknWindowLineLayout mainPane = AknLayoutScalable_Avkon::main_pane(4).LayoutLine(); + TAknLayoutRect mainPaneRect; + mainPaneRect.LayoutRect( iAppWndRect, mainPane ); + + TAknWindowLineLayout choiceWnd = AknLayoutScalable_Avkon::popup_choice_list_window(1).LayoutLine(); + TAknLayoutRect choiceRect; + choiceRect.LayoutRect( mainPaneRect.Rect(), choiceWnd ); + + iPopupItemRect = TRect( 0, 0, choiceRect.Rect().Width(), + AknLayoutScalable_Avkon::list_single_choice_list_pane(0).LayoutLine().iH ); + + iChoiceTextLayout = + AknLayoutScalable_Avkon::list_single_choice_list_pane_t1(1).LayoutLine(); + } + + const CFont* font = AknLayoutUtils::FontFromId( iChoiceTextLayout.iFont, NULL ); + iPopupWnd->SetFont( font ); + iPopupWnd->SetItemRect( iPopupItemRect, iPopupItemRect ); + + TInt leftMargin = iChoiceTextLayout.il; + + iPopupWnd->SetMarginAndBaseline( leftMargin, font->HeightInPixels() ); + + iPopupWnd->SetFontColor( AKN_LAF_COLOR_STATIC( iChoiceTextLayout.iC ) ); + + TSize imgSize ( iPopupItemRect.Width(), iPopupItemRect.Height() * 3 ); + AknIconUtils::SetSize( iPopupWndBgImg, imgSize, EAspectRatioNotPreserved ); + AknIconUtils::SetSize(iPopupWndFocusImg, imgSize, EAspectRatioNotPreserved ); + + iPopupSet = ETrue; + } + + +// --------------------------------------------------------------------------- +// Handle dead key event +// --------------------------------------------------------------------------- +// + TBool CPeninputSplitQwertyWindow::HandleDeadKeyL( TInt aEventType, + const TDesC& aEventData ) + { + // Set DeadKey to unlatched state + TBool deadKeyChange = EFalse; + iLayoutContext->SetData( EAkninputDataTypeLatchedSet, &deadKeyChange ); + UnLatchDeadKey( iNewDeadKeyBuf ); + + // Get the accent char + HBufC* newCharBuf = HBufC::NewL( 1 ); + + TBool handled = HandleAccentCharEvent( aEventType, + aEventData, + iNewDeadKeyBuf, + newCharBuf ); + + if( handled ) + { + // Send ths accent key to FEP + UiLayout()->SignalOwner( ESignalKeyEvent, *newCharBuf ); + iNewDeadKeyBuf = KNullDesC; + delete newCharBuf; + return ETrue; + } + + delete newCharBuf; + + return EFalse; + } + + // -------------------------------------------------------------------------- + // Handle resource of button(base on language direction) + // -------------------------------------------------------------------------- + // +void CPeninputSplitQwertyWindow::HandleButtonResOnLangDirChange( TInt aControlId ) + { + TRAP_IGNORE( HandleButtonResOnLangDirChangeL( aControlId ) ); + } + +// --------------------------------------------------------------------------- +// Handle resource of button(base on language direction) +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::HandleButtonResOnLangDirChangeL( TInt aControlId ) + { + CAknFepCtrlCommonButton* ctrl = CommonButtonCtrl( aControlId ); + if ( ctrl && iBmpRotator ) + { + TSyncRotationAngle rotChoice = CBitmapRotator::EMirrorVerticalAxis; + + User::LeaveIfError( + iBmpRotator->Rotate( *ctrl->ForgroundBmp() ,rotChoice ) + ); + + User::LeaveIfError( + iBmpRotator->Rotate( *ctrl->ForgroundBmpMask(), rotChoice ) + ); + } + } + +// --------------------------------------------------------------------------- +// Handle range list event +// --------------------------------------------------------------------------- +// +void CPeninputSplitQwertyWindow::HandleRangeListSelectedL( CFepUiBaseCtrl* /*aCtrl*/, + const TDesC& aData ) + { + CFepLayoutChoiceList::SEvent* event = (CFepLayoutChoiceList::SEvent*)aData.Ptr(); + + TInt index = -1; + TInt range = ERangeInvalid; + + if ( event->iCommand == EPeninputVkbLayoutNativeChar ) + { + range = ERangeNative; + } + + else if ( event->iCommand == EPeninputVkbLayoutNativeNumber ) + { + range = ERangeNativeNumber; + } + + else if ( event->iCommand == EPeninputVkbLayoutLatinChar ) + { + range = ERangeEnglish; + } + + else if ( event->iCommand == EPeninputVkbLayoutLatinNumber ) + { + range = ERangeNumber; + } + + else if ( event->iCommand == EPeninputVkbLayoutSymbol ) + { + range = ERangeSymbol; + } + + else if ( event->iCommand == EPeninputVkbLayoutAccented1 ) + { + index = 0; + range = ERangeAccent; + } + + else if ( event->iCommand == EPeninputVkbLayoutAccented2 ) + { + index = 1; + range = ERangeAccent; + } + + else if ( event->iCommand == EPeninputVkbLayoutAccented3 ) + { + index = 2; + range = ERangeAccent; + } + + TInt currentRange = IntContext( EPeninputDataTypeCurrentRange ); + TInt currentAccent = IntContext( EPeninputDataTypeCurrentAccent ); + + if ( currentRange == range ) + { + if ( range != ERangeAccent || currentAccent == index ) + { + iUiStateMgr->SetCurrentUiState( EPeninputVkbUiStateStandby ); + return; + } + } + + iLayoutContext->SetData( EPeninputDataTypeCurrentAccent, &index ); + + if ( range != ERangeAccent ) + { + ChangeRange( range ); + } + else + { + ChangeRange( ERangeAccent, EPeninputVkbLayoutAccented1 + 2 * index, ETrue ); + } + UpdateRangeCtrlsL(); + } + +// End Of File