view src/aci2/bmi/AUIEditor.c @ 632:d968a3216ba0

new tangomdm build target TCS211/Magnetite built for target leonardo runs just fine on the Tango-based Caramel board, but a more proper tangomdm build target is preferable in order to better market these Tango modems to prospective commercial customers. The only differences are in GPIO and MCSI config: * MCSI is enabled in the tangomdm build config. * GPIO 1 is loudspeaker amplifier control on Leonardo, but on Tango platforms it can be used for anything. On Caramel boards this GPIO should be configured as an output driving high. * GPIO 2 needs to be configured as Calypso input on Leonardo, but on Tango platforms it can be used for anything. On Caramel boards this GPIO should be configured as an output, either high or low is OK.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 04 Jan 2020 19:27:41 +0000
parents 93999a60b835
children
line wrap: on
line source

/*******************************************************************************

	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:   MMI
 $File:       AUIEditor.c
 $Revision:   1.0

 $Author:   Condat(UK)
 $Date:       22/02/01

********************************************************************************

 Description:
	Generic MMI Editor.

********************************************************************************

 $History: AUIEditor.c

 	Mar 14, 2006 DR: OMAPS00061468 - x0035544.
   	Description: SAT 27.22.4.22.2 SET UP IDLE MODE TEXT (Icon support) fails 
   	Solution : In the function AUI_edit_SetDefault() set the default value for 
   	display_type to SAT_ICON_NONE.

	Jan 16, 2006 DR: OMAPS00061460 - Shashi Shekar B.S.
	Description: SAT Icon support
	Solution : SAT icon support added.

    Dec-20-2004 MMI-SPR-27382 xreddymn
    Added NULL window handle check for AUI_edit_Destroy

 	Sep 2, 2004    REF: CRR 21370 xkundadu
	Description: Giving wrong expected result by long press on "#" key
	Fix:	When user presses long on '#' key it will display 'p'.
		Changed the long press of '*' key to display 'w'.

	 Jul 22,2004 CRR:21605 xrashmic - SASKEN
	 Description: After deleting all the characters in the editor the case does not change to 
	 sentence case.
	 Fix: After deleting a character, check if editor is empty and then set the case to
	 sentence case only if the user has not modified the case.


 	Jul 29, 2004         REF: CRR:20892 xrashmic - SASKEN
	Description: By Long press on Left/Right key at 'Message Editor' screen, 
	cursor not scrolling continuously
	Fix: The Long press of left/right key is now handled in AUI_edit_KbdLongCB.
	The continuous long press of a key was being ignored for all keys. Now
	only for left and right keys this is handled, for rest of the keys the continuos 
	long press is ignored.

 
	31/01/02      Original Condat(UK) BMI version.
	
 $End

*******************************************************************************/

#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.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"
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "mfw_sms.h"
#include "mfw_ss.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 "mfw_cm.h"
#include "mfw_edt.h"

#include "dspl.h"

#include "ksd.h"
#include "psa.h"

#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUIEditor.h"

#include "MmiDummy.h"
#include "MmiMmi.h"

#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"
#include "MmiIdle.h"

#include "cus_aci.h"
#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif

#include "Mmiicons.h"
#include "MmiBookShared.h"
#include "mmiSmsMenu.h"
#include "mfw_ffs.h"
#ifdef EASY_TEXT_ENABLED
#include "MmiDictionary.h"
#endif
#include "mmiColours.h"

#include "MmiDictionary.h"
#include "ATBCommon.h"
#include "ATBDisplay.h"
#include "ATBEditor.h"
#include "AUITextEntry.h"
#include "AUIEditor.h"
#include "AUIEditor_i.h"
#include "AUISymbol.h"

/* Mar 08, 2006    REF:ER OMAPS00065168  */
#ifdef NEPTUNE_BOARD
#include "audio.h"
#endif



#ifndef MFW_EVENT_PASSED
#define MFW_EVENT_PASSED 0
#endif

#define TRACE_AUIEditor			// Def/undef this to show/hide the trace_events for this file

static void AUI_edit_ClearPredText(T_AUI_EDITOR_INFO *data);

/* API - 08/07/03 - CQ10728*/
static void AUI_Edit_Display_Only_CB(T_MFW_HND win, USHORT Identifier, SHORT reason);
static void AUI_Edit_Display_Only_Destroy (T_MFW_HND window);
/* API - 08/07/03 - CQ10728 END*/


/*******************************************************************************

 Static Data

********************************************************************************/

/* eZiText icon */

static const unsigned char TextIconeZiTextSmall[] =
{
  0x03,0x03,0x18,0x7c,0xcc,0x08,0x10,0x0c
};

 // Jul 22,2004 CRR:21605 xrashmic - SASKEN
 // This variable would tell us if the user had changed the case explicitly
UBYTE CaseChanged = FALSE;

#define ED_IND_UPPER "ABC"
#define ED_IND_LOWER "abc"
#define ED_IND_CAPS "Abc"
#define ED_IND_NUM "123"
#define ED_IND_NONE "---"


/*******************************************************************************

 $Function:		AUI_edit_Start

 $Description:	Start the editor.

 $Returns:		None.

 $Arguments:	None.

*******************************************************************************/

T_MFW_HND AUI_edit_Start(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data)
{
    T_MFW_HND win;

    TRACE_FUNCTION ("AUI_edit_Start()");

    win = AUI_edit_Create(parent, editor_data);

    return win;
}


/*******************************************************************************

 $Function:		AUI_edit_QuickStart

 $Description:	Start the editor.

 $Returns:		Dialog handler for the editor.

 $Arguments:	win			- the parent window
 				TitleId		- the text id of the title (or NULL)
 				TitleString	- the text string of the title (or NULL)
 				buffer		- the unicode input buffer
 				len			- maximum length of the text entered
 				editor_info	- the T_AUI_EDITOR_DATA structure (allocated but empty)

*******************************************************************************/

T_MFW_HND AUI_edit_QuickStart(T_MFW_HND win, USHORT TitleId, UBYTE *TitleString, USHORT *buffer, USHORT len,
	T_AUI_EDITOR_DATA *editor_info, T_AUI_EDIT_CB editor_cb)
{

    TRACE_FUNCTION ("AUI_edit_QuickStart()");

	AUI_edit_SetDisplay(editor_info, ZONE_FULL_SK_TITLE, COLOUR_EDITOR, EDITOR_FONT);
	AUI_edit_SetEvents(editor_info, 0, TRUE, FOREVER, editor_cb);
	AUI_edit_SetBuffer(editor_info, ATB_DCS_UNICODE, (UBYTE *)buffer, len);
	AUI_edit_SetTextStr(editor_info, TxtSoftOK, TxtDelete, TitleId, TitleString);
	AUI_edit_SetAltTextStr(editor_info, 0, NULL, TRUE, TxtSoftBack);
    /* create the dialog handler */
    return AUI_edit_Start(win, editor_info);  /* start the common editor */ 
}


/*******************************************************************************

 $Function:		AUI_edit_Create

 $Description:	Create the editor.
 
 $Returns:		Pointer to the editor's window.

 $Arguments:	parent	-	The parent window.

*******************************************************************************/

static T_MFW_HND AUI_edit_Create(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data)
{
    T_AUI_EDITOR_INFO	*data = (T_AUI_EDITOR_INFO *)ALLOC_MEMORY (sizeof (T_AUI_EDITOR_INFO));
    T_MFW_WIN     		*win_data;

    TRACE_FUNCTION ("AUI_edit_Create()");

	/* Create window handler */

    data->win = win_create(parent, 0, E_WIN_VISIBLE, (T_MFW_CB)AUI_edit_WinCb);	// Create window

    if (data->win==NULL)														// Make sure window exists
    {
		return NULL;
    }

	/* Connect the dialog data to the MFW-window */
     
    data->mmi_control.dialog	= (T_DIALOG_FUNC)AUI_edit_ExecCb;				/* Setup the destination for events */
    data->mmi_control.data		= data;
    data->parent				= parent;
    win_data					= ((T_MFW_HDR *)data->win)->data;
    win_data->user				= (void *)data;

 	data->kbd					= kbd_create(data->win, KEY_ALL,(T_MFW_CB)AUI_edit_KbdCb);
	data->kbd_long				= kbd_create(data->win, KEY_ALL|KEY_LONG,(T_MFW_CB)AUI_edit_KbdLongCb);
	data->editor				= ATB_edit_Create(&data->editor_data.editor_attr,0);

	data->editor_data = *editor_data;
	
	 // Jul 22,2004 CRR:21605 xrashmic - SASKEN
	 // The initial value of this variable should be false. i.e the user has still not changed the case.
	CaseChanged=FALSE;

	AUI_edit_Init(data->win);

	SEND_EVENT(data->win, E_ED_INIT, 0, 0);
	
    /* Return window handle */

    return data->win;
}


/*******************************************************************************

 $Function:		AUI_edit_Init

 $Description:	Initialise the editor.
 
 $Returns:		Pointer to the editor's window.

 $Arguments:	win - The editor window

*******************************************************************************/

static void AUI_edit_Init(T_MFW_HND win)
{
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
    T_AUI_EDITOR_INFO	*data		= (T_AUI_EDITOR_INFO *)win_data->user;
    T_ATB_TEXT			text;
	
	TRACE_FUNCTION("AUI_edit_Init()");

	data->editor->update = ED_UPDATE_FULL;
	data->predText.len = 0;					/* Blank out predictive text buffer */

	/* Set up title information */

	data->hasTitle	= FALSE;
	data->title.len = 0;						/* Blank out title buffer */
	
	if (data->editor_data.TitleId!=NULL)
	{
		data->hasTitle = TRUE;
		text.data = (UBYTE *)GET_TEXT(data->editor_data.TitleId);
	}
	else if (data->editor_data.TitleString!=NULL)
	{
		data->hasTitle = TRUE;
		text.data = data->editor_data.TitleString;
	}

	/* If title exists, get its dcs and length */
	
	if (data->hasTitle)
	{
		if (text.data[0]==0x80)
		{
			text.data += 2;		/* Skip over two unicode indicator bytes */
			text.dcs = ATB_DCS_UNICODE;
		}
#ifdef EASY_TEXT_ENABLED
		else if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
		{
			text.dcs = ATB_DCS_UNICODE;
		}
#endif
		else
		{
			text.dcs = ATB_DCS_ASCII;
		}
		
		text.len = ATB_string_Length(&text);

		/* Allocate memory for the title and copy the text there */
		data->title.data = (UBYTE *)ALLOC_MEMORY((text.len + 1)*ATB_string_Size(&text));
		
		ATB_string_Copy(&data->title, &text);
	}
	
    /* Set up correct parameters for easytext */
    
#ifdef EASY_TEXT_ENABLED
	if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA))
	{
		/* Allocate word buffer memory */

		data->predText.data = (UBYTE *)ALLOC_MEMORY((ED_PREDTEXT_MAX+1)*sizeof(UBYTE));
		data->predText.dcs = ATB_DCS_ASCII;
		data->predText.len = 0;
	
		FFS_flashData.PredTextAvailable = TRUE;
		Initialize_Dict(Mmi_getCurrentLanguage()/*SPR1508*/, 0);
		ResetDictSearch();
	}
