diff g23m/condat/ms/src/bmi/MmiChineseInput.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/bmi/MmiChineseInput.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,2302 @@
+/*******************************************************************************
+
+					CONDAT (UK)
+
+********************************************************************************                                                                              
+
+ This software product is the property of Condat (UK) Ltd and may not be
+ disclosed to any third party without the express permission of the owner.                                 
+                                                                              
+********************************************************************************
+
+ $Project name:	Basic MMI                                                      
+ $Project code:	BMI (6349)                                                           
+ $Module:		MmiChineseInput
+ $File:		    MmiChineseInput.c
+ $Revision:		1.0                                                       
+                                                                              
+ $Author:		Condat(UK)                                                         
+ $Date:		    25/10/00                                                      
+                                                                               
+********************************************************************************
+                                                                              
+ Description:MMI Chinese Input handling.
+ 
+
+                        
+********************************************************************************
+
+ $History: MmiChineseInput.c
+	Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	Bug:Clenup of sprintf used for tracing
+	Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX
+
+	25/10/00			Original Condat(UK) BMI version.	
+03/10/02		Replaced most of the file with version on 3.3.3 line (MC, SPR 1242)
+	   
+ $End
+
+*******************************************************************************/
+
+
+/*******************************************************************************
+                                                                              
+                                Include Files
+                                                                              
+*******************************************************************************/
+#include <stdio.h>
+#include <string.h>
+
+#if defined (NEW_FRAME)
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+
+#else
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif
+
+
+#include "mfw_mfw.h"
+#include "mfw_win.h"
+#include "mfw_kbd.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifndef NEW_EDITOR
+#include "mfw_edt.h"
+#endif
+#include "mfw_tim.h"
+#include "mfw_phb.h"
+#include "mfw_sms.h"
+#include "mfw_icn.h"
+#include "mfw_mnu.h"
+#include "mfw_lng.h"
+#include "mfw_sat.h"
+#include "mfw_kbd.h"
+#include "mfw_nm.h"
+
+#include "dspl.h"
+
+#include "ksd.h"
+#include "psa.h"
+
+#include "MmiMain.h"
+#include "MmiDummy.h"
+#include "MmiMmi.h"
+
+#include "MmiDialogs.h"
+#include "MmiLists.h"
+#include "MmiMenu.h"
+#include "MmiSoftKeys.h"
+#include "MmiChineseInput.h"
+
+#include "mmiSmsBroadcast.h"
+#include "mmiSmsMenu.h"
+#include "mmismssend.h"
+#include "mmiColours.h"
+
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+#include "ATBCommon.h"
+#include "ATBDisplay.h"
+#include "ATBEditor.h"
+#include "AUIEditor.h"
+#include "AUISymbol.h"
+#else
+#include "MmiLatinPredText.h"
+#endif
+
+#define CHINESE_KEYPAD_TIME 			1000	/*one second*/
+#define	MAX_PHONEBOOK_ENTRY_SIZE		10  
+#define	LOWER_CASE_ASCII_OFFSET			97		/*ASCII code for 'a'*/
+#define  EZITEXT_OUTPUT_OFFSET			0xF400 	/*Add to ASCII to get display code for Jospeh's pinyin font*/
+
+#define CHI_FONT_WIDTH				12/*mc SPR1319*/
+
+/* SPR#1428 - SH - New Editor: don't use SymbolChar */
+#ifndef NEW_EDITOR
+extern int SymbolChar;
+#endif
+
+/*MC 15/07/02 Keypad counters; keep track of how many times a key has been pressed*/
+static char Counter[KCD_STAR];
+
+/*MC 15/07/02 Keypad counters; keep track of how many times a key has been pressed*/
+static char Counter[KCD_STAR];
+
+static const unsigned char TextIconeZiTextSmall[] =
+{
+	0x03,
+	0x03,
+	0x18,
+	0x7c,
+	0xcc,
+	0x08,
+	0x10,
+	0x0c
+};
+USHORT  TEXT_BUFFER_EDIT_SIZE;
+
+/*mc SPR1319, makes it easier to keep track of the mfw editor*/
+#ifdef LSCREEN
+/* SPR#1428 - SH - New Editor changes */
+  #ifdef NEW_EDITOR
+	 T_ED_DATA *editor_pointer;
+  #else /* NEW_EDITOR */
+	 T_MFW_HND* editor_pointer;
+  #endif /* NEW_EDITOR */
+#endif
+
+const char	StrokePrompt[]	= {0x7B, 0x14, 0x52, 0x12, 0x00, 0x3A, 0x00, 0x00};
+const char	PinYinPrompt[]	= {0x62, 0xFC, 0x97, 0xF3, 0x00, 0x3A, 0x00, 0x00};
+ZI8WCHAR const ZiStrokeKeyMap[10][3] =   /* table for PINYIN */
+{
+  {0,	ZI8_STROKE_MORE},
+  {1, 	ZI8_STROKE_OVER},
+  {2, 	ZI8_STROKE_DOWN},
+  {3, 	ZI8_STROKE_LEFT},
+  {4,  	ZI8_STROKE_DOT},
+  {5, 	ZI8_STROKE_OVER_DOWN},
+  {6, 	ZI8_STROKE_CURVED_HOOK},
+  {7, 	ZI8_STROKE_DOWN_OVER},
+  {8, 	ZI8_STROKE_MORE},
+  {9, 	ZI8_STROKE_OVER_DOWN_OVER},
+};
+
+ZI8WCHAR const ZiPinYinKeyMap[9][6] =   /* table for PINYIN */
+{
+  {ZI8_CODE_TONES_1,	ZI8_CODE_TONES_2, 	ZI8_CODE_TONES_3, 	ZI8_CODE_TONES_4,	ZI8_CODE_TONES_5,	5},
+  {ZI8_CODE_PINYIN_A, 	ZI8_CODE_PINYIN_B, 	ZI8_CODE_PINYIN_C, 	0, 					0, 					3},
+  {ZI8_CODE_PINYIN_D, 	ZI8_CODE_PINYIN_E, 	ZI8_CODE_PINYIN_F, 	0,					0,					3},
+  {ZI8_CODE_PINYIN_G, 	ZI8_CODE_PINYIN_H, 	ZI8_CODE_PINYIN_I, 	0,					0,					3},
+  {ZI8_CODE_PINYIN_J,  	ZI8_CODE_PINYIN_K, 	ZI8_CODE_PINYIN_L, 	0,					0,					3},
+  {ZI8_CODE_PINYIN_M, 	ZI8_CODE_PINYIN_N, 	ZI8_CODE_PINYIN_O, 	0,					0,					3},
+  {ZI8_CODE_PINYIN_P, 	ZI8_CODE_PINYIN_Q, 	ZI8_CODE_PINYIN_R, 	ZI8_CODE_PINYIN_S,	0, 					4},
+  {ZI8_CODE_PINYIN_T, 	ZI8_CODE_PINYIN_U, 	ZI8_CODE_PINYIN_V, 	0,					0, 					3},
+  {ZI8_CODE_PINYIN_W, 	ZI8_CODE_PINYIN_X, 	ZI8_CODE_PINYIN_Y,	ZI8_CODE_PINYIN_Z,	0, 					4},
+};
+
+typedef struct _IME_DATA
+{
+    int				CandidateCursor;	/* the indication of the current candidate highlighted */
+    unsigned short 	TextBufferCount;         // Total number of characters contained in the wszTextBuffer.
+    unsigned char	candidates;			/* last returned number of candidates */
+    int				TextCursor;			/* the current test cursor */
+    PZI8WCHAR		pTextBuffer;		/* the start of the text buffer */
+    int				TextBufferEditSize;	/*  */
+    int				TextBufferSize;		/*  */
+    unsigned char	moreCount;			/* keeps track of the more count */
+    PZI8WCHAR		pDisplayElementBuffer;
+    ZI8UCHAR		EditorMode;			     // To store current editor mode i.e. stroke, PinYin
+    unsigned char	InputScreenType;        // This variable is to state the different screen type. 
+    PZI8GETPARAM	pGetParam;			/* pointer to Zi8GetParam */
+} IME_DATA, * PIME_DATA;
+
+typedef struct
+{
+    T_MMI_CONTROL		mmi_control;
+    T_MFW_HND 		    parent_win;
+    T_MFW_HND       	input_win;
+    T_MFW_HND       	input_kbd;
+    USHORT          	Identifier;
+
+    ZI8UCHAR 		   	version;	
+    ZI8WCHAR* 		   	wszTextBuffer;/*[TEXT_BUFFER_EDIT_SIZE + 1];*/	/* TEXT_BUFFER_EDIT_SIZE = 80 */
+    ZI8WCHAR 		   	DisplayElementBuffer[TEXT_BUFFER_EXTRA_SPACE + 1];	/* TEXT_BUFFER_EXTRA_SPACE = 20 */
+    ZI8WCHAR 		   	wszElementBuffer[TEXT_BUFFER_EXTRA_SPACE + 1];		/* TEXT_BUFFER_EXTRA_SPACE = 20 */
+    ZI8GETPARAM 	   	GetParam;
+    IME_DATA 		   	Ime;
+    ZI8WCHAR 		   	wcCandidates[CANDIDATES_PER_GROUP+1];			/* CANDIDATES_PER_GROUP = 7 */
+	ZI8WCHAR			StartOfDisplayIndex;
+    ZI8WCHAR		   	HighlightedCandidate[2];  // This arrary is used to store the highlighted character pointed by CandidateCursor
+	ZI8WCHAR		   	CursorPosition[2];  //Used to show the cursor Position in the composed text.
+	ZI8UCHAR			NumberOfKeyPress;
+	CHAR				PerviousKeyPress;
+	T_MFW_HND		    options_win;
+    /* Start of variable decleared for dummy functions. This is to be removed when eZiText code is received*/
+    /* End */
+  	 T_CHINESE_DATA		Callback_Data;
+	/*MC 15/07/02 keypad timer for Pinyin*/
+	T_MFW_HND			KeyPad_Timer_Handle;
+#ifdef LSCREEN
+  #ifdef NEW_EDITOR	/* SPR#1428 - SH - New Editor changes */
+	T_ED_DATA			*editor;
+	T_ED_ATTR			editor_attr;
+  #else /* NEW_EDITOR */
+	T_MFW_HND			editor;/*mc SPR1319, using mfw_editor for colour display*/
+	MfwEdtAttr			editor_attr;
+  #endif /* NEW_EDITOR */
+#endif /* LSCREEN */
+} T_chinese_input;
+
+
+static T_MFW_HND 	chinese_input_create 		(T_MFW_HND  parent_win);
+
+static void	chinese_input_exec			(T_MFW_HND  win, USHORT event, SHORT value, void * parameter);
+static int	chinese_input_win_cb		(T_MFW_EVENT event, T_MFW_WIN * win);
+static int	chinese_input_kbd_cb		(T_MFW_EVENT event, T_MFW_KBD * keyboard);
+
+/*mc 15/07/02*/
+static int chinese_pinyin_timer_cb (MfwEvt e, MfwTim *t);
+
+/* Initialize the defined structure */
+void IMEInitialize(PIME_DATA pIME, PZI8GETPARAM pGetParam, PZI8WCHAR wszTextBuffer, int TextBufferEditSize,
+				  int TextBufferSize, PZI8WCHAR wcCandidates, PZI8WCHAR wszElementBuffer, PZI8WCHAR DisplayElementBuffer);
+void IMECursorLeft(PIME_DATA pIME); /* move the cadidate cursor left */
+void IMECursorRight(PIME_DATA pIME); /* move the cadidate cursor right */
+void IMESelectCandidate(PIME_DATA pIME, PZI8WCHAR wszElementBuffer); /* Select the candidate at sursor */
+void IMEMore(PIME_DATA pIME); /* get the next group of candidates */
+void IMEKeyPress(PIME_DATA pIME, ZI8WCHAR wcStroke); /* enter the stroke and get new candidates */
+void IMEClear(PIME_DATA pIME, PZI8WCHAR wszElementBuffer); /* Clear the last stroke entered */
+void CandidateHighlightDisplayContorl(PIME_DATA pIME, PZI8WCHAR HighlightedCandidate);
+void TextCursorDisplayContorl(PIME_DATA pIME, PZI8WCHAR CursorPosition, int InsertLine);
+void IMEChangeMode(PIME_DATA pIME, PZI8GETPARAM pGetParam);
+void DataConvert(PIME_DATA pIME);
+ZI8WCHAR Uni_strlen(PZI8WCHAR String);
+
+/*****************************Functions*****************************************/
+/*******************************************************************************
+
+ $Function:    	LatinChar
+
+ $Description:	Returns true if character is in ASCII range
+ 
+ $Returns:		UBYTE (TRUE/FALSE)	
+
+ $Arguments:	Wide char in Ezitext format (not our display format)
+ 
+*******************************************************************************/
+UBYTE LatinChar(ZI8WCHAR char_code)
+{	//if last byte is 0x00 and first byte is between 0x20 and 0x7E
+	if ((char_code% 0x100 == 0)&&(char_code>=0x2000) && (char_code<0x7F00))
+		return TRUE;
+	else
+		return FALSE;
+}
+
+/*******************************************************************************
+
+ $Function:    	chinese_input
+
+ $Description:	starts chinese editor
+ 
+ $Returns:		Window handle
+
+ $Arguments:	parebt window, editor attribute structure
+ 
+*******************************************************************************/
+T_MFW_HND chinese_input (T_MFW_HND parent_win, T_CHINESE_DATA* chinese_data)
+{
+    T_MFW_HND	win;
+    win = chinese_input_create (parent_win);
+    if(win NEQ NULL)
+    {
+        SEND_EVENT (win, CHINESE_INPUT_INIT, 0, chinese_data);
+    }
+    return win;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	chinese_input_create
+
+ $Description:	Creates chinese editor window
+ 
+ $Returns:		Dialogue info win
+
+ $Arguments:	parent win
+ 
+*******************************************************************************/
+static T_MFW_HND chinese_input_create (T_MFW_HND parent_win)
+{
+    T_MFW_WIN     *  win_data;
+    T_chinese_input  *  data = (T_chinese_input *)ALLOC_MEMORY (sizeof (T_chinese_input));
+
+    TRACE_EVENT ("chinese_input_create()");
+
+    data->input_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)chinese_input_win_cb);
+    if(data->input_win EQ 0)
+        return 0;
+  	/* Create window handler */
+    data->mmi_control.dialog	= (T_DIALOG_FUNC)chinese_input_exec;
+    data->mmi_control.data		= data;
+    data->parent_win    		= parent_win;
+    win_data             		= ((T_MFW_HDR *)data->input_win)->data;
+    win_data->user        		= (void *)data;
+
+    /*MC 15/07/02 create timer for pinyin multitap*/
+    data->KeyPad_Timer_Handle	= tim_create(data->input_win, CHINESE_KEYPAD_TIME, (MfwCb)chinese_pinyin_timer_cb);
+    memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+   
+  	/*return window handle */
+    return data->input_win;
+}
+
+/*******************************************************************************
+
+ $Function:    	chinese_pinyin_timer_cb
+
+ $Description:	Keypad timer callback
+ 
+ $Returns:		int
+
+ $Arguments:	Event mask and timer structure
+ 
+*******************************************************************************/
+static int chinese_pinyin_timer_cb (MfwEvt e, MfwTim *t)
+{	T_MFW_WIN     * win  = (T_MFW_WIN *)mfwParent( mfw_header());
+    T_chinese_input  * data = (T_chinese_input *)win->user;
+    int i;
+    TRACE_EVENT("chinese_pinyin_timer_cb()");
+  	for(i=0; i< KCD_STAR; i++)//MC, set all counters to 0
+  		 Counter[i] = 0;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:    	chinese_input_destroy
+
+ $Description:	Destruction of an information dialog
+ 
+ $Returns:		void
+
+ $Arguments:	win
+ 
+*******************************************************************************/
+void chinese_input_destroy (T_MFW_HND own_window)
+{
+    T_MFW_WIN     * win  = ((T_MFW_HDR *)own_window)->data;
+    T_chinese_input  * data = (T_chinese_input *)win->user;
+    TRACE_EVENT ("chinese_input_destroy()");
+
+	if (own_window == NULL)
+	{
+		TRACE_EVENT ("Error :- Called with NULL Pointer");
+		return;
+	}
+
+    if(data)
+  	{
+    	/* Exit TIMER & KEYBOARD Handle */
+        kbd_delete (data->input_kbd);
+    	/* Delete WIN Handler */
+        win_delete (data->input_win);
+        /* Free Memory */
+        /*MC 15/07/02, delete keyboard timer*/
+        tim_delete(data->KeyPad_Timer_Handle);
+        data->KeyPad_Timer_Handle= NULL;
+
+		/* SPR#1428 - SH - New Editor changes */
+#ifdef LSCREEN
+#ifdef NEW_EDITOR
+        if (data->editor)
+        {
+        	ATB_edit_Destroy(data->editor);
+        }
+#endif
+#endif
+
+        FREE_MEMORY ((void *)data, sizeof (T_chinese_input));
+  	}
+    else
+    {
+	    TRACE_EVENT ("chinese_input_destroy() - data already destroyed") ;
+    }
+}
+
+
+/*******************************************************************************
+
+ $Function:    	chinese_input
+
+ $Description:	
+
+ $Returns:		void
+
+ $Arguments:	win, window handle event, value, parameter
+
+*******************************************************************************/
+void chinese_input_exec (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+    T_MFW_WIN  		* win_data   	= ((T_MFW_HDR *)win)->data;
+    T_chinese_input	* data       	= (T_chinese_input *)win_data->user;
+    T_CHINESE_DATA	* chinese_data	= (T_CHINESE_DATA *)parameter;
+#ifdef NEW_EDITOR	/* SPR#1428 - SH - New Editor changes */
+	T_AUI_EDIT_CB	Callback		= data->Callback_Data.Callback;
+#else /* NEW_EDITOR */
+  	T_EDIT_CB 	Callback   = data->Callback_Data.Callback;
+ #endif /* NEW_EDITOR */
+  	T_MFW_HND       parent_win = data->parent_win;
+	USHORT          Identifier = data->Callback_Data.Identifier;
+
+	TRACE_EVENT ("chinese_input_exec()");
+    switch (event)
+    {	
+        case CHINESE_INPUT_INIT:
+        	data->Callback_Data = *chinese_data;
+        	TEXT_BUFFER_EDIT_SIZE = data->Callback_Data.EditorSize;
+      	    /* Initialize dialog */
+      	    /* Create timer and keyboard handler */
+            data->input_kbd = kbd_create (win, KEY_ALL, (T_MFW_CB)chinese_input_kbd_cb);
+	        /* Initialize all data structure and veriables to zero */
+	        memset(&data->Ime, 0, sizeof(data->Ime));
+	        memset(&data->GetParam, 0, sizeof(data->Ime));
+	        memset(&data->wcCandidates, 0, sizeof(data->wcCandidates));
+	        memset(&data->HighlightedCandidate, 0, sizeof(data->HighlightedCandidate));
+	        memset(&data->CursorPosition, 0, sizeof(data->CursorPosition));
+	        memset(&data->DisplayElementBuffer, 0,sizeof(data->DisplayElementBuffer));
+			data->StartOfDisplayIndex	= 0;
+            data->NumberOfKeyPress		= 0;
+            data->PerviousKeyPress		= -1;
+
+            /* Now intitialize the Zi8 Core Engine */
+            Zi8Initialize();
+            /* Now initialize the IME */
+            data->wszTextBuffer = (ZI8WCHAR*)&chinese_data->TextString[2]; //ignore first char (Unicode marker)
+            IMEInitialize(&data->Ime, &data->GetParam, data->wszTextBuffer, TEXT_BUFFER_EDIT_SIZE,
+                       sizeof(data->wszTextBuffer), data->wcCandidates, data->wszElementBuffer, data->DisplayElementBuffer);
+            /* Store any other data */
+    #ifdef LSCREEN /* SPR 1319 create an mfw editor to display editor content*/
+
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+			AUI_edit_SetAttr(&data->editor_attr, 0, COLOUR_EDITOR, EDITOR_FONT, ED_MODE_ALPHA, ED_CURSOR_BAR, ATB_DCS_UNICODE, (UBYTE *)chinese_data->TextString, TEXT_BUFFER_EDIT_SIZE+1); 
+			data->editor_attr.win_size.sy = Mmi_layout_line_height()*8;/*Don't want to cover whole screen*/
+			data->editor = ATB_edit_Create(&data->editor_attr, 0);
+			ATB_edit_Init(data->editor);
+			ATB_edit_Char(data->editor, ctrlBottom, TRUE);
+#else /* NEW_EDITOR */
+    		editor_attr_init(&data->editor_attr, 0, edtCurBar1, NULL, chinese_data->TextString,TEXT_BUFFER_EDIT_SIZE*2+2 , COLOUR_EDITOR );
+            data->editor_attr.win.sy = Mmi_layout_line_height()*8;/*Don't want to cover whole screen*/
+    		data->editor =edtCreate(data->input_win, &data->editor_attr, 0, 0);
+    		edtChar(data->editor, ecBottom);
+    		edtUnhide (data->editor);
+#endif /* NEW_EDITOR */
+    		editor_pointer = data->editor;
+    #endif
+            win_show (win);
+            break;
+
+            /*MC SPR 1752  same as E_ED_DESTROY*/
+        case CHINESE_INPUT_DESTROY:
+        	if (data)
+	        {
+	        		chinese_input_destroy(win);
+	        }
+        	break;
+
+        /*MC SPR 1752, new event*/
+        case CHINESE_INPUT_DEINIT:
+        {/* on DEINIT => selfdestroy; sendevent <value> */
+        	int i;
+
+  	
+			//GW-SPR-#1068-After the callback, ensure 'data' is up-to-date	
+		     if (Callback)
+		      {	
+	    	    	(Callback) (parent_win, Identifier, value);
+	    	    	//Callback may have freed data - if so reinit pointer
+		    		data = (T_chinese_input *)win_data->user;
+		      }
+
+	        if (data)
+	        {
+		        if (data->Callback_Data.DestroyEditor == TRUE)
+		        {	
+	        		chinese_input_destroy(win);
+		        }
+	        }
+    	}
+        	break;
+       case ADD_SYMBOL:/*adding a symbol to chinese editor from symbol selection screen*/
+       		if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)
+       		{	
+#ifndef LSCREEN
+
+       			int i=0;
+       			int j=0;
+       			
+	       		if(data->Ime.TextCursor < data->Ime.TextBufferCount) /* locate the text cursor position for correct character insertion */
+		    	{/* shift and move characters to make room to insert the selected character */
+		    		for (i=data->Ime.TextCursor; i<data->Ime.TextBufferCount; i++) 
+		    		{
+		    			data->Ime.pTextBuffer[data->Ime.TextBufferCount - j]=data->Ime.pTextBuffer[data->Ime.TextBufferCount - j - 1];
+		    			j++;
+		    		}
+		    	}
+		    	/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+				/* Now, value we get is already unicode */
+				data->Ime.pTextBuffer[data->Ime.TextCursor++]= (ZI8WCHAR)((USHORT)value);
+#else
+       			/*Shift char up into Unicode from ASCII*/
+       			data->Ime.pTextBuffer[data->Ime.TextCursor++]= (ZI8WCHAR)(SymbolChar << 8);
+#endif
+       			data->Ime.TextBufferCount++;/*increase char count by one*/
+#else			/*SPR 1319*/
+
+				/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+				ATB_edit_Char(data->editor, (USHORT)value, TRUE);
+#else /* NEW_EDITOR */
+				edtChar(data->editor, SymbolChar<<8);/*pop the symbol in the editor*/
+#endif /* NEW_EDITOR */
+				data->Ime.TextBufferCount++;/*increase char count by one*/
+#endif /* COLOURDISPLAY */
+       		}
+       		win_show(win);
+       		break;
+       	case LATIN_INPUT:/*return from Latin editor*/
+       		/*update size of buffer*/
+       		data->Ime.TextBufferCount = Uni_strlen(data->Ime.pTextBuffer);
+       		data->Ime.TextCursor = data->Ime.TextBufferCount;/*move cursor to end*/
+#ifdef LSCREEN
+#ifdef NEW_EDITOR
+			resources_setColour(COLOUR_EDITOR);
+       		ATB_edit_Refresh(data->editor);
+			ATB_edit_MoveCursor(data->editor, ctrlBottom, TRUE);
+#endif
+#endif
+       		//win_show(data->input_win);
+       		break;
+    }
+}
+
+
+/*******************************************************************************
+
+ $Function:    	chinese_input_win_cb
+
+ $Description:	
+ 
+ $Returns:		void
+
+ $Arguments:	window handle event, win
+*******************************************************************************/
+static int chinese_input_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
+{
+    T_chinese_input	* data = (T_chinese_input *)win->user;
+	int i = 0;
+	int j = 0;
+	PZI8WCHAR	Temp_ptr;
+    TRACE_EVENT ("chinese_input_win_cb()");
+
+    if(data EQ 0)
+        return 1;
+    switch (event)
+    {
+        case E_WIN_VISIBLE:
+   	        if (win->flags & E_WIN_VISIBLE)
+   	        {
+   	        	/*
+   	        	** Initialise the colours for the editor
+   	        	*/
+   	        	resources_setColour(COLOUR_EDITOR);
+
+   	            /* Print the information dialog */
+   	            /* Clear Screen */
+   	            dspl_ClearAll();
+   	            switch (data->Ime.InputScreenType)
+   	            {
+   	                case TEXT_DISPLAY_SCREEN:
+   	                {
+
+   	                	/* This section of the code was written to display the data stored in the text buffer. The text cursor position */
+   	                	/* was also taken into consideration to display the correct portion of text during editing (when data stored in */
+   	                	/* the text buffer is more than two line display.   */
+						ZI8WCHAR TempArray[CANDIDATES_PER_GROUP*2]; //maximum no of chars possible in a line
+						ZI8WCHAR TempArray2[CANDIDATES_PER_GROUP+1];
+   	                	int i;
+   	                	int space_counter;
+   	                	
+   	                	UBYTE first_line= 0; //no of chars in first line(set to minimum)
+   	                	UBYTE second_line=0; //no of chars in second line
+   	         
+                    	dspl_BitBlt(75,0,8,8,0,(char*)TextIconeZiTextSmall,0); 
+                    
+   	                	memset(TempArray, 0, CANDIDATES_PER_GROUP*2);
+   	                	if(data->Ime.TextBufferCount == 0) //If text buffer is empty
+   	                	{
+   	                		displaySoftKeys(data->Callback_Data.LeftSoftKey,TxtSoftBack); 	/* Softkey display*/
+   	                	}
+   	                	else 
+
+ #ifndef LSCREEN
+ 						{
+ 						if(data->Ime.TextBufferCount <= (CANDIDATES_PER_GROUP * 2)) // data in text buffer is within 2 lines
+   	                	{	
+   	                		
+							for(i=0; i<CANDIDATES_PER_GROUP; i++)
+								TempArray[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i];
+							TempArray[CANDIDATES_PER_GROUP] = 0x0000;
+							
+   	                		dspl_TextOut(1,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)TempArray);
+   	                		if(data->Ime.TextBufferCount > CANDIDATES_PER_GROUP)
+   	                		{
+   	                			for(i=0; i<CANDIDATES_PER_GROUP; i++)
+								TempArray2[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i+CANDIDATES_PER_GROUP];
+   	                			TempArray2[CANDIDATES_PER_GROUP] = 0x0000;
+								dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char *)TempArray2);
+   	                		}
+							j = (data->Ime.TextCursor / CANDIDATES_PER_GROUP) + 1;
+							TextCursorDisplayContorl(&data->Ime, data->CursorPosition, j);
+							displaySoftKeys(data->Callback_Data.LeftSoftKey,TxtDelete); 	/* Softkey display*/
+   	                	}
+   	                	else // data in text buffer is more than 14 characters. 
+   	                	{
+							if(data->Ime.TextCursor == data->StartOfDisplayIndex)
+							{
+								for(i=0; i<CANDIDATES_PER_GROUP; i++)
+									TempArray[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i];
+								TempArray[CANDIDATES_PER_GROUP] = 0x0000;
+   	                			dspl_TextOut(1,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char *)TempArray);
+   	                			for(i=0; i<CANDIDATES_PER_GROUP; i++)
+   	                				TempArray2[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i +CANDIDATES_PER_GROUP];
+   	                			TempArray2[CANDIDATES_PER_GROUP] = 0x0000;
+   	                			dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char *)TempArray2);
+								TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 1); 
+							}
+							else if(data->Ime.TextCursor > data->StartOfDisplayIndex)
+							{
+   	                			while(data->Ime.TextCursor - data->StartOfDisplayIndex >= CANDIDATES_PER_GROUP*2)
+   	                			{
+   	                				data->StartOfDisplayIndex = data->StartOfDisplayIndex + CANDIDATES_PER_GROUP;
+   	                			}
+   	                			for(i=0; i<CANDIDATES_PER_GROUP; i++)
+   	                				TempArray[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i];
+   	                			TempArray[CANDIDATES_PER_GROUP] = 0x0000;
+   	                			dspl_TextOut(1,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char *)TempArray);
+   	                			
+   	                			for(i=0; i<CANDIDATES_PER_GROUP; i++)
+   	                				TempArray2[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i +CANDIDATES_PER_GROUP];
+   	                			TempArray2[CANDIDATES_PER_GROUP] = 0x0000;
+   	                			dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char *)TempArray2);
+   	                			
+   	                			if((data->Ime.TextCursor - data->StartOfDisplayIndex) < CANDIDATES_PER_GROUP)
+									j = 1;
+								else if((data->Ime.TextCursor - data->StartOfDisplayIndex) < CANDIDATES_PER_GROUP * 2)
+									j = 2;
+								TextCursorDisplayContorl(&data->Ime, data->CursorPosition, j);
+							}
+							else if(data->Ime.TextCursor < data->StartOfDisplayIndex && data->StartOfDisplayIndex != 0)
+							{
+								data->StartOfDisplayIndex = data->StartOfDisplayIndex - CANDIDATES_PER_GROUP;
+								for(i=0; i<CANDIDATES_PER_GROUP; i++)
+   	                				TempArray[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i ];
+								TempArray[CANDIDATES_PER_GROUP] = 0x0000;
+   	                			dspl_TextOut(1,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char *)TempArray);
+   	                			for(i=0; i<CANDIDATES_PER_GROUP; i++)
+   	                				TempArray2[i]= data->wszTextBuffer[data->StartOfDisplayIndex+ i +CANDIDATES_PER_GROUP];
+   	                			TempArray2[CANDIDATES_PER_GROUP] = 0x0000;
+   	                			dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char *)TempArray2);
+   	                			if((data->Ime.TextCursor - data->StartOfDisplayIndex) < CANDIDATES_PER_GROUP)
+									j = 1;
+								else if((data->Ime.TextCursor - data->StartOfDisplayIndex) < CANDIDATES_PER_GROUP * 2)
+									j = 2;
+								TextCursorDisplayContorl(&data->Ime, data->CursorPosition, j);
+							}	
+   	                	
+
+							displaySoftKeys(data->Callback_Data.LeftSoftKey,TxtDelete); 	/* Softkey display*/
+   	                }
+ 	}
+ #else					/*SPR 1319, show editor and softkeys*/
+ /* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+						ATB_edit_Unhide(data->editor);
+						ATB_edit_Show(data->editor);
+#else /* NEW_EDITOR */
+ 						edtUnhide(data->editor);
+						edtShow(data->editor);
+#endif /* NEW_EDITOR */
+ 						displaySoftKeys(data->Callback_Data.LeftSoftKey,TxtDelete); 
+#endif
+   	                	}
+   	                    break;
+                    case STROKE_INPUT_SCREEN:
+#ifndef LSCREEN
+       			        /* Display the correct portion composed text stored in wszTextBuffer. If the text cursor is not pointing at */
+       			        /* the end of the text buffer, the display content is then adjusted to display the correct portion of the   */
+       			        /* text buffer.																				  */
+       			        if(data->Ime.TextBufferCount <=CANDIDATES_PER_GROUP)  //check text buffer count
+   	                	{
+   	                		if(data->Ime.TextBufferCount == data->Ime.TextCursor)
+   	                		{
+			    				dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                		}
+   	                		else
+   	                		{
+   	                			dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                			TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 0);
+   	                		}
+       			        }
+       			        else //when data->Ime.TextBufferCount > CANDIDATES_PER_GROUP
+       			        {
+							if(data->Ime.TextBufferCount == data->Ime.TextCursor) 
+	   	                	{
+								Temp_ptr = data->wszTextBuffer;
+	   	                		Temp_ptr = Temp_ptr + data->Ime.TextBufferCount - CANDIDATES_PER_GROUP;
+	   	                		dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char *)Temp_ptr);
+	   	                	}
+							else if(data->Ime.TextCursor < CANDIDATES_PER_GROUP)
+							{
+								dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                			TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 0);
+							}
+							else
+							{
+	   	                		Temp_ptr = &data->wszTextBuffer[data->Ime.TextCursor] - CANDIDATES_PER_GROUP + 1;
+	   	                		dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char *)Temp_ptr);
+	   	                		dspl_TextOut(73,0,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)data->CursorPosition);
+	   	                	}
+       			        }
+#else					/*SPR 1319, show editor*/
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+						ATB_edit_Unhide(data->editor);
+						ATB_edit_Show(data->editor);
+#else /* NEW_EDITOR */
+ 						edtUnhide(data->editor);
+						edtShow(data->editor);
+#endif /* NEW_EDITOR */
+#endif
+#ifndef LSCREEN
+			    		dspl_TextOut(0,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)StrokePrompt);/* Display input prompt */
+#else
+						/*SPR 1319 show stroke prompt*/
+						dspl_TextOut(0,SCREEN_SIZE_Y-Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)StrokePrompt);/* Display input prompt */
+#endif
+			    		/* Display input sequence for stroke */
+			    		i = Uni_strlen(data->DisplayElementBuffer);
+			    		if( i <= 4)
+			    		{
+#ifndef LSCREEN
+			    			dspl_TextOut(CHI_FONT_WIDTH*3,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char*)data->DisplayElementBuffer);//data->wszElementBuffer);
+#else
+						/*mc SPR1319*/
+							dspl_TextOut(CHI_FONT_WIDTH*3,SCREEN_SIZE_Y- Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)data->DisplayElementBuffer);//data->wszElementBuffer);
+#endif
+			    		}
+			    		else
+			    		{
+			    			Temp_ptr = data->DisplayElementBuffer;
+			    			Temp_ptr = Temp_ptr + i - 4;
+#ifndef LSCREEN
+			    			dspl_TextOut(CHI_FONT_WIDTH*3,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)Temp_ptr);//data->wszElementBuffer);
+#else
+							/*mc SPR1319*/
+							dspl_TextOut(CHI_FONT_WIDTH*3,SCREEN_SIZE_Y-Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)Temp_ptr);//data->wszElementBuffer);
+#endif
+			    		}
+
+#ifndef LSCREEN
+			    		/* Display candidate characters returned from eZiText */
+			    		dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char*)data->wcCandidates);
+#else
+						/*mc SPR1319*/
+						dspl_TextOut(1,SCREEN_SIZE_Y-Mmi_layout_line(3),DSPL_TXTATTR_UNICODE,(char*)data->wcCandidates);
+#endif
+
+			    		/* Highlight the candidate character pointed by Ime.CandidateCursor */
+			    		CandidateHighlightDisplayContorl(&data->Ime, data->HighlightedCandidate);
+			    		if (Uni_strlen(data->DisplayElementBuffer) > 0)
+			    			displaySoftKeys(TxtSoftSelect,TxtDelete);	/* Softkey display*/
+			    		else
+			    			displaySoftKeys(TxtSoftSelect,TxtSoftOK);	/* Softkey display*/
+			    	
+       					break;
+       				case PINYIN_INPUT_SCREEN:
+       					/* Display the correct portion composed text stored in wszTextBuffer. If the text cursor is not pointing at */
+       			        /* the end of the text buffer, the display content is then adjusted to display the correct portion of the   */
+       			        /* text buffer.	
+       			      	*/
+#ifndef LSCREEN
+       			        if(data->Ime.TextBufferCount <=CANDIDATES_PER_GROUP)  //check text buffer count
+   	                	{
+   	                		if(data->Ime.TextBufferCount == data->Ime.TextCursor)
+   	                		{
+			    				dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                		}
+   	                		else
+   	                		{
+   	                			dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                			TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 0);
+   	                		}
+       			        }
+       			        else //when data->Ime.TextBufferCount > CANDIDATES_PER_GROUP
+       			        {
+							if(data->Ime.TextBufferCount == data->Ime.TextCursor) 
+	   	                	{
+								Temp_ptr = data->wszTextBuffer;
+	   	                		Temp_ptr = Temp_ptr + data->Ime.TextBufferCount - CANDIDATES_PER_GROUP;
+	   	                		dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char *)Temp_ptr);
+	   	                	}
+							else if(data->Ime.TextCursor < CANDIDATES_PER_GROUP)
+							{
+								dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                			TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 0);
+							}
+							else
+							{
+	   	                		Temp_ptr = &data->wszTextBuffer[data->Ime.TextCursor] - CANDIDATES_PER_GROUP + 1;
+	   	                		dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char *)Temp_ptr);
+	   	                		dspl_TextOut(73,0,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)data->CursorPosition);
+	   	                	}
+       			        }
+#else
+						/*mc SPR1319*/
+						/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+						ATB_edit_Unhide(data->editor);
+						ATB_edit_Show(data->editor);
+#else /* NEW_EDITOR */
+ 						edtUnhide(data->editor);
+						edtShow(data->editor);
+#endif /* NEW_EDITOR */
+#endif
+#ifndef LSCREEN
+       					dspl_TextOut(0,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)PinYinPrompt);/* Display input prompt */
+#else
+						/*mc SPR1319*/
+						dspl_TextOut(0,SCREEN_SIZE_Y - Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)PinYinPrompt);/* Display input prompt */
+#endif
+       					/* Display input sequence for Pin-yin input */
+			    		i = Uni_strlen(data->DisplayElementBuffer);
+			    		if( i <= 4)
+			    		{
+#ifndef LSCREEN
+			    			dspl_TextOut(CHI_FONT_WIDTH*3,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)data->DisplayElementBuffer);//data->wszElementBuffer);
+#else
+							/*mc SPR1319*/
+			    			dspl_TextOut(CHI_FONT_WIDTH*3,SCREEN_SIZE_Y-Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)data->DisplayElementBuffer);//data->wszElementBuffer);
+#endif
+			    		}
+			    		else
+			    		{
+			    			Temp_ptr = data->DisplayElementBuffer;
+			    			Temp_ptr = Temp_ptr + i - 4;
+#ifndef LSCREEN
+			    			dspl_TextOut(CHI_FONT_WIDTH*3,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)Temp_ptr);//data->wszElementBuffer);
+#else
+							/*mc SPR1319*/
+							dspl_TextOut(CHI_FONT_WIDTH*3,SCREEN_SIZE_Y -Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)Temp_ptr);//data->wszElementBuffer);
+#endif
+			    		}
+			    		/* Display candidate characters returned from eZiText */
+#ifndef LSCREEN
+			    		dspl_TextOut(1,Mmi_layout_second_line(),DSPL_TXTATTR_UNICODE,(char*)data->wcCandidates);
+#else
+						/*mc SPR1319*/
+						dspl_TextOut(1,SCREEN_SIZE_Y-Mmi_layout_line(3),DSPL_TXTATTR_UNICODE,(char*)data->wcCandidates);
+#endif
+			    		/* Highlight the candidate character pointed by Ime.CandidateCursor */
+			    		CandidateHighlightDisplayContorl(&data->Ime, data->HighlightedCandidate);
+			    		/*MC should have "Delete" softkey when entering pinyin letters*/
+			    		if (Uni_strlen(data->DisplayElementBuffer) > 0)
+			    			displaySoftKeys(TxtSoftSelect,TxtDelete);	/* Softkey display*/
+			    		else
+			    			displaySoftKeys(TxtSoftSelect,TxtSoftOK);	/* Softkey display*/
+       					break;
+       				case WORD_ASSOCIATION_SCREEN:
+       					/* Display the correct portion composed text stored in wszTextBuffer. If the text cursor is not pointing at */
+       			        /* the end of the text buffer, the display content is then adjusted to display the correct portion of the   */
+       			        /* text buffer.	
+       			        */
+#ifndef LSCREEN
+       			        if(data->Ime.TextBufferCount <=CANDIDATES_PER_GROUP)  //check text buffer count
+   	                	{
+   	                		if(data->Ime.TextBufferCount == data->Ime.TextCursor)
+   	                		{
+			    				dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                		}
+   	                		else
+   	                		{
+   	                			dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                			TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 0);
+   	                		}
+       			        }
+       			        else //when data->Ime.TextBufferCount > CANDIDATES_PER_GROUP
+       			        {
+							if(data->Ime.TextBufferCount == data->Ime.TextCursor) 
+	   	                	{
+								Temp_ptr = data->wszTextBuffer;
+	   	                		Temp_ptr = Temp_ptr + data->Ime.TextBufferCount - CANDIDATES_PER_GROUP;
+	   	                		dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char *)Temp_ptr);
+	   	                	}
+							else if(data->Ime.TextCursor < CANDIDATES_PER_GROUP)
+							{
+								dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char*)data->wszTextBuffer);
+   	                			TextCursorDisplayContorl(&data->Ime, data->CursorPosition, 0);
+							}
+							else
+							{
+	   	                		Temp_ptr = &data->wszTextBuffer[data->Ime.TextCursor] - CANDIDATES_PER_GROUP + 1;
+	   	                		dspl_TextOut(1,0,DSPL_TXTATTR_UNICODE,(char *)Temp_ptr);
+	   	                		dspl_TextOut(73,0,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)data->CursorPosition);
+	   	                	}
+       			        }
+#else
+						/*mc SPR1319*/
+						/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+						ATB_edit_Unhide(data->editor);
+						ATB_edit_Show(data->editor);
+#else /* NEW_EDITOR */
+ 						edtUnhide(data->editor);
+						edtShow(data->editor);
+#endif /* NEW_EDITOR */
+#endif
+       					if(data->Ime.EditorMode == STROKE_INPUT_MODE)
+       					{
+#ifndef LSCREEN
+			    			dspl_TextOut(0,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)StrokePrompt);	/* Display input prompt */
+			    			/* Display input sequence for stroke */
+#else
+							/*mc SPR1319*/
+							dspl_TextOut(0,SCREEN_SIZE_Y -Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)StrokePrompt);	/* Display input prompt */
+			    			/* Display input sequence for stroke */
+
+#endif
+       					}
+       					else if(data->Ime.EditorMode == PINYIN_INPUT_MODE)
+       					{	
+#ifndef LSCREEN
+       						dspl_TextOut(0,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE,(char*)PinYinPrompt);	/* Display input prompt */
+       						/* Display input sequence for Pin-yin input */
+#else
+		      				dspl_TextOut(0,SCREEN_SIZE_Y-Mmi_layout_line(4),DSPL_TXTATTR_UNICODE,(char*)PinYinPrompt);	/* Display input prompt */
+       						/* Display input sequence for Pin-yin input */
+#endif
+       					}
+#ifndef LSCREEN
+			    		/* Display candidate charaters returned from eZiText */
+			    		dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE,(char*)data->wcCandidates);
+#else
+
+						dspl_TextOut(1,SCREEN_SIZE_Y-Mmi_layout_line(3),DSPL_TXTATTR_UNICODE,(char*)data->wcCandidates);
+#endif
+			    		/* Highlight the candidate character pointed by Ime.CandidateCursor */
+						CandidateHighlightDisplayContorl(&data->Ime, data->HighlightedCandidate);
+
+						displaySoftKeys(TxtSoftSelect,TxtSoftOK);	/* Softkey display*/
+       					break;
+	    			default:
+	       				break;
+   	            	}
+			}
+   	        
+	    	break;
+		default:
+	   	return 0;
+    	}
+   
+    return 1;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	chinese_input_kbd_cb
+
+ $Description:	Keyboard event handler
+
+ $Returns:		status int
+
+ $Arguments:	window handle event, keyboard control block
+
+*******************************************************************************/
+
+static int chinese_input_kbd_cb (T_MFW_EVENT event, T_MFW_KBD *keyboard)
+{
+  	T_MFW_HND       	win  		= mfw_parent (mfw_header());
+  	T_MFW_WIN    	*	win_data	= ((T_MFW_HDR *)win)->data;
+  	T_chinese_input	* 	data 		= (T_chinese_input *)win_data->user;
+  	T_MFW_HND       	parent_win 	= data->parent_win;
+  	USHORT          	Identifier 	= data->Identifier;
+  	int					temp = 0;
+  //  	void (* Callback)() = data->Callback;
+
+  	TRACE_EVENT("chinese_input_kbd_cb");
+/***************************Go-lite Optimization changes Start***********************/
+//Aug 16, 2004    REF: CRR 24323   Deepa M.D
+TRACE_EVENT_P6("Counters %d:%d:%d:%d:%d:%d",  Counter[0],  Counter[1],  Counter[2],  Counter[3],
+	 Counter[4],  Counter[5]);
+/***************************Go-lite Optimization changes end***********************/
+  	switch (keyboard->code)
+  	{
+    	case KCD_LEFT:
+    		switch(data->Ime.EditorMode)
+    		{
+    			case STROKE_INPUT_MODE:
+		    		switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				//access to the option list.
+						SEND_EVENT(win, CHINESE_INPUT_DEINIT/*SPR 1752*/, INFO_KCD_LEFT, NULL);
+		       				break;
+		       			case STROKE_INPUT_SCREEN:
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				IMESelectCandidate(&data->Ime, data->wszElementBuffer);
+		       				data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+			    		default:
+			       			break;
+		    		}
+		    		winShow(win);
+		    		break;
+		    	
+		    	case PINYIN_INPUT_MODE:
+		    		switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				SEND_EVENT(win, CHINESE_INPUT_DEINIT/*SPR 1752*/, INFO_KCD_LEFT, NULL);
+		    				//access to the option list.
+		       				break;
+		       			case PINYIN_INPUT_SCREEN:
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+		       				IMESelectCandidate(&data->Ime, data->wszElementBuffer);
+		       				data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+
+		       				break;
+			    		default:
+			       			break;
+		    		}
+		    		winShow(win);
+		    	default:
+			       	break;
+    		}
+
+       		break;
+	    case KCD_RIGHT:
+	    	switch(data->Ime.EditorMode)
+    		{
+    			case STROKE_INPUT_MODE:
+			    	switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				if(data->Ime.TextBufferCount == 0)
+							{	/* When there is no stored data, return back to the menu*/
+								//GW-SPR-#1068-Destroy using event - execute callback of the function that created the editor	
+								SEND_EVENT(win, CHINESE_INPUT_DEINIT/*SPR 1752*/, INFO_KCD_RIGHT, NULL);
+							}
+		    				else
+		    				{
+		    					IMEClear(&data->Ime, data->wszElementBuffer);
+		    				}
+		       				break;
+		       			case STROKE_INPUT_SCREEN:
+		       				IMEClear(&data->Ime, data->wszElementBuffer);
+		       				data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				data->Ime.InputScreenType = TEXT_DISPLAY_SCREEN;
+		       				break;
+			    		default:
+			       			break;
+			  		}
+			    	winShow(win);
+			    	break;
+		    	case PINYIN_INPUT_MODE:
+		    		switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				if(data->Ime.TextBufferCount == 0)
+							{	/* When there is no stored data, return back to the menu*/
+								//GW-SPR-#1068-Destroy using event - execute callback of the function that created the editor	
+								SEND_EVENT(win, CHINESE_INPUT_DEINIT/*SPR 1752*/, INFO_KCD_RIGHT, NULL);
+							}
+		    				else
+		    				{
+		    					IMEClear(&data->Ime, data->wszElementBuffer);
+		    					data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		    				}
+		       				break;
+		       			case PINYIN_INPUT_SCREEN:
+		       				memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+		       				IMEClear(&data->Ime, data->wszElementBuffer);
+		       				data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				data->Ime.InputScreenType = TEXT_DISPLAY_SCREEN;
+		       				break;
+			    		default:
+			       			break;
+		    		}
+		    		winShow(win);
+		    		break;
+	
+		    	default:
+			       	break;
+    		}	
+	       	break;
+	    case KCD_HUP:
+			//GW-SPR-#1068-Destroy using event - execute callback of the function that created the editor	
+			SEND_EVENT(win, CHINESE_INPUT_DEINIT/*SPR 1752*/, INFO_KCD_HUP, NULL);
+	       	break;
+	    case KCD_MNUUP:
+	    	switch(data->Ime.EditorMode)
+    		{
+    			case STROKE_INPUT_MODE:
+			    	switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				//update the text cursor
+		    				if(data->Ime.TextCursor > 0 && data->Ime.TextCursor <= data->Ime.TextBufferCount)
+		    				{
+		    					data->CursorPosition[0] = data->wszTextBuffer[data->Ime.TextCursor - 1];
+		    					data->Ime.TextCursor--;
+		    				}
+		    #ifdef LSCREEN /*SPR 1319 move left along editor*/
+		    /* SPR#1428 - SH - New Editor changes */
+		 	#ifdef NEW_EDITOR
+		 					ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE);
+		 	#else /* NEW_EDITOR */
+		    				edtChar(data->editor, ecLeft);
+		    #endif /* NEW_EDITOR */
+		    #endif
+		    				break;
+		       			case STROKE_INPUT_SCREEN:
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				IMECursorLeft(&data->Ime);
+							data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+			    		default:
+			       			break;
+			  		}
+			    	winShow(win);
+			        break;
+		
+			  	case PINYIN_INPUT_MODE:
+			  		switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				//update the text cursor
+		    				if(data->Ime.TextCursor > 0 && data->Ime.TextCursor <= data->Ime.TextBufferCount)
+		    				{
+		    					data->CursorPosition[0] = data->wszTextBuffer[data->Ime.TextCursor - 1];
+		    					data->Ime.TextCursor--;
+	   
+		    				}
+		#ifdef LSCREEN/*SPR 1319 move left along editor*/
+		/* SPR#1428 - SH - New Editor changes */
+		#ifdef NEW_EDITOR
+							ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE);
+		#else /* NEW_EDITOR */
+		    				edtCharUnicode(data->editor, ecLeft);
+		#endif /* NEW_EDITOR */
+		#endif
+		       				break;
+		       			case PINYIN_INPUT_SCREEN:
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+		       				IMECursorLeft(&data->Ime);
+							data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+			    		default:
+			       			break;
+		    		}
+			  		winShow(win);
+		    		break;
+		    	default:
+			       	break;
+    		}	
+	       	break;
+	    case KCD_MNUDOWN:
+	    	switch(data->Ime.EditorMode)
+    		{
+    			case STROKE_INPUT_MODE:
+					switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				//update the text cursor 
+		    				if(data->Ime.TextCursor < data->Ime.TextBufferCount)
+		    				{
+		    					data->Ime.TextCursor++;
+		    					data->CursorPosition[0] = data->wszTextBuffer[data->Ime.TextCursor];
+		    					
+		    				}
+#ifdef LSCREEN/*SPR 1319 move right along editor*/
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+							ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);
+#else /* NEW_EDITOR */
+		    				edtCharUnicode(data->editor, ecRight);
+#endif /* NEW_EDITOR */
+#endif
+		    				break;
+		       			case STROKE_INPUT_SCREEN:
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				IMECursorRight(&data->Ime);
+			    			data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+			    		default:
+			       			break;
+			  		}
+			    	winShow(win);
+			        break;
+			  
+	        	case PINYIN_INPUT_MODE:
+	        		switch (data->Ime.InputScreenType)
+					{
+		    			case TEXT_DISPLAY_SCREEN:
+		    				//update the text cursor 
+		    				if(data->Ime.TextCursor < data->Ime.TextBufferCount)
+		    				{
+		    					data->Ime.TextCursor++;
+		    					data->CursorPosition[0] = data->wszTextBuffer[data->Ime.TextCursor];		    					
+		    				}
+#ifdef LSCREEN	/*SPR 1319 move right  along editor*/
+/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+							ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);
+#else /* NEW_EDITOR */
+		    				edtCharUnicode(data->editor, ecRight);
+#endif /* NEW_EDITOR */
+#endif
+		       				break;
+		       			case PINYIN_INPUT_SCREEN:
+		       			case WORD_ASSOCIATION_SCREEN:
+		       				memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+		       				IMECursorRight(&data->Ime);
+			    			data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+		       				break;
+			    		default:
+			       			break;
+		    		}
+	        		winShow(win);
+		    		break;
+		    	default:
+			       	break;
+    		}	
+	       	break;
+	    case KCD_CALL:
+			break;
+		case KCD_0:
+			if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)/*MC*/
+			{
+				switch(data->Ime.EditorMode)
+	    		{
+	    			case STROKE_INPUT_MODE:
+		        		data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
+						IMEMore(&data->Ime);
+						data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+						winShow(win);
+			    		break;
+			    	case PINYIN_INPUT_MODE:
+			    		memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+			    		data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;
+			    		IMEMore(&data->Ime);
+						data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+						winShow(win);
+			    		break;
+			 
+			    	default:
+				       	break;
+	    		}
+			}
+	       	break;
+		case KCD_8:
+			if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)/*MC*/
+			{
+				switch(data->Ime.EditorMode)
+	    		{
+	    			case STROKE_INPUT_MODE:
+		        		data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
+						IMEMore(&data->Ime);
+						data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+						winShow(win);
+			    		break;
+			    	case PINYIN_INPUT_MODE:
+						data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;
+						/* The unclear of eZiText document, it is assumed that multi-key press may required to get to the required letter */
+						/* To do that a ZiPinYinKeyMap array is defined in ChineseInput.h header file.                                 */
+						/* When number of keypress from the user is given from the keypad hadler, the key press count can then be    */
+						/* used to work out the relevent code to insert into the element buffer for eZiText search. The variable          */
+						/* data->NumberOfKeyPress is decleared to store the key press count. 								  */
+
+						//temp = data->NumberOfKeyPress % ZiPinYinKeyMap[(keyboard->code)-1][5];
+						//IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiPinYinKeyMap[(keyboard->code)-1][temp - 1]);
+
+						/* due to not able to receive key press count, it is assume the first letter assign to the key is selected when key */
+						/* is pressed.	*/
+						/*MC, multitap handling*/
+						/*if time out or new key pressed*/
+						/***************************Go-lite Optimization changes Start***********************/
+						//Aug 16, 2004    REF: CRR 24323   Deepa M.D
+						TRACE_EVENT_P1("Keypad Counter : %d",  Counter[keyboard->code]);
+						/***************************Go-lite Optimization changes end***********************/
+						if ( Counter[keyboard->code] == 0)
+						{	tim_stop(data->KeyPad_Timer_Handle);/*stop timer*/
+							memset( Counter, 0, sizeof(char)*KCD_STAR);/*reset all key counters*/
+							IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiPinYinKeyMap[(keyboard->code)-1][0]);
+							 Counter[keyboard->code]++; //increment counter
+							tim_start(data->KeyPad_Timer_Handle);/*restart timer*/
+						}
+						else /*if counter is less than MAX for that key*/
+						{	ZI8WCHAR last_element; 
+
+							if ( Counter[keyboard->code] <ZiPinYinKeyMap[(keyboard->code)-1][5])
+							{	tim_stop(data->KeyPad_Timer_Handle);/*stop timer*/
+								//if last element is the previous char for this key
+								last_element = data->Ime.pGetParam->pElements[data->Ime.pGetParam->ElementCount -1];
+								//should put in check
+								if (last_element== ZiPinYinKeyMap[(keyboard->code)-1][ Counter[keyboard->code]-1])
+								{	//MC e.g. if we're trying to enter 'I' and the last char was 'H'
+									IMEClear(&data->Ime, data->Ime.pGetParam->pElements);/*remove last char from elements*/
+									data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;/*this prevents display problems*/
+								}
+								/*so we can add the next char for this key*/
+								IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiPinYinKeyMap[(keyboard->code)-1][ Counter[keyboard->code]]);
+								 Counter[keyboard->code]++; //increment counter
+								tim_start(data->KeyPad_Timer_Handle);/*restart timer*/
+							}
+						}
+						
+						data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+						winShow(win);
+			    		break;
+			    	default:
+				       	break;
+	    		}
+			}
+	       	break;
+		case KCD_1:
+		case KCD_2:
+		case KCD_3:
+		case KCD_4:
+		case KCD_5:
+		case KCD_6:
+		case KCD_7:
+		case KCD_9:	
+			switch(data->Ime.EditorMode)
+    		{
+    			case STROKE_INPUT_MODE:
+    				if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)/*MC*/
+					{	data->Ime.InputScreenType = STROKE_INPUT_SCREEN;
+						IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiStrokeKeyMap[keyboard->code][1] + ZI8_BASE_STROKES);
+						data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+						winShow(win);
+    				}
+					break;
+					
+				case PINYIN_INPUT_MODE:
+					if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)/*MC*/
+					{
+						data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;
+						/*MC, multitap handling*/
+						/***************************Go-lite Optimization changes Start***********************/
+						//Aug 16, 2004    REF: CRR 24323   Deepa M.D
+						TRACE_EVENT_P1("Keypad Counter : %d",  Counter[keyboard->code]);
+						/***************************Go-lite Optimization changes end***********************/
+						/*if time out or new key pressed*/		
+						if ( Counter[keyboard->code] == 0)
+						{	tim_stop(data->KeyPad_Timer_Handle);/*stop timer*/
+							memset( Counter, 0, sizeof(char)*KCD_STAR);/*reset all key counters*/
+							IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiPinYinKeyMap[(keyboard->code)-1][0]);
+							 Counter[keyboard->code]++; //increment counter
+							tim_start(data->KeyPad_Timer_Handle);/*restart timer*/
+						}
+						else /*if counter is less than MAX for that key*/
+						{	ZI8WCHAR last_element; 
+
+							if ( Counter[keyboard->code] <ZiPinYinKeyMap[(keyboard->code)-1][5])
+							{	tim_stop(data->KeyPad_Timer_Handle);/*stop timer*/
+								last_element = data->Ime.pGetParam->pElements[data->Ime.pGetParam->ElementCount -1];
+								//should put in check
+								//e.g. if last char was 'a' and we're entering 'b'
+								if (last_element== ZiPinYinKeyMap[(keyboard->code)-1][ Counter[keyboard->code]-1])
+								{	IMEClear(&data->Ime, data->Ime.pGetParam->pElements);/*remove last char from elements*/
+									data->Ime.InputScreenType = PINYIN_INPUT_SCREEN;/*this prevents display problems*/
+								}
+								/*so we can add the next char for this key*/
+								IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiPinYinKeyMap[(keyboard->code)-1][ Counter[keyboard->code]]);
+								 Counter[keyboard->code]++; //increment counter
+								tim_start(data->KeyPad_Timer_Handle);/*restart timer*/
+							}
+						}
+						//IMEKeyPress(&data->Ime, (ZI8WCHAR) ZiPinYinKeyMap[(keyboard->code)-1][/*0*/2]);
+						data->HighlightedCandidate[0] = data->wcCandidates[data->Ime.CandidateCursor];
+						winShow(win);
+						}
+					break;
+		
+		    	default:
+			       	break;
+			}
+			break;
+		case KCD_STAR:
+			if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)/*MC*/
+			{
+				switch(data->Ime.EditorMode)
+	    		{
+	    			case STROKE_INPUT_MODE:
+	    			/* SPR#1428 - SH - New Editor uses new symbol selector */
+#ifdef NEW_EDITOR
+						AUI_symbol_Start(win, ADD_SYMBOL);
+#else /* NEW_EDITOR */
+	    				SymbolScreenstart(win, NULL);
+#endif /* NEW_EDITOR */
+						break;
+					case PINYIN_INPUT_MODE:
+						memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+					/* SPR#1428 - SH - New Editor uses new symbol selector */
+#ifdef NEW_EDITOR
+						AUI_symbol_Start(win, ADD_SYMBOL);
+#else /* NEW_EDITOR */
+	    				SymbolScreenstart(win, NULL);
+#endif /* NEW_EDITOR */
+						break;
+			    	default:
+				       	break;
+				}
+			}
+			
+			break;
+	    case KCD_HASH:
+	    if (data->Ime.TextBufferCount < TEXT_BUFFER_EDIT_SIZE)/*MC*/
+		{
+	    	switch(data->Ime.EditorMode)
+    		{
+    		/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+				T_AUI_EDITOR_DATA	editor_data;
+#else /* NEW_EDITOR */
+    			T_EDITOR_DATA  editor_data;
+#endif /* NEW_EDITOR */
+    			case STROKE_INPUT_MODE:
+    				data->Ime.EditorMode = PINYIN_INPUT_MODE;
+					break;
+				case PINYIN_INPUT_MODE:
+					memset( Counter, 0, sizeof(char)*KCD_STAR);/*MC set counters to 0*/
+					/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+					AUI_edit_SetDefault(&editor_data);
+#else /* NEW_EDITOR */
+					editor_attr_init(&editor_data.editor_attr, NULL, edtCurBar1, 0, 0, 0, 0);
+					editor_data.hide									= FALSE;
+					editor_data.TextId               = '\0';  
+					editor_data.TextString           = NULL;  
+					editor_data.timeout			  = FOREVER;  // Avoid to return empty strings
+#endif /* NEW_EDITOR */			
+					//set mode to stroke input when Latin editor exited
+					data->Ime.EditorMode = STROKE_INPUT_MODE;
+					/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+					AUI_edit_SetDisplay(&editor_data, ZONE_FULL_SK_TITLE, COLOUR_EDITOR, EDITOR_FONT);
+					AUI_edit_SetBuffer(&editor_data, ATB_DCS_UNICODE, (UBYTE *)data->Callback_Data.TextString, data->Callback_Data.EditorSize*2 + 3);
+					AUI_edit_SetMode(&editor_data, ED_MODE_ALPHA, ED_CURSOR_BAR);
+					AUI_edit_SetTextStr(&editor_data, TxtChinese, TxtDelete, TxtNull, NULL);
+					AUI_edit_SetEvents(&editor_data, LATIN_INPUT, TRUE, FOREVER, (T_AUI_EDIT_CB)chinese_input_exec);
+					AUI_edit_Start(data->input_win, &editor_data);
+#else /* NEW_EDITOR */
+					editor_data.editor_attr.text     = (char *)data->Callback_Data.TextString;  
+					editor_data.editor_attr.size     = data->Callback_Data.EditorSize*2 + 3; 
+					editor_data.min_enter						 = 0; 
+	 				editor_data.mode = ALPHA_MODE;				
+					editor_data.LeftSoftKey          = TxtChinese;
+					editor_data.AlternateLeftSoftKey = TxtSoftBack;
+					editor_data.RightSoftKey         = TxtDelete;
+					editor_data.Identifier 			= LATIN_INPUT;
+					editor_data.Callback             = (T_EDIT_CB)chinese_input_exec/*NULL*/;
+					editor_data.destroyEditor 		 = TRUE;
+					editor_start(data->input_win, &editor_data);
+#endif /* NEW_EDITOR */
+					break;
+		    	default:
+	    		
+			       	break;
+			}
+
+	    	memset(&data->DisplayElementBuffer, 0,sizeof(data->DisplayElementBuffer));
+
+	    	IMEChangeMode(&data->Ime,&data->GetParam);
+	    	winShow(win);
+	    }
+			break;
+	    default:
+	       break;
+	  }
+	  return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:  	
+
+ $Description:	
+ $Returns:		
+
+ $Arguments:	menu and menu item (neither used)
+ 
+*******************************************************************************/
+int chinese_input_menu(MfwMnu* m, MfwMnuItem* i)
+{	
+	T_MFW_HND       parent        = mfwParent( mfw_header() );
+    chinese_input( parent, NULL );
+    return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMEChangeMode
+
+ $Description:	This function change some of the setting when user selected to use 
+                different input method. E.g change from Stroke to Pin-yin input.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void IMEChangeMode(PIME_DATA pIME, PZI8GETPARAM pGetParam)
+{
+	/* First initialize the members that will be constant */
+	switch(pIME->EditorMode)
+    {
+    	case STROKE_INPUT_MODE:
+			pGetParam->Language			= ZI8_LANG_ZH;
+			pGetParam->GetMode			= ZI8_GETMODE_STROKES;
+			pGetParam->SubLanguage		= ZI8_SUBLANG_ZH;
+			/*MC, check size of editor to work out context*/
+			if (TEXT_BUFFER_EDIT_SIZE <= MAX_PHONEBOOK_ENTRY_SIZE)
+				pGetParam->Context		= ZI8_GETCONTEXT_SURNAME;
+			else
+				pGetParam->Context		= ZI8_GETCONTEXT_SMS;
+			pGetParam->GetOptions		= ZI8_GETOPTION_ALLCOMPONENTS;
+			break;
+		case PINYIN_INPUT_MODE:
+			pGetParam->Language			= ZI8_LANG_ZH;
+			pGetParam->GetMode			= ZI8_GETMODE_PINYIN;
+			pGetParam->SubLanguage		= ZI8_SUBLANG_ZH/*ZI8_SUBLANG_ZH_ALL*/;
+			/*MC, check size of editor to work out context*/
+			if (TEXT_BUFFER_EDIT_SIZE <= MAX_PHONEBOOK_ENTRY_SIZE)
+				pGetParam->Context		= ZI8_GETCONTEXT_SURNAME;
+			else
+				pGetParam->Context		= ZI8_GETCONTEXT_SMS;
+			pGetParam->GetOptions		= ZI8_GETOPTION_NOCOMPONENTS/*ZI8_GETOPTION_SAMESOUND*/;
+			break;
+		case LATIN_INPUT_MODE:
+			pIME->InputScreenType = TEXT_DISPLAY_SCREEN;
+			break;
+		default:
+		   	break;
+	}
+	pIME->InputScreenType = TEXT_DISPLAY_SCREEN;
+	memset(pGetParam->pElements, 0, sizeof(pGetParam->pElements));
+	memset(pIME->pDisplayElementBuffer, 0,sizeof(pIME->pDisplayElementBuffer));
+	/* save the pointer to the ZI8GETPARAM structure in the IME data */
+	pIME->pGetParam				= pGetParam;
+	/* now initialize the text buffer and element buffer */
+	pIME->moreCount				= 0;
+	pGetParam->ElementCount 	= 0;
+	/* initilalize the WordCharacterCount to zero */
+	pGetParam->WordCharacterCount = 0;
+	/* initialize the saved number of candidates to zero */
+	pIME->candidates = 0;
+	/* initialize the candidate cursor to zero */
+	pIME->CandidateCursor = 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMEInitialize
+
+ $Description:	This function initializes the ZI8GETPARAM structure defined in the API 
+ 				and the various members of the IME_DATA structure defined in to keep 
+ 				track of the IME.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+/*void IMEInitialize(PIME_DATA pIME, PZI8GETPARAM pGetParam, PZI8WCHAR wszTextBuffer, int TextBufferEditSize,
+				 int TextBufferSize, PZI8WCHAR pCandidates)*/
+void IMEInitialize(PIME_DATA pIME, PZI8GETPARAM pGetParam, PZI8WCHAR wszTextBuffer,
+                  int TextBufferEditSize, int TextBufferSize, PZI8WCHAR pCandidates, 
+                  PZI8WCHAR wszElementBuffer, PZI8WCHAR DisplayElementBuffer)
+{
+	pIME->EditorMode			= STROKE_INPUT_MODE;
+	/* First initialize the members that will be constant */
+	switch(pIME->EditorMode)
+    {
+    	case STROKE_INPUT_MODE:
+			pGetParam->Language			= ZI8_LANG_ZH;
+			pGetParam->GetMode			= ZI8_GETMODE_STROKES;
+			pGetParam->SubLanguage		= ZI8_SUBLANG_ZH;
+						/*MC, check size of editor to work out context*/
+			if (TEXT_BUFFER_EDIT_SIZE <= MAX_PHONEBOOK_ENTRY_SIZE)
+				pGetParam->Context		= ZI8_GETCONTEXT_SURNAME;
+			else
+				pGetParam->Context		= ZI8_GETCONTEXT_SMS;
+
+			pGetParam->GetOptions		= ZI8_GETOPTION_ALLCOMPONENTS;
+			break;
+		case PINYIN_INPUT_MODE:
+			pGetParam->Language			= ZI8_LANG_ZH;
+			pGetParam->GetMode			= ZI8_GETMODE_PINYIN;
+			pGetParam->SubLanguage		= ZI8_SUBLANG_ZH;
+			if (TEXT_BUFFER_EDIT_SIZE <= MAX_PHONEBOOK_ENTRY_SIZE)
+				pGetParam->Context		= ZI8_GETCONTEXT_SURNAME;
+			else
+				pGetParam->Context		= ZI8_GETCONTEXT_SMS;
+			pGetParam->GetOptions		= ZI8_GETOPTION_NOCOMPONENTS/*ZI8_GETOPTION_SAMESOUND*/;
+			break;
+		case LATIN_INPUT_MODE:
+			break;
+		default:
+		   	break;
+	}
+	/* save the pointer to the ZI8GETPARAM structure in the IME data */
+	pIME->pGetParam				= pGetParam;
+	/* now initialize the text buffer and element buffer */
+	pIME->pTextBuffer			= wszTextBuffer;
+	pIME->TextBufferEditSize	= TextBufferEditSize;
+	pIME->TextBufferSize		= TextBufferSize;
+	pIME->moreCount				= 0;
+	pIME->TextBufferCount 		= Uni_strlen(wszTextBuffer);;
+	pIME->TextCursor 			= pIME->TextBufferCount;
+	pIME->pDisplayElementBuffer	= DisplayElementBuffer;
+	pIME->InputScreenType	= TEXT_DISPLAY_SCREEN;
+	
+	pGetParam->pElements 		= wszElementBuffer;
+	pGetParam->ElementCount 	= 0;
+	/* initilalize the WordCharacterCount to zero */
+	pGetParam->WordCharacterCount = 0;
+	/*initial pointer to the candidate buffer*/
+	pGetParam->pCandidates = pCandidates;
+	/* initialize the saved number of candidates to zero */
+	pIME->candidates = 0;
+	/* initialize the candidate cursor to zero */
+	pIME->CandidateCursor = 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMECursorLeft
+
+ $Description:	Move the candidate cursor left
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+/*
+GW SPR#1732 - Corrected cursor position from '6' to 'CANDIDATES_PER_GROUP - 1'
+*/
+
+void IMECursorLeft(PIME_DATA pIME)
+{
+	TRACE_EVENT ("IMECursorLeft()");
+	if(pIME->CandidateCursor != 0)
+	{
+		pIME->CandidateCursor--;
+		pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+		DataConvert(pIME);
+	}
+	/* check ElementCount to see whether ElementBuffer is empty and check if where is any more tick in the element buffer. */
+	else if(pIME->pGetParam->ElementCount != 0 && 
+		   pIME->pGetParam->pElements[pIME->pGetParam->ElementCount-1] == ZI8_CODE_MORE) 
+	{
+		/* If the last input is a more tick, remove it */
+		pIME->moreCount--;
+		/* replace last element with zero */
+		pIME->pGetParam->pElements[--pIME->pGetParam->ElementCount] = 0;
+		/* get candidates with the new stroke */
+		pIME->pGetParam->FirstCandidate = pIME->moreCount * CANDIDATES_PER_GROUP;
+		pIME->pGetParam->MaxCandidates = CANDIDATES_PER_GROUP + 1;
+		pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+		DataConvert(pIME);
+		/* initialize the candidate cursor the character position*/
+		pIME->CandidateCursor =CANDIDATES_PER_GROUP - 1;
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMECursorRight
+
+ $Description:	Move the candidate cursor right
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+/*
+GW SPR#1732 - Corrected test for cursor position from '6' to 'CANDIDATES_PER_GROUP - 1'
+*/
+void IMECursorRight(PIME_DATA pIME)
+{
+	TRACE_EVENT("IMECursorRight()");
+	/* If the candidate cursor is greater than the display ability, more tick is add to the element buffer */
+	/* to request for next set of characters.												 */
+	if(pIME->CandidateCursor >= CANDIDATES_PER_GROUP - 1)
+	{
+		pIME->moreCount++;
+		pIME->pGetParam->pElements[pIME->pGetParam->ElementCount++] = ZI8_CODE_MORE;
+		/* get new candidates */
+		pIME->pGetParam->FirstCandidate = pIME->moreCount * CANDIDATES_PER_GROUP;
+		pIME->pGetParam->MaxCandidates = CANDIDATES_PER_GROUP + 1;
+		pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+		DataConvert(pIME);
+		/* initialize the candidate cursor to zero */
+		pIME->CandidateCursor = 0;
+	}
+	/* Check number of available candidates before increment of candidate cursor is allowed */
+	else if(pIME->candidates > (pIME->CandidateCursor + 1))
+		{	pIME->CandidateCursor++;
+			pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+			DataConvert(pIME);
+		}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMESelectCandidate
+
+ $Description:	Select the cadidate at cursor.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void IMESelectCandidate(PIME_DATA pIME, PZI8WCHAR wszElementBuffer)
+{
+	int i = 0;
+	int j = 0;
+	ZI8WCHAR HighByte;
+	ZI8WCHAR Temp;
+	ZI8WCHAR LowByte;	
+
+	TRACE_EVENT("IMESelectCandidate()");
+
+
+	/* we can allow selection only if we have candidates*/
+	if(pIME->candidates == 0)
+		return;
+	/* if we have elements in the test we must now remove them */
+	while(pIME->pGetParam->ElementCount > 0)
+	{
+		pIME->pGetParam->pElements[--pIME->pGetParam->ElementCount] = 0;
+	}
+	/* the more count must be set to zero */
+	pIME->moreCount = 0;
+
+	/* check the limit of the text buffer. Stop user to enter character when text buffer is full */
+	if(pIME->TextBufferCount >= TEXT_BUFFER_EDIT_SIZE)
+    {
+    	//messages can be added to inform user when text buffer is full.
+    	return;
+	}
+
+	/* chek if the selected candidate is a component. To do that the storage format has to be change. */
+	/* Followin bit shifting procedure is used the perfrom the task.						 */
+	LowByte = pIME->pGetParam->pCandidates[pIME->CandidateCursor] & 0x00FF;
+	HighByte = pIME->pGetParam->pCandidates[pIME->CandidateCursor] & 0xFF00;
+	Temp = (LowByte << 8) & 0xFF00;
+	HighByte = (HighByte >> 8) & 0x00FF;
+	Temp = Temp | HighByte;
+	
+	if(Temp > ZI8_BASE_COMPONENTS && Temp < ZI8_BASE_BPMF) /* check if the selected candidate is a component */
+	{
+		memset(pIME->pDisplayElementBuffer, 0,sizeof(pIME->pDisplayElementBuffer));
+		pIME->pDisplayElementBuffer[0] = pIME->pGetParam->pCandidates[pIME->CandidateCursor];
+		
+		pIME->pGetParam->pElements[0] = Temp;
+		pIME->pGetParam->ElementCount = 1;
+    }
+	else    /* The selected character is character not a component */
+	{
+		if(pIME->TextCursor < pIME->TextBufferCount) /* locate the text cursor position for correct character insertion */
+	    {
+	    	for (i=pIME->TextCursor; i<pIME->TextBufferCount; i++) /* shift and move characters to make rooms to insert the selected character */
+	    	{
+	    		//pIME->pTextBuffer[pIME->TextBufferCount - i + 1]=pIME->pTextBuffer[pIME->TextBufferCount - i];
+	    		pIME->pTextBuffer[pIME->TextBufferCount - j]=pIME->pTextBuffer[pIME->TextBufferCount - j - 1];
+	    		j++;
+	    	}
+	    }	
+#ifndef LSCREEN
+		/* now added this character to the text */
+		pIME->pTextBuffer[pIME->TextCursor++] = pIME->pGetParam->pCandidates[pIME->CandidateCursor];
+#else	/*SPR 1319 Add candidate to editor*/
+		/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+		ATB_edit_Char(editor_pointer, (USHORT )pIME->pGetParam->pCandidates[pIME->CandidateCursor], TRUE);
+#else /* NEW_EDITOR */
+		edtCharUnicode(editor_pointer, pIME->pGetParam->pCandidates[pIME->CandidateCursor]);
+#endif /* NEW_EDITOR */
+		pIME->TextCursor++;
+#endif
+		/* Change input screen type */
+		pIME->InputScreenType = WORD_ASSOCIATION_SCREEN;
+		/* upate the element buffer to its new position */	
+		pIME->pGetParam->pElements = wszElementBuffer;
+
+		/* Adjust the word association. If the candidate we selected was a word candidat,	*/
+		/* then we continue the word association. Otherwise this character begins a new word        */		
+		if(pIME->pGetParam->wordCandidates > pIME->CandidateCursor)
+		{
+			pIME->pGetParam->WordCharacterCount++;
+		}
+		else
+		{
+			pIME->pGetParam->pCurrentWord = &pIME->pTextBuffer[pIME->TextCursor - 1];
+			pIME->pGetParam->WordCharacterCount = 1;
+		}
+		/* get new candidates */
+		pIME->pGetParam->FirstCandidate = pIME->moreCount * CANDIDATES_PER_GROUP;
+		pIME->pGetParam->MaxCandidates = CANDIDATES_PER_GROUP + 1;
+		//increase TextBufferCount by one
+		pIME->TextBufferCount++;
+		memset(pIME->pDisplayElementBuffer, 0, sizeof(pIME->pDisplayElementBuffer));
+	}
+	pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+	DataConvert(pIME);
+	/* initialize the candidate cursor to zero */
+	pIME->CandidateCursor = 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMEMore
+
+ $Description:	Get the next group of candidates. For this function, we add the more tick 
+ 				to the element buffer and increase the more count. Then we get the 
+ 				next group of candidates.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void IMEMore(PIME_DATA pIME)
+{	
+	TRACE_EVENT("IMEMore()");
+	
+	pIME->moreCount++;
+	pIME->pGetParam->pElements[pIME->pGetParam->ElementCount++] = ZI8_CODE_MORE;
+	/* get new candidates */
+	pIME->pGetParam->FirstCandidate = pIME->moreCount * CANDIDATES_PER_GROUP;
+	pIME->pGetParam->MaxCandidates = CANDIDATES_PER_GROUP + 1;
+	pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+	DataConvert(pIME);
+	/* initialize the candidate cursor to zero */
+	pIME->CandidateCursor = 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMEKeyPress
+
+ $Description:	Enter the stroke and get new candidates. However, any more ticks from 
+ 				the element buffer must be removed before any stroke is to be added.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void IMEKeyPress(PIME_DATA pIME, ZI8WCHAR wcStroke)
+{	char debug[80];
+	PZI8WCHAR element_buffer;
+
+	TRACE_EVENT ("IMEKeyPress()");
+
+	/* remove any trailing more ticks and set the more count back to zero */
+	while((pIME->pGetParam->ElementCount > 0) && pIME->pGetParam->pElements[pIME->pGetParam->ElementCount-1] == ZI8_CODE_MORE)
+	{
+		pIME->pGetParam->pElements[--pIME->pGetParam->ElementCount] = 0;
+	}
+	pIME->moreCount = 0;
+
+	/* Check the limit of the element buffer. Stop user to enter stroke or Pin Yin letter */
+	/* when element budder is full 												 */
+	if(pIME->pGetParam->ElementCount >= TEXT_BUFFER_EXTRA_SPACE)
+    {
+    	return;
+	}
+	/* Insert the stroke or the Pin Yin letter into the element buffer for character search */
+	pIME->pGetParam->pElements[pIME->pGetParam->ElementCount++] = wcStroke;
+
+/*MC, let's check what's in the element buffer*/
+
+	element_buffer = pIME->pGetParam->pElements;
+	/***************************Go-lite Optimization changes Start***********************/
+	//Aug 16, 2004    REF: CRR 24323   Deepa M.D
+	TRACE_EVENT_P5("Element List: %c, %c, %c, %c, %c", (element_buffer[0]-ZI8_BASE_PINYIN+65), (element_buffer[1]-ZI8_BASE_PINYIN+65), (element_buffer[2]-ZI8_BASE_PINYIN+65), (element_buffer[3]-ZI8_BASE_PINYIN+65), (element_buffer[4]-ZI8_BASE_PINYIN+65));
+	/***************************Go-lite Optimization changes end***********************/
+/*MC --end debug code*/
+	
+	/* get candidates with the new stroke */
+	pIME->pGetParam->FirstCandidate = pIME->moreCount * CANDIDATES_PER_GROUP;
+	pIME->pGetParam->MaxCandidates = CANDIDATES_PER_GROUP + 1;
+	pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+
+	if (pIME->candidates > 0 || pIME->EditorMode == PINYIN_INPUT_MODE)//MC
+	{	/* Convert the data storage format for display purpose */
+		DataConvert(pIME);
+		/* initialize the candidate cursor to zero */
+		pIME->CandidateCursor = 0;
+	}
+	else
+	{	//remove this keypress
+		IMEClear(pIME, pIME->pGetParam->pElements);
+	}
+}
+
+
+/*******************************************************************************
+
+ $Function:    	IMEClear
+
+ $Description:	Clear the last stroke entered. This function first handle the case where 
+ 				the last element is a more tick. If there are no elements, it removes 
+ 				the last text element.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+//void IMEClear(PIME_DATA pIME)
+void IMEClear(PIME_DATA pIME, PZI8WCHAR wszElementBuffer)
+{
+	int i = 0;
+
+	TRACE_EVENT("IMEClear()");
+	
+
+	/* handle the condition where the last element is a more tick */
+	if(pIME->pGetParam->ElementCount != 0) //check ElementCount to see whether ElementBuffer is empty
+	{
+		/* If the last input is a more tick, remove it */
+		if(pIME->pGetParam->pElements[pIME->pGetParam->ElementCount-1] == ZI8_CODE_MORE)
+		{
+			pIME->moreCount--;
+
+			/* replace last element with zero */
+			pIME->pGetParam->pElements[--pIME->pGetParam->ElementCount] = 0;
+		}
+		else
+		{
+			pIME->pGetParam->pElements[--pIME->pGetParam->ElementCount] = 0;	
+			pIME->pDisplayElementBuffer[pIME->pGetParam->ElementCount] = 0;
+		}
+
+		/* When ElementCount is zero and InputScreenType is STROKE_INPUT_SCREEN or PINYIN_INPUT_SCREEN, 	 */
+		/* InputScreenType will be set to WORD_ASSOCIATION_SCREEN to get the associated character. If no associated */
+		/* characters can be found, the most common used character in chinese writting will be provided.	 */
+		if((pIME->pGetParam->ElementCount == 0 && pIME->InputScreenType == STROKE_INPUT_SCREEN) || 
+		  (pIME->pGetParam->ElementCount == 0 && pIME->InputScreenType == PINYIN_INPUT_SCREEN))
+		{
+			pIME->InputScreenType = WORD_ASSOCIATION_SCREEN;
+		}
+	}
+	else
+	{
+		/* remove the last character from text buffer */
+		/* first update count for word association */
+		if(pIME->pGetParam->WordCharacterCount > 0)
+			pIME->pGetParam->WordCharacterCount--;
+
+		/* remove the character at cursor position */
+		if(pIME->TextCursor != 0)
+		{
+#ifndef LSCREEN
+			/* replace last character with zero */
+        	if(pIME->TextBufferCount==pIME->TextCursor)
+            {
+				pIME->pTextBuffer[--pIME->TextCursor] = 0;
+                pIME->TextBufferCount--;
+			}    
+			else if(pIME->TextBufferCount > pIME->TextCursor)
+			{
+			    for (i=pIME->TextCursor; i<pIME->TextBufferCount; i++)
+			    {
+			        pIME->pTextBuffer[i-1]=pIME->pTextBuffer[i];
+			    }
+			    pIME->pTextBuffer[pIME->TextBufferCount-1]=0;
+			    pIME->TextCursor--;
+                pIME->TextBufferCount--;
+			}
+#else		/*SPR 1319 delete char in front of cursor */
+	/* SPR#1428 - SH - New Editor changes */
+#ifdef NEW_EDITOR
+		ATB_edit_DeleteLeft(editor_pointer, TRUE); /* SPR#2342 - SH */
+#else /* NEW_EDITOR */
+		edtChar(editor_pointer, ecBack);
+#endif /* NEW_EDITOR */
+		  pIME->TextBufferCount--;
+#endif
+
+		}
+		/* update location of elements */
+		pIME->pGetParam->pElements = wszElementBuffer;
+	}
+	/* get candidates */
+	pIME->pGetParam->FirstCandidate = pIME->moreCount * CANDIDATES_PER_GROUP;
+	pIME->pGetParam->MaxCandidates = CANDIDATES_PER_GROUP + 1;
+	pIME->candidates = Zi8GetCandidates(pIME->pGetParam);
+	/* Convert the data storage format for display purpose */
+	DataConvert(pIME);
+	/* initialize the candidate cursor to zero */
+	pIME->CandidateCursor = 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:    	CandidateHighlightDisplayContorl
+
+ $Description:	With given candidate cursor position, and character stored in the HighlightedCandidate,
+ 				this function will invert the colour of the candidate to indicate user the current selected
+ 				character.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void CandidateHighlightDisplayContorl(PIME_DATA pIME, PZI8WCHAR HighlightedCandidate)
+{
+	/* Highlight the candidate character pointed by Ime.CandidateCursor */
+#ifndef LSCREEN
+	if(pIME->CandidateCursor == 0)
+		dspl_TextOut(1,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+	else if(pIME->CandidateCursor == 1)
+		dspl_TextOut(13,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+	else if(pIME->CandidateCursor == 2)
+		dspl_TextOut(25,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+	else if(pIME->CandidateCursor == 3)
+		dspl_TextOut(37,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+	else if(pIME->CandidateCursor == 4)
+		dspl_TextOut(49,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+	else if(pIME->CandidateCursor == 5)
+		dspl_TextOut(61,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+	else
+		dspl_TextOut(73,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)HighlightedCandidate);
+#else
+{
+/*
+SPR 1319 manually highlight selected candidate
+GW SPR#1732 - Added 0x80, 0x00 to the start of the 2 byte unicode string
+*/
+	char hChar[10];
+	memcpy(&hChar[2],HighlightedCandidate,8);
+	hChar[0] = 0x80;	hChar[1] = 0x00;
+	dspl_TextOut(pIME->CandidateCursor*CHI_FONT_WIDTH+1,SCREEN_SIZE_Y-Mmi_layout_line(3),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)hChar);
+}
+#endif
+}
+
+
+/*******************************************************************************
+
+ $Function:    	TextCursorDisplayContorl
+
+ $Description:	To display the cursor position to user during text editing.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void TextCursorDisplayContorl(PIME_DATA pIME, PZI8WCHAR CursorPosition, int InsertLine)
+{
+	int TempTextCursor 	= 0;
+	int x_position = 1;
+	int i;
+	int line;//position of char at start of line
+
+	TempTextCursor = pIME->TextCursor % CANDIDATES_PER_GROUP;
+	line = pIME->TextCursor - TempTextCursor;
+	for (i=0; i < TempTextCursor; i++)
+		
+	{	//if last byte of word is 0x00, and first byte is between 0x20 and 0x7E
+		if (LatinChar(pIME->pTextBuffer[line+i]))
+			x_position +=6;
+		else
+			x_position+=CHI_FONT_WIDTH;/*SPR 1319 using macro rather than magic no*/
+	}
+	switch(pIME->InputScreenType)
+	{
+		case TEXT_DISPLAY_SCREEN:
+		
+			if(InsertLine == 1)
+			{
+				
+			dspl_TextOut(x_position,Mmi_layout_line(1),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)CursorPosition);
+			
+
+			}
+			else
+			{	dspl_TextOut(x_position,Mmi_layout_line(2),DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)CursorPosition);
+				
+			}
+			break;
+		case STROKE_INPUT_SCREEN:
+		case WORD_ASSOCIATION_SCREEN:
+			dspl_TextOut(x_position,0,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)CursorPosition);
+		
+		default:
+			break;
+	}	
+}
+
+
+/*******************************************************************************
+
+ $Function:    	DataConvert
+
+ $Description:	To change to data storage format i.e if a unicode is 0x89D5.
+ 				The DataConvert function will change storage format to 0xD589 (This format 
+ 				is required to display UniCode on LCD). The data format is chaged by 
+ 				byte shifting.
+
+ $Returns:		void
+
+ $Arguments:	
+
+*******************************************************************************/
+void DataConvert(PIME_DATA pIME)
+{
+	ZI8WCHAR HighByte;
+	ZI8WCHAR Temp;
+	ZI8WCHAR LowByte;
+	ZI8WCHAR tempString[25];
+	int word_length;
+	int i 		= 0;
+	int count 	= 0;
+	TRACE_EVENT("DataConvert");
+
+	
+	if((pIME->InputScreenType == STROKE_INPUT_SCREEN) ||
+	  (pIME->InputScreenType == PINYIN_INPUT_SCREEN))
+	{
+		count = pIME->pGetParam->ElementCount;
+		/* The more tick is not to be displayed on LCD therefore it is not considered. */
+		while((count > 0) && pIME->pGetParam->pElements[count - 1] == ZI8_CODE_MORE)
+		{
+			count--;
+		}
+
+		/* Format of the data stored in the array pointed by pElement is converted and  */
+		/* saved in the array pointed by pDisplayElementBuffer. Please note that the    */
+		/* the data format stored in the array pointed by pElement was unchanged. This */
+		/* is kept that way for eZiText character search.*/
+			if (pIME->InputScreenType == STROKE_INPUT_SCREEN)
+			{	for(i = 0; i < count; i++)
+				{
+					Temp = pIME->pGetParam->pElements[i];
+					LowByte = pIME->pGetParam->pElements[i] & 0x00FF;
+					HighByte = pIME->pGetParam->pElements[i] & 0xFF00;
+					Temp = (LowByte << 8) & 0xFF00;
+					HighByte = (HighByte >> 8) & 0x00FF;
+					Temp = Temp | HighByte;
+					pIME->pDisplayElementBuffer[i] = Temp;
+				}	
+				pIME->pDisplayElementBuffer[count] = 0x0000; //terminate string
+			}
+				
+			if (pIME->InputScreenType == PINYIN_INPUT_SCREEN)	
+			{ 	int no_of_display_chars;
+				int i;
+				word_length = count; //let's use user input for display
+				/*word_length = */Zi8GetCharInfo(pIME->pGetParam->pCandidates[pIME->CandidateCursor], tempString, 12, ZI8_GETMODE_PINYIN);
+				TRACE_EVENT((char*)tempString);/*MC Tracing first matched pinyin word*/
+
+				/*MC convert input elements from EZi element codes to Ezi Pinyin spelling for display*/
+				for (i=0; i<word_length; i++)
+				{	tempString[i] = (((pIME->pGetParam->pElements[i]-ZI8_BASE_PINYIN)+LOWER_CASE_ASCII_OFFSET)) +EZITEXT_OUTPUT_OFFSET; 
+				}
+
+				if (word_length > 0)
+				{
+					if (word_length < count)
+						no_of_display_chars = word_length;
+					else
+						no_of_display_chars = count;
+					/***************************Go-lite Optimization changes Start***********************/
+					//Aug 16, 2004    REF: CRR 24323   Deepa M.D
+					TRACE_EVENT_P1("chars returned: %d", word_length);		
+					/***************************Go-lite Optimization changes end***********************/
+					for(i = 0; i < no_of_display_chars; i++)
+					{
+						Temp = tempString[i];
+						LowByte = tempString[i] & 0x00FF;
+						HighByte = tempString[i] & 0xFF00;
+						Temp = (LowByte << 8) & 0xFF00;
+						HighByte = (HighByte >> 8) & 0x00FF;
+						Temp = Temp |HighByte;
+						pIME->pDisplayElementBuffer[i] = Temp;
+					}
+					pIME->pDisplayElementBuffer[no_of_display_chars] = 0x0000;//terminate string
+				}
+				
+			}
+		}
+			
+	
+	/* format of the data stored in the array pointed by pCandidates is coverted for display */
+	for(i = 0; i < pIME->pGetParam->count; i++)
+	{
+		Temp = pIME->pGetParam->pCandidates[i];
+		LowByte = pIME->pGetParam->pCandidates[i] & 0x00FF;
+		HighByte = pIME->pGetParam->pCandidates[i] & 0xFF00;
+		Temp = (LowByte << 8) & 0xFF00;
+		HighByte = (HighByte >> 8) & 0x00FF;
+		Temp = Temp | HighByte;
+		pIME->pGetParam->pCandidates[i] = Temp;
+	}
+	pIME->pGetParam->pCandidates[pIME->candidates] = 0x0000;//terminate string
+				
+}
+
+
+/*******************************************************************************
+
+ $Function:    	Uni_strlen
+
+ $Description:	To count the number of element from the input array
+
+ $Returns:		number of element
+
+ $Arguments:	
+
+*******************************************************************************/
+ZI8WCHAR Uni_strlen(PZI8WCHAR String)
+{
+	int i = 0;
+	ZI8WCHAR count = 0;
+
+	while(String[i] != 0)		
+	{
+		i++;
+		count++;
+	}
+	return count;
+}
+