uiutils/Findutil/src/FindUtilChinese.cpp
changeset 0 2f259fa3e83a
child 4 8ca85d2f0db7
child 14 3320e4e6e8bb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiutils/Findutil/src/FindUtilChinese.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,2463 @@
+/*
+* Copyright (c) 2002 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:         Chinese Find Utilities implementation file.
+*
+*/
+
+
+
+
+
+
+
+
+
+#include <PtiEngine.h>
+#include <CentralRepository.h>
+#include <AknFepInternalCRKeys.h>
+#include <AvkonInternalCRKeys.h>
+#include <aknedsts.h>
+#include <COEAUI.H>
+#include <aknenv.h> //phonebook
+#include <aknappui.h>
+#include <aknapp.h>
+#include <eikenv.h>
+#include <eikapp.h>
+#include <eikappui.h>
+
+
+#include "FindUtilChinese.h"
+#include "chinesefindutils.h"
+
+// CONSTANTS 
+const TUint16 KStarChar = 0x002a;   
+const TUint16 KZhuyinstart = 0x3105;
+const TInt KZhuyincount = 37;
+const TInt KSeperator = 2626;
+const TInt KMaxWordInterpretationLen = 255;
+const TInt16 KMinUnicodeHz = 0x4e00;
+const TInt16 KStrokeHorizontalValue = 0x4e00; 
+const TInt16 KStrokeVerticalValue = 0x4e28;
+const TInt16 KStrokeDownToLeftValue = 0x4e3f;
+const TInt16 KStrokeDownToRightValue = 0x4e36;
+const TInt16 KStrokeBendingValue = 0x4e5b;
+const TInt KSysInputMode = -1;
+const TInt KLeftToRightFlag =0x200e;
+const TInt KRightToLeftFlag =0x200f;
+const TUid KUidPhoneBook = {0x101F4CCE};
+const TUid KUidPhoneBookServer = {0x10207277};
+
+_LIT(KWildChar, "*");
+_LIT(KUnderLine, "_");
+_LIT(KMiddleLine, "-");
+_LIT(KBlank, " ");
+_LIT(KTab, "\t");
+
+const TInt KLitLineFeed(8233);
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------
+// Factory function at first ordinal to create concrete object of MFindUtil
+// ---------------------------------------------------------
+//
+EXPORT_C MFindUtil* FindUtilFactoryFunctionL()
+    {
+    MFindUtil* util = CFindUtilChinese::NewL();
+    return util;
+    }
+
+// ---------------------------------------------------------
+// Symbian constructor
+// ---------------------------------------------------------
+//
+CFindUtilChinese* CFindUtilChinese::NewL()
+    {
+    CFindUtilChinese* self = new (ELeave) CFindUtilChinese();
+    
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);//self
+
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Symbian second-phase constructor
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::ConstructL()
+    {
+    iRepositoryFind = CRepository::NewL(KCRUidAknFep);
+    
+    iRepositoryFindAdaptive = CRepository::NewL(KCRUidAvkon);
+
+    iWatcher = CFindRepositoryWatcher::NewL(KCRUidAknFep,
+                                            TCallBack(HandleFindRepositoryCallBack, this),
+                                            iRepositoryFind);
+                                            
+    iWatcherAdaptive = CFindRepositoryWatcher::NewL(KCRUidAvkon,
+                                            TCallBack(HandleFindRepositoryCallBack, this),
+                                            iRepositoryFindAdaptive);                                        
+    }
+
+// ---------------------------------------------------------
+// CFindUtilChinese utils class
+// ---------------------------------------------------------
+//
+CFindUtilChinese::CFindUtilChinese():
+    iLanguage(ELangTest),
+    iSupportPRCChinese(EFalse),
+    iCurInputMode(KSysInputMode),
+    iSearchMethodPRC(EAdptSearchPinyin),
+    iSearchMethodTaiWan(EAdptSearchZhuyin),
+    iSearchMethodHongKong(EAdptSearchStroke),
+    iSearchMethodAdaptive(EFalse)
+    {
+    }
+
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+CFindUtilChinese::~CFindUtilChinese()
+    {
+    delete iPtiEngine;
+    delete iWatcher;
+    delete iPtiEnginePrc;
+    delete iRepositoryFind;
+    delete iWatcherAdaptive;
+    delete iRepositoryFindAdaptive;
+    }
+
+// ---------------------------------------------------------
+// Open ptiengine and active it by input language
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::OpenT9InterfaceL(TLanguage aLanguage)
+    {
+    if (!iPtiEngine)
+        {
+        iPtiEngine = CPtiEngine::NewL();
+        iSupportPRCChinese = IsSupportLanguage(ELangPrcChinese);
+        }
+
+    if (aLanguage != iLanguage)
+        {
+        iLanguage = aLanguage;
+        iPtiEngine->ActivateLanguageL(iLanguage);
+        iPtiEngine->EnableToneMarks(EFalse);
+        }
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// Close ptiengine
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::CloseT9InterfaceL()
+    {
+    iLanguage = ELangTest; 
+    iPtiEngine->CloseCurrentLanguageL();
+    }
+
+// ---------------------------------------------------------
+// Translate Chinese word to its spelling
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::DoTranslationL(TInt16 aHZUnicode,  
+                                       RPointerArray<HBufC>& aSpellList)
+    {
+    if(CEikonEnv::Static())
+        {
+        if (iSearchMethodAdaptive &&(CEikonEnv::Static()->EikAppUi()->Application()->AppDllUid() == KUidPhoneBook ||
+                CEikonEnv::Static()->EikAppUi()->Application()->AppDllUid() == KUidPhoneBookServer ))
+                {
+                if (!T9ChineseTranslationAdaptiveL(aHZUnicode, aSpellList))
+                    {
+                    return EFalse;
+                    }    
+                }
+            else
+                {
+                if (!T9ChineseTranslationL(aHZUnicode, aSpellList))
+                    {
+                    return EFalse;
+                    }    
+                }
+        }
+    else
+        {
+        if (iSearchMethodAdaptive)
+            {
+            if (!T9ChineseTranslationAdaptiveL(aHZUnicode, aSpellList))
+                {
+                return EFalse;
+                }
+            }
+        else
+            {
+            if (!T9ChineseTranslationL(aHZUnicode, aSpellList))
+                {
+                return EFalse;
+                }
+            }
+        }
+    return ETrue;
+    
+    }
+
+// ---------------------------------------------------------
+// Find pane text is including stroke symbol
+// ---------------------------------------------------------
+//
+TInt CFindUtilChinese::IsStrokeSymbol(const TInt aFindWord)
+    {
+    TInt strokeValue = 0;
+
+    switch (aFindWord)
+        {
+        case KStrokeHorizontalValue:
+            strokeValue = 1;
+            break;
+        case KStrokeVerticalValue:
+            strokeValue = 2;
+            break;
+        case KStrokeDownToLeftValue:
+            strokeValue = 3;
+            break;
+        case KStrokeDownToRightValue:
+            strokeValue = 4;
+            break;
+        case KStrokeBendingValue:
+            strokeValue = 5;
+            break;
+        default:
+            return strokeValue;
+        }// switch
+
+    return strokeValue;
+    }
+
+// ---------------------------------------------------------
+// Do translate for Chinese word
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::T9ChineseTranslationL(TInt16 aHZUnicode,  
+                                             RPointerArray<HBufC>& aSpellList)
+    {
+    TBuf<KMaxWordInterpretationLen> wordInterpretationBuf;
+    
+    if ( iLanguage == ELangPrcChinese )
+        {
+        if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) 
+                                    != KErrNone)
+            {
+            return EFalse;
+            }
+        }
+    else if ( iLanguage == ELangTaiwanChinese )
+        {
+        if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiZhuyin) 
+                                    != KErrNone)
+            {
+            return EFalse;
+            }
+        }
+    else if ( iLanguage == ELangHongKongChinese )
+        {
+        if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) 
+                                    != KErrNone)
+            {
+            return EFalse;
+            }
+        }
+    else if ( iLanguage == ELangEnglish )
+        {
+        if (!iSupportPRCChinese)
+            {
+            return EFalse;
+            }
+            
+        TInt err = KErrNone;
+        if (!iPtiEnginePrc)
+            {
+            iPtiEnginePrc = CPtiEngine::NewL(EFalse);
+            TRAP(err, iPtiEnginePrc->ActivateLanguageL(ELangPrcChinese));
+            }   
+                   
+        if (err == KErrNone)
+            {
+            if (iPtiEnginePrc->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) 
+                                           != KErrNone) 
+                
+                return EFalse;
+            }
+        }
+    else
+        {
+        return EFalse;
+        }
+                
+    const TInt len = wordInterpretationBuf.Length();
+    TInt start = 0;
+    
+  
+	for (TInt i =0; i < len; i++)
+	    {
+	    if (wordInterpretationBuf[i] == KSeperator) 
+	        {
+	        aSpellList.Append((wordInterpretationBuf.MidTPtr(start, i-start)).Alloc());
+	        start = i + 1;
+	        }
+	    }
+	        
+	aSpellList.Append((wordInterpretationBuf.MidTPtr(start, len-start)).Alloc());   	
+
+    
+    return ETrue;
+	}
+
+// ---------------------------------------------------------
+// Do translate for Chinese word
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::T9ChineseTranslationAdaptiveL(TInt16 aHZUnicode,  
+                                             RPointerArray<HBufC>& aSpellList)
+    {
+    TBuf<KMaxWordInterpretationLen> wordInterpretationBuf;
+    
+    if ( iLanguage == ELangPrcChinese )
+        {
+        if(iSearchMethodPRC == EAdptSearchPinyin)
+	        {
+	        if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) 
+                                    != KErrNone)
+	            {
+	            return EFalse;
+	            }	
+	        }
+	    else if(iSearchMethodPRC == EAdptSearchStroke)    
+		    {
+		    if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) 
+                                    != KErrNone)
+	            {
+	            return EFalse;
+	            }	
+		    }
+		else
+			{
+			return EFalse;	
+			}    
+        
+        }
+    else if ( iLanguage == ELangTaiwanChinese )
+        {
+        if(iSearchMethodTaiWan == EAdptSearchZhuyin)
+	        {
+	        if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiZhuyin) 
+                                    != KErrNone)
+	            {
+	            return EFalse;
+	            }	
+	        }
+	    else if(iSearchMethodTaiWan == EAdptSearchStroke)    
+		    {
+		    if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) 
+                                    != KErrNone)
+	            {
+	            return EFalse;
+	            }	
+		    }
+		else
+			{
+			return EFalse;	
+			}       
+        }
+    else if ( iLanguage == ELangHongKongChinese )
+        {
+        switch(iSearchMethodHongKong)
+	        {
+	        case EAdptSearchNormalCangjie:
+        	     if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie) 
+	                                    != KErrNone)
+		            {
+		            return EFalse;
+		            }
+        	     break;
+        	case EAdptSearchEasyCangjie:
+        		if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie) 
+	                                    != KErrNone)
+		            {
+		            return EFalse;
+		            }
+        	     break;
+        	case EAdptSearchAdvCangjie:
+        	     if ((iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie) != KErrNone)
+        	         &&(iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie) != KErrNone))
+		            {
+		            return EFalse;
+		            }
+        	     break;
+        	case EAdptSearchStroke:
+	        	if (iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiStrokes) 
+	                                    != KErrNone)
+		            {
+		            return EFalse;
+		            }
+        	     break;
+        	default:
+        	     return EFalse;        	
+	        }
+     
+        }
+    else if ( iLanguage == ELangEnglish )
+        {
+        if (!iSupportPRCChinese)
+            {
+            return EFalse;
+            }
+            
+        TInt err = KErrNone;
+        if (!iPtiEnginePrc)
+            {
+            iPtiEnginePrc = CPtiEngine::NewL(EFalse);
+            TRAP(err, iPtiEnginePrc->ActivateLanguageL(ELangPrcChinese));
+            }   
+                   
+        if (err == KErrNone)
+            {
+            if (iPtiEnginePrc->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiPinyin) 
+                                           != KErrNone) 
+                
+                return EFalse;
+            }
+        }
+    else
+        {
+        return EFalse;
+        }
+                
+    TInt len = wordInterpretationBuf.Length();
+    TInt start = 0;
+    
+    if( iSearchMethodHongKong != EAdptSearchAdvCangjie )
+	    {
+	    for (TInt i =0; i < len; i++)
+	        {
+	        if (wordInterpretationBuf[i] == KSeperator) 
+	            {
+	            aSpellList.Append((wordInterpretationBuf.MidTPtr(start, i-start)).Alloc());
+	            start = i + 1;
+	            }
+	        }
+	        
+	    aSpellList.Append((wordInterpretationBuf.MidTPtr(start, len-start)).Alloc());   	
+	    }
+    //Could look advanced cangjie as normal and easy cangjie
+    else 
+	    {
+	    iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiEasyCangjie);
+	    len = wordInterpretationBuf.Length();
+        start = 0;
+	    for (TInt i =0; i < len; i++)
+	        {
+	        if (wordInterpretationBuf[i] == KSeperator) 
+	            {
+	            aSpellList.Append((wordInterpretationBuf.MidTPtr(start, i-start)).Alloc());
+	            start = i + 1;
+	            }
+	        }
+        
+    	aSpellList.Append((wordInterpretationBuf.MidTPtr(start, len-start)).Alloc()); 
+    	 
+    	
+    	iPtiEngine->GetSpelling(aHZUnicode, wordInterpretationBuf, EPtiCangJie);
+	    len = wordInterpretationBuf.Length();
+        start = 0;
+	    for (TInt i =0; i < len; i++)
+	        {
+	        if (wordInterpretationBuf[i] == KSeperator) 
+	            {
+	            aSpellList.Append((wordInterpretationBuf.MidTPtr(start, i-start)).Alloc());
+	            start = i + 1;
+	            }
+	        }
+        
+    	aSpellList.Append((wordInterpretationBuf.MidTPtr(start, len-start)).Alloc());  
+	    }
+    
+    return ETrue;
+    } 
+
+// ---------------------------------------------------------
+// Find pane text is including separator
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IsFindWordSeparator(TChar aCh)
+    {
+    return aCh ==' '|| aCh=='-'|| aCh =='\t' || aCh == '_'|| aCh == KLitLineFeed;
+    } 
+
+// ---------------------------------------------------------
+// Create ptiengine and initialize member data 
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::OpenL()
+    {
+    CFindUtilBase::OpenL();
+    TInt inputLanguage = 0;
+    TInt searchMode =0;
+   
+    if (iRepositoryFind != NULL)
+        {
+        iRepositoryFind->Get(KAknFepInputTxtLang, inputLanguage);
+        }
+
+    OpenT9InterfaceL((TLanguage)inputLanguage);
+    
+    if (iRepositoryFindAdaptive != NULL)
+        {
+        iRepositoryFindAdaptive->Get(KAknAvkonAdaptiveSearchEnabled, iSearchMethodAdaptive);
+        }
+    if( inputLanguage == ELangPrcChinese)
+	    {
+	    iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChinesePRC , searchMode);	
+	    if(searchMode ==0)
+		    {
+		    iSearchMethodPRC = EAdptSearchPinyin;	
+		    }
+	    else if(searchMode ==1)
+		    {
+		    iSearchMethodPRC = EAdptSearchStroke;	
+		    }
+	    }
+    else if(inputLanguage == ELangTaiwanChinese)
+	    {
+	    iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseTW , searchMode);
+	    if(searchMode ==0)
+		    {
+		    iSearchMethodTaiWan = EAdptSearchZhuyin;	
+		    }
+	    else if(searchMode ==1)
+		    {
+		    iSearchMethodTaiWan = EAdptSearchStroke;	
+		    }	
+	    }
+    else if(inputLanguage == ELangHongKongChinese)
+	    {
+	    iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseHongkong  , searchMode);
+	    if(searchMode ==1)
+		    {	    
+		    iRepositoryFind->Get(KAknFepCangJieMode , searchMode);
+
+		    switch (searchMode)
+			    {
+			    case 0:
+		    	   iSearchMethodHongKong = EAdptSearchNormalCangjie;
+		    	   break;
+		    	case 1:
+		    	   iSearchMethodHongKong = EAdptSearchEasyCangjie;
+		    	   break;
+		    	case 2:
+		    	   iSearchMethodHongKong = EAdptSearchAdvCangjie;
+		    	   break;
+			    }
+		    	   
+		    }
+	    else if(searchMode ==0)
+		    {
+		    iSearchMethodHongKong = EAdptSearchStroke;	
+		    }
+		    	
+	    }
+    
+    }
+
+// ---------------------------------------------------------
+// Close ptiEngine 
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::Close()
+    {
+    // Only close T9 interface if this was the last reference
+    if (iReferenceCount == 1)
+        {
+        TRAP_IGNORE(CloseT9InterfaceL());    
+        }
+        
+    CFindUtilBase::Close();
+    }
+
+// ---------------------------------------------------------
+// Match arithmetic for general search
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::Match(const TDesC& aContactsField, const TDesC& aWord)
+    {
+    // Check function parameter
+    if (aWord.Length() == 0)
+        {
+        return ETrue;
+        }
+ 
+    if (aContactsField.Length() == 0)
+        {
+        return EFalse;
+        }
+    
+    TBool ret = EFalse; 
+    
+    // Check Chinese word in find pane
+    TBool chineseWord = IsChineseWord(aWord);
+    
+    if (chineseWord)
+        {
+        ret = IncludeString(aContactsField, aWord);
+       
+        if (ret)
+            {
+            // Included return ETrue
+            return ret;
+            }
+   /*     else// If it do not find, check the symbol
+            {
+            // if Stroke Symbol in HongKong
+            TBool strokeSymHK = (IsStrokeSymbolInString(aWord)) && 
+                               (iLanguage == ELangHongKongChinese);
+                               
+            // it is not include stroke symbol
+            if (!strokeSymHK)
+                {
+                return ret;
+                }
+            }*/
+       }
+    
+    // Array for item string
+    RPointerArray<STRINGINFO> stringInfoArr;
+    // Split item string
+    TRAPD(err, SplitItemStringL(stringInfoArr, aContactsField));
+    if (err != KErrNone)
+        {
+        stringInfoArr.ResetAndDestroy();
+        stringInfoArr.Close();
+        return ret;
+        }
+    
+    TInt index = 0;
+    STRINGINFO* pStringInfo;
+    const TInt arrayCount = stringInfoArr.Count();
+
+    if (!chineseWord)
+        {
+        // Search English word
+        for (index = 0; index < arrayCount; index ++)
+            {
+            pStringInfo = stringInfoArr[index];
+            if (!pStringInfo->isChinese &&
+                pStringInfo->segmentString.MatchC(aWord) != KErrNotFound)
+                {
+                ret = ETrue;
+                break;
+                }
+            }
+        }
+    
+    if (!ret)// If not find, search Chinese word 
+        {
+        TRAP(err, ret = MatchChineseInitialStringL(stringInfoArr, aWord));
+        }
+
+    stringInfoArr.ResetAndDestroy();
+    stringInfoArr.Close();
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// Initial character search 
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::MatchChineseInitialStringL(RPointerArray<STRINGINFO>& aStringInfoArr, 
+                                                  const TDesC& aSearchStr)
+    {
+    TInt spellCount = 0;
+    TInt i = 0;
+    TInt chineseWordCount;
+    TInt chineseWordIndex;
+    STRINGINFO* pStringInfo;	
+    TBool ret = EFalse;
+    const TInt arrayCount = aStringInfoArr.Count();
+    
+    for (TInt index = 0; index < arrayCount; index ++)
+        {
+        pStringInfo = aStringInfoArr[index];
+        // English word, continue
+        if (!pStringInfo->isChinese)
+            {
+            continue;
+            }
+    
+        chineseWordCount = pStringInfo->segmentString.Length();
+
+        for (chineseWordIndex = 0; chineseWordIndex < chineseWordCount; chineseWordIndex ++)
+            {
+            RPointerArray<HBufC> spellList;
+                            
+            if (!DoTranslationL(TInt16(pStringInfo->segmentString[chineseWordIndex]), spellList))
+                {
+                spellList.ResetAndDestroy();//destroy spellList
+                spellList.Close();                
+                continue;
+                }
+                    
+            spellCount = spellList.Count();
+            // Search all spelling
+            for (i = 0; i < spellCount; i++)
+                {                
+                if (spellList[i]->MatchC(aSearchStr) != KErrNotFound)
+                    {
+                    // If find, break
+                    ret = ETrue;
+                    break;
+                    }
+                }//end for
+                    
+            spellList.ResetAndDestroy();//destroy spellList
+            spellList.Close();
+              
+            if (ret)
+                {
+                // If find, return
+                return ret;
+                }
+            }
+       }
+ 
+    return ret;    
+    }
+
+// ---------------------------------------------------------
+// Remove separator from search text
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::RemoveSeparator(TDes& aSearchText)
+    {
+    TInt index = -1;
+    TBuf<1> temp;
+    
+    temp.Copy(KUnderLine);
+    while ((index = aSearchText.FindC(temp)) > 0)
+        {
+        aSearchText.Replace(index, 1, KNullDesC);
+        }
+    
+    temp.Copy(KMiddleLine);    
+    while ((index = aSearchText.FindC(temp)) > 0)
+        {
+        aSearchText.Replace(index, 1, KNullDesC);
+        }
+       
+    temp.Copy(KBlank);    
+    while ((index = aSearchText.FindC(temp)) > 0)
+        {
+        aSearchText.Replace(index, 1, KNullDesC);
+        }
+       
+    temp.Copy(KTab);    
+    while ((index = aSearchText.FindC(temp)) > 0)
+        {
+        aSearchText.Replace(index, 1, KNullDesC);
+        }              
+    }
+
+// ---------------------------------------------------------
+// Match arithmetic for accurate search 
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::MatchRefineL( const TDesC& aItemString, const TDesC &aSearchText)
+    {
+    TBuf<KMaxWordLength> tempBuf;    
+    TBuf<KMaxWordLength> itemString;
+       
+    itemString.Zero();
+    if ( KMaxWordLength > aItemString.Length() )
+        {
+        itemString.Copy( aItemString );
+        }
+    else
+        {
+        itemString.Copy( aItemString.Left( KMaxWordLength ) );
+        }
+    
+    //trim the sepcial char
+    if(itemString.Length()>0)
+        {
+        if(itemString[0]== KLeftToRightFlag || itemString[0]== KRightToLeftFlag)
+            {
+            itemString.Delete(0,1);
+            itemString.Delete((itemString.Length()-1),1);    
+            }
+        }
+    
+    TBool haschineseword = EFalse; 
+    
+    // Check function parameter
+    if (aSearchText.Length() == 0)
+        {
+        return ETrue;
+        }
+ 
+    if (aItemString.Length() == 0)
+        {
+        return EFalse;
+        }
+        
+    TBool ret = EFalse;
+    
+    tempBuf.Zero();
+    if ( KMaxWordLength > aSearchText.Length() )
+        {
+        tempBuf.Copy( aSearchText );
+        }
+    else
+        {
+        tempBuf.Copy( aSearchText.Left( KMaxWordLength ) );
+        } 
+    
+    RemoveSeparator(tempBuf);
+    
+    if (iLanguage == ELangHongKongChinese)
+        {
+        UpdateCurrentInputMode();
+        }
+    else
+        {
+        iCurInputMode = KSysInputMode;
+        }
+             
+    // Check Chinese word in find pane
+    if (IsChineseWord(tempBuf))
+        {
+        haschineseword = ETrue;
+        ret = IncludeString(aItemString, tempBuf);
+        
+        if (ret || ChineseWord( tempBuf ))
+            {
+            return ret;
+            }
+    /*    else
+            {
+            // if Stroke Symbol in HongKong
+            TBool strokeSymHK = (IsStrokeSymbolInString(tempBuf)) && 
+                                 (iLanguage == ELangHongKongChinese) &&
+                                 iCurInputMode == 0x0020;
+                                
+            if (!strokeSymHK)
+                {
+                return ret;
+                }
+            }*/
+        }
+
+    //Find if search string has chinese word. 
+    //Compare with item string if find chinese word in item string then delete it from search and item string.
+    //if not then return EFalse.
+    TBool InputMethodStroke = EFalse;
+    if(iLanguage == ELangHongKongChinese && iCurInputMode == 0x0020)
+        {
+        InputMethodStroke = ETrue;
+        }
+    
+    if (haschineseword)
+        {
+        TInt ii=0;
+        TBuf<KMaxWordLength> tmpBuf;
+        tmpBuf.Zero();
+        
+        ////translate the whole searchstring to spelllist
+        while (ii< tempBuf.Length())
+            {
+            
+            //if it is a valid chinese character
+            if ((TInt)tempBuf[ii]>= KMinUnicodeHz && (!InputMethodStroke
+                    ||(InputMethodStroke && !IsStrokeSymbol(tempBuf[ii]))))
+                {
+                
+                RPointerArray<HBufC> spellList;
+                
+                //translate the chinese charater to spellList( pinyin or stroke )
+                if( DoTranslationL(TInt16(tempBuf[ii]), spellList)
+                    && ( tmpBuf.Length() + spellList[0]->Length() < KMaxWordLength)  )
+                	{
+                    tmpBuf.Append( spellList[0]->Des() );
+                    }
+                    
+                spellList.ResetAndDestroy();
+                spellList.Close();
+                ii++;
+                }
+            //if not, just append it     
+            else
+                {
+                if( tmpBuf.Length() + 1 < KMaxWordLength )
+                	{
+                    tmpBuf.Append( tempBuf[ii] );
+                    }
+                    
+                ii++;
+                }
+            }
+            
+            tempBuf.Zero();
+            tempBuf.Copy(tmpBuf);
+        }
+
+    // Array for item string
+    RPointerArray<STRINGINFO> stringInfoArr;
+    // Split item string
+    SplitItemStringL(stringInfoArr, itemString);
+    
+    if (stringInfoArr.Count() > 0)
+        {
+        ret = MatchSegmentL(stringInfoArr, tempBuf);
+        }
+
+    stringInfoArr.ResetAndDestroy();
+    stringInfoArr.Close();
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// Splite the input text to sgement by language
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::SplitItemStringL(RPointerArray<STRINGINFO>& aStringInfoArr, 
+                                        const TDesC &aItemString)
+    {
+    TBuf<KMaxWordLength> tempBuf;
+    TBuf<KMaxWordLength> englishBuf;
+    TBuf<KMaxWordLength> chineseBuf;
+    
+    tempBuf.Zero();
+    englishBuf.Zero();
+    chineseBuf.Zero();
+    
+    TInt index = 0;
+    TUint32 temp = 0;
+    TInt32 distance = 0;
+    const TInt strLength = aItemString.Length();
+    
+    for (; index < strLength; index++)
+        {
+        if (IsFindWordSeparator(aItemString[index]))
+            {
+            // Check Chinese and English Buf. If it is not empty, 
+            // add buf to Array
+            InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue);
+            InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse);
+            continue;
+            }
+        
+        temp = aItemString[index];
+        distance = (TInt32)(temp - KMinUnicodeHz);
+        
+        if (distance < 0)// English word
+            {
+            // Chinese word is end and add to array
+            InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue);
+          
+            // Add English word to array
+            englishBuf.Append((TChar)aItemString[index]);
+            }
+        else // Chinese word
+            {
+            // English word is end and add to array
+            InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse);
+        
+            // Add Chinese word to array
+            chineseBuf.Append((TChar)aItemString[index]);
+            }
+        }
+       
+    // Finish loop check buffer is empty
+    InsertStrInforArrayL(aStringInfoArr, chineseBuf, ETrue);
+    InsertStrInforArrayL(aStringInfoArr, englishBuf, EFalse);
+    }
+
+// ---------------------------------------------------------
+// Insert segment to list
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::InsertStrInforArrayL(RPointerArray<STRINGINFO>& aStringInfoArr, 
+                                            TDes &aSegmentStr, const TBool aChinese)    
+    {
+    if (aSegmentStr.Length() <= 0)
+        {
+        return;
+        }
+   
+    STRINGINFO* strInfo = new(ELeave) STRINGINFO;
+           
+    strInfo->segmentString.Zero();
+    strInfo->segmentString.Copy(aSegmentStr);
+    strInfo->segmentString.LowerCase();
+    strInfo->isChinese = aChinese;
+              
+    aStringInfoArr.AppendL(strInfo);
+    aSegmentStr.Zero();
+    }
+
+// ---------------------------------------------------------
+// This segment is matched by search text
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::MatchSegmentL(RPointerArray<STRINGINFO>& aStringInfoArr, 
+                                     const TDesC &aSearchText)
+    {
+    const TInt arrayLength = aStringInfoArr.Count();
+    const TInt searchStrLength = aSearchText.Length();
+    TInt searchStrIndex = 0;
+    STRINGINFO* pStringInfo;
+    TBuf<KMaxWordLength> tempBuf;
+    TInt index = 0;
+
+    // First only check English
+    for (; index < arrayLength; index ++)
+        {
+        tempBuf.Zero();	
+        pStringInfo = aStringInfoArr[index];
+        
+        tempBuf = aSearchText.Mid(searchStrIndex, searchStrLength - searchStrIndex);
+   
+        // Compare word
+        if (!pStringInfo->isChinese)
+            {
+            searchStrIndex += MatchString(pStringInfo->segmentString, tempBuf);
+            }
+              
+        if (searchStrIndex >= searchStrLength)
+            {
+            return ETrue;
+            }       	
+        }
+
+    TBuf<KMaxWordLength> bufcurrent;
+    TBuf<KMaxWordLength> tempbufcurrent;
+    TInt searchStrIndextemp = 0;
+    TInt searchStrIndexMax = 0;
+    // Find Chinese and English
+    searchStrIndex = 0;
+    index = 0;
+   
+    for (; index < arrayLength; index ++)
+        {
+        tempBuf.Zero();
+        pStringInfo = aStringInfoArr[index];
+        
+        tempBuf = aSearchText.Mid(searchStrIndex, searchStrLength - searchStrIndex);
+        
+        searchStrIndexMax = 0;
+        
+        bufcurrent = pStringInfo->segmentString;
+        
+        for(TInt i =0;i< pStringInfo->segmentString.Length();i++)
+            {
+            tempbufcurrent = bufcurrent.Mid(i);
+            if (pStringInfo->isChinese)
+                {
+                TInt temp=0;
+                searchStrIndextemp = MatchChineseStringL(tempbufcurrent, tempBuf,temp);  
+                if(searchStrIndextemp > searchStrIndexMax)
+                    {
+                    searchStrIndex -= searchStrIndexMax;
+                    searchStrIndexMax = searchStrIndextemp;
+                    searchStrIndex += searchStrIndexMax;
+                    }
+                }
+            else
+                {
+                searchStrIndex += MatchString(pStringInfo->segmentString, tempBuf);
+                }
+                  
+            if (searchStrIndex >= searchStrLength)
+                {
+                return ETrue;
+                }
+            else if(!pStringInfo->isChinese)
+                {
+                break;
+                }
+            }          
+        }
+   
+    return EFalse;   
+    }
+
+// ---------------------------------------------------------
+// Search Chinese word in input text 
+// ---------------------------------------------------------
+//
+TInt CFindUtilChinese::MatchChineseStringL(const TDesC& aFirst, const TDesC& aSecond,TInt& aIndex)
+    {
+    const TInt stringLength = aFirst.Length();
+    const TInt searchLength = aSecond.Length();	
+    TInt index = 0;
+    TBuf<KMaxWordLength> tempBuf;
+    TBuf<KMaxWordLength> previousBuf;
+    TInt curMatchCount = 0;
+    TInt preMatchCount = 0;
+    TInt matchIndex = 0;
+    TInt curSearchIndex = 0;
+    TBool bFullMatched = EFalse;
+    TBool bContinue = EFalse;
+      
+    for(; index < stringLength; index++)
+        {
+        RPointerArray<HBufC> spellList;
+                        
+        if (!DoTranslationL(TInt16(aFirst[index]), spellList) )
+            {
+            spellList.ResetAndDestroy();//destroy spellList
+            spellList.Close();
+                
+            continue;
+            }
+            
+        matchIndex = 0;
+        bContinue = EFalse;
+        
+        // Get left string
+        tempBuf = aSecond.Mid(curSearchIndex, searchLength - curSearchIndex);             
+        
+        // Get Matched count and the matched index in list     
+        curMatchCount = MaxMatchInList(spellList, tempBuf, previousBuf, matchIndex, 
+                                       bFullMatched, preMatchCount, bContinue);     
+        
+        // There is a string matched in list 
+        if (curMatchCount != 0)
+            {
+            previousBuf.Copy(spellList[matchIndex]->Des());
+           
+            if (curMatchCount == previousBuf.Length())
+                {
+                bFullMatched = ETrue;
+                }
+            else
+                {
+                bFullMatched = EFalse;
+                }
+
+            // If it is repeat match, continue     
+            if (!bContinue)
+                {
+                curSearchIndex += curMatchCount;    
+                }
+            else
+                {
+                bFullMatched = EFalse;
+                previousBuf.Zero();
+                curMatchCount = 0;
+                }
+            }
+        else
+            {
+            bFullMatched = EFalse;
+            previousBuf.Zero();
+            if (curSearchIndex != 0)
+                {
+                index--;
+                }
+                
+            curSearchIndex = 0;
+            }
+
+        spellList.ResetAndDestroy();//destroy spellList
+        spellList.Close();
+        preMatchCount = curMatchCount;
+        
+        // Search to End and return
+        if (curSearchIndex >= searchLength)
+           {
+           break;
+           }
+      }
+   aIndex = index;
+   return curSearchIndex;
+   }
+
+// ---------------------------------------------------------
+// Maximal matched count in spelling list  
+// ---------------------------------------------------------
+//
+TInt CFindUtilChinese::MaxMatchInList(RPointerArray<HBufC> &spellList, TDesC& aSearchStr, 
+    TDesC& aPreviouStr, TInt& aMatchIndex, const TBool aFullMatched, const TInt aMatchedCount, TBool& aAgain)
+   {
+   const TInt itemCount = spellList.Count();
+   TInt matchCount = 0;
+   TBool selfMatch = EFalse;
+   aMatchIndex = 0;
+   
+   // If list is empty, then return
+   if (itemCount == 0)
+      {
+      return matchCount;
+      }
+   
+   TInt index = 0;
+   TInt temp = 0;
+   TBuf<KMaxWordLength> tempBuf;
+   TInt repeatCount = 0;
+   TBool loopFlag = EFalse;
+   
+   for (; index < itemCount; index++)
+       {
+       temp = 0;
+       repeatCount = 0;
+       loopFlag = EFalse;
+       tempBuf.Zero();
+       tempBuf.Copy(spellList[index]->Des());
+        
+       temp = MatchString(tempBuf, aSearchStr);
+       if(temp != 0)
+           {
+           selfMatch = ETrue;
+           }
+       else
+           {
+           selfMatch = EFalse;
+           }
+       // Not find and previous word is not empty
+       if (temp == 0 && aPreviouStr.Length() != 0)
+           {
+           // Previous word is fully matched
+           if (aFullMatched)
+               {
+               repeatCount = ReverseMatchString(aPreviouStr, tempBuf);
+               // Find repeat and remove it, search again
+               if (repeatCount != 0)
+                   {
+                   temp = MatchString(tempBuf.Right(tempBuf.Length() - repeatCount), aSearchStr); 
+                   
+                   if (temp == 0)
+                       {
+                       loopFlag = ETrue;
+                       temp = repeatCount;
+                       }
+                   }              
+               }
+           else
+               {
+               repeatCount = MatchString(aPreviouStr, tempBuf);
+
+               // Find repeat and remove it, search again
+               if (repeatCount != 0)
+                   {
+                   if (aMatchedCount <= repeatCount)
+                       {
+                       temp = MatchString(tempBuf.Right(tempBuf.Length() - aMatchedCount), aSearchStr);   
+                       
+                       if (temp == 0)
+                           {
+                           loopFlag = ETrue;
+                           temp = aMatchedCount;                           
+                           }
+                       }
+                   }
+                   
+               if (temp == 0)
+                   {
+                   repeatCount = ReverseMatchString(aPreviouStr.Left(aMatchedCount), tempBuf);
+                   
+                   if (repeatCount != 0)
+                       {
+                       temp = MatchString(tempBuf.Right(tempBuf.Length() - repeatCount), aSearchStr);
+                       
+                       if (temp == 0)
+                           {
+                           loopFlag = ETrue;
+                           temp = repeatCount;
+                           }
+                       }                        
+                   }
+               }
+           }
+       
+       // Find count is longer than before
+       // Record new data
+       if ((loopFlag == aAgain) &&
+           (temp > matchCount))
+           {
+           matchCount = temp;
+           aMatchIndex = index;
+           aAgain = loopFlag;
+           }
+           
+       if (loopFlag != aAgain &&
+           loopFlag &&
+           (temp > matchCount))
+           {
+           matchCount = temp;
+           aMatchIndex = index;
+           aAgain = loopFlag;            
+           }           
+           
+       if (loopFlag != aAgain &&
+           !loopFlag &&
+           temp != 0)
+           {
+           matchCount = temp;
+           aMatchIndex = index;
+           aAgain = loopFlag;            
+           }
+        if(matchCount == aSearchStr.Length() && selfMatch)
+            {
+            break;
+            }
+       }
+    return matchCount;	
+   }
+
+// ---------------------------------------------------------
+// Search the taxt is include the input text  
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IncludeString(const TDesC& aFirst, const TDesC& aSecond)
+    {
+    TBuf<KMaxWordLength> tempBuf;
+    tempBuf.Zero();
+       
+    if (TInt16(aSecond[0]) != KStarChar)
+        {
+        tempBuf.Append(KWildChar);
+        }
+      
+    tempBuf.Append(aSecond);
+      
+    if (TInt16(aSecond[aSecond.Length() -1]) != KStarChar)
+        {
+        tempBuf.Append(KWildChar);
+        }
+        
+    if (aFirst.MatchC(tempBuf) != KErrNotFound)
+        {
+        return ETrue;
+        }
+        
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// Search text in other text  
+// ---------------------------------------------------------
+//
+TInt CFindUtilChinese::MatchString(const TDesC& aFirst, const TDesC& aSecond)
+    {
+    const TInt secondStrLength = aSecond.Length();
+    const TInt firstStrLength = aFirst.Length();
+    const TInt compareCount = firstStrLength > secondStrLength ? secondStrLength : firstStrLength;
+    TInt index = 0;
+   
+    TBuf<KMaxWordLength> tempStr;
+    // translate search target string into numeric string before match
+    if (iConverter)
+        {
+        iConverter->Converter( aFirst, tempStr );
+        }
+    else
+        {
+        tempStr.Copy(aFirst);
+        }
+    
+    for (; index < compareCount; index++)
+        {
+		if (tempStr.Left(index + 1).FindC(aSecond.Left(index + 1)) == KErrNotFound)
+            {
+            break;
+            }
+        }
+    // Match count
+    return index;
+    }
+    
+// ---------------------------------------------------------
+// Search text by reverse  
+// ---------------------------------------------------------
+//
+TInt  CFindUtilChinese::ReverseMatchString(const TDesC& aFirst, const TDesC& aSecond)
+    {
+    const TInt secondStrLength = aSecond.Length();
+    const TInt firstStrLength = aFirst.Length();
+    TInt compareCount = firstStrLength > secondStrLength ? secondStrLength : firstStrLength;
+    TInt index = 0;
+    TInt matchCount = 0;
+   
+    for (; index < compareCount; index++)
+        {
+        TBuf<KMaxWordLength> firstConvStr;
+        TBuf<KMaxWordLength> secondConvStr;
+        
+        // translate compared target string into numeric string before match
+        if ( iConverter )
+            {
+            iConverter->Converter( aFirst, firstConvStr );
+            iConverter->Converter( aSecond, secondConvStr );
+            }
+        else
+            {
+            firstConvStr.Copy( aFirst );
+            secondConvStr.Copy( aSecond );
+            }
+            
+        if( firstConvStr.Right( index + 1 ).FindC( secondConvStr.Left( index + 1 ) ) != KErrNotFound )
+            {
+            matchCount = index + 1;
+            }
+        }
+   
+    return matchCount;	
+    }
+
+// ---------------------------------------------------------
+// Current input text is handled by this model  
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IsWordValidForMatching(const TDesC& /*aWord*/)
+    {
+    return ETrue;
+    }
+
+// ---------------------------------------------------------
+// Find pane text is including Chinese word  
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IsChineseWord(const TDesC& aWord)
+    {
+    TBool IsChineseSearchStr = EFalse;
+    const TInt len = aWord.Length();
+    
+    for (TInt ii = 0; ii< len; ii++)
+        {
+        if ((TInt)aWord[ii] >= KMinUnicodeHz )
+            {
+            IsChineseSearchStr = ETrue;
+            break;
+            }
+        }
+
+    return IsChineseSearchStr;
+    }
+
+// --------------------------------------------------------
+// Find pane text is just Chinese word
+// --------------------------------------------------------
+//
+TBool CFindUtilChinese::ChineseWord(const TDesC& aWord)
+	{
+	TBool isChineseWord = ETrue;
+	const TInt len = aWord.Length();
+	
+    TBool InputMethodStroke = EFalse;
+    if(iLanguage == ELangHongKongChinese && iCurInputMode == 0x0020)
+        {
+        InputMethodStroke = ETrue;
+        }
+	
+	for( TInt i = 0; i < len; i++ )
+		{
+		if( ( ( TInt )aWord[i] < KMinUnicodeHz ) || ( InputMethodStroke && IsStrokeSymbol(aWord[i]) ) )
+			{
+			isChineseWord = EFalse;
+			break;
+			}
+		}
+	return isChineseWord;
+	}
+    
+// ---------------------------------------------------------
+// Find pane text is including stroke symbol  
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IsStrokeSymbolInString(const TDesC& aWord)
+    {
+    const TInt len = aWord.Length();
+    
+    for (TInt index = 0; index < len; index++)
+        {
+        if (IsStrokeSymbol(TInt(aWord[index])) != 0)
+            {
+            return ETrue;
+            }
+        }
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// Find pane text is including zhuyin symbol  
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IsZhuyinSymbolInString(const TDesC& aWord)
+    {
+    const TInt len = aWord.Length();
+    
+    for (TInt index = 0; index < len; index++)
+        {
+        if ((aWord[index] >= KZhuyinstart) && 
+            (aWord[index] < KZhuyinstart + KZhuyincount))
+            {
+            return ETrue;
+            }
+        }
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// This language is support by this model 
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::IsSupportLanguage(TLanguage aLang)    
+    {
+    if (iPtiEngine->GetLanguage(aLang))
+        {
+        return ETrue;
+        }
+        
+    return EFalse;
+    }    
+
+// ---------------------------------------------------------
+// Callback method to notify client about language change.
+// ---------------------------------------------------------
+//
+TInt CFindUtilChinese::HandleFindRepositoryCallBack(TAny* aPtr)
+    {
+    TInt ret = KErrNone;
+    CFindUtilChinese *self = static_cast<CFindUtilChinese*>(aPtr);
+    TInt searchMode = 0;
+    
+    if (self->iWatcher->ChangedKey() == KAknFepInputTxtLang)
+        {
+        TInt inputLanguage = 0;
+        self->iRepositoryFind->Get(KAknFepInputTxtLang, inputLanguage);
+
+        TRAP(ret, self->OpenT9InterfaceL(TLanguage(inputLanguage)));
+        }
+    if(self->iWatcherAdaptive->ChangedKey() == KAknAvkonAdaptiveSearchEnabled)
+        {
+        self->iRepositoryFindAdaptive->Get(KAknAvkonAdaptiveSearchEnabled, self->iSearchMethodAdaptive);
+        }
+    
+    if (self->iWatcherAdaptive->ChangedKey() == KAknAdaptiveSearchChinesePRC)
+        {
+        self->iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChinesePRC, searchMode);
+       
+        if(searchMode ==0)
+		    {
+		    self->iSearchMethodPRC = EAdptSearchPinyin;	
+		    }
+	    else if(searchMode ==1)
+		    {
+		    self->iSearchMethodPRC = EAdptSearchStroke;	
+		    }
+        }
+    
+    if (self->iWatcherAdaptive->ChangedKey() == KAknAdaptiveSearchChineseTW )
+        {
+        self->iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseTW , searchMode);
+       
+        if(searchMode ==0)
+		    {
+		    self->iSearchMethodTaiWan = EAdptSearchZhuyin;	
+		    }
+	    else if(searchMode ==1)
+		    {
+		    self->iSearchMethodTaiWan = EAdptSearchStroke;	
+		    }
+        }
+        
+    if (self->iWatcherAdaptive->ChangedKey() == KAknAdaptiveSearchChineseHongkong )
+        {
+        self->iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseHongkong , searchMode);
+       
+        if(searchMode ==1)
+		    {
+		    self->iRepositoryFind->Get(KAknFepCangJieMode , searchMode);
+       
+	        switch (searchMode)
+		        {
+		        case 0:
+			       self->iSearchMethodHongKong = EAdptSearchNormalCangjie;
+			       break;
+			    case 1:
+			       self->iSearchMethodHongKong = EAdptSearchEasyCangjie;
+			       break;
+			   	case 2:
+			       self->iSearchMethodHongKong = EAdptSearchAdvCangjie;
+			   	   break;	
+		        }
+			    
+		    }
+	    else if(searchMode ==0)
+		    {
+		    self->iSearchMethodHongKong = EAdptSearchStroke;	
+		    }
+        }
+    
+    if (self->iWatcher->ChangedKey() == KAknFepCangJieMode )
+        {
+        self->iRepositoryFind->Get(KAknFepCangJieMode , searchMode);
+       
+        switch (searchMode)
+	        {
+	        case 0:
+		       self->iSearchMethodHongKong = EAdptSearchNormalCangjie;
+		       break;
+		    case 1:
+		       self->iSearchMethodHongKong = EAdptSearchEasyCangjie;
+		       break;
+		   	case 2:
+		       self->iSearchMethodHongKong = EAdptSearchAdvCangjie;
+		   	   break;	
+	        }
+		    
+        }
+    
+    return ret;    
+    }
+
+// ---------------------------------------------------------
+// Update input method in ptiengine from find pane
+// ---------------------------------------------------------
+//
+void CFindUtilChinese::UpdateCurrentInputMode()
+    {
+	CCoeEnv* coeEnv = NULL;
+	coeEnv = CCoeEnv::Static();
+	iCurInputMode = KSysInputMode;
+	if (coeEnv)
+        {
+	    CAknEdwinState* pState = NULL;
+	  
+	    if (coeEnv->AppUi() == NULL)                              
+	    	return;
+	    	
+	    TCoeInputCapabilities inputCapabilities = static_cast<const CCoeAppUi*>(coeEnv->AppUi())->InputCapabilities();
+        MCoeFepAwareTextEditor* fepAvareTextEditor = inputCapabilities.FepAwareTextEditor();
+        if (fepAvareTextEditor)
+            {
+            pState =  static_cast<CAknEdwinState*>(fepAvareTextEditor->Extension1()->State(KNullUid));
+            if (pState)
+                {
+                iCurInputMode = pState->CurrentInputMode();
+                }            
+            }
+        }
+    }
+// ---------------------------------------------------------------------------
+// UpdateNextChar
+// ---------------------------------------------------------------------------
+//
+void CFindUtilChinese::UpdateNextCharsL(HBufC*& aNextChars, TChar aCh)
+	{
+    if( aNextChars->Locate(aCh) == KErrNotFound )
+		{			
+		if( aNextChars->Des().Length() == aNextChars->Des().MaxLength())
+			{
+			aNextChars = aNextChars->ReAllocL( aNextChars->Des().MaxLength()+10 );
+			}		
+		aNextChars->Des().Append(aCh);								
+		}
+	}    
+
+// ---------------------------------------------------------------------------
+// UpdateNextCharFromString
+// ---------------------------------------------------------------------------
+//
+void CFindUtilChinese::UpdateNextCharsFromStringL(HBufC*& aNextChars, const TDesC& aItemString)
+	{
+		
+	 // Array for item string
+    RPointerArray<STRINGINFO> stringInfoArr;
+    // Split item string
+    TRAPD(err, SplitItemStringL(stringInfoArr, aItemString));
+    
+    if (err != KErrNone)
+        {
+        stringInfoArr.ResetAndDestroy();
+        stringInfoArr.Close();
+        }
+        
+    TInt index = 0;
+    STRINGINFO* pStringInfo;
+    const TInt arrayCount = stringInfoArr.Count();
+
+
+    for (index = 0; index < arrayCount; index ++)
+        {
+        pStringInfo = stringInfoArr[index];
+        if (!pStringInfo->isChinese )
+	        {
+	        UpdateNextCharsL( aNextChars, pStringInfo->segmentString[0]);	
+	        }
+        else
+	        {
+            TInt chineseworkcount =  pStringInfo->segmentString.Length();
+            
+            for(TInt i =0;i<chineseworkcount;i++) 
+            	{
+    	        RPointerArray<HBufC> spellList;
+                TBuf<KMaxWordLength> tempBuf;
+            	if (!DoTranslationL(TInt16(pStringInfo->segmentString[i]), spellList))
+	                {
+	                UpdateNextCharsL( aNextChars, pStringInfo->segmentString[i]);
+	                }
+	            else
+	                {
+	                //for multiphnetic spell
+                    TInt spellCount = spellList.Count();
+                    // Search all spelling
+                    for (TInt j = 0; j < spellCount; j++)
+                        {
+                	    tempBuf.Copy(spellList[j]->Des());
+                	    UpdateNextCharsL( aNextChars, tempBuf[0]);                                        
+                        }//end for
+            	    }
+            spellList.ResetAndDestroy();//destroy spellList
+            spellList.Close();       	
+	        }
+        }
+        }
+    stringInfoArr.ResetAndDestroy();
+    stringInfoArr.Close();
+    		
+	}
+
+// ---------------------------------------------------------------------------
+// TrimChineseCharacter
+// ---------------------------------------------------------------------------
+//
+TBool CFindUtilChinese::TrimChineseCharacterL(TDes& aItemString, TDes& aSearchText,HBufC*& aNextChars)
+    {
+    TBuf<KMaxWordLength> tempBuf;    
+    TBuf<KMaxWordLength> itemString;
+    
+    tempBuf.Zero();
+        
+    tempBuf.Copy(aSearchText);
+       
+    itemString.Zero();
+        
+    itemString.Copy(aItemString);
+    
+    TInt searchMode;
+    TBool InputMethodStroke= EFalse;
+    
+    if ( iLanguage == ELangPrcChinese )
+        {
+        iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChinesePRC, searchMode);
+        if(searchMode == 1)
+            {
+            InputMethodStroke = ETrue;
+            }
+        }
+    else if ( iLanguage == ELangHongKongChinese)
+        {
+        iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseHongkong, searchMode);
+        if(searchMode == 1)
+            {
+            InputMethodStroke = ETrue;
+            }
+        }
+    else if( iLanguage == ELangTaiwanChinese)
+        {
+        iRepositoryFindAdaptive->Get(KAknAdaptiveSearchChineseTW, searchMode);
+        if(searchMode == 0)
+            {
+            InputMethodStroke = ETrue;
+            }
+        }
+    TInt ii =0;
+    while (ii< tempBuf.Length())
+        {
+        if ((TInt)tempBuf[ii]>= KMinUnicodeHz && (!InputMethodStroke
+                ||(InputMethodStroke && !IsStrokeSymbol(tempBuf[ii]))))
+            {
+            TInt Findcursor = itemString.Locate(tempBuf[ii]);
+            if (Findcursor != KErrNotFound)
+                {
+                if ((Findcursor == itemString.Length()-1) && (ii
+                        == tempBuf.Length()-1))
+                    {
+                    return ETrue;
+                    }
+                itemString.Delete(0, Findcursor+1);
+                tempBuf.Delete(0, ii+1);
+                if (tempBuf.Length()==0)
+                    {
+                    TBuf<KMaxWordLength> usefortrim;
+                    usefortrim.Append(itemString[0]);
+                    UpdateNextCharsFromStringL(aNextChars, usefortrim);
+                    return ETrue;
+                    }
+                ii=0;
+                }
+            else
+                {
+                ii++;
+                }
+            }
+        else
+            {
+            ii++;
+            }
+        
+        }
+     aSearchText.Zero();
+     
+     aSearchText.Copy(tempBuf);
+     
+     aItemString.Zero();
+     
+     aItemString.Copy(itemString);
+     
+     return EFalse;
+     
+    }
+// ---------------------------------------------------------------------------
+// CheckEnglishFirst
+// ---------------------------------------------------------------------------
+//
+TBool CFindUtilChinese::CheckEnglishFirstL( RPointerArray<STRINGINFO>& aarray, TDes& aSearchText,HBufC*& aNextChars)
+    {
+    TBool ret = EFalse ;
+    if (aarray.Count() > 0)
+        {
+        const TInt arrayLength = aarray.Count();
+        const TInt searchStrLength = aSearchText.Length();
+        TBuf<KMaxWordLength> tempBuf;
+        TBuf<KMaxWordLength> temp;
+
+        TInt searchStrIndex = 0;
+        STRINGINFO* pStringInfo= NULL;
+        TBuf<KMaxWordLength> transSearchBuf;
+        TInt index = 0;
+
+        tempBuf.Zero();
+
+        tempBuf.Copy(aSearchText);
+        // First only check English
+        for (; index < arrayLength; index ++)
+            {
+            transSearchBuf.Zero();
+            pStringInfo = aarray[index];
+
+            transSearchBuf = tempBuf.Mid(searchStrIndex, searchStrLength
+                    - searchStrIndex);
+
+            // Compare word
+            if (!pStringInfo->isChinese)
+                {
+                searchStrIndex += MatchString(pStringInfo->segmentString,
+                        transSearchBuf);
+                }
+
+            if (searchStrIndex >= searchStrLength)
+                {
+                ret = ETrue;
+
+                //append to next char
+                if (pStringInfo->segmentString.Length() > searchStrIndex)
+                    {
+                    UpdateNextCharsL(aNextChars,
+                            pStringInfo->segmentString[searchStrIndex]);
+                    }
+                break;
+                }
+            }
+        //for english string add next character directly    
+        if (ret)
+            {
+            if (arrayLength <= index+1)
+                {
+                return ret;
+                }
+            
+            AppendCharInNextSegmentL(aarray,index+1,aNextChars);
+            }
+        }
+    return ret;
+    }
+// ---------------------------------------------------------------------------
+// AddNextIfOverlapL to check if overlap problem 
+// ---------------------------------------------------------------------------
+//
+void CFindUtilChinese::AddNextIfOverlapL(const RPointerArray<STRINGINFO>& astringInfoArr ,
+            const TInt aindex, const TInt aindexforfind, const TDes& aCurrentBuf,HBufC*& aNextChars )
+{
+    TBuf<KMaxWordLength> temp;
+    TBuf<KMaxWordLength> tempNext;
+    RPointerArray<HBufC> tempSpellList;
+    STRINGINFO* pStringInfo;
+    STRINGINFO* pStringInfoNext;
+    
+    if(astringInfoArr.Count()>aindex)
+        {
+        pStringInfo= astringInfoArr[aindex];
+        }
+    else
+    	{
+    	return;
+    	}
+    
+    if (pStringInfo->isChinese)
+        {
+        if((pStringInfo->segmentString).Length()>aindexforfind+1)//in same segment
+            {
+            if (DoTranslationL(TInt16((pStringInfo->segmentString)[aindexforfind+1]), tempSpellList))
+                {
+                temp.Copy(tempSpellList[0]->Des());
+                }
+            }
+        else if(astringInfoArr.Count()>aindex+1)//next segment should be english
+            {
+            temp.Copy(astringInfoArr[aindex+1]->segmentString);
+            }
+        }
+    else
+        {
+        if(astringInfoArr.Count()>aindex+1)
+            {
+            pStringInfo= astringInfoArr[aindex+1]; //next segment should be chinese
+            if (!DoTranslationL(TInt16((pStringInfo->segmentString)[0]), tempSpellList))
+                {
+                temp.Copy(pStringInfo->segmentString);
+                }
+            else
+                {
+                temp.Copy(tempSpellList[0]->Des());
+                }
+            }
+        
+        }
+    tempSpellList.ResetAndDestroy();
+    if(ReverseMatchString(aCurrentBuf,temp)>0)
+        {
+        if (pStringInfo->isChinese)
+            {
+            if((pStringInfo->segmentString).Length()>aindexforfind+2)//in same segment
+                {
+                if (!DoTranslationL(TInt16((pStringInfo->segmentString)[aindexforfind+2]), tempSpellList))
+                    {
+                    tempNext.Append((pStringInfo->segmentString)[aindexforfind+2]);
+                    }
+                else
+                    {
+                    tempNext.Copy(tempSpellList[0]->Des());
+                    }
+                }
+            else if(astringInfoArr.Count()>aindex+2)//next segment should be english
+                {
+                pStringInfoNext = astringInfoArr[aindex+2];
+                if(pStringInfoNext->isChinese)
+                    {
+                    if (!DoTranslationL(TInt16((pStringInfoNext->segmentString)[0]),
+                                tempSpellList))
+                            {
+                            tempNext.Append((pStringInfoNext->segmentString)[0]);
+                            }
+                        else
+                            {
+                            tempNext.Copy(tempSpellList[0]->Des());
+                            }
+                    }
+                else
+                    {
+                    tempNext.Copy(pStringInfoNext->segmentString);
+                    }
+                }
+            }
+        else
+            {
+            if(astringInfoArr.Count()>aindex+2)
+                {
+                pStringInfo= astringInfoArr[aindex+2]; //next segment should be chinese
+                if (!DoTranslationL(TInt16((pStringInfo->segmentString)[0]), tempSpellList))
+                    {
+                    tempNext.Copy(pStringInfo->segmentString);
+                    }
+                else
+                    {
+                    tempNext.Copy(tempSpellList[0]->Des());
+                    }
+                }        
+            }
+        }
+
+    if(tempNext.Length()>0)
+        {
+        UpdateNextCharsL(aNextChars,tempNext[0]);
+        }  
+    tempSpellList.ResetAndDestroy();
+    tempSpellList.Close();
+}
+// ---------------------------------------------------------------------------
+// AppendCharInNextSegmentL this segment is english
+// ---------------------------------------------------------------------------
+//
+void CFindUtilChinese::AppendCharInNextSegmentL(const RPointerArray<STRINGINFO>& astringInfoArr ,
+            const TInt aindex,HBufC*& aNextChars)
+    {
+    TBuf<KMaxWordLength> temp;
+
+    RPointerArray<HBufC> tempSpellList;
+    
+    if ( !astringInfoArr[aindex]->isChinese)
+        {
+        UpdateNextCharsL(aNextChars,
+                astringInfoArr[aindex]->segmentString[0]);
+        }
+    else
+        {
+        if (!DoTranslationL(
+                TInt16(astringInfoArr[aindex]->segmentString[0]),
+                tempSpellList))
+            {
+            UpdateNextCharsL(aNextChars,
+                   astringInfoArr[aindex]->segmentString[0]);
+            }
+        else
+            {
+            //for multiphnetic spell
+            TInt spellCount = tempSpellList.Count();
+            // Search all spelling
+            for (TInt j = 0; j < spellCount; j++)
+                {
+                temp = tempSpellList[j]->Des();
+                UpdateNextCharsL(aNextChars, temp[0]);
+                }//end for
+            }
+
+        }
+    tempSpellList.ResetAndDestroy();
+    tempSpellList.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// AppendNextSegmentFirstChar this segment is chinese
+// ---------------------------------------------------------------------------
+//
+TBool CFindUtilChinese::AppendNextSegmentFirstCharL(const RPointerArray<STRINGINFO>& astringInfoArr ,
+const TInt aindex ,const TInt aindexforfind,const TDes& aCurrentBuf ,const TDes& aTranSearchBuf,HBufC*& aNextChars)
+    {
+    STRINGINFO* pStringInfo= astringInfoArr[aindex];
+    TBuf<KMaxWordLength> temp;
+    TInt ret(0);
+    if (pStringInfo->isChinese)
+        {
+        if (aCurrentBuf.Length() > aindexforfind + 1)
+            {
+            RPointerArray<HBufC> tempSpellList;
+            if (!DoTranslationL(
+                    TInt16(aCurrentBuf[aindexforfind + 1]),
+                    tempSpellList))
+                {
+                UpdateNextCharsL(aNextChars,
+                        aCurrentBuf[aindexforfind + 1 ]);
+                }
+            else
+                {
+                //for multiphnetic spell
+                TInt spellCount = tempSpellList.Count();
+                // Search all spelling
+                for (TInt j = 0; j < spellCount; j++)
+                    {
+                    temp = tempSpellList[j]->Des();
+                    UpdateNextCharsL(aNextChars, temp[0]);
+                    if (temp.Length()>1)
+                        {
+                        TBuf<KMaxWordLength>
+                                useforminan(aTranSearchBuf);
+                        useforminan.Append(temp[1]);
+                        if (MatchRefineL(aCurrentBuf, useforminan))
+                            {
+                            UpdateNextCharsL(aNextChars,temp[1]);
+                            }
+                        }
+                    }//end for                               
+                }
+            tempSpellList.ResetAndDestroy();
+            tempSpellList.Close();
+            }
+        else
+            {
+            //if space exist in chinese words, it will split them into differenct segments.
+            if (aindex < astringInfoArr.Count() - 1)
+                {
+                STRINGINFO* pStringInfo1 =
+                        astringInfoArr[aindex + 1];
+                if (pStringInfo1->isChinese)
+                    {
+                    RPointerArray<HBufC> tempSpellList;
+                    if (!DoTranslationL(TInt16((pStringInfo1->segmentString)[0]),
+                            tempSpellList))
+                        {
+                        UpdateNextCharsL(aNextChars,(pStringInfo1->segmentString)[0]);
+                        }
+                    else
+                        {
+                        //for multiphnetic spell
+                        TInt spellCount = tempSpellList.Count();
+                        // Search all spelling
+                        for (TInt j = 0; j < spellCount; j++)
+                            {
+                            temp = tempSpellList[j]->Des();
+                            UpdateNextCharsL(aNextChars,temp[0]);
+                            }//end for
+                        }
+                    tempSpellList.ResetAndDestroy();
+                    tempSpellList.Close();
+                    }
+                else
+                    {
+                    UpdateNextCharsL(aNextChars,
+                            pStringInfo1->segmentString[0]);
+                    }
+                }
+            }
+
+        }
+    else
+        {
+        //have no next element in array
+        if (astringInfoArr.Count() <= aindex+1)
+            {
+            ret = ETrue;
+            return ret;
+            }
+        
+        AppendCharInNextSegmentL(astringInfoArr,aindex+1,aNextChars);
+        
+        }
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// IsAdaptiveFindMatchL
+// ---------------------------------------------------------------------------
+//
+TBool CFindUtilChinese::IsAdaptiveFindMatchL( const TDesC& aItemString, const TDesC& aSearchText,
+ HBufC*& aNextChars )
+{
+    
+    TBuf<KMaxWordLength> tempBuf;    
+    TBuf<KMaxWordLength> itemString;
+    
+    TBool ret = EFalse;
+    
+    tempBuf.Zero();
+    if ( KMaxWordLength > aSearchText.Length() )
+        {
+        tempBuf.Copy( aSearchText );
+        }
+    else
+        {
+        tempBuf.Copy( aSearchText.Left( KMaxWordLength ) );
+        }
+    
+    itemString.Zero();
+     
+    if ( KMaxWordLength > aItemString.Length() )
+        {
+        itemString.Copy( aItemString );
+        }
+    else
+        {
+        itemString.Copy( aItemString.Left( KMaxWordLength ) );
+        }
+    
+    RemoveSeparator(tempBuf);
+    
+    RPointerArray<HBufC> spellList;
+    
+    //trim the sepcial char
+    if(itemString.Length()>0)
+        {
+        if(itemString[0]== KLeftToRightFlag || itemString[0]== KRightToLeftFlag)
+            {
+            itemString.Delete(0,1);
+            itemString.Delete((itemString.Length()-1),1);     
+            } 
+        }                
+    
+    //Find if search string has chinese word. 
+    //Compare with item string if find chinese word in item string then delete it from search and item string.
+    
+    if(IsChineseWord(tempBuf))
+        {
+        if(TrimChineseCharacterL(itemString,tempBuf,aNextChars))
+            {
+            spellList.ResetAndDestroy();//destroy spellList
+            spellList.Close();
+            return ETrue;
+            }
+        }
+       
+    // Array for item string
+    RPointerArray<STRINGINFO> stringInfoArr;
+    // Split item string
+    SplitItemStringL(stringInfoArr, itemString);
+    
+    // For store temp data 
+    TBuf<KMaxWordInterpretationLen> temp;
+        
+    //First only check English
+    
+    if(CheckEnglishFirstL(stringInfoArr,tempBuf,aNextChars))
+        {
+        spellList.ResetAndDestroy();//destroy spellList
+        spellList.Close();
+        stringInfoArr.ResetAndDestroy();
+        stringInfoArr.Close();
+        return ETrue;
+        }
+    
+    const TInt arrayLength = stringInfoArr.Count();
+    const TInt searchStrLength = tempBuf.Length();
+    TInt searchStrIndex = 0;
+    STRINGINFO* pStringInfo= NULL;
+    TBuf<KMaxWordLength> transSearchBuf;
+    TInt index = 0; 
+    TInt indexforfind =0;
+    TInt indexlast=0;
+    
+    TBuf<KMaxWordLength> bufcurrent;
+    TBuf<KMaxWordLength> tempbufcurrent;
+    
+    // Find Chinese and English
+    for (; index < arrayLength; index ++)
+        {
+        TInt matchLength = 0;
+        transSearchBuf.Zero();
+        pStringInfo = stringInfoArr[index];
+
+        transSearchBuf = tempBuf.Mid(searchStrIndex, searchStrLength
+                - searchStrIndex);
+        if (transSearchBuf.Length()==0)
+            {
+            break;
+            }
+
+        bufcurrent = pStringInfo->segmentString;
+
+        for (TInt j =0; j < pStringInfo->segmentString.Length(); j++)
+            {
+            TInt indexforfindtemp = 0;
+            TInt searchStrIndextemp = 0;
+            if (pStringInfo->isChinese)
+                {
+                tempbufcurrent = bufcurrent.Mid(j);
+                matchLength = MatchChineseStringL(tempbufcurrent,
+                        transSearchBuf, indexforfindtemp);
+                searchStrIndextemp +=matchLength;
+                if (indexforfindtemp>=indexforfind)
+                    {
+                    if (indexlast == index && searchStrIndextemp
+                            >= searchStrIndex)
+                        {
+                        searchStrIndex = searchStrIndextemp;
+                        }
+                    else
+                        if (indexlast != index)
+                            {
+                            searchStrIndex += searchStrIndextemp;
+                            }
+                    indexforfind = indexforfindtemp;
+                    indexlast = index;
+                    }
+                }
+            else
+                {//english words and chinese words don't coexist in same segment
+                matchLength = MatchString(bufcurrent, transSearchBuf);
+                searchStrIndex +=matchLength;
+                if (searchStrIndex >= searchStrLength)
+                    {
+                    //append next char in the same segment
+                    ret = ETrue;
+
+                    if (bufcurrent.Length() > matchLength)
+                        {
+                        UpdateNextCharsL(aNextChars, bufcurrent[matchLength]);
+                        }
+                    if (arrayLength <= index+1)
+                        {
+                        spellList.ResetAndDestroy();//destroy spellList
+                        spellList.Close();
+                        stringInfoArr.ResetAndDestroy();
+                        stringInfoArr.Close();
+                        return ret;
+                        }
+                    
+                    AppendCharInNextSegmentL(stringInfoArr,index+1,aNextChars);
+                    
+                    }
+                break;
+                }
+            // Append next character in same segment this segment is chinese
+            if (searchStrIndex >= searchStrLength)
+                {
+                ret = ETrue;
+                RPointerArray<HBufC> tempSpellList;
+                if (tempbufcurrent.Length()>indexforfind)
+                    {
+                    if (!DoTranslationL(TInt16(tempbufcurrent[indexforfind]),
+                            tempSpellList))
+                        {
+                        UpdateNextCharsL(aNextChars,
+                                tempbufcurrent[indexforfind]);
+                        }
+                    else
+                        {
+                        //for multiphnetic spell
+                        TInt spellCount = tempSpellList.Count();
+
+                        // Search all spelling
+                        for (TInt j = 0; j < spellCount; j++)
+                            {
+                            //for multiphnetic spell
+                            TInt spellCount = tempSpellList.Count();
+                            TInt matchMaxIndex = 0;
+                            TInt matchMax = 0;
+                            TInt matchMaxPre = 0;
+                            TBool fullmatch = EFalse;
+                            TBool offset = KErrNotFound;
+                            // Search all spelling
+                            for (TInt j = 0; j < spellCount; j++)
+                                {
+                                temp = tempSpellList[j]->Des();
+                                for (TInt k = 1; k <= searchStrLength; k++)
+                                    {
+                                    TBuf<KMaxWordLength> tmpBuf = tempBuf.Mid(
+                                            searchStrLength - k, k);
+                                    offset = temp.Find(tmpBuf);
+                                    if (offset != KErrNotFound)
+                                        {
+                                        TBuf<KMaxWordLength> buf = temp.Mid(0,k);
+                                        if (buf == tmpBuf)
+                                            {
+                                            fullmatch = ETrue;
+                                            }
+                                        }
+                                    if (offset != KErrNotFound && fullmatch)
+                                        {
+                                        matchMax = k;
+                                        }
+                                    fullmatch = EFalse;
+                                    }
+                                if (matchMax > matchMaxPre)
+                                    {
+                                    matchMaxPre = matchMax;
+                                    matchMaxIndex = j;
+                                    }
+                                if (matchMax == searchStrLength && fullmatch)
+                                    {
+                                    if (matchMaxPre <temp.Length())
+                                        {
+                                        UpdateNextCharsL(aNextChars, temp[matchMax]);
+                                        }
+                                    }
+                                fullmatch = EFalse;
+                                offset = KErrNotFound;
+                                }
+                            temp = tempSpellList[matchMaxIndex]->Des();
+                            if (matchMaxPre <temp.Length())
+                                {
+                                UpdateNextCharsL(aNextChars,temp[matchMaxPre]);
+                                }
+                            }
+                        tempSpellList.ResetAndDestroy();
+                        tempSpellList.Close();
+                        }
+                    }
+                //Append first translated character or english letter in next segment.
+                if (ret)
+                    { 
+                    AppendNextSegmentFirstCharL(stringInfoArr,index,
+                            indexforfind,tempbufcurrent,transSearchBuf,aNextChars);
+                    
+                    AddNextIfOverlapL(stringInfoArr,index,indexforfind+j,transSearchBuf,aNextChars);
+                    }
+                searchStrIndex = 0;
+                }
+            indexforfind = 0;
+            }
+        }
+
+    spellList.ResetAndDestroy();//destroy spellList
+	spellList.Close(); 		
+    stringInfoArr.ResetAndDestroy();
+    stringInfoArr.Close();
+
+    return ret;
+}
+    
+// -----------------------------------------------------------------------------
+// CFindUtilChinese::MatchAdaptiveRefineL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+TBool CFindUtilChinese::MatchAdaptiveRefineL( const TDesC& aItemString, 
+	const TDesC &aSearchText, HBufC*& aNextChars )
+	{
+	//Get default adaptive search method.
+	if ( aItemString.Length() == 0 )
+        {
+        return EFalse;
+        }
+    if ( aSearchText.Length() == 0 )
+        {
+        UpdateNextCharsFromStringL( aNextChars, aItemString );
+        return ETrue;
+        } 
+               
+    return IsAdaptiveFindMatchL( aItemString, aSearchText, aNextChars);		    
+    	
+	}
+
+// ---------------------------------------------------------
+// Match arithmetic for accurate search, special translation 
+// for aItemString is implemented with MFindTargetStrTranslation
+// before the final match
+// ---------------------------------------------------------
+//
+TBool CFindUtilChinese::MatchRefineL( const TDesC& aItemString, const TDesC& aSearchText, 
+                                      TMatchPolicy aPolicy, MFindStringConverter* aConverter)
+    {
+    TBool ret = EFalse;
+    
+    if (aPolicy == ECustomConverter)
+        {
+        iConverter = aConverter;
+        }
+
+    ret = MatchRefineL(aItemString, aSearchText);
+    iConverter = NULL;
+    
+    return ret;
+    }    
+
+// end of file