#endif

	/* Initialise editor */
	
	ATB_edit_Init(data->editor);

	/* Initialise text entry */
	
	data->entry_data = AUI_entry_Create(data->win, data->editor, E_ED_UPDATE);
		
	/* If there's a timeout, create the timer */
	
    if (data->editor_data.timeout && (data->editor_data.timeout != FOREVER))
    {
        data->timer = tim_create(data->win, data->editor_data.timeout, (T_MFW_CB)AUI_edit_TimerCb);
        tim_start(data->timer);
    }
    else
    {
        data->timer = NULL;
    }

    /* Title timer, if required, is set up in WinCb */

	data->title_timer = NULL;
    
    return;
}


/*******************************************************************************

 $Function:		AUI_edit_Destroy

 $Description:	Destroy the editor.

 $Returns:		None.

 $Arguments:	window	-	The editor window.

*******************************************************************************/

void AUI_edit_Destroy(T_MFW_HND win)
{
	T_MFW_WIN			*win_data;
    T_AUI_EDITOR_INFO	*data;

#ifdef TRACE_AUIEditor
    TRACE_FUNCTION ("AUI_edit_Destroy()");
#endif

	if (win == NULL)
	{
#ifdef TRACE_AUIEditor
		TRACE_EVENT ("Error : Called with NULL Pointer");
#endif
		return;
	}
	// xreddymn Dec-21-2004 MMI-SPR-27382: Added NULL window handle check for AUI_edit_Destroy
	win_data	= ((T_MFW_HDR *)win)->data;
	if(win_data == NULL) return;
	data		= (T_AUI_EDITOR_INFO *)win_data->user;
    if (data)
    {
    	/* Free memory allocated for easytext buffer */
    	
#ifdef EASY_TEXT_ENABLED
		if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA) && data->predText.data )
		{
			TRACE_EVENT("Freeing predictive text buffer");
			FREE_MEMORY((void *)data->predText.data, (ED_PREDTEXT_MAX+1)*sizeof(UBYTE));
		}
#endif

		/* Free memory allocated for title */

		if (data->hasTitle)
		{
			FREE_MEMORY(data->title.data, (data->title.len + 1)*ATB_string_Size(&data->title));
		}

		/* Delete timers */

		if (data->timer)
		{
			tim_delete(data->timer);
			data->timer = NULL;
		}
		if (data->title_timer)
		{
			tim_delete(data->title_timer);
			data->title_timer = NULL;
		}
		
        win_delete (data->win);

		/* Free editor memory */
		
		AUI_entry_Destroy(data->entry_data);
		ATB_edit_Destroy(data->editor);
		FREE_MEMORY ((void *)data, sizeof (T_AUI_EDITOR_INFO));
    }
    
    return;
}


/*******************************************************************************

 $Function:    	AUI_edit_ExecCb

 $Description:	Dialog function for editor.
 
 $Returns:		None.

 $Arguments:	None.
 
*******************************************************************************/

static void AUI_edit_ExecCb(T_MFW_HND win, USHORT event, USHORT value, void *parameter)
{
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
    T_AUI_EDITOR_INFO	*data      = (T_AUI_EDITOR_INFO *)win_data->user;

    T_MFW_HND			parent_win	= data->parent;
    USHORT				alphachar;
 	/* Store these in case editor is destroyed on callback */
    USHORT				Identifier	= data->editor_data.Identifier;
    T_AUI_EDIT_CB		Callback	= data->editor_data.Callback;
    UBYTE				destroyEditor = data->editor_data.destroyEditor;

/* Mar 08, 2006    REF:ER OMAPS00065168  */
#ifdef NEPTUNE_BOARD
    UBYTE ringer;
#endif

#ifdef TRACE_AUIEditor
    TRACE_FUNCTION ("AUI_edit_ExecCb()");
#endif

    switch (event)
    {
    	/* Initialise */
    
        case E_ED_INIT:
        	TRACE_EVENT("E_ED_INIT");
			win_show(data->win);
			break;

      	/* Destroy the editor */
      	
      	case E_ED_DESTROY:
			AUI_edit_Destroy(data->win);   
      		break;
      		
      	/* De-initialise editor */
        case E_ED_DEINIT:
         	TRACE_EVENT("E_ED_DEINIT");

/* Mar 08, 2006    REF:ER OMAPS00065168  */
/* Stop playing ring tone on key press */
    #ifdef NEPTUNE_BOARD
            ringer = getcurrentSMSTone();
            audio_StopSoundbyID( AUDIO_BUZZER, ringer );

            vsi_t_sleep(0,10); /* small delay */
    #endif 

	        if (Callback)
    	    	(Callback) (parent_win, Identifier, value);

			if(destroyEditor)
            	AUI_edit_Destroy(data->win);   
            break;

		/* Insert a character */
		
		case E_ED_INSERT:
			alphachar = (USHORT)value;
			/* If value is set, insert character */
			if (alphachar!=NULL)
			{
	            ATB_edit_Char(data->editor, alphachar, TRUE);
#ifdef EASY_TEXT_ENABLED
				if(FFS_flashData.PredTextAvailable && FFS_flashData.PredTextSelected && ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT))
				{
		            if ((alphachar == UNICODE_FULLSTOP) ||(alphachar == UNICODE_EXCLAMATION)
		            	|| (alphachar == UNICODE_QUESTION))
		        	{
		             	ATB_edit_Char(data->editor, UNICODE_SPACE, TRUE);
		        	}
				}
#endif
			}
			else
			/* If parameter is set, insert string */
			if (parameter!=NULL)
			{
				ATB_edit_InsertString(data->editor, (T_ATB_TEXT *)parameter);
			}
			win_show(data->win);
			break;

		/* Update word wrap & redraw editor window */
		
		case E_ED_UPDATE:
			//ATB_edit_Refresh(data->editor); /* SPR#2342 - SH */
			win_show(data->win);
   			break;

        default:
		break;
    }
    return;
}


/*******************************************************************************

 $Function:		AUI_edit_WinCb

 $Description:	Editor window event handler.

 $Returns:		None.

 $Arguments:	event	- the event
 				win		- the editor window

*******************************************************************************/

