view src/ui/bmi/AUIEditor.c @ 221:5bf097aeaad7

LLS: when turning off all LEDs on boot, skip LED-C Having LLS turn off LED-A and LED-B on boot is normally unnecessary (they should already be off in Iota), but it is harmless, hence this logic is kept for robustness. However, having LLS read-modify-write the BCICTL2 register (to turn off LED-C) creates a potential race condition with FCHG writes to this register, especially in the case when baseband switch-on is caused by VCHG and charging is expected to start right away. Furthermore, control of the charging LED itself (on those hw targets that have it) is the responsibility of the FCHG SWE, hence LLS should leave it alone.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Apr 2021 21:55:13 +0000
parents 70ea7526b59e
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*/