fep/aknfep/src/AknFepUiInputStateCandidateChinesePhrase.cpp
changeset 0 eb1f2e154e89
child 3 f5a1e66df979
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/AknFepUiInputStateCandidateChinesePhrase.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,265 @@
+/*
+* 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 candidate chinese phrase state
+*
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+#include "AknFepUiInputStateCandidateChinesePhrase.h"
+#include "AknFepUiCtrlContainerChinese.h"
+#include "AknFepUIManagerStateInterface.h"  //MAknFepUIManagerStateInterface
+#include "AknFepUICtrlPinyinPopup.h"        //Pinyin phrase
+#include "aknfepuictrleditpane.h"
+#include "AknFepUICtrlCandidatePane.h"      //MAknFepUICtrlCandidatePane
+#include <PtiEngine.h>                      //CPtiEngine
+#include <aknnotewrappers.h>
+#include "aknfepzhuyinconvertion.h"
+#include "aknfepzhuyinkeyhandlerinterface.h"
+#include <PtiUserDicEntry.h>
+
+const TInt KMaxBufLen = 100;
+const TInt KInputPhraseMaxLength = 7;
+
+_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" );
+///////////////////
+// Candidate state
+///////////////////
+
+TAknFepInputStateCandidateChinesePhrase::TAknFepInputStateCandidateChinesePhrase(
+                               MAknFepUIManagerStateInterface* aOwner,
+                               MAknFepUICtrlContainerChinese* aUIContainer)
+    :TAknFepInputStateCandidateBaseChinesePhrase(aOwner, aUIContainer)
+    {
+    iState = ECandidate;
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    
+    uiContainer->CandidatePane()->SelectFirstPhrase();
+
+    TBool multiplePages = !(uiContainer->CandidatePane()->IsLastPage() &&
+                            uiContainer->CandidatePane()->IsFirstPage());
+    TInt bufLength = iOwner->PtiEngine()->CandidatePage().Length();
+    TBool showHorizontalScrollArrows = multiplePages || bufLength>1;
+
+    uiContainer->ShowHorizontalScrollArrows(showHorizontalScrollArrows); 
+    uiContainer->ShowVerticalScrollArrows(multiplePages);
+    uiContainer->FocusCandidatePane(ETrue);
+    uiContainer->CandidatePane()->ShowCandidateOrdinals(ETrue);    
+    UpdateIndicator();
+    UIContainer()->EditPaneWindow()->DisableCursor();
+    }
+
+TBool TAknFepInputStateCandidateChinesePhrase::HandleKeyL(TInt aKey, TKeyPressLength aLength)
+    {
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    
+    CDesCArrayFlat* zhuyinSymbols = uiContainer->PinyinPopupWindow()->ZhuyinSymbols();
+    CDesCArrayFlat* chineseDisped = uiContainer->PinyinPopupWindow()->ChineseCharsDisped();
+    CDesCArrayFlat* zhuyinSymbolsForChinese = uiContainer->PinyinPopupWindow()->ZhuyinSymbolsForChineseCharsDisped();
+    CDesCArrayFlat* candidateList = uiContainer->CandidatePane()->CandidateArray();
+    MZhuyinKeyHandler* zhuyinKeyHandler = iOwner->ZhuyinKeyHandler();
+    
+    TInt index = MapKeyToIndex(aKey);
+    
+    if(aKey == EKeyBackspace)
+        {
+        zhuyinKeyHandler->SetStatusChgFlag(MZhuyinKeyHandler::EFromCandidateToEntry);
+        iOwner->ChangeState(EEntry);
+        return ETrue;
+        }
+    
+    // for fix bug when press left or right arrow play err-tone
+    if ( HandleVerticalNavigation( aKey ) || HandleHorizontalNavigation( aKey ) )
+        {
+        return ETrue;
+        }
+    
+    if ( aLength == EShortKeyPress && ( candidatePane->SelectIndex(index,EFalse) 
+        || aKey == EKeyOK || aKey ==  EKeyCBA1 ))
+        {
+        TPtrC text = candidatePane->CurrentPhraseCandidate();
+        if ( text.Length() == 0 )
+            {
+            return ETrue;
+            }
+        TBuf<KMaxBufLen> pinyinshown = UIContainer()->PinyinPopupWindow()->GetEEPContent();
+        TInt count = TZhuyinSymbolsMethods::GetChineseCount(pinyinshown);
+        if ( count > text.Length() )
+            {
+            fepMan->PhraseCreation(ETrue);
+            }
+        if ( fepMan->IsPhraseCreation( ) )
+            {
+            TBuf<KMaxBufLen> buf;
+            buf.Copy( text );
+            TBool commit = TZhuyinSymbolsMethods::AppendChineseChar( buf,
+                fepMan->ZhuyinAnalyser( ), zhuyinSymbols, chineseDisped,
+                zhuyinSymbolsForChinese );
+            TBool changeState = UpdateEEPContent();
+            if ( commit )
+                {
+                TBuf<KMaxBufLen> commitbuf;
+                TZhuyinSymbolsMethods::Convert2Des(chineseDisped, commitbuf);
+                fepMan->NewTextL(commitbuf);
+                fepMan->CommitInlineEditL();
+                AddPhraseToDB(commitbuf);
+                if ( chineseDisped->Count() < KInputPhraseMaxLength ||
+                    zhuyinSymbols->Count() == 0 )
+                    {
+                    iOwner->FepMan()->TryCloseUiL();
+                    }
+                else
+                    {
+                    CAknWarningNote* errnote = new( ELeave ) CAknWarningNote();
+                    errnote->SetTone( CAknNoteDialog::EWarningTone );
+                    errnote->ExecuteLD( KMaxPhraseNote );
+                    fepMan->TryCloseUiL();
+                    }
+                popup->ResetStrokeArray();
+                }
+            else
+                {
+                editPane->SetCursorIndexOfKeystroke( 0 );
+                if ( changeState )
+                    {
+                    for ( TInt i = 0; i < candidateList->Count(); i++ )
+                        {
+                        if ( TZhuyinSymbolsMethods::IsZhuyinSymbol( 
+                            candidateList->MdcaPoint( i ) ) )
+                            {
+                            candidateList->Delete( i, 1 );
+                            break;
+                            }
+                        }
+                    if ( candidateList->Count() > 0 )
+                        {
+                        popup->SetChangeState( ETrue );
+                        iOwner->ChangeState( EEntry );
+                        }
+                    else
+                        {
+                        popup->SetChangeState( ETrue );
+                        iOwner->ChangeState( EZhuyinSequenceEdit );
+                        }
+                    }
+                else
+                    {
+                    popup->SetChangeState( ETrue );
+                    iOwner->ChangeState( EZhuyinSequenceEdit );
+                    }
+                }
+            }
+        else
+            {
+            TBuf<KMaxBufLen> textbuf;
+            for ( TInt i = 0; i < chineseDisped->Count(); i++ )
+                {
+                textbuf.Append(chineseDisped->MdcaPoint(i));
+                }
+            textbuf.Append(text);
+            fepMan->NewTextL(textbuf);
+            fepMan->CommitInlineEditL();
+            AddPhraseToDB(textbuf);
+            popup->ResetStrokeArray();
+            if ( text.Length() <= KInputPhraseMaxLength && !fepMan->IsPhraseCreation() )
+                {
+                if (fepMan->IsFlagSet(CAknFepManager::EFlagEditorFull))
+                    {
+                    fepMan->ClearFlag(CAknFepManager::EFlagEditorFull);
+                    iOwner->FepMan()->TryCloseUiL();
+                    }
+                else
+                    {
+                    iOwner->ChangeState( EPredictiveCandidate );
+                    }
+                }
+            else
+                {
+                fepMan->TryCloseUiL();
+                }
+            }
+        }
+    else if ( aKey == EPtiKeyStar )
+        {
+        return ETrue;
+        }    
+    else if ( aKey == EKeyCBA2 )
+        {
+        popup->ResetStrokeArray();
+        iOwner->FepMan()->EntryPhrase( EFalse );
+        iOwner->FepMan()->TryCloseUiL();
+        }
+    else if ( !iOwner->IsValidChineseInputKey(aKey) )
+        {
+        iOwner->FepMan()->PlaySound(EAvkonSIDErrorTone);
+        }
+    return ETrue;
+    }
+
+TBool TAknFepInputStateCandidateChinesePhrase::UpdateEEPContent( )
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    CDesCArrayFlat* zhuyinSymbols = UIContainer()->PinyinPopupWindow()->ZhuyinSymbols();
+    CDesCArrayFlat* chineseDisped = UIContainer()->PinyinPopupWindow()->ChineseCharsDisped();
+    CAknFepZhuyinAnalyser* analyser = iOwner->ZhuyinAnalyser();
+    CDesCArrayFlat* candidateList = UIContainer()->CandidatePane()->CandidateArray();
+    TBuf<KMaxBufLen> buf;
+    TBool isPhraseCreation = EFalse;
+    TBool valid = TZhuyinSymbolsMethods::UpdateEEPContent(
+        ptiengine,
+        analyser,
+        zhuyinSymbols,
+        chineseDisped,
+        candidateList,
+        buf,
+        isPhraseCreation
+        );
+    
+    if ( chineseDisped->Count() != 0  || zhuyinSymbols->Count() > 1 )
+        {
+        for ( TInt i = 0; i < candidateList->Count(); ++i )
+            {
+            if ( TZhuyinSymbolsMethods::IsZhuyinSymbol( candidateList->MdcaPoint( i ) ) )
+                {
+                candidateList->Delete( i, 1 );
+                break;
+                }
+            }
+        }
+    iOwner->FepMan()->PhraseCreation(isPhraseCreation);
+    UIContainer()->PinyinPopupWindow()->SetEEPContent(buf);
+    UIContainer()->PinyinPopupWindow()->SetEEPContentValid(valid);
+    return valid;
+    }
+void TAknFepInputStateCandidateChinesePhrase::AddPhraseToDB( TDes& aPhrase )
+    {
+    TPtiUserDictionaryEntry addUdbEntry( aPhrase );
+    //Add the phrase to the DB by PTI Engine
+    iOwner->PtiEngine()->AddUserDictionaryEntry( addUdbEntry );
+    }
+
+// End of file