static int AUI_edit_WinCb(T_MFW_EVENT event, T_MFW_WIN *win_data)
{
    T_AUI_EDITOR_INFO	*data			= (T_AUI_EDITOR_INFO *)win_data->user;
    T_ED_DATA			*editor			= data->editor;
	USHORT				scrollBarSize;
	USHORT				scrollBarPos;
	SHORT				editX			= editor->attr->win_size.px;
	SHORT				editY			= editor->attr->win_size.py;
	SHORT				editWidth		= editor->attr->win_size.sx;
	SHORT				editHeight		= editor->attr->win_size.sy;
	char				lengthIndC[12];

	/* Strings for the header */
	T_ATB_TEXT			string;
	USHORT				stringWidth;
	USHORT				stringHeight;
	T_ATB_TEXT			title;
	USHORT				titleWidth;
	USHORT				titleHeight;

	USHORT				textLen;
	static USHORT		oldTextLen = 0xFFFF;
	USHORT				startPos;
	static USHORT		oldStartPos = 0xFFFF;
	
	T_DS_TEXTFORMAT  	format;
	BOOL				showIcons;				/* Flag that stores whether icons (e.g. alignment icons) should be shown */
	T_ED_LINE			*line;
	USHORT				leftSK;
	USHORT				rightSK;
	USHORT				textIndex;
	T_ATB_TEXT			newTitle;
	USHORT				lastSpace;
	USHORT				character;
// Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460
#ifdef FF_MMI_SAT_ICON
	SHORT				titleIconWidth = 0;
	SHORT				iconX;
	SHORT				iconY;
#endif
	
#ifdef TRACE_AUIEditor
    TRACE_FUNCTION ("AUI_edit_WinCb()");
#endif

    if (!data)
		return MFW_EVENT_CONSUMED;
  
    switch(event)
    {
        case E_WIN_VISIBLE: 											/* window is visible */
            if (win_data->flags & E_WIN_VISIBLE)
			{
// Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460
#ifdef FF_MMI_SAT_ICON
				if (editor->attr->TitleIcon.data != NULL)
				{
					if (editor->attr->TitleIcon.width > TITLE_ICON_WIDTH) 
					{
						titleIconWidth = TITLE_ICON_WIDTH;
					}
					else
					{
						titleIconWidth = editor->attr->TitleIcon.width;
					}
				}			
				else
				{
					titleIconWidth = 0;
				}
#endif

				textLen = data->editor->attr->text.len;
				line = ATB_edit_LineGet(data->editor, data->editor->winStartLine);
				startPos = line->pos;

				if (editor->update==ED_UPDATE_TRIVIAL)
                                editor->update = ED_UPDATE_DEFAULT;

				TRACE_EVENT("Updating whole screen.");
				
				oldTextLen = textLen;
				oldStartPos = startPos;

				/* Show the edited text */
				/* Don't update editor text if in ED_UPDATE_PARTIAL */
				
				if (editor->update!=ED_UPDATE_PARTIAL)
				{
					ATB_edit_Show(data->editor);
				}
				
				/* Set the colour for drawing title and scrollbar */

				resources_setTitleColour(COLOUR_EDITOR);

				/* TITLE */

				if (data->editor_data.zone_id & ZONE_TITLE)
				{
					dspl_Clear(0,0, SCREEN_SIZE_X-1, editY-1);
				
					/* Display the title, if it exists */

					string.len = 0;
					string.dcs = ATB_DCS_ASCII;
					title.len = 0;
					title.dcs = ATB_DCS_ASCII;
		
					if (data->hasTitle)
					{
						title.data = data->title.data;
						title.len = data->title.len;
						title.dcs = data->title.dcs;
					}

					/* Uppercase/lowercase indicator */

					if (!ATB_edit_Mode(editor, ED_MODE_READONLY))
					{
						switch(ATB_edit_GetCasePref(editor))
						{
							case ED_CASEPREF_ALPHA_UC:
							case ED_CASEPREF_ALPHANUM_UC:
								string.data = (UBYTE *)ED_IND_UPPER;
								break;

							case ED_CASEPREF_ALPHA_LC:
							case ED_CASEPREF_ALPHANUM_LC:
								string.data = (UBYTE *)ED_IND_LOWER;
								break;
							
							case ED_CASEPREF_ALPHANUM:
								if (ATB_edit_GetCase(editor)==ED_CASE_UPPER)
									string.data = (UBYTE *)ED_IND_UPPER;
								else if (ATB_edit_GetCase(editor)==ED_CASE_LOWER)
									string.data = (UBYTE *)ED_IND_LOWER;
								else if (ATB_edit_GetCase(editor)==ED_CASE_CAPS)
									string.data = (UBYTE *)ED_IND_CAPS;
								else
									string.data = (UBYTE *)ED_IND_NUM;
								break;
								
							case ED_CASEPREF_NUM:
								string.data = (UBYTE *)ED_IND_NUM;
								break;

							default:
								string.data = (UBYTE *)ED_IND_NONE;
								break;
						}

						string.len = ATB_string_Length(&string);
						
#ifdef EASY_TEXT_ENABLED
						/* Display predicted word in header */

						if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected)
						{
							if (ATB_edit_CapitaliseWord(data->editor))	/* Word is capitalised */
								string.data = (UBYTE *)ED_IND_CAPS;
							else
								string.data = (UBYTE *)ED_IND_LOWER;
							string.len = ATB_string_Length(&string);
						
							if(data->predText.len!=0)
							{
								title.data = data->predText.data;
								title.len = data->predText.len;
								title.dcs = data->predText.dcs;
		                    }
						}
#endif
						if (ATB_edit_Mode(editor, ED_MODE_ALPHA) && title.len==0)
						{
							/* SPR#1995 - SH - 'size' includes null terminator, so
							 * remaining characters is size-1 */
#ifdef LSCREEN
							sprintf(lengthIndC, "%d/%d", textLen, editor->attr->size-1);
#else
							sprintf(lengthIndC, "%d", editor->attr->size-textLen-1);
#endif
								
							title.data = (UBYTE *)lengthIndC;
							title.len = ATB_string_Length(&title);
						}
					}

					/* Draw the string to the right of the editor - the case/format indicator, and icons (if appropriate) */

					stringWidth = 0;
					stringHeight = 0;
					showIcons = FALSE;
					
					if (string.len)
					{
					TRACE_EVENT("Displaying string on right");
						ATB_display_SetFormatAttr(&format, 0, FALSE);	/* Set format to format at cursor */						
						stringWidth = ATB_display_StringWidth(&string, &format)+2;
						stringHeight = ATB_display_StringHeight(&string, &format);
						ATB_display_Text(SCREEN_SIZE_X-stringWidth+2,0, &format, &string);
						showIcons = TRUE;				/* If showing case, show icons */
					}

#ifdef EASY_TEXT_ENABLED
					/* Display ezitext icon to the left of the case indicator */

					if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected == TRUE)
					{
						if (data->predText.len==0)		// Show icons only if there's no predicted text entry currently
							showIcons = TRUE;
						else
							showIcons = FALSE;
					}
#endif

					/* Show icons to the left of the case indicator */
					
					if (showIcons)
					{
						
#ifdef EASY_TEXT_ENABLED
						/*  Display ezitext icon to the left of the case indicator */
						if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected == TRUE)
						{
							stringWidth += 8;
							dspl_BitBlt(SCREEN_SIZE_X-stringWidth+2,
								0,8,8,0,(char*)TextIconeZiTextSmall,0);
						}
#endif

						if (stringHeight<Mmi_layout_line_height())
							stringHeight = Mmi_layout_line_height();
					}
					

					/* Draw the string to the left of the screen - the editor title, or the number of characters
					 * remaining free in the buffer, or the predicted text word. */

					titleWidth = 0;
					titleHeight = 0;
					
					if (title.len)
					{
						ATB_display_SetFormatAttr(&format, 0, FALSE);				/* Clear format */

						titleWidth = ATB_display_StringWidth(&title, &format)+2;
						titleHeight = ATB_display_StringHeight(&title, &format);

						/* Check to see if title fits into top line - if it doesn't,
						 * we will need display a section of it. */

						if (titleWidth>(SCREEN_SIZE_X-stringWidth-2))
						{
							/* Create timer if it doesn't exist */

							if (!data->title_timer)
							{
								data->title_timer = tim_create(data->win, 3000, (T_MFW_CB)AUI_edit_TitleTimerCb);
								data->title_pos = 0;
								data->title_next_pos = 0;
						        tim_start(data->title_timer);
						    }
						    
							titleWidth = 0;
							textIndex = data->title_pos;
							lastSpace = 0;

							while (titleWidth<(SCREEN_SIZE_X-stringWidth-2) && textIndex<title.len)
							{
								character = ATB_string_GetChar(&title, textIndex);
								titleWidth+=ATB_display_GetCharWidth(character, &format);
								textIndex++;
								if (character==UNICODE_SPACE)
									lastSpace = textIndex;
							}
								
							TRACE_EVENT_P1("Characters that fit: %d", textIndex);

							/* Calculate next start position */

							if (textIndex==title.len)
								data->title_next_pos = 0;
							else
							{
								/* Word wrap to last space, if there was one */
								
								if (lastSpace>0)
									textIndex = lastSpace;
								data->title_next_pos = textIndex;
							}

							TRACE_EVENT_P1("Next position: %d", data->title_next_pos);
								
							newTitle.len = textIndex-data->title_pos;
							newTitle.data = (UBYTE *)ALLOC_MEMORY((newTitle.len+1)*ATB_string_Size(&title));
							newTitle.dcs = title.dcs;

							for (textIndex=0; textIndex<newTitle.len; textIndex++)
							{
								ATB_string_SetChar(&newTitle, textIndex, ATB_string_GetChar(&title, data->title_pos+textIndex));
							}
							ATB_string_SetChar(&newTitle, newTitle.len, UNICODE_EOLN);
// Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460
#ifdef FF_MMI_SAT_ICON
							/* Check if the icon is self-explanatory, GSM 11.14, Sec 6.5.4, 12.32.
								If the icon is to displayed, move the text by icon width. */
							if (editor->attr->TitleIcon.selfExplanatory == FALSE)
								ATB_display_Text(titleIconWidth+1,0,&format, &newTitle);
#else
							ATB_display_Text(0,0,&format, &newTitle);
#endif
							FREE_MEMORY((UBYTE *)newTitle.data, (newTitle.len+1)*ATB_string_Size(&title));
						}
						else
// Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460
#ifdef FF_MMI_SAT_ICON
						{
							/* Check if the icon is self-explanatory, GSM 11.14, Sec 6.5.4, 12.32.
								If the icon is to displayed, move the text by icon width. */
							if (editor->attr->TitleIcon.selfExplanatory == FALSE)
								ATB_display_Text(titleIconWidth+1,0,&format, &title);
						}
#else
							ATB_display_Text(0,0,&format, &title);
#endif

#ifdef EASY_TEXT_ENABLED
						/* Provides a cursor in the predicted word, so the user can tell which of the characters
						 * entered are being used to select the word. */
						 
						if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected && data->predText.len!=0)
						{
							ATB_display_Cursor(&data->predText, data->predTextChar.pos, ED_CURSOR_BLOCK,
								data->predTextChar.lineWidth, 0, data->predTextChar.width, data->predTextChar.height);
	                    }
#endif
					}

// Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460
#ifdef FF_MMI_SAT_ICON
					if(editor->attr->TitleIcon.data != NULL)
					{

						if (titleHeight == 0)
							titleHeight = TITLE_ICON_HEIGHT;

						/* Display '?' icon if the size is bigger, 
							else display the icon*/
						if ((editor->attr->TitleIcon.width > TITLE_ICON_WIDTH) || (editor->attr->TitleIcon.height > TITLE_ICON_HEIGHT))
						{
							/* iconY calculates place hoilder to place the icon 
								at the center of the screen. */
							   iconX = 1;
							   iconY = 1+ ((titleHeight-2) / 2) - (10 / 2);
							   dspl_BitBlt2(iconX, iconY, 8, 
									10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
						}
						else
						{
							/* iconY calculates place hoilder to place the icon 
								at the center of the screen. */
							iconX = 1;
							iconY = 1+ ((titleHeight-2) / 2) - (editor->attr->TitleIcon.height / 2);
							dspl_BitBlt2(iconX, iconY, editor->attr->TitleIcon.width, editor->attr->TitleIcon.height, 
								(void*)editor->attr->TitleIcon.data, 0, BMP_FORMAT_256_COLOUR);
						}
					}
#endif					

					/* Draw line on top */
					
					if (stringHeight>titleHeight)
						titleHeight = stringHeight;

	/* Non colour display - draw line between title texts*/
#ifndef LSCREEN
					if (titleHeight>0)
					{
						if (stringWidth==0)
							stringWidth = 1;					/* Make sure end of line is on-screen */
						dspl_DrawLine(titleWidth, titleHeight/2, SCREEN_SIZE_X-stringWidth, titleHeight/2); /* Line between title & indicator */
					}
#endif
				}

				/* SCROLLBAR */
				
				if (data->editor_data.zone_id & ZONE_SCROLLBAR)
				{
					dspl_Clear(editX+editWidth, editY, editX+editWidth+ED_SCROLLBAR_WIDTH-1, editY+editHeight-1);
				
					/* Vertical scrollbar - only show if editor is taller than view size */

					if (editor->totalHeight > 0 && editor->viewHeight<editor->totalHeight)
					{
						dspl_DrawLine(editX+editWidth, editY, editX+editWidth, editY+editHeight-1);
						scrollBarSize = editor->viewHeight * editHeight / editor->totalHeight;
						if (scrollBarSize>editHeight)
							scrollBarSize = editHeight;
						scrollBarPos = editor->viewStartPos * editHeight / editor->totalHeight;

						dspl_DrawLine(editX+editWidth+1, editY+scrollBarPos, editX+editWidth+1,
							editY+scrollBarPos+scrollBarSize);
						dspl_DrawLine(editX+editWidth+2, editY+scrollBarPos, editX+editWidth+2,
							editY+scrollBarPos+scrollBarSize);
					}
				}

				/* SOFTKEYS */

				if (data->editor_data.zone_id & ZONE_SOFTKEYS)
				{
#ifdef EASY_TEXT_ENABLED
					/* If a word is being entered, display OK and Delete */

					if (ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT) && data->predText.len!=0 && FFS_flashData.PredTextSelected == TRUE)
					{
						leftSK = TxtSoftOK;
						rightSK = TxtDelete;
					}
					else
#endif
					{
					/* Entered less than the required number of chars: Alternate Left Softkey appears */
						if (textLen < data->editor_data.min_enter)
						{
							leftSK = data->editor_data.AltLeftSoftKey;
						}
						else
						{
							leftSK = data->editor_data.LeftSoftKey;
						}
					/* Buffer is empty and alternative rsk enabled: alternative rsk appears */
						if (textLen==0 && data->editor_data.change_rsk_on_empty)
						{
							rightSK = data->editor_data.AltRightSoftKey;
						}
						else
						{
							rightSK = data->editor_data.RightSoftKey;
						}
	                }
	                displaySoftKeys(leftSK, rightSK);
	        	}

	        	/* Finished drawing screen */
			}
            break;
            
        default:
            return MFW_EVENT_PASSED;
