diff g23m/condat/ms/src/mfw/mfw_mnu.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/condat/ms/src/mfw/mfw_mnu.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,1944 @@
+/*
++--------------------------------------------------------------------+
+| PROJECT: MMI-Framework (8417)         $Workfile:: mfw_mnu.c       $|
+| $Author:: Kk  $ CONDAT GmbH           $Revision:: 18              $|
+| CREATED: 24.11.98                     $Modtime:: 24.02.00 8:07    $|
+| STATE  : code                                                      |
++--------------------------------------------------------------------+
+
+   MODULE  : MFW_MNU
+ 
+   PURPOSE : menu handling functions
+
+   EXPORT  :
+
+   TO DO   :
+
+   $History:: mfw_mnu.c                                             $
+
+       Shashi Shekar B.S., a0876501, 16 Mar, 2006, OMAPS00061462
+       Icon support for SetupMenu & Select item.
+   
+ *
+ * ************************************************
+ * User: xreddymn           Date: Sep-30-2005
+ * Updated in $/GSM/Condat/MS/SRC/MFW
+ * Added header display for menus on monochrome
+ * screens for MMI-SPR-33781
+ *
+ * ************************************************
+ * User: xreddymn           Date: Dec-16-2004
+ * Updated in $/GSM/Condat/MS/SRC/MFW
+ * Added double line display for MFW list menu items
+ *
+ * *****************  Version 18  *****************
+ * User: Kk           Date: 28.02.00   Time: 10:33
+ * Updated in $/GSM/Condat/MS/SRC/MFW
+ * font usage corrected for page and list menus. free menus still
+ * need rework.
+ *
+ * *****************  Version 17  *****************
+ * User: Es           Date: 17.01.00   Time: 17:37
+ * Updated in $/GSM/Condat/MS/SRC/MFW
+ * menu mode handling bug (uses only first level settings)
+|
+| *****************  Version 16  *****************
+| User: Le           Date: 6.01.00    Time: 9:23
+| Updated in $/GSM/Condat/MS/SRC/MFW
+| Alignment of MFW versions
+ *
+ * *****************  Version 2  *****************
+ * User: Es           Date: 22.11.99   Time: 10:29
+ * Updated in $/GSM/Condat/SND-MMI/MFW
+ *
+ * *****************  Version 1  *****************
+ * User: Es           Date: 18.11.99   Time: 16:35
+ * Created in $/GSM/Condat/SND-MMI/MFW
+ * Initial
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+#define ENTITY_MFW
+
+#if defined (NEW_FRAME)
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+
+#else
+
+#include "STDDEFS.H"
+#include "custom.h"
+#include "gsm.h"
+#include "vsi.h"
+
+#endif
+
+#include "mfw_sys.h"
+#include "mfw_mfw.h"
+#include "mfw_kbd.h"
+#include "gdi.h"
+#include "dspl.h"
+#include "mfw_lng.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifndef NEW_EDITOR
+#include "mfw_edt.h"
+#endif
+#include "mfw_icn.h"
+#include "mfw_mnu.h"
+
+
+#include "message.h"
+#include "prim.h"
+#include "aci_cmh.h"
+
+#include "mfw_mmi.h"
+static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma);
+static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start);
+static void drawPageMenu (MfwMnu *mnu);
+static void drawListMenu (MfwMnu *m);
+static void drawFreeMenu (MfwMnu *m);
+static int mnuCommand (U32 cmd, void *h);
+
+#define TIME_TRACE_EVENT 
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuInit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : initialize menu handler
+
+*/
+
+MfwRes mnuInit (void)
+{
+    mfwCommand[MfwTypMnu] = (MfwCb) mnuCommand;
+
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuExit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : finalize menu handler
+
+*/
+
+MfwRes mnuExit (void)
+{
+    mfwCommand[MfwTypMnu] = 0;
+
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuCreate          |
++--------------------------------------------------------------------+
+
+  PURPOSE : create menu control
+  GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be 
+				used (useStrID) and if the strings are ascii or unicode (uesDefLang).
+
+*/
+
+MfwHnd mnuCreate (MfwHnd w, MfwMnuAttr *a, MfwEvt e, MfwCb f)
+{
+    MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
+    MfwMnu *mnu = (MfwMnu *) mfwAlloc(sizeof(MfwMnu));
+	MfwHdr *insert_status =0;
+	
+    if (!hdr || !mnu)
+    {
+    	TRACE_ERROR("ERROR: mnuCreate() Mem Alloc Failed.");
+			
+	   	if(hdr)
+   			mfwFree((U8*)hdr,sizeof(MfwHdr));
+   		if(mnu)
+   			mfwFree((U8*)mnu,sizeof(MfwMnu));	
+   		
+	   	return 0;
+  	}
+
+    mnu->mask = e;
+    mnu->flags = 0;
+    mnu->handler = f;
+    mnu->attr = a;
+    mnu->curAttr = a;
+
+    mnu->useStrID = 0;
+    mnu->useDefLang = 0;
+    /* SPR#1983 - SH - Stores character type, ASCII/UNICODE */
+    mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
+    mnu->level = 0;
+    memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
+    memset(mnu->lShift,1,sizeof(mnu->lShift));
+    mnu->lCursor[0] = 0;
+    mnu->scrollMode = 1;
+    hdr->data = mnu;
+    hdr->type = MfwTypMnu;
+
+    insert_status = mfwInsert(w,hdr);
+    if(!insert_status)
+	{
+  		TRACE_ERROR("ERROR: mnuCreate() Failed to Install Handler. ");
+   		mfwFree((U8*)hdr,sizeof(MfwHdr));
+   		mfwFree((U8*)mnu ,sizeof(MfwMnu));
+		return 0;
+  	}
+    return insert_status;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuDelete          |
++--------------------------------------------------------------------+
+
+  PURPOSE : delete menu control
+
+*/
+
+MfwRes mnuDelete (MfwHnd m)
+{
+    MfwRes res;
+
+    if (!m)
+        return MfwResIllHnd;
+
+    mnuHide(m);
+    res = (mfwRemove(m)) ? MfwResOk : MfwResIllHnd;
+
+    mfwFree(((MfwHdr *) m)->data,sizeof(MfwMnu));
+    mfwFree(m,sizeof(MfwHdr));
+
+    return res;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuLang            |
++--------------------------------------------------------------------+
+
+  PURPOSE : set / get whether the string is associated with an ID or if it is null-terminated
+
+  GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be 
+				used (useStrID) and if the strings are ascii or unicode (uesDefLang).
+*/
+
+MfwHnd mnuLang (MfwHnd m, MfwHnd l)
+{
+    MfwHnd ol;
+    MfwMnu *mnu;
+
+    if( (mnu = mfwControl(m)) == 0)
+        return (MfwHnd) MfwResIllHnd;
+
+    ol = mnu->useStrID;
+    mnu->useStrID = l;
+    mnu->useDefLang = l;
+
+	/* SPR#1983 - SH - Set character type appropriately */
+   	if (l)
+   	{
+   		mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
+   	}
+   	else
+   	{
+   		mnu->textDCS = MNU_LIST_LANGUAGE_ASCII;
+   	}	
+
+    return ol;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuStrType         |
++--------------------------------------------------------------------+
+
+  PURPOSE : set / get language in use (1=use default ascii/unicode, 0=assume ascii)
+
+  GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be 
+				used (useStrID) and if the strings are ascii or unicode (uesDefLang).
+*/
+MfwHnd mnuStrType (MfwHnd m, MfwHnd l)
+{
+    MfwHnd ol;
+    MfwMnu *mnu;
+
+    if( (mnu = mfwControl(m)) == 0)
+        return (MfwHnd) MfwResIllHnd;
+
+    ol = mnu->useDefLang;
+    mnu->useDefLang = l;
+
+	/* SPR#1983 - SH  - Set character type appropriately*/
+   	if (l)
+   	{
+   		mnu->textDCS = MNU_LIST_LANGUAGE_UNICODE;
+   	}
+   	else
+   	{
+   		mnu->textDCS = MNU_LIST_LANGUAGE_DEFAULT;
+   	}
+   	
+    return ol;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuDCSType         |
++--------------------------------------------------------------------+
+
+  PURPOSE : SPR#1983 - SH - Added.
+  			Set the character type of the menu text
+*/
+
+UBYTE mnuDCSType (MfwHnd m, UBYTE listLanguageType)
+{
+    UBYTE ol;
+    MfwMnu *mnu;
+
+    if( (mnu = mfwControl(m)) == 0)
+        return NULL;
+
+    ol = mnu->textDCS;
+    mnu->textDCS = listLanguageType;
+   	
+    return ol;
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuShow            |
++--------------------------------------------------------------------+
+
+  PURPOSE : show menu
+
+*/
+
+MfwRes mnuShow (MfwHnd m)
+{
+    MfwMnu *mnu;
+
+    if( (mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+    mnu->flags |= E_MNU_VISIBLE;
+    mnuUpdate(mnu);
+
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuHide            |
++--------------------------------------------------------------------+
+
+  PURPOSE : hide menu
+
+*/
+
+MfwRes mnuHide (MfwHnd m)
+{
+    MfwMnu *mnu;
+//	U8 dsplOld;  // RAVI
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+    mnu->flags &= ~E_MNU_VISIBLE;
+    if (mnu->handler)
+        if (mnu->mask & E_MNU_VISIBLE)
+            mnu->handler(E_MNU_VISIBLE,mnu);
+
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuUnhide          |
++--------------------------------------------------------------------+
+
+  PURPOSE : unhide menu (without drawing)
+
+*/
+
+MfwRes mnuUnhide (MfwHnd m)
+{
+    MfwMnu *mnu;
+//	U8 dsplOld;  // RAVI
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+    mnu->flags |= E_MNU_VISIBLE;
+    if (mnu->handler)
+        if (mnu->mask & E_MNU_VISIBLE)
+            mnu->handler(E_MNU_VISIBLE,mnu);
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuUpdate          |
++--------------------------------------------------------------------+
+
+  PURPOSE : draw menu
+
+*/
+
+MfwRes mnuUpdate (MfwMnu *m)
+{
+
+//    U8 dsplOld;  // RAVI
+	
+
+    if (!m)
+        return MfwResIllHnd;
+    if (!(m->flags & E_MNU_VISIBLE))
+        return MfwResOk;
+
+    if (m->handler)
+        if (m->mask & E_MNU_VISIBLE)
+            m->handler(E_MNU_VISIBLE,m);
+
+	/*JVJE Update to fit the menu to a visible item */
+	{
+		MfwMnuAttr *ma = m->curAttr;
+		int index= m->lCursor[m->level];
+	//	int iloop;   // RAVI
+		U16 retVal;
+
+		 if (ma->items[index].flagFunc)
+			 retVal = ma->items[index].flagFunc(m,ma,&(ma->items[index]));
+		 else
+		 	retVal = 0;
+
+		while (retVal & MNU_ITEM_HIDE)
+	    {
+			index++;
+			if (index>=ma->nItems)
+				index =0;
+
+			 if (ma->items[index].flagFunc)
+				 retVal = ma->items[index].flagFunc(m,ma,&(ma->items[index]));
+			 else
+			 	retVal = 0;
+
+	    } 
+		m->lCursor[m->level]=index;	    
+	}
+	
+    if ((m->curAttr->mode & MNU_DISPLAY) == MNU_OVERLAPPED)
+        drawFreeMenu(m);
+    else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_PAGED)
+        drawPageMenu(m);
+    else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST)
+        drawListMenu(m);
+    /* xreddymn Dec-16-2004 MMI-SPR-27384: Two line height list display */
+    else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST_2_LINE)
+        drawListMenu(m);
+    else if ((m->curAttr->mode & MNU_DISPLAY) == MNU_LIST_COLOUR)
+        drawListMenu(m);
+
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuUp              |
++--------------------------------------------------------------------+
+
+  PURPOSE : one step up
+
+*/
+
+MfwRes mnuUp (MfwHnd m)
+{
+    MfwMnu *mnu;
+    MfwMnuAttr *ca;
+    MfwMnuItem *ci;
+//	U8 uMode;  // RAVI
+	
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+
+    ca = mnu->curAttr;
+    do
+    {
+        if (mnu->lCursor[mnu->level] == 0)
+        {
+            mnu->lCursor[mnu->level] = ca->nItems - 1;
+            mnu->flags |= E_MNU_TOPPED;
+            if (mnu->handler)
+                if (mnu->mask & E_MNU_TOPPED)
+                    mnu->handler(E_MNU_TOPPED,mnu);
+        }
+        else
+        {
+            mnu->lCursor[mnu->level] -= (U8) 1;
+            mnu->flags &= ~E_MNU_TOPPED;
+        }
+        ci = ca->items + mnu->lCursor[mnu->level];
+    } while (ci->flagFunc(mnu,ca,ci) & MNU_ITEM_HIDE);
+	
+	if (mnu->scrollMode) /* Simple scrolling */
+	{
+		U8 shift = mnu->lShift[mnu->level];
+		U8 index = countVisible(mnu,ca,mnu->lCursor[mnu->level]);
+		U8 visibleItems = countVisible(mnu,ca,ca->nItems); 
+		int nLines = mnu->nLines;
+	    		
+		if (visibleItems<nLines)
+			nLines = visibleItems;
+		if (shift>1)
+			shift--;
+		mnu->lShift[mnu->level] = shift;		
+
+	}
+    mnuUpdate(mnu);
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuDown            |
++--------------------------------------------------------------------+
+
+  PURPOSE : one step down
+
+*/
+
+MfwRes mnuDown (MfwHnd m)
+{
+    MfwMnu *mnu;
+    MfwMnuAttr *ca;
+    MfwMnuItem *ci;
+
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+    ca = mnu->curAttr;
+    do
+    {
+        if (mnu->lCursor[mnu->level] >= mnu->curAttr->nItems - 1)
+        {
+            mnu->lCursor[mnu->level] = 0;
+            mnu->flags |= E_MNU_BOTTOMED;
+            if (mnu->handler)
+                if (mnu->mask & E_MNU_BOTTOMED)
+                    mnu->handler(E_MNU_BOTTOMED,mnu);
+        }
+        else
+        {
+            mnu->lCursor[mnu->level] += (U8) 1;
+            mnu->flags &= ~E_MNU_BOTTOMED;
+        }
+        ci = ca->items + mnu->lCursor[mnu->level];
+    } while (ci->flagFunc(mnu,ca,ci) & MNU_ITEM_HIDE);
+
+	if (mnu->scrollMode) /* Simple scrolling */
+	{
+		U8 shift = mnu->lShift[mnu->level];
+		U8 index = countVisible(mnu,ca,mnu->lCursor[mnu->level]);
+		U8 visibleItems = countVisible(mnu,ca,ca->nItems); 
+		int nLines = mnu->nLines;
+		
+		if (visibleItems<nLines)
+			nLines = visibleItems;
+		if (shift<nLines)
+			shift++;
+		mnu->lShift[mnu->level] = shift;		
+
+	}
+    mnuUpdate(mnu);
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuSelect          |
++--------------------------------------------------------------------+
+
+  PURPOSE : select a menu item; if there is a submenu, go one level
+            down
+
+*/
+
+MfwRes mnuSelect (MfwHnd m)
+{
+    MfwMnu *mnu;
+    MfwMnuAttr *submenu, *ca;
+    MenuFunc func;
+//	U8 dsplOld;  // RAVI
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+    
+    ca = mnu->curAttr;
+    submenu = ca->items[mnu->lCursor[mnu->level]].menu;
+    func = ca->items[mnu->lCursor[mnu->level]].func;
+
+    if (func)                        /* perform submenu          */
+    {
+        func(mnu,&ca->items[mnu->lCursor[mnu->level]]);
+    }
+
+    if (submenu)                      /* call menu function       */
+    {
+        if (menuIsEmpty(mnu,submenu))
+        {
+            mnu->flags |= E_MNU_EMPTY;
+            if (mnu->handler && mnu->mask & E_MNU_EMPTY)
+                mnu->handler(E_MNU_EMPTY,mnu);
+            mnu->flags &= ~E_MNU_EMPTY;
+        }
+        else
+        {
+            dspl_Clear(ca->area->px, ca->area->py,
+                        (U16) (ca->area->sx+ca->area->px-1),
+                        (U16) (ca->area->sy+ca->area->py-1));
+            mnu->level++;
+            mnu->lCursor[mnu->level] = 0;
+            ca = mnu->curAttr = submenu;
+            if (ca->items->flagFunc(mnu,ca,ca->items) & MNU_ITEM_HIDE)
+                mnuDown(m);
+            else
+                mnuUpdate(mnu);
+        }
+	    return MfwResOk;								/* we do not have to check for !submenu */
+    }
+
+    if (!func && !submenu)                                /* inform mmi               */
+    {
+        mnu->flags |= E_MNU_SELECT;
+        if (mnu->handler && mnu->mask & E_MNU_SELECT)
+            mnu->handler(E_MNU_SELECT,mnu);
+    }
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuEscape          |
++--------------------------------------------------------------------+
+
+  PURPOSE : go back one level or leave the menu
+
+*/
+
+MfwRes mnuEscape (MfwHnd m)
+{
+    MfwMnu *mnu;
+    MfwMnuAttr *attr;
+    U8 lvl;
+//	U8 dsplOld;  // RAVI
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+    if (mnu->level != 0)
+    {
+        mnu->lCursor[mnu->level] = UNUSED;
+        mnu->lShift[mnu->level] = 1;
+        mnu->level--;
+        lvl = 0;                        /* set level 0              */
+        attr = mnu->attr;               /* set start point          */
+        while (lvl != mnu->level)
+        {
+            attr = attr->items[mnu->lCursor[lvl]].menu;
+            lvl++;
+        }
+        mnu->curAttr = attr;
+        mnuUpdate(mnu);
+    }
+    else
+    {
+        mnu->flags |= E_MNU_ESCAPE;
+        if (mnu->handler)
+            if (mnu->mask & E_MNU_ESCAPE)
+                mnu->handler(E_MNU_ESCAPE,mnu);
+    }
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuDone            |
++--------------------------------------------------------------------+
+
+  PURPOSE : reset menu
+
+*/
+
+MfwRes mnuDone (MfwHnd m)
+{
+    MfwMnu *mnu;
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+    mnu->curAttr = mnu->attr;
+    mnu->level = 0;
+    memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
+    memset(mnu->lShift,1,sizeof(mnu->lShift));
+    mnu->lCursor[0] = 0;
+
+    return MfwResOk;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuKeyAction       |
++--------------------------------------------------------------------+
+
+  PURPOSE : perform direct jumping if there was pressed KCD_1
+            through KCD_9; in this case function returns 1;
+            otherwise function returns 0
+
+*/
+
+MfwRes mnuKeyAction (MfwHnd m, U8 keycode)
+{
+    MfwMnu *mnu;
+    U8 directAccess;
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+    switch (keycode)
+    {
+        case KCD_1: directAccess = 0; break;
+        case KCD_2: directAccess = 1; break;
+        case KCD_3: directAccess = 2; break;
+        case KCD_4: directAccess = 3; break;
+        case KCD_5: directAccess = 4; break;
+        case KCD_6: directAccess = 5; break;
+        case KCD_7: directAccess = 6; break;
+        case KCD_8: directAccess = 7; break;
+        case KCD_9: directAccess = 8; break;
+        default: return 0;
+    }
+
+    if (directAccess >= mnu->curAttr->nItems)
+        return 0;
+
+    mnu->lCursor[mnu->level] = directAccess;
+    mnuShow(m);
+    mnuSelect(m);
+
+    return 1;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuChooseItem      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Chooses the nItemst Item.
+
+*/
+
+MfwRes mnuChooseVisibleItem(MfwHnd m,U8 nItem)
+{
+
+    MfwMnu *mnu;
+	int i;
+
+    if ((mnu = mfwControl(m)) == 0)
+        return MfwResIllHnd;
+
+	if (nItem<0)
+		return MfwResIllHnd;
+
+	for (i = 0; i < mnu->curAttr->nItems; i++)
+    {
+		if (!(mnu->curAttr->items[i].flagFunc(mnu,
+                                              mnu->curAttr,
+                                            &(mnu->curAttr->items[i]))
+                & MNU_ITEM_HIDE))
+		{
+			if (!nItem)
+				{
+					mnu->lCursor[mnu->level] = i;
+					mnuUpdate(mnu);
+					return MfwResOk;
+				}
+			else
+				nItem--;
+		}
+	}
+	return MfwResIllHnd;
+
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : menuIsEmpty        |
++--------------------------------------------------------------------+
+
+  PURPOSE : check for empty submenu
+
+*/
+
+static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma)
+{
+    int i;
+
+    for (i = 0; i < ma->nItems; i++)
+        if (!(ma->items[i].flagFunc(m,ma,&(ma->items[i]))
+                                            & MNU_ITEM_HIDE))
+            return 0;
+
+    return 1;
+}
+
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : countVisible       |
++--------------------------------------------------------------------+
+
+  PURPOSE : count visible items up to current item
+
+*/
+
+static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start)
+{
+    int i, count;
+
+    for (i = 0, count = 0; i < start; i++)
+        if (!(ma->items[i].flagFunc(m,ma,&(ma->items[i]))
+                                            & MNU_ITEM_HIDE))
+            count++;
+
+    return count;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : countVisibleItems  |
++--------------------------------------------------------------------+
+
+  PURPOSE : count visible items in the current branch
+
+*/
+
+U8 mnuCountVisibleItems (MfwHnd m)
+{
+    MfwMnu *mnu;
+
+	if ((mnu = mfwControl(m)) == 0)
+        return 0;
+
+	return (U8)countVisible(mnu, mnu->curAttr,mnu->curAttr->nItems);
+}
+
+
+/*
++--------------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU                  |
+| STATE   : code                        ROUTINE : countCurrentVisibleItem  |
++--------------------------------------------------------------------------+
+
+  PURPOSE : returns the position of the current Item
+*/
+
+U8 mnuCountCurrentVisibleItem(MfwHnd m)
+{
+    MfwMnu *mnu;
+	U8 i;
+	U8 pos=0;
+
+	if ((mnu = mfwControl(m)) == 0)
+        return 0;
+
+	for (i = 0; i < mnu->curAttr->nItems; i++)
+    {
+		if ((mnu->lCursor[mnu->level]) == i)
+			return pos;
+		if (!(mnu->curAttr->items[i].flagFunc(mnu,
+                                              mnu->curAttr,
+                                            &(mnu->curAttr->items[i]))
+                & MNU_ITEM_HIDE))
+			pos++;
+	}
+	return pos;
+
+}
+
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : checkPredraw       |
++--------------------------------------------------------------------+
+
+  PURPOSE : check / generate predraw event
+
+*/
+
+static int checkPredraw (MfwMnu *mnu, MfwMnuItem *mi,
+                                char **t, MfwIcnAttr **icn)
+{
+    int res = 0;
+
+    if (mi->flagFunc(mnu,mnu->curAttr,mi) & MNU_ITEM_NOTIFY)
+    {
+        mnu->flags |= E_MNU_PREDRAW;
+        if (mnu->handler)
+            if (mnu->mask & E_MNU_PREDRAW)
+            {
+                if (mi->exta)
+                {
+                    ((MfwItmExtPredraw*)(mi->exta))->str = *t;
+                    ((MfwItmExtPredraw*)(mi->exta))->icon = *icn;
+                }
+                res = mnu->handler(E_MNU_PREDRAW,mi);
+                if (mi->exta)
+                {
+                    *t = ((MfwItmExtPredraw*)(mi->exta))->str;
+                    *icn = ((MfwItmExtPredraw*)(mi->exta))->icon;
+                }
+            }
+        mnu->flags &= ~E_MNU_PREDRAW;
+    }
+
+    return res;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : checkPostdraw      |
++--------------------------------------------------------------------+
+
+  PURPOSE : check / generate postdraw event
+
+*/
+
+static int checkPostdraw (MfwMnu *mnu, MfwMnuItem *mi)
+{
+    int res = 0;
+
+    if (mi->flagFunc(mnu,mnu->curAttr,mi) & MNU_ITEM_NOTIFY)
+    {
+        mnu->flags |= E_MNU_POSTDRAW;
+        if (mnu->handler)
+            if (mnu->mask & E_MNU_POSTDRAW)
+                res = mnu->handler(E_MNU_POSTDRAW,mi);
+        mnu->flags &= ~E_MNU_POSTDRAW;
+    }
+
+    return res;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : checkStatus        |
++--------------------------------------------------------------------+
+
+  PURPOSE : check / insert item status (string MUST be in RAM)
+
+  SPR998 - SH - Changed to allow checkbox menu items.
+*/
+
+static int checkStatus (MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi,
+                                                              char *menuString)
+{
+	char *e;                            /* ES!! UNICODE             */
+	int index = 0;   // RAVI
+#if (BOARD != 61)	
+	BOOL unicode;
+#endif
+	U16 flagResult;
+
+#if(BOARD != 61)
+	if (menuString[0] == 0x80)
+		unicode = TRUE;
+	else
+		unicode = FALSE;
+#endif
+
+	flagResult = mi->flagFunc(m,ma,mi);
+    switch (flagResult)
+    {
+    	case MNU_ITEM_STATED:
+		    e = mi->exta;
+		    if (!e)
+		        return 0;
+		    while (menuString[index])
+		    {
+		        if (menuString[index] == '%')                  /* ES!! : UNICODE           */
+		        {
+		            switch (menuString[index+1])
+		            {
+		                case 'c':               /* single char              */
+		                    strcpy(&menuString[index+1],&menuString[index+2]);
+		                    menuString[index] = *e;
+		                    e++;
+		                    break;
+		            }
+		        }
+		        index++;
+		    }
+		    break;
+
+		/* SPR998 - SH - Checked or unchecked option.
+		 * Don't need to do anything here. */
+		
+		case MNU_ITEM_UNCHECKED:
+		case MNU_ITEM_CHECKED:
+			break;
+			
+		default:
+			break;
+	}
+
+    return flagResult;	/* SPR#998 - SH - Now returns item type */
+}
+
+
+static void mnuDrawHeader(MfwMnuAttr *mnuAttr, MfwRect* areaLeft, char *hdrString)
+{
+	int mode = mnuAttr->mode;
+	MfwRect* mnuArea = mnuAttr->area;
+	int mnuColour =  mnuAttr->mnuColour;
+	char* txt=hdrString;
+	int nPixels;
+	int xPos,yPos,sy,txtXpos;  // RAVI - Removed txtLen, sx
+
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+	USHORT		titleIconWidth = 0;
+	USHORT 		iconX, iconY;
+#endif
+
+	xPos = mnuArea->px;
+	yPos = mnuArea->py;
+	sy = res_getTitleHeight();
+	resources_setTitleColour(mnuColour);
+    dspl_Clear(xPos,yPos,(U16)(mnuArea->sx+xPos-1),(U16)(mnuArea->sy+yPos-1));
+	if ((mode & MNU_HDR_ALIGN) == MNU_HDR_LEFT)
+	{
+		//Position is correct
+		txtXpos = xPos;
+	}
+	else
+	{
+		nPixels = dspl_GetTextExtent( txt, 0);
+		if ((mode & MNU_HDR_ALIGN) == MNU_HDR_RIGHT)
+		{
+			txtXpos =  xPos + mnuArea->sx - nPixels;
+		}
+		else
+		{	//Display in middle
+			txtXpos =  xPos + (mnuArea->sx - nPixels)/2;
+		}
+	}
+
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+       if (mnuAttr->icon != NULL)
+	{
+		if (mnuAttr->icon->area.sx > TITLE_ICON_WIDTH) 
+		{
+			titleIconWidth = TITLE_ICON_WIDTH;
+		}
+		else
+		{
+			titleIconWidth = mnuAttr->icon->area.sx;
+		}
+	}			
+	else
+	{
+		titleIconWidth = 0;
+	}
+
+	if(titleIconWidth)
+		txtXpos = txtXpos + titleIconWidth + 1;
+
+    if (mnuAttr->icon != NULL)
+    {
+		if(mnuAttr->icon->selfExplanatory == FALSE)
+		{
+			if (txt[0] != 0x80)
+				dspl_ScrText (txtXpos, yPos, txt, 0);
+			else
+				dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt );
+		}	
+    }
+    else
+    {
+			if (txt[0] != 0x80)
+				dspl_ScrText (txtXpos, yPos, txt, 0);
+			else
+				dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt );
+    }
+#else
+	if (txt[0] != 0x80)
+		dspl_ScrText (txtXpos, yPos, txt, 0);
+	else
+		dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt );
+#endif	
+
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+    if (mnuAttr->icon != NULL)
+	{
+	    if (mnuAttr->icon->icons != NULL)
+	    {
+			if ((mnuAttr->icon->area.sx > TITLE_ICON_WIDTH) || (mnuAttr->icon->area.sy > TITLE_ICON_HEIGHT))
+			{
+				/* iconY calculates place holder to place the icon 
+					at the center of the screen. */
+				   iconX = 1;
+				   iconY = 1+ ((sy-2) / 2) - (10 / 2);
+				   dspl_BitBlt2(iconX, iconY, 8, 
+						10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
+			}
+			else
+			{
+			        dspl_BitBlt2(mnuAttr->icon->area.px, mnuAttr->icon->area.py,
+			   	                mnuAttr->icon->area.sx, mnuAttr->icon->area.sy,
+			                    mnuAttr->icon->icons, 0, mnuAttr->icon->icnType);
+			}
+	    	}
+    	}
+#endif
+
+	areaLeft->px = xPos;	
+	areaLeft->sx = mnuArea->sx;
+	areaLeft->py = yPos+sy;	
+	areaLeft->sy = mnuArea->sy-sy;
+#ifdef MFW_DEBUG_DISPLAY_SIZE
+    dspl_DrawRect(xPos,yPos,(xPos+mnuArea->sx-1),(yPos+sy-1));
+#endif    
+	resources_restoreMnuColour();
+}
+
+// Sep 30, 2005  REF: CRR MMI-SPR-33781  xreddymn
+// Description: Menu header not displayed for Golite
+// Solution: Added functionality to display menu header
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuDrawHeaderBW    |
++--------------------------------------------------------------------+
+
+  PURPOSE : Displays menu header (title) on monochrome displays.
+  Code is based on mnuDrawHeader. See also mnuDrawHeader.
+*/
+static void mnuDrawHeaderBW(MfwMnuAttr *mnuAttr, MfwRect* areaLeft, char *hdrString)
+{
+	int     mode = mnuAttr->mode;
+	MfwRect *mnuArea = mnuAttr->area;
+	int     mnuColour = mnuAttr->mnuColour;
+	char    *txt = hdrString;
+	int     nPixels;
+	int     xPos, yPos, sx, sy, txtLen, txtXpos;
+
+	xPos = mnuArea->px;
+	yPos = mnuArea->py;
+	sy = res_getTitleHeight();
+	resources_setTitleColour(mnuColour);
+	dspl_Clear(xPos, yPos, (U16)(mnuArea->sx + xPos - 1), (U16)(mnuArea->sy + yPos - 1));
+	dspl_DrawLine(xPos, (U16)(sy + yPos - 2), (U16)(mnuArea->sx + xPos - 1), (U16)(sy + yPos - 2));
+	if ((mode & MNU_HDR_ALIGN) == MNU_HDR_LEFT)
+	{	//Position is correct
+		txtXpos = xPos;
+	}
+	else
+	{
+		nPixels = dspl_GetTextExtent( txt, 0);
+		if ((mode & MNU_HDR_ALIGN) == MNU_HDR_RIGHT)
+		{
+			txtXpos = xPos + mnuArea->sx - nPixels;
+		}
+		else
+		{	//Display in middle
+			txtXpos = xPos + (mnuArea->sx - nPixels)/2;
+		}
+	}
+	if (txt[0] != 0x80)
+		dspl_ScrText (txtXpos, yPos, txt, 0);
+	else
+		dspl_TextOut(txtXpos, yPos, DSPL_TXTATTR_CURRENT_MODE, txt);
+	// Remaining area is calculated so that it does not touch
+	// or overlap with the menu header
+	areaLeft->px = xPos;
+	areaLeft->sx = mnuArea->sx;
+	areaLeft->py = yPos+sy + 1;
+	areaLeft->sy = mnuArea->sy - sy - 1;
+	resources_restoreMnuColour();
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : drawPageMenu       |
++--------------------------------------------------------------------+
+
+  PURPOSE : draws menu in page mode
+
+  GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be 
+				used (useStrID) and if the strings are ascii or unicode (uesDefLang).
+
+*/
+void fastCopyBitmap(int startX, 	int startY, 	// start position of bitmap
+						int bmpSx,	int bmpSy,		//size of bitmap
+						char*	srcBitmap,
+						int posX,   	int posY,   	// start of area to be copied into
+						int sx,     	int sy,     	// size of area to be copied into 
+						U32 bgd_col,	int bmptype);
+
+static void drawPageMenu (MfwMnu *mnu)
+{
+    MfwMnuAttr *ma;                     /* menu attributes          */
+    //U16 th, tw, tl;                     /* text height, width, len  */ // RAVI - Removed 
+    U16 ax, ay, aw, ah;  // RAVI -  , x;              /* menu area dimensions     */
+//    int tLines;                         /* lines in item text       */  // RAVI
+//    int nLines;                         /* lines in menu area       */ // RAVI
+    char *txt;                // RAVI - Removed *t2, save;          /* item text & clip saver   */
+    MfwIcnAttr * icn;                    /* item icon                */
+    U8 oldFont = -1;                    /* save previous font       */
+    MfwMnuItem *mi;                     /* current item             */
+  //  char  *t;      // RAVI - Removed tt [64]             /* temp item string         */
+
+
+    ma = mnu->curAttr;
+    if (ma->font != (U8) -1)
+        oldFont = dspl_SelectFontbyID(ma->font); /* setup font */
+
+    ax = ma->area->px; ay = ma->area->py;
+    aw = ma->area->sx; ah = ma->area->sy;
+
+    mi = ma->items + mnu->lCursor[mnu->level];
+    icn = mi->icon;
+	txt =  mi->str;
+ 	resources_setColour(ma->mnuColour);
+
+    if ((ma->mode & MNU_HDRFORMAT_STR)==0)  /* header is a text ID */
+		txt =  (char*)MmiRsrcGetText((int)txt);  
+ 	checkPredraw(mnu,mi,&txt,&icn);     /* ES!!                     */
+    {
+    	MfwRect areaLeft;
+    	mnuDrawHeader(ma,&areaLeft,txt);
+    	ax = areaLeft.px; ay = areaLeft.py;
+    	aw = areaLeft.sx; ah = areaLeft.sy;
+    }
+	if ((dspl_getDisplayType()==DSPL_COLOUR) &&  (ma->bgdBitmap != NULL))
+	{
+		MfwRect *bmpArea = &ma->bgdBitmap->area;
+		if ((ma->bgdBitmap->icons != NULL) &&  (bmpArea->sx >0) && (bmpArea->sy >0))
+		{
+			fastCopyBitmap(		(int)bmpArea->px, (int)bmpArea->py, (int)bmpArea->sx, (int)bmpArea->sy,
+									ma->bgdBitmap->icons,
+									(int)ax,(int)ay, (int)aw, (int)ah, 
+									dspl_GetBgdColour(),
+									ma->bgdBitmap->icnType);			
+		}
+		else
+		{
+		    dspl_Clear(ax,ay,(U16)(ax+aw-1),(U16)(ay+ah-1));
+		}			
+	}
+	else
+	{
+	    dspl_Clear(ax,ay,(U16)(ax+aw-1),(U16)(ay+ah-1));
+	}
+		
+    
+
+    if (icn != NULL)
+    {                                   /* show associated icon     */
+	dspl_BitBlt2(icn->area.px,icn->area.py,
+                    icn->area.sx,icn->area.sy,
+                    icn->icons,0,icn->icnType);
+
+    	}
+    if (oldFont != (U8) -1)
+        dspl_SelectFontbyID(oldFont);   /* restore previous font    */
+
+    checkPostdraw(mnu,mi);              /* ES!!                     */
+
+#ifdef MFW_DEBUG_DISPLAY_SIZE
+    dspl_DrawRect(ax,ay,(ax+aw-1),(ay+ah-1));
+#endif    
+	resources_restoreColour();
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : drawListMenu       |
++--------------------------------------------------------------------+
+
+  PURPOSE : draws menu in list mode
+
+  GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be 
+				used (useStrID) and if the strings are ascii or unicode (uesDefLang).
+*/
+#define MAX_STR_CHAR 64
+static void drawListMenu (MfwMnu *mnu)
+{
+    MfwMnuAttr *ma;                     /* menu attributes          */
+    U16 fh, fw;                         /* font height & width      */
+    U16 ax, ay, aw, ah;                 /* menu area dimensions     */
+    U16 x, x2=0, EOL_position=0, hfh=0;
+    int nLines;
+    int i;
+    int nIdx;
+    int nTextLen;
+    MfwIcnAttr * icn;
+//    int fit;    // RAVI
+    char *txtStr;                          /* item text                */
+    char txt[MAX_STR_CHAR];
+    U8 oldFont = -1;                    /* save previous font       */
+//	UBYTE temp;	   // RAVI
+//	int UniHeight = 12;  // RAVI
+	int simpleScrolling;
+	int status;							/* SPR#998 - SH - Status for each menu item */
+	const USHORT checkbox_width = 7;	/* SPR#998 - SH - Checkbox width in pixels */
+	const USHORT checkbox_height = 7;	/* SPR#998 - SH - Checkbox height in pixels */
+	const USHORT checkbox_spacing_left = 1;	/* SPR#998 - SH - Gap between left edge of menu and checkbox */
+	const USHORT checkbox_spacing_right = 2; /* SPR#998 - SH - Gap between right edge of checkbox and menu text */
+	USHORT checkbox_x;		/* SPR#998 - SH - X position of checkbox */
+	USHORT checkbox_y;		 /* SPR#998 - SH - Y position of checkbox */
+
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+	USHORT		titleIconWidth = 0;
+	USHORT 		iconX, iconY;
+#endif
+
+	TIME_TRACE_EVENT("drawListMenu() start");	
+    ma = mnu->curAttr;
+
+	/* SPR#1983 - SH - Ignore language type now */
+	
+    if (ma->font != (U8) -1)
+        oldFont = dspl_SelectFontbyID(ma->font); /* setup font */
+
+	/* xreddymn Dec-16-2004 MMI-SPR-27384: Two line height list display */
+	if((ma->mode & MNU_DISPLAY)== MNU_LIST_2_LINE)
+	{
+		hfh = dspl_GetFontHeight(); 	/* height of one line */
+		fh = hfh<<1;					/* height of two lines */
+	}
+	else
+		fh = dspl_GetFontHeight();
+    fw = dspl_GetTextExtent("X",1); // ES!! only for normal fonts !
+    
+    //Display header info (if required)
+    if ((ma->hdrId != 0) && (dspl_getDisplayType()==DSPL_COLOUR))
+    {
+    	MfwRect areaLeft;
+    	char *hdrStr;
+	    if ((ma->mode & MNU_HDRFORMAT_STR)==0)  /* header is a text ID */
+			hdrStr =  MmiRsrcGetText(ma->hdrId);  
+    	else
+    		hdrStr = (char*)(ma->hdrId);
+    	mnuDrawHeader(ma,&areaLeft,hdrStr);
+    	ax = areaLeft.px; ay = areaLeft.py;
+    	aw = areaLeft.sx; ah = areaLeft.sy;
+    }
+    // Sep 30, 2005  REF: CRR MMI-SPR-33781  xreddymn
+    // Description: Menu header not displayed for Golite
+    // Solution: Added functionality to display menu header
+    // Display a different header in case of monochrome screens
+    else if((ma->hdrId != 0) && (DSPL_BW == dspl_getDisplayType()))
+    {
+    	MfwRect areaLeft;
+    	char *hdrStr;
+    	if ((ma->mode & MNU_HDRFORMAT_STR) == 0)  /* header is a text ID */
+    		hdrStr = MmiRsrcGetText(ma->hdrId);
+    	else
+    		hdrStr = (char*)(ma->hdrId);
+    	mnuDrawHeaderBW(ma, &areaLeft, hdrStr);
+    	ax = areaLeft.px; ay = areaLeft.py;
+    	aw = areaLeft.sx; ah = areaLeft.sy;
+    }
+    else
+    {
+    	ax = ma->area->px; ay = ma->area->py;
+    	aw = ma->area->sx; ah = ma->area->sy;
+    }
+    resources_setColour(ma->mnuColour);
+    dspl_Clear(ax,ay,(U16)(aw+ax-1),(U16)(ah+ay-1));
+    nLines = ah / fh;
+	mnu->nLines = nLines; //Store the number of lines we are drawing for scrolling up/down
+    {
+//    	TRACE_EVENT_P5(" ax:%d ay:%d aw:%d ah:%d lines:%d",ax,ay,aw,ah, nLines);
+    } 	
+	if ((!mnu->scrollMode)||(countVisible(mnu,ma,ma->nItems)<=nLines)) /* Simple scrolling */
+		simpleScrolling = TRUE;
+	else
+		simpleScrolling = FALSE;
+
+	if (simpleScrolling)
+	{
+	    nIdx = (countVisible(mnu,ma,mnu->lCursor[mnu->level])/nLines)*nLines;
+	}
+	else
+	{
+		int count=mnu->lShift[mnu->level];
+		int index= mnu->lCursor[mnu->level]+1;
+		int nVisibles = countVisible(mnu,ma,ma->nItems);
+
+		while (ma->items[index-1].flagFunc(mnu,ma,&(ma->items[index-1])) & MNU_ITEM_HIDE)
+	    {
+			index++;
+        } 
+
+		while (count>0){
+			if (index<=0)
+				index = ma->nItems-1;
+			else
+				index--;
+	        if (!(ma->items[index].flagFunc(mnu,ma,&(ma->items[index]))& MNU_ITEM_HIDE))
+				count--;								
+		}
+		if (nVisibles<nLines)
+			nLines = nVisibles;
+	    nIdx = index;	
+	}
+
+    for (i = 0; i < nLines; nIdx++)     /* ES!! not so nice...      */
+    {
+    	if (nIdx >= ma->nItems)
+    	{
+			if (simpleScrolling)
+				break;
+			else
+				nIdx=0;				
+		}
+	
+        if (ma->items[nIdx].flagFunc(mnu,ma,&(ma->items[nIdx]))
+	                                            & MNU_ITEM_HIDE)
+            continue;
+	    if (mnu->useStrID)                   /* use language handler     */
+			txtStr = (char*)MmiRsrcGetText((int)ma->items[nIdx].str);   //JVJE
+    	else
+            txtStr = ma->items[nIdx].str;
+		icn = ma->items[nIdx].icon;
+
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+       if (icn != NULL)
+	{
+		if (icn->area.sx > TITLE_ICON_WIDTH) 
+		{
+			titleIconWidth = TITLE_ICON_WIDTH;
+		}
+		else
+		{
+			titleIconWidth = icn->area.sx;
+		}
+	}			
+	else
+	{
+		titleIconWidth = 0;
+	}
+#endif
+
+        checkPredraw(mnu,ma->items+nIdx,&txtStr,&icn); /* ES!!         */
+		memcpy(txt,txtStr,MAX_STR_CHAR);
+    	status = checkStatus(mnu,ma,ma->items+nIdx,txt); /* SPR#998 - SH - Store the resulting status  */
+
+	    if ((mnu->useStrID) &&
+	       ((ma->mode & MNU_DISPLAY) == MNU_LIST_COLOUR))
+	    {
+			resources_setColourMnuItem( (int)ma->items[nIdx].str );
+	    }
+
+		/* xreddymn Dec-16-2004 MMI-SPR-27384: For two line menu item display */
+		if((ma->mode & MNU_DISPLAY)== MNU_LIST_2_LINE)
+		{
+			EOL_position=0;
+#ifdef NO_ASCIIZ
+			if(txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
+ 			{
+				while((((U16*)txt)[EOL_position]!='\n') && (((U16*)txt)[EOL_position]!='\0')) EOL_position++;
+				if(((U16*)txt)[EOL_position]=='\0')	/* Less than two lines to display */
+					EOL_position=0;
+				else									/* Two lines to display, break each line with a '\0' */
+				{
+					((U16*)txt)[EOL_position]='\0';
+					EOL_position++;
+				}
+			}
+			else
+#endif
+			{
+				while((txt[EOL_position]!='\n') && (txt[EOL_position]!='\0')) EOL_position++;
+				if(txt[EOL_position]=='\0')				/* Less than two lines to display */
+					EOL_position=0;
+				else									/* Two lines to display, break each line with a '\0' */
+				{
+					txt[EOL_position]='\0';
+					EOL_position++;
+				}
+			}
+			if(EOL_position>0)
+			{
+#ifdef NO_ASCIIZ
+				if(txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
+					nTextLen = dspl_GetTextExtent((char*)(txt+(EOL_position<<1)),(U16)dspl_str_length(txt));
+				else
+#endif
+					nTextLen = dspl_GetTextExtent((char*)(txt+EOL_position),(U16)dspl_str_length(txt));
+
+				/* SPR#998 - SH - If list is a checkbox list, include space for checkbox in width */	
+				if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED)
+				{
+					nTextLen+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right);
+				}
+				/* end of SPR#998 */
+			
+		        if ((ma->mode & MNU_ALIGN) == MNU_CENTER)
+			        x2 = (U16) (ax + (aw - nTextLen) / 2);
+		        else if ((ma->mode & MNU_ALIGN) == MNU_RIGHT)
+			        x2 = (U16) (ax + aw - nTextLen);
+		        else
+			        x2 = (U16) (ax + fw);        /* MNU_LEFT (default)       */
+				if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE)
+					x2 =ax;
+			}
+		}
+
+        nTextLen = dspl_GetTextExtent(txt,(U16)dspl_str_length(txt));
+
+		/* SPR#998 - SH - If list is a checkbox list, include space for checkbox in width */
+		
+		if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED)
+		{
+			nTextLen+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right);
+		}
+
+		/* end of SPR#998 */
+		
+        if ((ma->mode & MNU_ALIGN) == MNU_CENTER)
+	        x = (U16) (ax + (aw - nTextLen) / 2);
+        else if ((ma->mode & MNU_ALIGN) == MNU_RIGHT)
+	        x = (U16) (ax + aw - nTextLen);
+        else
+	        x = (U16) (ax + fw);        /* MNU_LEFT (default)       */
+		if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE)
+			x =ax;
+
+		/* SPR#998 - SH - Draw checkboxes if required */
+
+		if (status==MNU_ITEM_CHECKED || status==MNU_ITEM_UNCHECKED)
+		{	
+			checkbox_x = x+checkbox_spacing_left;
+			checkbox_y = ay+i*fh+(fh-checkbox_height)/2;
+			
+			if (status==MNU_ITEM_CHECKED)
+			{
+				/* NOTE: for some reason, a filled rect must have x2, y2 +1 of the same size
+				 * of unfilled rect...compare parameters here and below */
+				dspl_DrawFilledRect(checkbox_x, checkbox_y, checkbox_x+checkbox_width+1,
+					checkbox_y+checkbox_height+1);
+			}
+			else
+			{
+				dspl_DrawRect(checkbox_x, checkbox_y, checkbox_x+checkbox_width,
+					checkbox_y+checkbox_height);
+			}
+			x+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right); /* Text box now starts just to the right of checkbox */
+
+			/* xreddymn Dec-16-2004 MMI-SPR-27384: For two line menu item display */
+			x2+=(checkbox_spacing_left+checkbox_width+checkbox_spacing_right);
+		}
+
+		/* end of SPR#998 */
+		
+		{      
+#ifdef NO_ASCIIZ
+/*MC, use universal height rather than smaller chinese font height*/
+/*MC, SPR1526, send  whole string to dspl_TextOut, rather than missing out unicode tag*/
+/* SPR#1983 - SH - If unicode is set, send text as unicode */
+
+			if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
+			{
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+				if (icn != NULL)
+				{
+					if(icn->selfExplanatory == FALSE)
+					dspl_TextOut(titleIconWidth + 1 + x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
+				}
+				else
+					dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
+#else
+				dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
+#endif
+				if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
+				{
+					dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,(char*)(txt+(EOL_position<<1)));
+
+				}
+			}
+			else
+#endif
+			{
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+				if (icn != NULL)
+				{
+					if(icn->selfExplanatory == FALSE)
+					dspl_TextOut(titleIconWidth + 1 + x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
+				}
+				else
+					dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
+#else			
+				dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
+#endif
+				if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
+				{
+					dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE,(char*)(txt+EOL_position));
+				}
+			}	
+		}
+
+	    if (nIdx == mnu->lCursor[mnu->level])
+        {
+	        if ((ma->mode & MNU_ITEMSEL) == MNU_FRAMED)
+            dspl_DrawRect(ax,(U16)(ay+i*fh),(U16)(aw-2+ax),
+                                                (U16)(fh-1+ay+i*fh));
+	        else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_ARROW)
+            	dspl_TextOut(ax,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,">");
+            else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_STAR)
+	            dspl_TextOut(ax,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,"*");
+            else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_BLOCK)
+	            dspl_TextOut(ax,(U16)(ay+i*fh),
+                            DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS," ");
+	        else if ((ma->mode & MNU_ITEMSEL) == MNU_CUR_LINE)
+            {
+				if (dspl_getDisplayType()==DSPL_BW)
+				{
+	       			dspl_DrawFilledColRect(x,ay+i*fh,aw,ay+(i+1)*fh,0x00FFFFFF);
+#ifdef NO_ASCIIZ
+					/* SPR#1983 - SH - If unicode is set, send text as unicode */
+					if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
+					{
+						dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,txt);
+						if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
+						{
+							dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE|DSPL_TXTATTR_INVERS,(char*)(txt+(EOL_position<<1)));
+						}
+					}
+					else
+#endif
+					{
+						dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS,txt);
+						if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
+						{
+							dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE|DSPL_TXTATTR_INVERS,(char*)(txt+EOL_position));
+						}
+					}
+				}
+				else
+				{
+					resources_setHLColour(ma->mnuColour);
+	       			dspl_DrawFilledBgdRect(x,ay+i*fh,aw,ay+(i+1)*fh);
+#ifdef NO_ASCIIZ
+					/* SPR#1983 - SH - If unicode is set, send text as unicode */
+					if (txt[0] == 0x80 || mnu->textDCS==MNU_LIST_LANGUAGE_UNICODE)
+					{
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+				if (icn != NULL)
+				{
+						if(icn->selfExplanatory == FALSE)
+						dspl_TextOut(titleIconWidth + x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
+				}
+				else
+					dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
+#else
+						dspl_TextOut(x,(U16)ay+i*fh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,txt);
+#endif
+						if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
+						{
+							dspl_TextOut(x2,(U16)ay+i*fh+hfh/*MC, 1319*/,DSPL_TXTATTR_UNICODE,(char*)(txt+(EOL_position<<1)));
+						}
+					}
+					else
+#endif
+					{
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+				if (icn != NULL)
+				{
+						if(icn->selfExplanatory == FALSE)
+						dspl_TextOut(titleIconWidth + x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
+				}
+				else
+					dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
+#else
+						dspl_TextOut(x,(U16)(ay+i*fh),DSPL_TXTATTR_CURRENT_MODE,txt);
+#endif
+						if(EOL_position>0) /* xreddymn Dec-16-2004 MMI-SPR-27384: two line display */
+						{
+							dspl_TextOut(x2,(U16)(ay+i*fh+hfh),DSPL_TXTATTR_CURRENT_MODE,(char*)(txt+EOL_position));
+						}
+					}
+					resources_restoreMnuColour();
+
+				}
+			}
+            if (icn != NULL)// && icn->nIcons > nIdx)
+	        {
+// Shashi Shekar B.S., a0876501, Feb 4, 2006, DR: OMAPS00061462
+#ifdef FF_MMI_SAT_ICON
+/* There is a problem when this icon is displayed. 
+The last parameter was not taken into consideration & a default '0' was been set. This is corrected now.*/
+/*    	        dspl_BitBlt2(icn->area.px, icn->area.py,
+        	                icn->area.sx, icn->area.sy,
+                            icn->icons, 0, icn->icnType);*/
+
+		if ((icn->area.sx > LINE_ICON_WIDTH) || (icn->area.sy > fh))
+		{
+			   dspl_BitBlt2(icn->area.px, icn->area.py,
+		   	                icn->area.sx, icn->area.sy, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
+		}
+		else
+		{
+		        dspl_BitBlt2(icn->area.px, icn->area.py,
+		   	                icn->area.sx, icn->area.sy,
+		                    icn->icons, 0, icn->icnType);
+		}
+#else
+    	        dspl_BitBlt2(icn->area.px,icn->area.py,
+        	                icn->area.sx,icn->area.sy,
+                            icn->icons,(U16)nIdx,0);
+#endif
+	        }
+    	}
+        i++;
+	    checkPostdraw(mnu,ma->items+nIdx); /* ES!!                  */
+    }	
+
+    if (oldFont != (U8) -1)
+        dspl_SelectFontbyID(oldFont);   /* restore previous font    */
+
+    /* SPR#1983 - SH - No longer have to change text type back */
+    
+    resources_restoreColour();
+#ifdef MFW_DEBUG_DISPLAY_SIZE
+    dspl_DrawRect(ax,ay,(ax+aw-1),(ay+ah-1));
+#endif    
+TIME_TRACE_EVENT("drawListMenu() end");	
+
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : drawFreeMenu       |
++--------------------------------------------------------------------+
+
+  PURPOSE : draws menu in overlapped mode
+
+*/
+static void drawFreeMenu (MfwMnu *mnu)
+{
+// ES!! to be revised
+//kk needs font entry
+    int nFontHeight;
+    int i, x;
+    int nIdx;
+    int nTextLen;
+    MfwIcnAttr * icn;
+
+    MfwMnuAttr *wa;                     /* working attribute        */
+
+
+    wa = mnu->curAttr;
+    dspl_Clear(wa->area->px,wa->area->py,
+                (U16)(wa->area->sx+wa->area->px-1),
+                (U16)(wa->area->sy+wa->area->py-1));
+    nFontHeight = dspl_GetFontHeight();
+    nTextLen = dspl_GetTextExtent(wa->items[mnu->lCursor[mnu->level]].str,
+        (U16)dspl_str_length(wa->items[mnu->lCursor[mnu->level]].str));
+
+    if ((wa->mode & MNU_ALIGN) == MNU_CENTER)
+        x = wa->area->px + (wa->area->sx - nTextLen) / 2;
+    else if ((wa->mode & MNU_ALIGN) == MNU_RIGHT)
+        x = wa->area->px + wa->area->sx - nTextLen;
+    else
+        x = wa->area->px;
+ 
+    dspl_TextOut((U16)x,(U16)(wa->area->py+wa->area->sy-nFontHeight),DSPL_TXTATTR_CURRENT_MODE,
+                 wa->items[mnu->lCursor[mnu->level]].str);
+
+    for (i = 0; i < wa->nItems; i++)
+    {
+        nIdx = (mnu->lCursor[mnu->level] + i + 1) % wa->nItems;
+        icn = wa->items[nIdx].icon;
+        if (icn != NULL)
+            dspl_BitBlt(icn->area.px,icn->area.py,
+                        icn->area.sx,icn->area.sy,
+                        0/*icn->usIndex*/,icn->icons,0);
+    }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuCommand         |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle mfw windows command
+
+*/
+
+static int mnuCommand (U32 cmd, void *h)
+{
+    switch (cmd)
+    {
+        case MfwCmdDelete:              /* delete me                */
+            if (!h)
+                return 0;
+            mnuDelete(h);
+            return 1;
+        case MfwCmdUpdate:              /* repaint                  */
+            if (!h || ((MfwHdr *) h)->type != MfwTypMnu)
+                return 0;
+            mnuUpdate(((MfwHdr *) h)->data);
+            return 1;
+        default:
+            break;
+    }
+
+    return 0;
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuScrollMode      |
++--------------------------------------------------------------------+
+
+  PURPOSE : handle mfw windows command
+
+*/
+
+void mnuScrollMode (MfwHnd menu,U8 mode)
+{
+	MfwMnu *mnu;
+	
+    if ((mnu = mfwControl(menu)) == 0)
+        return;
+	mnu->scrollMode = mode;	
+}
+
+
+void mnuInitDataItem(MfwMnuItem* mnuItem)
+{
+	mnuItem->icon = 0;
+	mnuItem->exta = 0;
+	mnuItem->menu = 0;
+	mnuItem->func = 0;	
+    mnuItem->str = NULL;                       
+    mnuItem->flagFunc = 0; 
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
+| STATE   : code                        ROUTINE : mnuIdentify           |
++--------------------------------------------------------------------+
+
+  PURPOSE : SPR998 - SH - Identify menu option.  Returns the index of the option, or -1
+  if option is not found.
+
+*/
+
+int mnuIdentify(struct MfwMnuAttrTag *attr, struct MfwMnuItemTag *item)
+{
+	int index;
+	int currentOption;
+	
+	/* Identify current menu option */
+
+	currentOption = -1;
+	
+	for (index=0; index < attr->nItems; index++)
+	{
+		if (&attr->items[index]==item)
+			currentOption = index;
+	}
+
+	return currentOption;
+}
+
+
+MMI_TRACE_P1(char* str, int err)
+{
+	TRACE_EVENT_P2("%s:%d",str,err);
+}
+
+