fep/aknfep/src/aknfepuiinputminiqwertyzhuyinphrasebase.cpp
branchRCL_3
changeset 44 ecbabf52600f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fep/aknfep/src/aknfepuiinputminiqwertyzhuyinphrasebase.cpp	Wed Sep 01 12:23:33 2010 +0100
@@ -0,0 +1,625 @@
+/*
+* Copyright (c) 2008 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 TAknFepInputMiniQwertyZhuyinPhraseBase definition.
+ *
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+// System includes
+#include <e32cmn.h>
+#include <PtiEngine.h>
+#include <PtiDefs.h>
+#include <avkon.rsg>
+#include <aknfep.rsg>
+#include <PtiUserDicEntry.h>
+#include <aknnotewrappers.h> //CAknWarningNote 
+// User includes
+#include "AknFepUIManagerStateInterface.h"
+#include "AknFepUICtrlInputPane.h"
+#include "AknFepUICtrlPinyinPopup.h"        //Pinyin phrase
+#include "aknfepuictrleditpane.h"           //pinyin phrase creation
+#include "AknFepUICtrlCandidatePane.h"
+#include "AknFepManager.h"
+#include "aknfepuiinputminiqwertyzhuyinphrasebase.h"
+#include "aknfepinputstateminiqwertyzhuyinkeymap.h"
+
+const TInt KMaxPhraseCount = 100;
+const TInt KMaxBufLength = 150;
+const TInt KMaxPhraseCreationCount = 7;
+//KMaxPhraseNote means the max phrase is seven
+_LIT( KMaxPhraseNote,"\x8BCD\x7EC4\x6700\x957F\x4E3A\x4E03\x5B57" );
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::TAknFepInputMiniQwertyZhuyinPhraseBase
+// C++ default constructor
+// ---------------------------------------------------------------------------
+//
+TAknFepInputMiniQwertyZhuyinPhraseBase::TAknFepInputMiniQwertyZhuyinPhraseBase(
+                                MAknFepUIManagerStateInterface* aOwner,
+                                MAknFepUICtrlContainerChinese* aUIContainer) :
+    TAknFepInputStateCandidateQwertyBaseChinesePhrase( aOwner, aUIContainer )
+    {
+    if (iOwner->PtiEngine()->InputMode() != EPtiEngineZhuyinPhraseQwerty)
+        {
+        iOwner->PtiEngine()->SetInputMode( EPtiEngineZhuyinPhraseQwerty );
+        }
+    iOwner->PtiEngine()->SetCandidatePageLength( KMaxPhraseCount );
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    uiContainer->SetLayout( MAknFepUICtrlContainerChinese::ELayoutPhraseCreation );
+    iOwner->PtiEngine()->SetCase(EPtiCaseLower);
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::HandleKeyL
+// Handle system key press event.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyZhuyinPhraseBase::HandleKeyL(
+	                                             TInt /*aKey*/ ,
+                                                 TKeyPressLength /*aLength*/ )
+    {
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::GetValidKeystroke
+// Get the valid keystroke.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyZhuyinPhraseBase::GetValidKeystroke()
+    {
+    TBool result = ETrue;
+    TRAPD( ret, result = GetValidKeystrokeL() );
+    if ( KErrNone != ret )
+        {
+        return EFalse;
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::RefreshEditPane
+// Refresh editing pane.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::RefreshEditPane()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    CDesCArrayFlat* phrase = editPane->PhraseArray();
+    
+    TInt validCount = editPane->GetEffictiveLength();
+    TInt underLineLen = 0;
+    TBuf<KMaxBufLength> buf;
+    
+    for ( TInt i = 0; i < phrase->Count(); ++i )
+        {
+        buf.Append( phrase->MdcaPoint( i ) );
+        }
+    
+    for ( TInt i = 0; i < keystroke->Count(); ++i )
+        {
+        buf.Append( keystroke->MdcaPoint( i ) );
+        if ( i < validCount )
+            {
+            underLineLen = underLineLen + keystroke->MdcaPoint( i ).Length();
+            }
+        }
+    editPane->SetCursorIndexOfKeystroke( validCount );
+    editPane->SetText( buf, phrase->Count() + underLineLen, ETrue );
+    if ( 0 == validCount )
+        {
+        editPane->SetHighlight( phrase->Count(), buf.Length() );
+        }
+    
+    if ( EMiniQwertyEdit == iState )
+        {
+        editPane->ActiveCursor();
+        editPane->EnableCursor();
+        }
+    else if ( EZhuyinSpelling == iState )
+        {
+        editPane->DeactiveCursor();
+        editPane->EnableCursor();
+        editPane->SetUnderline( phrase->Count(), phrase->Count() + underLineLen - 1 );
+        }
+    else if ( EZhuyinCandidate == iState )
+        {
+        editPane->DisableCursor();
+        editPane->SetUnderline( phrase->Count(), phrase->Count() + underLineLen - 1 );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::RefreshSpellingPane
+// Refresh spelling pane.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::RefreshSpellingPane( TBool aClearSelection )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlInputPane* inputPane = uiContainer->InputPane();
+    CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+    TInt selection = 0;
+    if ( !aClearSelection )
+        {
+        selection = popup->CurrentSelection();
+        if ( selection >= spelling->Count() )
+            {
+            selection = 0;
+            }
+        }
+    popup->SplitPhraseSpellingIntoPages( );
+    if ( spelling->Count( ) == 0 )
+        {
+        uiContainer->SetControlInVisible( EFalse );
+        }
+    else
+        {
+        // set display page for delibrate selection
+        inputPane->SetText( spelling->MdcaPoint( selection ) );
+        popup->SetDisplayPage( selection );
+        popup->SetPhraseItemTexts( );
+        popup->PopupSizeChanged( );
+        uiContainer->Enable( ETrue );  
+        }
+
+    if ( EMiniQwertyEdit == iState )
+        {
+        //popup need to add none high lighted interface.
+        popup->SetNoneHighlighted();
+        }
+    popup->Enable( spelling->Count( ) > 0 );
+    uiContainer->Enable( ETrue );    
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::RefreshSpellingPane
+// Refresh spelling pane.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::RefreshCandidatePane( TBool aClearSelection )
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    TInt validCount = editPane->ShowKeystrokeArray()->Count();
+    CDesCArrayFlat* candidateArray = 
+        uiContainer->CandidatePane()->CandidateArray();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    // have valid keystroke.
+    if ( validCount > 0 )
+        {
+        // set display page for delibrate selection
+        ClearDeliberateSelection();
+        GetCandidate( aClearSelection );
+        uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+        uiContainer->CandidatePane()->SetCandidateBuffer();
+        uiContainer->ShowVerticalScrollArrows( ETrue );
+        uiContainer->Enable( ETrue );
+        }
+    else
+        {
+        candidateArray->Reset();
+        if ( KMaxPhraseCreationCount == phraseCount )
+            {
+            TRAP_IGNORE( candidateArray->AppendL( KMaxPhraseNote ) );
+            }
+        uiContainer->CandidatePane()->SplitPhraseCandidatesIntoPages();
+        uiContainer->CandidatePane()->SetCandidateBuffer();
+        uiContainer->Enable( ETrue );
+        uiContainer->ShowHorizontalScrollArrows( EFalse );
+        uiContainer->ShowVerticalScrollArrows( EFalse );
+        }    
+    uiContainer->Enable(ETrue);
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::UpdateIndicator
+// Update Indicator.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::UpdateIndicator()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+
+    if (candidatePane->IsFirstPage())
+        {
+        uiContainer->CandidatePane()->ShowUpScrollArrows(EFalse);
+        }
+    else
+        {
+        uiContainer->CandidatePane()->ShowUpScrollArrows(ETrue);
+        }
+
+    if (candidatePane->IsLastPage())
+        {
+        uiContainer->CandidatePane()->ShowDownScrollArrows(EFalse);
+        }
+    else
+        {
+        uiContainer->CandidatePane()->ShowDownScrollArrows(ETrue);
+        }
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    if (iOwner->FepMan()->KeyboardLayout() == EPtiKeyboardQwerty4x10)
+        {
+        if (candidatePane->VisibleCandidateCount()==1)
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse);
+            uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse);
+            }
+        else
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(ETrue);
+            uiContainer->CandidatePane()->ShowRightScrollArrows(ETrue);
+            }
+        }
+    else
+        {
+#endif
+        if (candidatePane->SelectedIndex() == 0
+                && candidatePane->IsFirstPage() )
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(EFalse);
+            }
+        else
+            {
+            uiContainer->CandidatePane()->ShowLeftScrollArrows(ETrue);
+            }
+
+        if (candidatePane->IsLastPage() && (candidatePane->SelectedIndex()
+                == candidatePane->VisibleCandidateCount() - 1))
+            {
+            uiContainer->CandidatePane()->ShowRightScrollArrows(EFalse);
+            }
+        else
+            {
+            uiContainer->CandidatePane()->ShowRightScrollArrows(ETrue);
+            }
+        }
+#ifdef RD_INTELLIGENT_TEXT_INPUT
+    }
+#endif    
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::ClearDeliberateSelection
+// clear selection.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::ClearDeliberateSelection()
+    {
+    // we must have just deleted the last character, 
+    // or we are starting a new pinyin session, 
+    // so wipe the last deliberate selection
+    TPtr oldDeliberateSelection = iOwner->GetLatestDeliberateSelection();
+    oldDeliberateSelection = KNullDesC;
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::ClearPtiEngineKeystroke
+// clear the ptiengine keystroke.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::ClearPtiEngineKeystroke()
+    {
+    iOwner->PtiEngine()->ClearCurrentWord();
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::GetCandidateL
+// Get the candidate info.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::GetCandidate( TBool aClearSelection )
+    {
+    TRAP_IGNORE( GetCandidateL( aClearSelection ) );
+    }
+
+// ---------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::SetWarningColor
+// Set warning color.
+// ---------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::ChangeCbaL()
+    {
+    MAknFepManagerUIInterface* fepMan = iOwner->FepMan();
+    MAknFepUICtrlEditPane* editPane = UIContainer()->EditPaneWindow();
+    TInt candidateCount = UIContainer()->CandidatePane()->CandidateArray()->Count();
+    TInt keyStrokeCount = editPane->KeystrokeArray()->Count();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    TInt currentCBAResId = editPane->GetCurrentCBAResID();
+    if ( ( candidateCount == 0 && keyStrokeCount != 0 ) || 
+        ( phraseCount == 1 && keyStrokeCount == 0 ) )
+        {
+        if (R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_EMPTY != currentCBAResId )
+            {
+            fepMan->UpdateCbaL( R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_EMPTY );
+            editPane->SetCurrentCBAResID( R_AKNFEP_SOFTKEYS_EMPTY_CANCEL_EMPTY );
+            }
+
+        }
+    else if ( keyStrokeCount == 0 )
+        {
+        if ( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE != currentCBAResId )
+            {
+            fepMan->UpdateCbaL( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE );
+            editPane->SetCurrentCBAResID( R_AKNFEP_SOFTKEYS_DONE_CANCEL_DONE );
+            }
+        }
+    else if ( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL != currentCBAResId )
+        {
+        fepMan->UpdateCbaL( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL );
+        editPane->SetCurrentCBAResID( R_AKNFEP_SOFTKEYS_OK_SELECT_CANCEL );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::CheckPhraseSpellingL
+// Check the spelling whether is phrase spelling.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyZhuyinPhraseBase::CheckPhraseSpellingL()
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* spelling = 
+        uiContainer->PinyinPopupWindow()->PhoneticSpellingArray();
+    CDesCArrayFlat* tmpArray = editPane->TempArray();
+    const TUint16 specZhuyin = 0x311D;
+    _LIT( delimiter, "\x0027" );
+    TInt validSpellingCount = 0;
+    tmpArray->Reset();
+    
+    if ( 0 == ptiengine->GetPhoneticSpellingsL( *tmpArray ) )
+        {
+        return EFalse;
+        }
+    
+    for ( TInt i = 0; i < tmpArray->Count(); ++i )
+        {
+        if ( ( KErrNotFound == tmpArray->MdcaPoint( i ).Find( delimiter ) ) &&
+            ( specZhuyin != tmpArray->MdcaPoint( i )[0] ) )
+            {
+            validSpellingCount = validSpellingCount + 1;
+            spelling->InsertL( 0, tmpArray->MdcaPoint( i ) );
+            }
+        }
+    
+    if ( 0 == validSpellingCount )
+        {
+        return EFalse;
+        }
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::GetValidKeystroke
+// Get the valid keystroke.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyZhuyinPhraseBase::GetValidKeystrokeL()
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* showKeystroke = editPane->ShowKeystrokeArray();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    RArray<TInt>* keycodeArray = editPane->KeycodeArray();
+    TInt phraseCount = editPane->PhraseArray()->Count();
+    CDesCArrayFlat* spelling = 
+        uiContainer->PinyinPopupWindow()->PhoneticSpellingArray();
+    TInt keyCode = 0;
+    TInt stringBeforeLength = 0;
+    TInt stringAfterLength = 0;
+    
+    spelling->Reset();
+    spelling->Compress();
+    showKeystroke->Reset();
+    showKeystroke->Compress();
+    
+    editPane->SetEffictiveLength( 0 );
+    if ( KMaxPhraseCreationCount == phraseCount )
+        {
+        if ( keystroke->Count() > 0 )
+            {
+            keystroke->Reset();
+            }
+        return EFalse;
+        }
+    
+    if ( 0 == keystroke->Count() )
+        {
+        return EFalse;
+        }
+    
+    if ( 1 == keystroke->MdcaPoint( 0 ).Length() )
+        {
+        return EFalse;
+        }
+   
+    if ( CheckToneMarkBorderUpon() )
+        {
+        return EFalse;
+        }
+    
+    ClearPtiEngineKeystroke();
+    for ( TInt i = 0; ( i < keystroke->Count() ) && 
+        ( i < keycodeArray->Count() ); ++i )
+        {
+        keyCode = (*keycodeArray)[i];
+        if ( keyCode == EPtiKeyQwertyE || 
+            keyCode == EPtiKeyQwertyR || 
+            keyCode == EPtiKeyQwertyY || 
+            keyCode == EPtiKeyQwertyU ||
+            keyCode == EStdKeySpace )
+            {
+            if( ptiengine->SetToneMark( keyCode ) )
+                {
+                if ( !CheckPhraseSpellingL() )
+                    {
+                    break;
+                    }
+                else
+                    {
+                    showKeystroke->AppendL( keystroke->MdcaPoint( i - 1 ) );
+                    showKeystroke->AppendL( keystroke->MdcaPoint( i ) );
+                    }
+                }
+            break;
+            }
+        else
+            {
+            stringBeforeLength = 
+                ptiengine->GetPhoneticSpelling(1).Length();
+            stringAfterLength = 
+                ptiengine->AppendKeyPress((TPtiKey)keyCode).Length();
+            if ( stringBeforeLength != stringAfterLength )
+                {
+                if ( i + 1 < keystroke->Count() )
+                    {
+                    if ( 1 != keystroke->MdcaPoint( i + 1 ).Length() )
+                        {
+                        if ( !CheckPhraseSpellingL() )
+                            {
+                            break;
+                            }
+                        showKeystroke->AppendL( keystroke->MdcaPoint( i ) );
+                        }
+                    }
+                else
+                    {
+                    if ( CheckPhraseSpellingL() )
+                        {
+                        showKeystroke->AppendL( keystroke->MdcaPoint( i ) );
+                        }
+                    }
+                }
+            else
+                {
+                break;
+                }
+            }
+        }
+    
+    editPane->SetEffictiveLength( showKeystroke->Count() );
+    if ( 0 == showKeystroke->Count() )
+        {
+        return EFalse;
+        }
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::GetValidKeystroke
+// Get the valid keystroke.
+// ---------------------------------------------------------------------------
+//
+TBool TAknFepInputMiniQwertyZhuyinPhraseBase::CheckToneMarkBorderUpon()
+    {
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlEditPane* editPane = uiContainer->EditPaneWindow();
+    CDesCArrayFlat* keystroke = editPane->KeystrokeArray();
+    
+    if ( keystroke->Count() > 1 )
+        {
+        for ( TInt i = 1; i < keystroke->Count(); ++i )
+            {
+            if ( ( 1 == keystroke->MdcaPoint( i - 1 ).Length() ) &&
+                ( 1 == keystroke->MdcaPoint( i ).Length() ) )
+                {
+                return ETrue;
+                }
+            }
+        }
+    
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// TAknFepInputMiniQwertyZhuyinPhraseBase::GetCandidateL
+// Get candidate info.
+// ---------------------------------------------------------------------------
+//
+void TAknFepInputMiniQwertyZhuyinPhraseBase::GetCandidateL( TBool aClearSelection )
+    {
+    CPtiEngine* ptiengine = iOwner->PtiEngine();
+    MAknFepUICtrlContainerChinese* uiContainer = UIContainer();
+    MAknFepUICtrlPinyinPopup* popup = uiContainer->PinyinPopupWindow();
+    MAknFepUICtrlCandidatePane* candidatePane = uiContainer->CandidatePane();
+    CDesCArrayFlat* spelling = popup->PhoneticSpellingArray();
+    CDesCArrayFlat* candidateArray = candidatePane->CandidateArray();
+    candidateArray->Reset();
+    candidateArray->Compress();
+    
+    if ( 0 == spelling->Count() )
+        {
+        return;
+        }
+    
+    TInt selection = 0;
+    if ( !aClearSelection )
+        {
+        selection = popup->CurrentSelection();
+        if ( selection >= spelling->Count() )
+            {
+            selection = 0;
+            }
+        }
+    RPointerArray<HBufC> list;
+    extern void CleanArray( TAny* aAny );
+    TCleanupItem cleanitem( CleanArray, &list );
+    CleanupStack::PushL( cleanitem );
+    HBufC* retString = ptiengine->GetCandidatesByInputString( 
+                                              spelling->MdcaPoint( selection ), 
+                                              list,
+                                              EFalse );
+    
+    delete retString;
+    retString = NULL;
+    
+    for ( TInt i = 0; i < list.Count(); ++i )
+        {
+        if ( 1 == spelling->MdcaPoint( selection ).Length() )
+            {
+            if ( 0 != spelling->MdcaPoint( selection ).Compare( *(list[i]) ) )
+                {
+                candidateArray->AppendL( *(list[i]) );
+                }
+            }
+        else
+            {
+            candidateArray->AppendL( *(list[i]) );
+            }
+        }
+    
+    CleanupStack::PopAndDestroy(); // cleanitem  
+    }
+
+// End of file