//            break;  // RAVI
    }

	data->editor->update = ED_UPDATE_DEFAULT;
	
    return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:		AUI_edit_KbdCb

 $Description:	Editor keyboard event handler

 $Returns:		None.

 $Arguments:	event		- the keyboard event
 				keyboard 

*******************************************************************************/

static int AUI_edit_KbdCb(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_AUI_EDITOR_INFO	*data		= (T_AUI_EDITOR_INFO *)win_data->user;
#if (BOARD != 61)	
	T_ATB_TEXT			*PredText	= &data->predText;
	USHORT				character;
#endif	
	ED_RES				result;
  	
	TRACE_FUNCTION("AUI_edit_KbdCb()");
	
    /* Suppress unwanted long keypresses */

	data->doNextLongPress = TRUE;         		/* next Key_long event is correct */

	/* Restart the timer */
	
    if (data->timer !=NULL)
	{
    	tim_stop(data->timer);
    	tim_start(data->timer);
	}

#ifdef EASY_TEXT_ENABLED
	if (FFS_flashData.PredTextSelected==FALSE || !ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT))
	{
	/* Predictive text is off */
#endif

	switch (keyboard->code)
	{
		/* UP key */
		
		case KCD_MNUUP:
			/* For DSample, up and down move cursor up and down a line in all modes */
#ifdef LSCREEN
			ATB_edit_MoveCursor(data->editor, ctrlUp, TRUE);

			/* For other samples, up and down move left and right when not in read only mode */
#else
			if (ATB_edit_Mode(data->editor, ED_MODE_READONLY))		/* Acts as up key in read-only mode */
			{
				ATB_edit_MoveCursor(data->editor, ctrlUp, TRUE);
			}
      		else
    		{
				ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);
			}
#endif
			data->editor->update = ED_UPDATE_TRIVIAL;		/* This flag speeds up update */
			win_show(data->win);
			break;

		/* DOWN key */
		
		case KCD_MNUDOWN:
			/* For DSample, up and down move cursor up and down a line in all modes */
#ifdef LSCREEN
			ATB_edit_MoveCursor(data->editor, ctrlDown, TRUE);

			/* For other samples, up and down move left and right when not in read only mode */
#else
			if (ATB_edit_Mode(data->editor, ED_MODE_READONLY))		/* Act as down key in read-only mode */
			{
				ATB_edit_MoveCursor(data->editor, ctrlDown, TRUE);
			}
      		else
    		{
        		ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE);		/* Otherwise, move cursor left */
      		}
#endif
			data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
			win_show(data->win);
			break;

		/* For DSample, left and right keys move cursor left and right */
#ifdef LSCREEN

		/* MENU LEFT */
		
		case KCD_MNULEFT:
			ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE);		/* Move cursor left */
			data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
			win_show(data->win);
			break;

		/* MENU RIGHT */
		
		case KCD_MNURIGHT:
			ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);		/* Move cursor right */
			data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
			win_show(data->win);
			break;
#endif

		/* LEFT SOFT KEY */
		
		case KCD_LEFT:
			if (data->editor_data.editor_attr.text.len < data->editor_data.min_enter)
			{
				/* Entered less than the required number of chars */
				if (data->editor_data.AltLeftSoftKey!=TxtNull)
				{
					/* an alternate softkey is defined: execute it */
					SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_ALTERNATELEFT, NULL);
				}
			}
			else if (data->editor_data.LeftSoftKey!=TxtNull)
			{
				/* Left Softkey is enabled (and entered sufficient number of chars): execute it
				 * get the orginal text back into the editor instead of the hide buffer ( only filled with '*') */
				if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))
				{
					ATB_edit_HiddenExit(data->editor);
				}
				SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_LEFT, NULL);
			}
			break;

		/* HANGUP key */

        case KCD_HUP:
            if (data->editor_data.RightSoftKey NEQ TxtNull)						/* Right softkey is enabled: execute it */
			{
				SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_HUP, NULL);		/* Deinitialise the editor */
            }
			break;

		/* SEND KEY */

		case KCD_CALL:
			if (data->editor_data.editor_attr.text.len >= data->editor_data.min_enter)
			{
				/* Send this event to generate an MO call in SMS editor */
				SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_CALL, NULL);
			}
			break;
		
		/* RIGHT SOFT KEY */

	    case KCD_RIGHT:
	    TRACE_EVENT("KCD_RIGHT");
	        if (ATB_edit_Mode(data->editor, ED_MODE_READONLY)) 					/* in read only mode, */
	        {
	        	TRACE_EVENT("SENDING DEINIT EVENT");
	        	SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL);		/* just deinitialise editor */
	        }
	        else															/* otherwise, RSK acts as clear key */
            {
            	/* If multitap is in progress, delete current character
				 * rather than previous character */

				if (data->editor->multitap)
				{
					AUI_entry_StopMultitap(data->entry_data); /* Cancel multitap */
					result = ATB_edit_DeleteRight(data->editor, TRUE); /* SPR#2342 - SH */
				}
				else
				{
	            	result = ATB_edit_DeleteLeft(data->editor, TRUE); /* SPR#2342 - SH */
				}
				
	            /* If we delete from first character in the editor, exit editor */
	            if (result==ED_DONE)
	            {
					SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL);
	            }
	            else
	            {
		            win_show(data->win);
	            }
            }
			break;

		/* Switch text mode: uppercase, lowercase */
		case KCD_HASH:
			if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA))
			{				
				 // Jul 22,2004 CRR:21605 xrashmic - SASKEN
				 // The user has explicitly changed the case. When
				 // the editor becomes empty, we should not reset the 
				 // case to sentence case
				CaseChanged=TRUE;
				switch(ATB_edit_GetCase(data->editor))
				{
					case ED_CASE_LOWER:
						 // Jul 22,2004 CRR:21605 xrashmic - SASKEN
						 // The user has changed the case to sentence case.
						 // when the editor becomes empty, we have to reset 
						 // the case to sentence case.
						CaseChanged=FALSE;
						ATB_edit_SetCase(data->editor, ED_CASE_CAPS);
						break;
					case ED_CASE_CAPS:
						ATB_edit_SetCase(data->editor, ED_CASE_UPPER);
						break;
					case ED_CASE_UPPER:
						ATB_edit_SetCase(data->editor, ED_CASE_LOWER);

						/* If easy text selected, switch to it */
#ifdef EASY_TEXT_ENABLED
  						if (ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextAvailable)
						{
							FFS_flashData.PredTextSelected = TRUE;
						}
#endif
						break;
					case ED_CASE_NUM:
						ATB_edit_SetCase(data->editor, ED_CASE_LOWER);
						break;
				}
			}
			else
			{
				/* SPR#1788 - SH - Forbid '#' entry in read only mode */
			 if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY))
				AUI_entry_EventKey(data->entry_data, event, keyboard);
			}

			win_show(data->win);
			break;

		case (KCD_STAR):
			/* If we're in apha mode and not in read-only mode, display the symbol screen */	
			if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA) && !ATB_edit_Mode(data->editor, ED_MODE_READONLY))
			{
				AUI_symbol_Start (data->win, E_ED_INSERT);
			}
			else
			{
			/* SPR#1788 - SH - Allow '*' to be entered in numeric mode */
			 if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY))
				AUI_entry_EventKey(data->entry_data, event, keyboard);
			}

			win_show(data->win);
			break;

		/* KEY ENTRY 0 - 9 */
		
		case KCD_0:
		case KCD_1:
		case KCD_2:
		case KCD_3:
		case KCD_4:
		case KCD_5:
		case KCD_6:
		case KCD_7:
		case KCD_8:
		case KCD_9:
            if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY))
			{
                AUI_entry_EventKey(data->entry_data, event, keyboard);
                win_show(data->win);
        	}
			break;
		}

