view src/ui/bmi/AUIEditor.c @ 135:70ea7526b59e

bmi/AUI*.c: bogotab fixes
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 14 Nov 2020 03:18:11 +0000
parents c0052fe355d3
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

    May 15, 2006 DR: OMAPS00075852 - xreddymn
    Description: New SMS and Message Full indications will not be seen by user
    when CB is enabled, because CB messages have higher priority.
    Solution: CB messages and New SMS or Message Full indications are displayed
    in two different zones on the Idle screen.
    Changes: Added new display zone which is located one line above
    the softkeys.

    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 "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={0,0,NULL};

    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;


    T_DS_TEXTFORMAT     format;
    BOOL                showIcons;              /* Flag that stores whether icons (e.g. alignment icons) should be shown */

    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;
                ATB_edit_LineGet(data->editor, data->editor->winStartLine);


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

                TRACE_EVENT("Updating whole screen.");


                /* 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)   && defined(EASY_TEXT_ENABLED)
    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)   && defined(EASY_TEXT_ENABLED)
    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_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*/
#ifndef LSCREEN
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;
}
#endif
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;
        /* xreddymn OMAPS00075852 May-15-2006
         * This display zone is located one line above the softkeys.
         */
        case ZONE_MIDDLETWOLINES_HEIGHT:
            attr->win_size.py = attr->win_size.py+attr->win_size.sy-Mmi_layout_line_height()*3;
            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));
                }
                if(formatstr[formatIndex]!=0)       /*a0393213 lint warnings removal - 'Possible access of out-of-bounds pointer'*/
                    {
                    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]==(char)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*/