diff -r ebd48d2de13c -r ecbabf52600f fep/aknfep/src/aknfepinputstatespellingpinyinphrasecreation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/src/aknfepinputstatespellingpinyinphrasecreation.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -0,0 +1,402 @@ +/* +* Copyright (c) 2004 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: +* Provides the CAknFepUIInputStatePinyinPhrase methods. +* +*/ + + + + + + + + + + + +#include //CPtiEngine +#include //keys +#include +#include +#include + +#include "AknFepPanic.h" +#include "aknfepinputstatespellingpinyinphrasecreation.h" +#include "AknFepUIManagerStateInterface.h" //MAknFepUIManagerStateInterface +#include "AknFepManagerUIInterface.h" //MAknFepManagerUIInterface +#include "AknFepUiCtrlContainerChinese.h" +#include "AknFepUICtrlInputPane.h" +#include "AknFepUICtrlCandidatePane.h" +#include "AknFepUICtrlPinyinPopup.h" //Pinyin phrase +#include "aknfepuictrleditpane.h" //pinyin phrase creation +#include "AknFepManager.h" + +const TUint16 KDelimiter =0x0027; +const TInt KMaxPhraseCreationCount = 7; +const TInt KMaxSpellingLength = 10; + +// --------------------------------------------------------- +// C++ construct. +// --------------------------------------------------------- +// +TAknFepInputStateSpellingPinyinPhraseCreation::TAknFepInputStateSpellingPinyinPhraseCreation( + MAknFepUIManagerStateInterface* aOwner, + MAknFepUICtrlContainerChinese* aUIContainer) + :TAknFepInputStatePinyinPhraseCreationBase( aOwner, aUIContainer ) + { + iState = ESpellingSelection; + + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + uiContainer->FocusCandidatePane(EFalse); + uiContainer->CandidatePane()->ShowCandidateOrdinals(EFalse); + uiContainer->SetLayout(MAknFepUICtrlContainerChinese::ELayoutPhraseCreation); + uiContainer->CandidatePane()->SelectFirstPhrase(); + uiContainer->ShowVerticalScrollArrows(ETrue); + uiContainer->ShowHorizontalScrollArrows(EFalse); + uiContainer->InputPane()->SetOverrideFontId(0); + uiContainer->SetFepMan( iOwner->FepMan() ); + uiContainer->EditPaneWindow()->DeactiveCursor(); + + // in the case that we are coming back to the input pane from the candidate pane, + // we need to ensure that the current selection is selected correctly + if ( uiContainer->PinyinPopupWindow()->GetFromEditToSpellingFlag() ) + { + TInt validCount = uiContainer-> + PinyinPopupWindow()->InEffectKeystrokeArray()->Count(); + TInt chineseCount = uiContainer-> + PinyinPopupWindow()->ChooseChineseCharacterArray()->Count(); + TInt index = 0; + if ( !uiContainer->PinyinPopupWindow()->GetPhraseCreationEditingState() ) + { + index = uiContainer->PinyinPopupWindow()->CurrentSelection(); + } + uiContainer->EditPaneWindow()->SetCursorIndexOfKeystroke( validCount ); + ShowInfo(); + uiContainer->EditPaneWindow()-> + SetUnderline( chineseCount, chineseCount + validCount - 1 ); + uiContainer->InputPane()->SetText( uiContainer-> + PinyinPopupWindow()->PhoneticSpellingArray()->MdcaPoint( index ) ); + uiContainer->PinyinPopupWindow()->SetFromEditToSpellingFlag(); + uiContainer->PinyinPopupWindow()->SplitPhraseSpellingIntoPages(); + uiContainer->PinyinPopupWindow()->SetDisplayPage( index ); + uiContainer->PinyinPopupWindow()->SetPhraseItemTexts(); + uiContainer->PinyinPopupWindow()->PopupSizeChanged(); // phrase input + uiContainer->PinyinPopupWindow()->Enable( ETrue ); + } + else + { + ImplicityShowInfo( ETrue ); + } + + ChangeCba(); + } + +// --------------------------------------------------------- +// HandleKeyL +// --------------------------------------------------------- +// +TBool TAknFepInputStateSpellingPinyinPhraseCreation::HandleKeyL( + TInt aKey, + TKeyPressLength aLength ) + { + switch( aKey ) + { + case EKeyBackspace: + case EKeyUpArrow: + HandleKeyBackspaceOrKeyUpArrow( aLength ); + break; + case EKeyRightArrow: + HandleKeyRightArrow(); + break; + case EKeyLeftArrow: + HandleKeyLeftArrow(); + break; + case EKeyOK: + case EKeyDownArrow: + case EKeyCBA1: + HandleKeyOKOrKeyDownArrowOrKeyCBA1( aLength ); + break; + case EKeyCBA2: + iOwner->FepMan()->TryCloseUiL(); + break; + default: + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + break; + } + return ETrue; + } + +// --------------------------------------------------------- +// Initialize state +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::InitializeStateL(void) + { + iOwner->FepMan()->UpdateCbaL(R_AKNFEP_SOFTKEYS_PHRASE_CREATION_SELECT_CANCEL_SELECT); + } + +// --------------------------------------------------------- +// Implicity the show info +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::ImplicityShowInfo( + TBool aGetScreenCoordinates ) + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow(); + CDesCArrayFlat* validKeystroke = popup->InEffectKeystrokeArray(); + TInt chineseCount = popup->ChooseChineseCharacterArray()->Count(); + TInt selection(0); + // get cursor position + TPoint baseLine = TPoint(0,0); + TInt height = 0; + TInt ascent = 0; + if ( aGetScreenCoordinates ) + { + TRAPD(ret,iOwner->FepMan()->GetScreenCoordinatesL(baseLine,height,ascent)); + if (ret == KErrNone) + { + uiContainer->SetContainerPosition(baseLine, height); + } + } + if ( popup->GetPhraseCreationState() ) + { + GetValidKeystroke(); + editPane->SetCursorIndexOfKeystroke( validKeystroke->Count() ); + } + else + { + editPane->SetCursorIndexOfKeystroke( validKeystroke->Count() ); + } + + ShowInfo(); + editPane->SetUnderline( chineseCount, chineseCount + + validKeystroke->Count() - 1 ); + if ( popup->GetPhraseCreationState() ) + { + ClearDeliberateSelection(); + } + else + { + selection = popup->CurrentSelection(); + } + RefreshUI( selection ); + if ( popup->GetPhraseCreationState() ) + { + popup->SetPhraseCreationState( EFalse ); + } + } + +// --------------------------------------------------------- +// Refresh the show info +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::RefreshShowInfo() + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow(); + MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane(); + CDesCArrayFlat* validKeystroke = popup->InEffectKeystrokeArray(); + CDesCArrayFlat* spelling = popup->PhoneticSpellingArray(); + CDesCArrayFlat* candidateArray = + uiContainer->CandidatePane()->CandidateArray(); + TInt selection = popup->CurrentSelection(); + TInt chineseCount = popup->ChooseChineseCharacterArray()->Count(); + TPtr deliberateSelection = iOwner->GetLatestDeliberateSelection(); + + editPane->SetCursorIndexOfKeystroke( validKeystroke->Count() ); + ShowInfo(); + editPane->SetUnderline( chineseCount, chineseCount + + validKeystroke->Count() - 1 ); + inputPane->SetText( spelling->MdcaPoint( selection ) ); + deliberateSelection = spelling->MdcaPoint( selection ); + + popup->SplitPhraseSpellingIntoPages(); + popup->SetDisplayPage(selection); + popup->SetPhraseItemTexts(); + popup->PopupSizeChanged(); + popup->Enable( validKeystroke->Count() ); + GetCandidate( selection ); + uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages(); + uiContainer->CandidatePane()->SetCandidateBuffer(); + uiContainer->Enable( ETrue ); + uiContainer->ShowHorizontalScrollArrows( EFalse ); + uiContainer->ShowVerticalScrollArrows( ETrue ); + UpdateIndicator(); + } + +// --------------------------------------------------------- +// KeyBackspace Or KeyUpArrow +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::HandleKeyBackspaceOrKeyUpArrow( + TKeyPressLength aLength ) + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + + TBool state = ETrue; + if ( popup->IsChangeStatet() && aLength == ELongKeyPress ) + { + state = EFalse; + } + else + { + popup->SetChangeState( EFalse ); + } + if ( state ) + { + popup->SetChangeState( ETrue ); + //change state to EKeySequenceEdit + popup->SetFromEditToSpellingFlag( ETrue ); + iOwner->ChangeState( EKeySequenceEdit ); + } + } + +// --------------------------------------------------------- +// KeyOK Or KeyDownArrow Or KeyCBA1 +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::HandleKeyOKOrKeyDownArrowOrKeyCBA1( + TKeyPressLength aLength ) + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + TBool state = ETrue; + if ( popup->IsChangeStatet() && aLength == ELongKeyPress ) + { + state = EFalse; + } + else + { + popup->SetChangeState( EFalse ); + } + + TBool changeState = ( popup->ChooseChineseCharacterArray()->Count() != + KMaxPhraseCreationCount ) && ( popup->KeystrokeArray()->Count() != 0 ); + + if ( changeState && state ) + { + if(popup->IsEnabled()) + { + popup->Enable(EFalse); + } + popup->SetChangeState( ETrue ); + iOwner->ChangeState(ECandidateSelection); + } + } + +// --------------------------------------------------------- +// KeyRightArrow +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::HandleKeyRightArrow() + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + TBuf spelling; + popup->SetPhraseCreationState( EFalse ); + if( popup->SelectNextPhrase() ) + { + if ( RefreshValidKeystroke() ) + { + RefreshShowInfo(); + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + } + +// --------------------------------------------------------- +// KeyRightArrow +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::HandleKeyLeftArrow() + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + + if( popup->SelectPrevPhrase() ) + { + if ( RefreshValidKeystroke() ) + { + RefreshShowInfo(); + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + } + else + { + iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone); + } + } + +// --------------------------------------------------------- +// Refresh Valid Keystroke. +// --------------------------------------------------------- +// +TBool TAknFepInputStateSpellingPinyinPhraseCreation::RefreshValidKeystroke() + { + TRAPD( ret, RefreshValidKeystrokeL() ); + if ( KErrNone != ret ) + { + return EFalse; + } + return ETrue; + } + +// --------------------------------------------------------- +// Refresh Valid Keystroke. +// --------------------------------------------------------- +// +void TAknFepInputStateSpellingPinyinPhraseCreation::RefreshValidKeystrokeL() + { + MAknFepUICtrlContainerChinese* uiContainer = UIContainer(); + MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow(); + CDesCArrayFlat* validKeystroke = popup->InEffectKeystrokeArray(); + CDesCArrayFlat* keystroke = popup->ShowKeystrokeArray(); + CDesCArrayFlat* spelling = popup->PhoneticSpellingArray(); + TInt selection = popup->CurrentSelection(); + validKeystroke->Reset(); + TInt spellLength = spelling->MdcaPoint( selection ).Length(); + + for ( TInt i = 0; ( i < spellLength ) && ( spellLength <= + keystroke->Count() ); ++i ) + { + validKeystroke->AppendL( keystroke->MdcaPoint( i ) ); + } + + if ( spellLength < keystroke->Count() ) + { + if ( KDelimiter == keystroke->MdcaPoint( spellLength )[0] ) + { + validKeystroke->AppendL( keystroke->MdcaPoint( spellLength ) ); + } + } + + validKeystroke->Compress(); + } + +// End of file