#ifdef EASY_TEXT_ENABLED
		}
	else
	
	/* Short key press in EasyText */

		{
		if(FFS_flashData.PredTextAvailable == TRUE)
		{
	        switch (keyboard->code)
            {
				case KCD_MNUUP:
					if(PredText->len==0)
					{
#ifdef LSCREEN
						ATB_edit_MoveCursor(data->editor, ctrlUp, TRUE);

					/* For other samples, up and down move left and right when not in read only mode */
#else
						ATB_edit_MoveCursor(data->editor,ctrlRight, TRUE);
#endif
						data->editor->update = ED_UPDATE_TRIVIAL;		/* This flag speeds up update */
						win_show(data->win);
					}	
					break;

				case KCD_MNUDOWN:
					if(PredText->len==0)
					{
#ifdef LSCREEN
						ATB_edit_MoveCursor(data->editor, ctrlDown, TRUE);

					/* For other samples, up and down move left and right when not in read only mode */
#else
						ATB_edit_MoveCursor(data->editor,ctrlLeft, TRUE);
#endif
						data->editor->update = ED_UPDATE_TRIVIAL;		/* This flag speeds up update */
						win_show(data->win);
					}
					break;

#ifdef LSCREEN
				case KCD_MNURIGHT:
					if(PredText->len==0)
					{
						ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);
						data->editor->update = ED_UPDATE_TRIVIAL;		/* This flag speeds up update */
						win_show(data->win);
					}
					break;

				case KCD_MNULEFT:
					if(PredText->len==0)
					{
						ATB_edit_MoveCursor(data->editor,ctrlLeft, TRUE);
						data->editor->update = ED_UPDATE_TRIVIAL;		/* This flag speeds up update */
						win_show(data->win);
					}
					break;
#endif

				case KCD_LEFT:
					if(PredText->len==0)
					{
						if (data->editor_data.LeftSoftKey NEQ TxtNull)
						{
							SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_LEFT, NULL);
						}
					}
					else
					{
						if ((data->editor_data.editor_attr.text.len + PredText->len) < data->editor_data.editor_attr.size)
						{
							if (ATB_string_GetChar(PredText,0)!=UNICODE_STAR)
							{
								/* Capitalise first letter of words and the letter 'I' */
								
								if (ATB_edit_CapitaliseWord(data->editor) || (PredText->len==1 && ATB_string_GetChar(PredText, 0)==ATB_char_Unicode('i')))
								{
									ATB_string_SetChar(PredText, 0,  ATB_edit_FindCapital(ATB_string_GetChar(PredText, 0)));/*SPR1508*/
								}
								character = ATB_edit_GetCursorChar(data->editor, -1);
								
								if ( character != UNICODE_SPACE && character != UNICODE_EOLN)
								{
									ATB_string_MoveRight(PredText,0,1,ED_PREDTEXT_MAX);
									ATB_string_SetChar(PredText, 0, UNICODE_SPACE);
								}
								ATB_edit_InsertString(data->editor,PredText);
							}
						}
						ResetDictSearch();
						AUI_edit_ClearPredText(data);
						ATB_edit_SetCase(data->editor, ED_CASE_LOWER);
						win_show(data->win);
					}
					break;

				case KCD_HUP:
					if (data->editor_data.RightSoftKey NEQ TxtNull)			/* Right softkey is enabled: execute it */
					{
						SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_HUP, NULL);
					}
					break;

				case KCD_RIGHT:
					if(PredText->len==0)
					{
						if(ATB_string_GetChar(&data->editor_data.editor_attr.text, 0)!=UNICODE_EOLN)
						{
							ATB_edit_Char(data->editor,ctrlBack,TRUE);
							win_show(data->win);
						}
						else
						{
							/* leave editor if buffer already empty */
							SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL);
						}
					}
					else
					{
						if (PredText->len==1)
						{
							DictBackSpace((char *)data->predText.data);
							AUI_edit_ClearPredText(data);
							ATB_edit_SetCase(data->editor, ED_CASE_LOWER);
						}
						else
						{
							DictBackSpace((char *)data->predText.data);
							data->predTextChar.pos--;						/* char deleted, move cursor pos back */
							AUI_edit_CalcPredText(data);
						}
						win_show(data->win);
					}
					break;

				case KCD_2:
				case KCD_3:
				case KCD_4:
				case KCD_5:
				case KCD_6:
				case KCD_7:
				case KCD_8:
				case KCD_9:
					if (PredText->len==0)
					{
						AUI_edit_ClearPredText(data);
					}
					if (DictAlphaKeyPress(keyboard->code,(char *)PredText->data))
					{	
						PredText->len = ATB_string_Length(PredText);
						data->predTextChar.pos++;			/* The keypress was used to find a word, advance cursor */
						AUI_edit_CalcPredText(data);
					}
					win_show(data->win);
					break;

				case KCD_HASH:
					switch(ATB_edit_GetCase(data->editor))
					{
						/* Press # once to switch into capitalise mode */
						case ED_CASE_CAPS:
							ATB_edit_SetCase(data->editor, ED_CASE_LOWER);
							/* Switch out of easy text mode, if we're not entering a word */
							if (PredText->len==0)
							{
								FFS_flashData.PredTextSelected = FALSE;
							}
							break;
						default:
							ATB_edit_SetCase(data->editor, ED_CASE_CAPS);
							break;
					}
					win_show(data->win);
					break;

				case KCD_STAR:
					if (PredText->len==0)
					{
						AUI_symbol_Start (data->win, E_ED_INSERT);
					}
					else
					{
						int i;
						MoreCandidates((char *)PredText->data, &i);
						AUI_edit_CalcPredText(data);
						win_show(data->win);
					}
					break;

				case KCD_0:
				case KCD_1:
					if (PredText->len!=0)
					{	
						if ((data->editor_data.editor_attr.text.len + PredText->len) < MAX_MSG_LEN)
						{
							/* If char b4 cursor full stop/question/exclamation (or last char space and char b4 full stop) */
							if (ATB_edit_CapitaliseWord(data->editor) || (PredText->len==1 && ATB_string_GetChar(PredText,0)==ATB_char_Unicode('i')))
								ATB_string_SetChar(PredText, 0, ATB_edit_FindCapital(ATB_string_GetChar(PredText, 0)));/*SPR1508*/

							/* Capitalise first letter of char. If char before cursor not space, insert space */
							character = ATB_edit_GetCursorChar(data->editor, -1);

							if (ATB_string_GetChar(PredText, 0) != UNICODE_STAR)
							{								
								if (keyboard->code == KCD_1)
								{
									/* Insert space at end of string */
									ATB_string_SetChar(PredText, PredText->len, UNICODE_SPACE);
									PredText->len++;
									ATB_string_SetChar(PredText, PredText->len, UNICODE_EOLN);
									
									if ( character!=UNICODE_SPACE && character!=UNICODE_EOLN)
									{
										/* Insert space at start of string */
										ATB_string_MoveRight(PredText, 0, 1, ED_PREDTEXT_MAX);
										ATB_string_SetChar(PredText, 0, UNICODE_SPACE);
									}
								}
								else
								{
									/* Insert space and full stop at end of string */
									ATB_string_SetChar(PredText, PredText->len, UNICODE_FULLSTOP);
									PredText->len++;
									ATB_string_SetChar(PredText, PredText->len, UNICODE_SPACE);
									PredText->len++;
									ATB_string_SetChar(PredText, PredText->len, UNICODE_EOLN);
									
									if ( character!=UNICODE_SPACE && character!=UNICODE_EOLN)
									{
										/* Insert space at start of string */
										ATB_string_MoveRight(PredText, 0, 1, ED_PREDTEXT_MAX);
										ATB_string_SetChar(PredText, 0, UNICODE_SPACE);
									}
								}
								ATB_edit_InsertString(data->editor, PredText);
							}
						}
						AUI_edit_ClearPredText(data);
						ResetDictSearch();
						ATB_edit_SetCase(data->editor, ED_CASE_LOWER);
						win_show(data->win);
					}
				break;

				/* Any key */
				
				default:
					if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY)) /* ignore normal keys if in read-only mode */
					{
						AUI_entry_EventKey(data->entry_data, event, keyboard);
						ATB_edit_Char(data->editor,ctrlBack,TRUE);
						win_show(data->win);
					}
				break;
				}
			}
		}
#endif
	
    return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:		AUI_edit_KbdLongCb

 $Description:	Editor keyboard event handler for long keypresses

 $Returns:		None.

 $Arguments:	event		- the keyboard event
 				keyboard 

*******************************************************************************/

static int AUI_edit_KbdLongCb(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_AUI_EDITOR_INFO	*data		= (T_AUI_EDITOR_INFO *)win_data->user;

#if (BOARD != 61)	
	T_ATB_TEXT			*PredText	= &data->predText;
#endif

	ED_RES				result;
  
#ifdef TRACE_AUIEditor
	TRACE_FUNCTION("AUI_edit_KbdLongCb()");
#endif

    /* Suppress unwanted long keypresses */

	if ( data->doNextLongPress )
		data->doNextLongPress = FALSE;       			/* mark Key_long event as consumed but do current long press */
 	// Jul 29, 2004         REF: CRR:20892 xrashmic - SASKEN
	// Description: By Long press on Left/Right key at 'Message Editor' screen, 
	// cursor not scrolling continuously
	// Fix: The continuous long press of a key was being ignored for all keys. 
	// Now only for left and right keys this is handled.
	else if(!(keyboard->code==KCD_MNULEFT ||keyboard->code== KCD_MNURIGHT))
	{
		return MFW_EVENT_CONSUMED;      		/* don't do current long press */
	}

	/* Restart the timer */
	
    if (data->timer !=NULL)
	{
    	tim_stop(data->timer);
    	tim_start(data->timer);
	}

#ifdef EASY_TEXT_ENABLED
	if (FFS_flashData.PredTextSelected == FALSE || !ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT)) {
	/* Predictive text is off */
#endif

	switch (keyboard->code)
	{
	 	// Jul 29, 2004         REF: CRR:20892 xrashmic - SASKEN
		// Description: By Long press on Left/Right key at 'Message Editor' screen, 
		// cursor not scrolling continuously
		// Fix: The Long press of left/right key is now handled in AUI_edit_KbdLongCB.
		case KCD_MNULEFT:
			ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE);		/* Move cursor left */
			data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
			win_show(data->win);
			break;
		case KCD_MNURIGHT:
			ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);		/* Move cursor right */
			data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
			win_show(data->win);
			break;

		case KCD_RIGHT:
			result = ATB_edit_ClearAll(data->editor);						/* Otherwise, clear the editor */	

			/* If buffer is empty, right soft key causes exit from editor */
			if (result==ED_DONE)
			{
				SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL);
			}
			else
			{
				win_show(data->win);
			}
			break;

		/* KEY ENTRY 0 */
		
		case KCD_0:
			/* Alpha mode: insert a '0' */
			if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA))
			{
				if (keyboard->code<=KCD_HASH)
				{
					ATB_edit_DeleteLeft(data->editor, FALSE);  /* SPR#2342 - SH */
					AUI_entry_EditDigit(data->entry_data, keyboard->code);	// enter the character, not multi-tap
					win_show(data->win);
				}
			}

			/* Number mode: insert a '+'*/
			else if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY))			/* ignore normal keys if in read-only mode */
			{
				if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN))								/* in hidden mode do not allow entering of '+' */
				{
					ATB_edit_DeleteLeft(data->editor, TRUE); /* remove the '0'. SPR#2342 - SH */
				}
				else
				{
					ATB_edit_Char(data->editor,ctrlBack,FALSE); 				/* remove the '0' */
					ATB_edit_Char(data->editor,UNICODE_PLUS,TRUE);    			/* insert the '+' */
				}
				win_show(data->win);
			}
			break;
		case (KCD_STAR):
			/* MZ cq11414 add Pause Character */
			ATB_edit_DeleteLeft(data->editor, FALSE);

			//Sep 2, 2004    REF: CRR 21370 xkundadu
			//Changed the long press of '*' key to display 'w'
    			AUI_entry_EditChar(data->entry_data, ATB_char_Unicode('w'), FALSE);
			win_show(data->win);
			break;

		case (KCD_HASH):

			/* In alphanumeric mode, a long hold of # selects number case */
			if (ATB_edit_GetCasePref(data->editor)==ED_CASEPREF_ALPHANUM)
				ATB_edit_SetCase(data->editor, ED_CASE_NUM);
			else 
			{ 
				/* MZ cq11414 add Wait  Character */			
				ATB_edit_DeleteLeft(data->editor, FALSE);

				//Sep 2, 2004    REF: CRR 21370 xkundadu
				//Changed the long press of '#' key to display 'p'
	    			AUI_entry_EditChar(data->entry_data, ATB_char_Unicode('p'), FALSE);
			}
			win_show(data->win);
			break;

		/* KEY ENTRY 1 - 9 */
		
		case KCD_1:
		case KCD_2:
		case KCD_3:
		case KCD_4:
		case KCD_5:
		case KCD_6:
		case KCD_7:
		case KCD_8:
		case KCD_9:
			/* Insert equivalent numeric character, only possible in Alpha modes */
			if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA))
			{
				if (keyboard->code<=KCD_HASH)
				{
					ATB_edit_DeleteLeft(data->editor, FALSE); /* SPR#2342 - SH */
					AUI_entry_EditDigit(data->entry_data, keyboard->code);	// enter the character, not multi-tap
					win_show(data->win);
				}
			}
			break;

		}
	
#ifdef EASY_TEXT_ENABLED
	}
	else
	{
		if(FFS_flashData.PredTextAvailable == TRUE)
		{
			switch (keyboard->code)
			{
			 	// Jul 29, 2004         REF: CRR:20892 xrashmic - SASKEN
				// Description: By Long press on Left/Right key at 'Message Editor' 
				// screen,  cursor not scrolling continuously
				// Fix: The Long press of left/right key is now handled in
				// AUI_edit_KbdLongCB.
				case KCD_MNULEFT:
					ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE);		/* Move cursor left */
					data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
					win_show(data->win);
					break;		
				case KCD_MNURIGHT:
					ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE);		/* Move cursor right */
					data->editor->update = ED_UPDATE_TRIVIAL;				/* This flag speeds up update - no change to text */
					win_show(data->win);
					break;

				case KCD_RIGHT: 								/*empty predictive text string */
					if(PredText->len!=0)
					{
						PredText->len = 0;
						ATB_string_SetChar(PredText, 0, UNICODE_EOLN);
						ResetDictSearch();
						win_show(data->win);
					}
					else 										/*empty whole editor */
					{
						if(data->editor_data.editor_attr.text.len > 0 )
						{
							ATB_edit_ClearAll(data->editor);
							win_show(data->win);
						}
						else
						{
							/* leave editor if buffer already empty */
							SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL);
						}
					}
					break;

				case(KCD_STAR):
					AUI_symbol_Start(data->win, E_ED_INSERT);
					break;

				case (KCD_HASH):
					break;

				/* KEY ENTRY 1 - 9 */

				case KCD_0:
				case KCD_1:
				case KCD_2:
				case KCD_3:
				case KCD_4:
				case KCD_5:
				case KCD_6:
				case KCD_7:
				case KCD_8:
				case KCD_9:
					if(PredText->len==0)
					{
						/* Insert equivalent numeric character, only possible in Alpha modes */
						if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA))
						{
							if (keyboard->code<=KCD_HASH)
							{
								ATB_edit_DeleteLeft(data->editor, FALSE); /* SPR#2342 - SH */
								AUI_entry_EditDigit(data->entry_data, keyboard->code);	// enter the character, not multi-tap
							}
						}
						win_show(data->win);
					}
					break;
			}
		}
	}
	#endif

	return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:    	AUI_edit_TimerCb

 $Description:	Callback function for the editor info timer.
 
 $Returns:		None.

 $Arguments:	event	- the event type
 				timer	- the timer
 
*******************************************************************************/

static int AUI_edit_TimerCb (T_MFW_EVENT event, T_MFW_TIM *timer)
{
    T_MFW_HND			win			= mfw_parent (mfw_header());
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
    T_AUI_EDITOR_INFO 	*data		= (T_AUI_EDITOR_INFO *)win_data->user;

//    T_MFW_HND			parent_win	= data->parent;  // RAVI
//    USHORT				Identifier	= data->editor_data.Identifier;  // RAVI
//    T_AUI_EDIT_CB			Callback	= data->editor_data.Callback;  // RAVI

	TRACE_FUNCTION("AUI_edit_TimerCb");

#if 0
    AUI_edit_Destroy(data->win);

    if (Callback)
        (Callback) (parent_win, Identifier, INFO_TIMEOUT);
#else
	SEND_EVENT (win, E_ED_DEINIT, INFO_TIMEOUT, NULL);
#endif

    return MFW_EVENT_CONSUMED;
}

/*******************************************************************************

 $Function:    	AUI_edit_TitleTimerCb

 $Description:	Callback function for the editor title timer.  Recalculates title_pos so that
 				the next part of the string is displayed.
 
 $Returns:		None.

 $Arguments:	event	- the event type
 				timer	- the timer
 
*******************************************************************************/

static int AUI_edit_TitleTimerCb (T_MFW_EVENT event, T_MFW_TIM *timer)
{
   	/* Use the mfwHeader property of the timer to get the window */
    T_MFW_HND			win			= mfw_parent(timer->mfwHeader); 
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
    T_AUI_EDITOR_INFO 	*data		= (T_AUI_EDITOR_INFO *)win_data->user;

	TRACE_FUNCTION("AUI_edit_TitleTimerCb");

	/* SPR#1597 - SH - Since there may be multiple timers running at once, only
	call win_show if the window is focussed. */
	
	if (winIsFocussed(win))
	{
		if (data->title_next_pos!=data->title_pos)
		{
			data->title_pos = data->title_next_pos;
		}

		data->editor->update = ED_UPDATE_PARTIAL;  /* Don't update editor text */
		win_show(data->win);

		tim_start(data->title_timer);
	}
	
    return MFW_EVENT_CONSUMED;
}


/*******************************************************************************

 $Function:		AUI_edit_CalcPredText

 $Description:	Calculate properties of predicted text string.

 $Returns:		None.

 $Arguments:	data	- The AUI editor data
 
*******************************************************************************/

static void AUI_edit_CalcPredText(T_AUI_EDITOR_INFO *data)
{
	USHORT character;
	T_ATB_TEXT dummy;

	data->predText.len = ATB_string_Length(&data->predText);

	/* Get position of current entry */
	dummy.data = data->predText.data;
	dummy.dcs = data->predText.dcs;
	dummy.len = data->predTextChar.pos;
	data->predTextChar.lineWidth = ATB_display_StringWidth(&dummy, &data->predTextChar.format);
 	data->predTextChar.lineHeight = ATB_display_StringHeight(&dummy, &data->predTextChar.format);
 
	/* Get width and height of current character */
	character = ATB_string_GetChar(&data->predText, data->predTextChar.pos);
	data->predTextChar.width = ATB_display_GetCharWidth(character, &data->predTextChar.format);
	data->predTextChar.height = ATB_display_GetCharHeight(character, &data->predTextChar.format);

	return;
}


/*******************************************************************************

 $Function:		AUI_edit_ClearPredText

 $Description:	Clear the predictive text buffer

 $Returns:		None.

 $Arguments:	data	- The AUI editor data
 
*******************************************************************************/

static void AUI_edit_ClearPredText(T_AUI_EDITOR_INFO *data)
{
	data->predText.len = 0;
	ATB_string_SetChar(&data->predText,0,UNICODE_EOLN);
	memset(&data->predTextChar, 0, sizeof(T_ED_CHAR));
	return;
}


/*******************************************************************************

 $Function:		AUI_edit_InsertString

 $Description:	Insert a string into the editor
 
 $Returns:		Pointer to the editor's window.

 $Arguments:	win		- The editor window
 				string	- The string to insert
				dcs		- The dcs of the string
	
*******************************************************************************/

void AUI_edit_InsertString(T_MFW_HND win, UBYTE *string, T_ATB_DCS dcs)
{
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
    T_AUI_EDITOR_INFO	*data		= (T_AUI_EDITOR_INFO *)win_data->user;
	T_ATB_TEXT			text;

	text.data = string;
	text.dcs = dcs;
	text.len = ATB_string_Length(&text);
	
    ATB_edit_InsertString(data->editor, &text);

	return;
}


/*******************************************************************************

 $Function:		AUI_edit_InsertChar

 $Description:	Insert a character into the editor
 
 $Returns:		Pointer to the editor's window.

 $Arguments:	win			- The editor window
 				character	- The character to insert
	
*******************************************************************************/

void AUI_edit_InsertChar(T_MFW_HND win, USHORT character)
{
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
    T_AUI_EDITOR_INFO	*data		= (T_AUI_EDITOR_INFO *)win_data->user;

    ATB_edit_Char(data->editor, character, TRUE);

	return;
}


/*******************************************************************************

 $Function:		AUI_edit_GetSpecificWindowSIze
 
 $Description:	Sets up window size

 $Returns:		None.

 $Arguments:	attr	- The ATB editor attributes
 				zone_id	- Specifies the window size (See ZONE_... in header file)

*******************************************************************************/
#ifndef LSCREEN
//Sizes defined for CSAMPLE editore
#define BOOKDETAILS_EDITOR_SIZE 		0, 0, SCREEN_SIZE_X-4, Mmi_layout_line(LAST_LINE_TOP)
#define NUMBER_EDITOR_SIZE				0, 12, SCREEN_SIZE_X , MNU3LINE
#define PHONEBOOK_DLG_EDITOR_SIZE		4, Mmi_layout_line(3)+2, SCREEN_SIZE_X-4, SCREEN_SIZE_Y-(Mmi_layout_line(3)+2)
#define BOOKSDN_EDITOR_SIZE 			34, Mmi_layout_line(3)+2, 50, Mmi_layout_line(1)+2

//MMIbooksearchwindow
//#define BOOKSEARCH_EDITOR_SIZE 			0, Mmi_layout_line(SECOND_LAST_LINE_TOP), SCREEN_SIZE_X, Mmi_layout_line(1)

//MMICall
#define CALL_EDITOR_SIZE				4,28,SCREEN_SIZE_X-4, 20
#define CALLSCRATCHPAD_EDITOR_SIZE		6, Mmi_layout_line(2),SCREEN_SIZE_X-6, 16

//MMIServices
#define SERVICE_CREATE_EDITOR_SIZE		4,Mmi_layout_line(1)+2,SCREEN_SIZE_X-4, MNU3LINE
#define PASSWORD_EDITOR_SIZE			0, 12, SCREEN_SIZE_X , 13
#define EM_EDITOR_SIZE					0, 0, SCREEN_SIZE_X-4, Mmi_layout_line(LAST_LINE_TOP)

//From MMIIdle
//GW Changed window height from 30 (27?) to 24.
#define WIN_DIALLING_SIZE				0,Mmi_layout_line_icons(2), SCREEN_SIZE_X,24
#define WIN_DIALLING_C_SIZE 			0,Mmi_layout_line_icons(1),SCREEN_SIZE_X,32

//Positions for editor windows in mmismssend
#define PHNO_EDITOR_SIZE 				0, (Mmi_layout_line(1)+2), SCREEN_SIZE_X, 20

//NB defines below used twice, second time START/SIZE_Y was same as START/SIZE_Y above 
#define CENTRE_EDITOR_SIZE				0, Mmi_layout_line(1), SCREEN_SIZE_X, MNU3LINE+3

//And for MMIServices - moved here from mmiservices.c
#define SAT_EDITOR_SIZE	 				6,30,SCREEN_SIZE_X-6, 20

#define RPWD_EDITOR_SIZE				0,12,SCREEN_SIZE_X,13

//MMIBookCallDetails
#define PHB_EDITOR_SIZE  				4,0,SCREEN_SIZE_X-4, ALLBUT2LINE

//MMIPins
#define PIN_EDIT_RESET_SIZE 			12,20,84-12,16

//MMITimeDate
#define TIMEDATE_EDITOR_AREA_SIZE 0,10,70,10
#endif
/* GW SPR#1840 26/03/03 - Copied from MMieditor.c*/
static void setSize(T_ATB_WIN_SIZE *win, int px, int py, int sx, int sy)
{
	win->px = px;	win->py = py;
	win->sx = sx;	win->sy = sy;
}

void AUI_edit_GetSpecificWindowSize(T_ED_ATTR* attr, int zone_id )
{
	switch (zone_id)
	{
		case ZONE_SMALL_EDITOR:
			attr->win_size.px = 6;
			attr->win_size.py = Mmi_layout_IconHeight()*2;
			attr->win_size.sx = SCREEN_SIZE_X-attr->win_size.px;
			attr->win_size.sy = Mmi_layout_line_height()*2+4;
			break;
			
		case ZONE_BOTTOM_LINE:
			attr->win_size.px = 0;
			attr->win_size.py = SCREEN_SIZE_Y - Mmi_layout_line_height() - Mmi_layout_softkeyHeight();
			attr->win_size.sx = SCREEN_SIZE_X-attr->win_size.px;
			attr->win_size.sy = Mmi_layout_line_height();
			break;
			
		case ZONE_BOTTOM_LINE_FIND: //used for phonebook search
			attr->win_size.px = dspl_GetTextExtent(MmiRsrcGetText(TxtFind),0); 
			attr->win_size.py = SCREEN_SIZE_Y - Mmi_layout_line_height() - Mmi_layout_softkeyHeight();
			attr->win_size.sx = SCREEN_SIZE_X-attr->win_size.px;
			attr->win_size.sy = Mmi_layout_line_height();
			break;
		
#ifndef LSCREEN
		case BOOKDETAILS_EDITOR: 		setSize(&attr->win_size,BOOKDETAILS_EDITOR_SIZE);		break;
		case NUMBER_EDITOR:			 	setSize(&attr->win_size,NUMBER_EDITOR_SIZE);				break;
		case PHONEBOOK_DLG_EDITOR:		setSize(&attr->win_size,PHONEBOOK_DLG_EDITOR_SIZE);		break;
		case BOOKSDN_EDITOR:			setSize(&attr->win_size,BOOKSDN_EDITOR_SIZE);			break;
	//	case BOOKSEARCH_EDITOR:		 	setSize(&attr->win_size,BOOKSEARCH_EDITOR_SIZE);			break;
		case CALL_EDITOR: 			 	setSize(&attr->win_size,CALL_EDITOR_SIZE);				break;
		case CALLSCRATCHPAD_EDITOR:		setSize(&attr->win_size,CALLSCRATCHPAD_EDITOR_SIZE);		break;
		case SERVICE_CREATE_EDITOR:		setSize(&attr->win_size,SERVICE_CREATE_EDITOR_SIZE);		break;
		case PASSWORD_EDITOR:			setSize(&attr->win_size,PASSWORD_EDITOR_SIZE);			break;
		case EM_CREATE_EDITOR:			setSize(&attr->win_size,EM_EDITOR_SIZE);				break;/*SPR#1840*/
		
		case WIN_DIALLING:				
		case WIN_DIALLING_CB:				
				if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
					setSize(&attr->win_size,WIN_DIALLING_C_SIZE);
				else
					setSize(&attr->win_size,WIN_DIALLING_SIZE);
				break;
		case WIN_DIALLING_SMS:		 	
				if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
				{
					setSize(&attr->win_size,0,Mmi_layout_line_icons(1),SCREEN_SIZE_X,24);/*SPR#1840*/
				}
				else
					setSize(&attr->win_size,WIN_DIALLING_SIZE);
				break;
		case WIN_DIALLING_SAT:		 	
				if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE)
					setSize(&attr->win_size,WIN_DIALLING_C_SIZE);
				else
					setSize(&attr->win_size,WIN_DIALLING_SIZE);
				break;
		
		case PHNO_EDITOR:			 	setSize(&attr->win_size,PHNO_EDITOR_SIZE);				break;
		case CENTRE_EDITOR:				setSize(&attr->win_size,CENTRE_EDITOR_SIZE);				break;
		case SAT_EDITOR	:			 	setSize(&attr->win_size,SAT_EDITOR_SIZE);				break;
		case RPWD_EDITOR:			 	setSize(&attr->win_size,RPWD_EDITOR_SIZE);				break;
		case PHB_EDITOR: 			 	setSize(&attr->win_size,PHB_EDITOR_SIZE);				break;
		case PIN_EDIT_RESET:			setSize(&attr->win_size,PIN_EDIT_RESET_SIZE);			break;
		case TIMEDATE_EDITOR_AREA:		setSize(&attr->win_size,TIMEDATE_EDITOR_AREA_SIZE);		break;
#endif	
		default:
			break;
	}
}

/*******************************************************************************

 $Function:		AUI_edit_CalculateWindow
 
 $Description:	Sets up window size

 $Returns:		None.

 $Arguments:	attr	- The ATB editor attributes
 				zone_id	- Specifies the window size (See ZONE_... in header file)
 				SPR#1559 - SH - this is now a pointer to the zone_id, allowing
 							the zone_id to be modified by this function

*******************************************************************************/

void AUI_edit_CalculateWindow(T_ED_ATTR* attr, int *zone_id_pointer )
{
	int zone_id = *zone_id_pointer;
	
	attr->win_size.px = 0;
	attr->win_size.py = 0;
	attr->win_size.sx = SCREEN_SIZE_X;
	attr->win_size.sy = SCREEN_SIZE_Y;
	
	if (zone_id == ZONE_BORDER_EDITOR)
	{	//Leave border on left/right of screen.
		attr->win_size.px = 4;
		attr->win_size.sx = attr->win_size.sx - 2*attr->win_size.px;
		zone_id = ZONE_FULLSOFTKEYS;
		*zone_id_pointer = zone_id;
	}
	else if ((zone_id != 0x0000) && ((zone_id &0xF000)==0xF000))/*SPR#1840*/
	{
		AUI_edit_GetSpecificWindowSize(attr,zone_id);
	    return;
	}
	else if (zone_id == 0)
	{
		zone_id = ZONE_FULLSOFTKEYS;
		*zone_id_pointer = zone_id;
	}
	
	if (zone_id & ZONE_ICONS)
		attr->win_size.py = attr->win_size.py + Mmi_layout_IconHeight();

	if (zone_id & ZONE_SOFTKEYS)
		attr->win_size.sy = attr->win_size.sy - Mmi_layout_softkeyHeight();

	if (zone_id & ZONE_TITLE)
		attr->win_size.py = attr->win_size.py + Mmi_layout_TitleHeight();
	
	if (zone_id & ZONE_CASE_ABC)
		attr->win_size.sy = attr->win_size.sy - Mmi_layout_line_height();

	if (zone_id & ZONE_SCROLLBAR)
		attr->win_size.sx = attr->win_size.sx - ED_SCROLLBAR_WIDTH;

	attr->win_size.sy = attr->win_size.sy - attr->win_size.py;

	if ((zone_id & ZONE_FULLSCREEN) == ZONE_FULLSCREEN)
		return;
	
	/*Else window is not entire screen */
	
	switch (zone_id & ZONE_FULL_HEIGHT)
	{
		case ZONE_FULL_HEIGHT:	
			break;
		case ZONE_TOPHALF_HEIGHT:
			attr->win_size.sy = attr->win_size.sy/2;		
			break;
		case ZONE_MIDDLE_HEIGHT:			
			attr->win_size.sy = attr->win_size.sy/2;		
			attr->win_size.py = attr->win_size.py+attr->win_size.sy/2;		
			break;
		case ZONE_BOTTOMHALF_HEIGHT:		
			attr->win_size.sy = attr->win_size.sy/2;		
			attr->win_size.py = attr->win_size.py+attr->win_size.sy;		
			break;
		case ZONE_BOTTOMTWOLINES_HEIGHT:		
			attr->win_size.py = attr->win_size.py+attr->win_size.sy-Mmi_layout_line_height()*2;
			attr->win_size.sy = Mmi_layout_line_height()*2;				
			break;
		default:
			//No action
			break;
	}
	
	switch (zone_id & ZONE_FULL_WIDTH)
	{
		case ZONE_FULL_WIDTH:	
			break;
		case ZONE_LEFTHALF_WIDTH:		
			attr->win_size.sx = attr->win_size.sx/2;		
			break;
		case ZONE_MIDDLE_WIDTH	:		
			attr->win_size.sx = attr->win_size.sx/2;		
			attr->win_size.px = attr->win_size.px+attr->win_size.sx/2;		
			break;
		case ZONE_RIGHTHALF_WIDTH:		
			attr->win_size.sx = attr->win_size.sx/2;		
			attr->win_size.px = attr->win_size.px+attr->win_size.sx;		
			break;
		default:
			//No action
			break;
	}
}


/*******************************************************************************

 $Function:		AUI_edit_SetDefault

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
 
*******************************************************************************/

void AUI_edit_SetDefault(T_AUI_EDITOR_DATA *editor_data)
{
	/* Set everything to zero... */
	/* SPR#1559 - Move CalculateWindow to below */
	
	memset(editor_data, 0, sizeof(T_AUI_EDITOR_DATA));

	/* Except these things... */
	
	editor_data->editor_attr.colour	= COLOUR_EDITOR;
	editor_data->editor_attr.font	= EDITOR_FONT;
	editor_data->editor_attr.cursor	= ED_CURSOR_BAR;
	editor_data->editor_attr.mode	= ED_MODE_ALPHA;
	editor_data->editor_attr.text.dcs    = ATB_DCS_ASCII;
	editor_data->timeout			= FOREVER;
	editor_data->destroyEditor		= TRUE;
	editor_data->zone_id			= ZONE_FULL_SK_TITLE;

// Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460
#ifdef FF_MMI_SAT_ICON
	editor_data->editor_attr.TitleIcon.data = NULL;
	editor_data->editor_attr.TitleIcon.width = 0;
	editor_data->editor_attr.TitleIcon.height = 0;
	editor_data->editor_attr.TitleIcon.isTitle = FALSE;
//x0035544 Mar 14, 2006 DR:OMAPS00061468
//set the default value for display_type to SAT_ICON_NONE
	editor_data->editor_attr.TitleIcon.display_type = SAT_ICON_NONE;
	editor_data->editor_attr.TitleIcon.selfExplanatory = FALSE;
#endif	

	/* SPR#1559 - SH - CalculateWindow moved here; pointer to zone_id used */
	AUI_edit_CalculateWindow(&editor_data->editor_attr, &editor_data->zone_id);
	
	ATB_display_ClearFormat(&editor_data->editor_attr.startFormat);
	return;
}


/*******************************************************************************

 $Function:		AUI_edit_SetDisplay

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
 				zone_id		- Type of editor screen (see header file for ZONE_...)
 				colour		- Colour of the editor
 
*******************************************************************************/

void AUI_edit_SetDisplay(T_AUI_EDITOR_DATA *editor_data, int zone_id, int colour, UBYTE font )
{
	/* SPR#1559 - SH - Use pointer to zone_id */
	AUI_edit_CalculateWindow(&editor_data->editor_attr, &zone_id);
	editor_data->zone_id 			= zone_id;
	editor_data->editor_attr.colour	= colour;
	editor_data->editor_attr.font	= font;
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetEvents

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.

*******************************************************************************/

void AUI_edit_SetEvents(T_AUI_EDITOR_DATA *editor_data, USHORT Identifier, BOOL destroyEditor, ULONG timeout, T_AUI_EDIT_CB Callback)
{
	if (editor_data)
	{
		editor_data->Identifier			= Identifier;
		editor_data->destroyEditor		= destroyEditor;
		editor_data->timeout			= timeout;
		editor_data->Callback			= Callback;
	}	
	return;
}


/*******************************************************************************

 $Function:		AUI_edit_SetMode

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
 				mode		- Editor mode (see header file for ED_MODE_...)
 				cursor		- Editor cursor (see header file for ED_CURSOR_...)
 
*******************************************************************************/

void AUI_edit_SetMode(T_AUI_EDITOR_DATA *editor_data, USHORT mode, USHORT cursor )
{
	if (editor_data)
	{
		editor_data->editor_attr.mode		= mode;
		editor_data->editor_attr.cursor		= cursor;
	}
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetBuffer

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
 				dcs			- Data coding scheme of text (see ATB_DCS_...)
 				text		- The text in the appropriate coding scheme
 				size		- Maximum size of the edit buffer in characters
 
*******************************************************************************/

void AUI_edit_SetBuffer(T_AUI_EDITOR_DATA *editor_data, UBYTE dcs, UBYTE *text, USHORT size)
{
	if (editor_data)
	{
		editor_data->editor_attr.text.dcs = dcs;
		editor_data->editor_attr.text.data = text;
		editor_data->editor_attr.text.len = ATB_string_Length(&editor_data->editor_attr.text);
		editor_data->editor_attr.size = size;
	}
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetTextStr

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
 				LeftSoftKey, RightSoftKey - Text IDs of the softkeys
 				TitleId		- Text ID for the title
 				TextString	- Text string for the title, used if TitleId is 0
 
*******************************************************************************/

void AUI_edit_SetTextStr(T_AUI_EDITOR_DATA *editor_data, USHORT LeftSoftKey, USHORT RightSoftKey, USHORT TitleId, UBYTE *TitleString)
{
	if (editor_data)
	{
		editor_data->LeftSoftKey = LeftSoftKey;
		editor_data->RightSoftKey = RightSoftKey;
		editor_data->AltRightSoftKey = RightSoftKey;
		editor_data->TitleId = TitleId;
		editor_data->TitleString = TitleString;
	}
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetAltTextStr

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
  				min_enter	- No of characters needed to be entered
 				AltLeftSoftKey - Text ID of alternate left softkey
 				change_rsk_on_empty - TRUE if alternative right soft key is used for
 				              empty buffer
 				AltRightSoftKey - Text ID of alternative right softkey
 
*******************************************************************************/

void AUI_edit_SetAltTextStr(T_AUI_EDITOR_DATA *editor_data, UBYTE min_enter, USHORT AltLeftSoftKey, BOOL change_rsk_on_empty, USHORT AltRightSoftKey)
{
	if (editor_data)
	{
		editor_data->AltLeftSoftKey = AltLeftSoftKey;
		editor_data->min_enter = min_enter;
		editor_data->AltRightSoftKey = AltRightSoftKey;
		editor_data->change_rsk_on_empty = change_rsk_on_empty;
	}
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetFormatStr

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
  				formatstr	- The formatted input string
  				preformat	- TRUE if format codes are to be inserted into text
  							  before editing
  				filler		- If preformat is true, this character will be used to
  							  pad out the provided string
 
*******************************************************************************/

void AUI_edit_SetFormatStr(T_AUI_EDITOR_DATA *editor_data, char *formatstr, BOOL preformat, char filler)
{
	USHORT textIndex;
	USHORT formatIndex;
//	USHORT character;  // RAVI

	TRACE_FUNCTION("AUI_edit_SetFormatStr()");
	
	if (editor_data)
	{
		editor_data->editor_attr.FormatString = formatstr;

		/* SPR#1983 - SH - *m and *M strings are freeform, no preformatting required */
		if (preformat && strcmp(formatstr, "*m")!=0 && strcmp(formatstr, "*M")!=0)
		{
			formatIndex = 0;
			textIndex = 0;

			/* SPR#1983 - SH - Ensure formatting doesn't write over null terminator */
			while (formatstr[formatIndex]!=0 && 
				!strchr("123456789*", formatstr[formatIndex]) && /* Exit at delimited field */
				textIndex<(editor_data->editor_attr.size-1))
			{
				/* Encountered fixed character */
				if (formatstr[formatIndex]=='\\')
				{
					formatIndex++;
					ATB_string_SetChar(&editor_data->editor_attr.text, textIndex, ATB_char_Unicode(formatstr[formatIndex]));
				}
				/* If editor text has run out, fill the rest with our filler character */
				else if (textIndex>editor_data->editor_attr.text.len)
				{
					ATB_string_SetChar(&editor_data->editor_attr.text, textIndex, ATB_char_Unicode(filler));
				}

				formatIndex++;
				textIndex++;
			}
		}
	}
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetFormatAttr

 $Description:	Sets up standard editor attributes.

 $Returns:		None.

 $Arguments:	editor_data	- The MMI editor data that is to be modified.
  				startFormat	- Pointer to text formatting data structure
 
*******************************************************************************/

void AUI_edit_SetFormatAttr(T_AUI_EDITOR_DATA *editor_data, UBYTE attr)
{
	if (editor_data)
	{
		editor_data->editor_attr.startFormat.attr = attr;
	}
	
	return;
}

/*******************************************************************************

 $Function:		AUI_edit_SetAttr

 $Description:	Set some standard editor attributes

 $Returns:    	None.

 $Arguments:  	attr	- The editor attr

*******************************************************************************/
void AUI_edit_SetAttr(T_ED_ATTR *attr, int zone_id, ULONG colour, UBYTE font, USHORT mode, USHORT cursor, T_ATB_DCS dcs, UBYTE *text, USHORT size)
{
	/* Populate the structure with the parameters
	*/
	/* SPR#1559 - SH - Use pointer to zone_id */
	AUI_edit_CalculateWindow(attr, &zone_id );
	attr->colour = colour;
	attr->font = font;
	attr->mode = mode;
	attr->cursor = cursor;
	attr->text.dcs = dcs;
	attr->text.data = text;
	attr->text.len = ATB_string_Length(&attr->text);
	attr->size = size;

	return;
}

/* API - 08/07/03 - CQ10728 - Query your own number with a D1 SIM*/
/*******************************************************************************

 $Function:		AUI_Edit_Display_Only

 $Description:	Sets up the display requirements for the Editor & also shows it

 $Returns:    	None.

 $Arguments:  	win - parent window, LSK - Left Soft Key, RSK - Right Soft Key
 				string1 - String details, string2 - String details, Title - Editor title string

*******************************************************************************/
void AUI_Edit_Display_Only(T_MFW_HND win, int LSK, int RSK, char *string1, char *string2, int Title)
{	
	 
	T_MFW_WIN			*win_data	= ((T_MFW_HDR *)win)->data;
	T_AUI_EDITOR_INFO	*data		= (T_AUI_EDITOR_INFO *)win_data->user;

	T_AUI_EDITOR_DATA display_editor_info;

	int size = MAX_RO_EDITOR_LEN;

	AUI_edit_SetDefault(&display_editor_info);
			
			/* Include title for colour display */
#ifdef COLOURDISPLAY
	AUI_edit_SetDisplay(&display_editor_info, ZONE_FULL_SK_TITLE_SCROLL, COLOUR_EDITOR, EDITOR_FONT);
#else /* COLOURDISPLAY */
	AUI_edit_SetDisplay(&display_editor_info, ZONE_FULL_SK_SCROLL, COLOUR_EDITOR, EDITOR_FONT);
#endif /* COLOURDISPLAY */
	AUI_edit_SetMode(&display_editor_info, ED_MODE_ALPHA | ED_MODE_READONLY, ED_CURSOR_NONE);
	AUI_edit_SetEvents(&display_editor_info, 0, FALSE, FOREVER, (T_AUI_EDIT_CB) AUI_Edit_Display_Only_CB);
	AUI_edit_SetTextStr(&display_editor_info, LSK, RSK, Title, NULL);

	/* SPR#2672 - SH - Allocate buffer dynamically */

	data->displayBuffer = (char *)ALLOC_MEMORY(size);
	
	strcpy(data->displayBuffer, string1);
		
	if(string2 != NULL)
	{
		strcat(data->displayBuffer, "\n");
		strcat(data->displayBuffer, string2);
	}
	
	if (data->displayBuffer[0]==0x80)
	{
		AUI_edit_SetBuffer(&display_editor_info, ATB_DCS_UNICODE, (UBYTE *)&data->displayBuffer[2], size/2);
	}
	else
	{
		AUI_edit_SetBuffer(&display_editor_info, ATB_DCS_ASCII, (UBYTE *)&data->displayBuffer[0], size);
	}

	data->win = AUI_edit_Start(win,&display_editor_info);  /* start the editor */
	
}

/*******************************************************************************

 $Function:		AUI_Edit_Display_Only_CB

 $Description:	Handles the key call back from the Read only Editor

 $Returns:    	None.

 $Arguments:  	

*******************************************************************************/
static void AUI_Edit_Display_Only_CB(T_MFW_HND win, USHORT Identifier, SHORT reason)
{ 
	T_MFW_WIN   * win_data = ((T_MFW_HDR *) win)->data;
	T_AUI_EDITOR_INFO     * data = (T_AUI_EDITOR_INFO *)win_data->user;

TRACE_EVENT("AUI_Edit_Display_Only_CB");

	switch(reason)
	{
		case INFO_KCD_RIGHT:
		case INFO_KCD_HUP:
			TRACE_EVENT("INFO_KCD_RIGHT/HUP");
			AUI_Edit_Display_Only_Destroy(data->win);
		break;

		default:
			TRACE_EVENT("Err: Default");
			break;
		
	}
}

/*******************************************************************************

 $Function:    	AUI_Edit_Display_Only_Destroy

 $Description:	Destroy the Read only information Editor
 
 $Returns:		none

 $Arguments:	own_window - current window handler
 				
*******************************************************************************/

static void AUI_Edit_Display_Only_Destroy(MfwHnd own_window)
{
    T_MFW_WIN * win_data;
    T_AUI_EDITOR_INFO     * data;

//	USHORT i;  // RAVI

    TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_destroy()");

    if (own_window)
	{
	    win_data = ((T_MFW_HDR *)own_window)->data;
	    data = (T_AUI_EDITOR_INFO *)win_data->user;

	    if (data)
		{
		    /*
		     * Delete WIN handler
		     */ 

			/* SPR#2672 - SH - Delete buffer */

			if (data->displayBuffer!=NULL)
			{
				FREE_MEMORY((void *)data->displayBuffer, MAX_RO_EDITOR_LEN);
			}
			
			/* SPR#1428 - SH - New Editor changes */
#ifdef NEW_EDITOR
			AUI_edit_Destroy(data->win);
#else /* NEW_EDITOR */
			editor_destroy(data->win);
#endif /* NEW_EDITOR */

		    win_delete (data->win);

		    FREE_MEMORY ((void *)data, sizeof (T_AUI_EDITOR_INFO));
		
		
		}
	    else
		{
		    TRACE_EVENT ("SmsRead_R_TEXTEDT2_destroy() called twice");
		}
	}
}
/* API - 08/07/03 - CQ10728 END*/