view src/ui/bmi/mmiLists.c @ 46:09cdd5bf04e4

Condat display driver fix for 96x64 BW framebuffer
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 17 Oct 2020 22:50:15 +0000
parents 67bfe9f274f6
children c0052fe355d3
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:		    MmiLists.c
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    22/02/01                                                      
                                                                               
********************************************************************************
                                                                              
 Description:

  

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

 $History: MmiLists.c

    July 10, 2007    REF:  DRT OMAPS00135679  x0073106
    Description:MM: Board freezes while choosing settings menu in File management.
    Solution: Hang-up key is mapped properly while going back from audio list window.

    Mar 30, 2007    REF: OMAPS00122691  x0039928
    Description: COMBO: No melody heard on parsing over different volums in tones menu
    Solution: E_MELODY_START event is sent to play the melody.
    
 	xrashmic 8 Sep 2006, OMAPS00091618
	Removed redundant code introduced during integration
 	
    June 19, 2006    REF: DRT OMAPS00076378  x0012849 : Jagannatha
    Description: MIDI files should play while browsing
    Solution: Event will be generated upon press of Menu up and down key.

	June 05, 2006 REF:OMAPS00060424 x0045876
 	Description: Header Toggling
 	Solution: Implemented the toggling of header when displaying the length text in SELECT ITEM and SET UP MENU

 	May 18, 2006    REF: DRT OMAPS00076438  xdeepadh	
	Description: Scrolling not implemented in Imageviewer
	Solution: The support for scrolling has been provided.

       	May 03, 2006    REF: DRT OMAPS00076439  xdeepadh
	Description: Image viewer back not working 
	Solution: The Preview List will be repopulated, when the list window is 
	resumed.

       	May 03, 2006    REF: DRT OMAPS00076376  xdeepadh
	Description: File Viewer-N5.12 issues (very unstable)
	Solution: The keys are blocked until the view or preview is completed.
 	
	Dec 22, 2005    REF: ENH  xdeepadh
	Description: Image Viewer Application
	Solution: Implemeted the Image Viewer  to view the jpeg images

       xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       Using the MenuSelect Key for requesting the help info in STK menu. Storing the info that 
       MenuSelectKey was pressed in a list view.
                
   	May 24, 2005    REF: CRR 29358  x0021334
	Description: CT_PTCRB 27.22.4.9.8 fails: wrong terminal response
	Fix:	The implementation is now based on timer. After the specified timeout period
	       the control comes back to SAT main menu, if there is no selection done by the user.

	25/10/00			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 "gdi.h"
#include "audio.h"

#include "pconst.cdg"
#include "mconst.cdg"
#include "message.h"
#include "ccdapi.h"
#include "prim.h"
#include "cus_aci.h"
#include "cnf_aci.h"
#include "mon_aci.h"

#include "tok.h"

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




#include "mfw_sys.h"

#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.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 "mfw_tim.h"

#include "mfw_sim.h"
#include "mfw_cm.h"
#include "mfw_nm.h"
#include "mfw_phb.h"
#include "mfw_mme.h"
#include "mfw_sat.h"
#include "mfw_sms.h"

#include "dspl.h"

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

#include "MmiMain.h"
#include "MmiBookController.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiLists.h"



#include "MmiMenu.h"
#include "mmiCall.h"
#include "Mmiicons.h"
#include "MmiIdle.h"

#include "MmiSoftKeys.h"
#include "MmiSounds.h"
#include "MmiIdle.h"
#include "MmiNetwork.h"
#include "mmiSat_i.h"
#include "MmiAoc.h"


#include "cus_aci.h"
#include "mfw_ffs.h"
#include "MmiTimers.h"



#include "mmiColours.h"


#ifndef MFW_EVENT_PASSED
#define MFW_EVENT_PASSED 0
#endif

/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
MfwHnd g_win;		

extern MfwHnd g_title_timer;
/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */

extern MfwRect menuArea;               /* menus display area      */
extern BOOL getMelodyListStatus(void);

typedef enum
{
    E_INIT,
    E_BACK,
    E_RETURN,
    E_ABORT,
    E_EXIT
} e_lists_events;



/*-----------------------------------------------------------------------------
*
* List menu handling functions:
*
*-----------------------------------------------------------------------------*/
// ADDED BY RAVI - 28-11-2005
EXTERN UBYTE mnuDCSType (MfwHnd m, UBYTE listLanguageType);
EXTERN BOOL getScrollStatus(void);
// END RAVI - 28-11-2005


static int listsKeyEvent(MfwEvt event, MfwKbd *keyboard);
static int listsWinEvent(MfwEvt e, MfwWin *w);
static int listsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle);
static void lists_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);
static int listsIconsKeyEvent(MfwEvt event, MfwKbd *keyboard);
static int listsIconsWinEvent(MfwEvt e, MfwWin *w);
static int listsIconsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle);
static void listsIcons_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter);


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

 $Function:  listIconsDisplayListMenu  

 $Description:	 Creates a list menu from data stored in NVRAM.

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
 MfwHnd winIconsLists;
T_MFW listIconsDisplayListMenu (MfwHnd Parent, ListMenuData *Data, ListCbFunc cbFunc,int inUnicode)
{
    // UBYTE i;  // RAVI - Not Used.
    MfwWin * win;
    MfwHnd winLists;
    T_MFW Status = LISTS_OK;

    TRACE_FUNCTION ("listIconsDisplayListMenu() Start");

    winLists = winCreate(Parent, 0, E_WIN_VISIBLE |E_WIN_RESUME|E_WIN_SUSPEND, (MfwCb)listsIconsWinEvent);
	winIconsLists=winLists;
    if (winLists == NULL)
	{
	    Status = LISTS_FAIL;				/* Inform caller of failure. */
	    TRACE_EVENT ("win creation fails");
	}
    else
	{
	    ListIconsWinInfo * ListData = (ListIconsWinInfo *)ALLOC_MEMORY (sizeof (ListIconsWinInfo));

		if (!ListData)
			{
				/* cq12719. if insufficient memory for listdata then delete window and Free allocated memory.16-03-04.MZ */
				if(NULL != winLists)
					winDelete(winLists);
				
				 TRACE_EVENT ("(ListIconsWinInfo *)ALLOC_MEMORY fails");
				 return LISTS_FAIL;
			}

	    ListData->mmi_control.dialog = (T_DIALOG_FUNC)lists_exec_cb;
	    ListData->mmi_control.data   = ListData;
	    win = ((MfwHdr *)winLists)->data;
	    win->user = (void *) ListData;

	    ListData->Parent = Parent;
	    ListData->Callback = cbFunc;
	    ListData->winLists = winLists;
	    ListData->kbdLists =      kbdCreate(winLists,Data->KeyEvents|KEY_MAKE,(MfwCb)listsIconsKeyEvent);
	    ListData->kbdLists_long = kbdCreate(winLists,Data->KeyEvents|KEY_LONG,(MfwCb)listsIconsKeyEvent);

	    if ((ListData->kbdLists == NULL) || (ListData->kbdLists_long == NULL))
		{
		    Status = LISTS_FAIL;
			TRACE_EVENT ("ListData->kbdLists fails");
		}
	    else
		{
		    /* Create initial list menu for display. */

		    /*
		     * set menu list from outside
		     */
		    ListData->MenuListsAttr = *Data->Attr; /* copy contents */

		    /* SPR#2492 - DS - Do not overwrite mode settings unless mode is zero */
		    if (ListData->MenuListsAttr.mode == 0x0000) /* Mode not yet setup */
         		    ListData->MenuListsAttr.mode = MNU_LEFT | MNU_LIST | MNU_CUR_LINE;
		    else
        		    ListData->MenuListsAttr.mode |= Data->Attr->mode;
		    
 		    ListData->MenuListsAttr.font = Data->Font; 
		    ListData->MenuListsAttr.items = Data->List;
		    ListData->MenuListsAttr.nItems = Data->ListLength;

		    /* START: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */
		   ListData->MenuListsAttr.header_toggle = Data->Attr->header_toggle;
		   if (ListData->MenuListsAttr.header_toggle)
		   	g_win = winLists;
		    /* END: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */


		    /*
		     * Intialize List Menu Data
		     */
		    ListData->MenuData = Data; /* copy contents */
		    ListData->MenuData->listCol = COLOUR_LIST_XX; //Set-up colour
		    ListData->MenuData->Attr = &ListData->MenuListsAttr; /* copy data*/
		    ListData->MenuLists = mnuCreate(winLists, &ListData->MenuListsAttr,
						    E_MNU_SELECT | E_MNU_ESCAPE| E_MNU_POSTDRAW, 
						    (MfwCb)listsIconsListCbMenu);
			ListData->MenuData->win = winLists;
			Data->win = winLists;
			mnuScrollMode(ListData->MenuLists,0);						
			if (Data->Strings)
				mnuLang (ListData->MenuLists,0);
			else
				mnuLang (ListData->MenuLists,mainMmiLng);

			/* SPR#1983 - SH - Set up whether menu is in unicode or not */
			if (inUnicode != 0)
			{
			    mnuDCSType(ListData->MenuLists, inUnicode); /* Unicode display */
			}
		    mnuChooseVisibleItem(ListData->MenuLists, Data->ListPosition-1);
		    mnuUnhide(ListData->MenuLists);
			displaySoftKeys(ListData->MenuData->LeftSoftKey,ListData->MenuData->RightSoftKey);
		    winShow(winLists);
			
		}
	}
    return Status;
}

static int listsIconsKeyEvent (MfwEvt e, MfwKbd *k)
    /* list keyboard event handler */
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    ListIconsWinInfo      * data = (ListIconsWinInfo *)win_data->user;
    MfwMnu *MenuHandle;

	/* This trace function was added inside the fflag by vinoj to remove compilation error: 2/6/06*/
	TRACE_FUNCTION("listsIconsKeyEvent() start");
    {
        //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       //Initialize selectKey to FALSE here. It will be set to TRUE only when a key event for KCD_MNUSELECT occurs.
       data->MenuData->selectKey = FALSE;
	if (!(e & KEY_MAKE))
	{
		return MFW_EVENT_CONSUMED;
	}
	if(data->MenuData->block_keys == TRUE)
	{
		return MFW_EVENT_CONSUMED;
	}
    if (e & KEY_LONG)
	{
	    switch (k->code)
		{
		case KCD_HUP: /* back to previous menu */
		    mnuEscape(data->MenuLists);
		    break;
		case KCD_RIGHT: /* Power Down */
		    return MFW_EVENT_PASSED; /* handled by idle */
		default: /* no response to all other keys */
		    return MFW_EVENT_CONSUMED;
		}
	}
    else
	{
	    switch (k->code)
		{
		case KCD_MNUUP: /* highlight previous entry */
		    mnuUp(data->MenuLists);
		      {
		      MenuHandle = mfwControl(data->MenuLists);
			 	data->MenuData->Reason = LISTS_REASON_SCROLL;
				data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
				data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; 
		    	  // Send event to indicate that the user has scrolled list items
		     	  SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);	
		      }			 			    

		    break;
		case KCD_MNUDOWN: /* highlight next entry */
		    mnuDown(data->MenuLists);
		      {
		      MenuHandle = mfwControl(data->MenuLists);
			 	data->MenuData->Reason = LISTS_REASON_SCROLL;
				data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
				data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; 
		    	  // Send event to indicate that the user has scrolled list items
		     	  SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);	
		      }			 			    
		    break;
		case KCD_MNUSELECT:
                //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
                //Menu Select Key was pressed, storing this for future use.
                data->MenuData->selectKey = TRUE;                
                //Break is delibrately not used here. The control should pass through the KCD_LEFT case.
		case KCD_LEFT: /* activate this entry */
 	    	MenuHandle = mfwControl(data->MenuLists);
               data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
		    mnuSelect(data->MenuLists);
		    break;
		case KCD_CALL: /* press send key */
		    data->ExitReason = LISTS_REASON_SEND;
		    data->MenuData->Reason = LISTS_REASON_SEND;
	    	MenuHandle = mfwControl(data->MenuLists);
		    data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
		    data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */

		    /* SPR998 - SH - check if callback exists before calling it! */
		    if (data->Callback)
		    	data->Callback(data->Parent, data->MenuData);
		    	
			if (data->MenuData->autoDestroy)
			{
				/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				if (data->MenuListsAttr.header_toggle)
				{
					if (g_title_timer)
					{
						tim_delete(g_title_timer);
				     		g_title_timer = NULL;
					}
				}
				/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				winDelete (win);
	    			FREE_MEMORY ((void*)data, sizeof (ListIconsWinInfo));
		    	}
		break;
		case KCD_HUP: /* back to previous menu */
		    data->ExitReason = LISTS_REASON_HANGUP;
		    data->MenuData->Reason = LISTS_REASON_HANGUP;
   			/*NM, p023 */

   	    	MenuHandle = mfwControl(data->MenuLists);
		    data->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
		    data->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
   			/*NM, p023 end */
		     data->Callback(data->Parent, data->MenuData);
			//July 10, 2007    REF:  DRT OMAPS00135679  x0073106	
			/*if (data->MenuData->autoDestroy)
			{*/
			       /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				if (data->MenuListsAttr.header_toggle)
				{
					if (g_title_timer)
					{
						tim_delete(g_title_timer);
				     		g_title_timer = NULL;
					}
				}
				/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				/*	winDelete (win);
	    		    	FREE_MEMORY ((void*)data, sizeof (ListIconsWinInfo));
		    }*/
			break;
		case KCD_RIGHT: /* back to previous menu */
		    mnuEscape(data->MenuLists);
		    break;
		default: /* no response to all other keys */
		    return MFW_EVENT_CONSUMED;
		}
	}
        }
    return MFW_EVENT_CONSUMED;
}

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

 $Function:  listsWinEvent  

 $Description:	 window event handler

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
static int listsIconsWinEvent(MfwEvt e, MfwWin *w)
{
    ListIconsWinInfo * ListData = (ListIconsWinInfo *)w->user;

    TRACE_FUNCTION("listsIconsWinEvent() start");
    TRACE_EVENT_P1("ListData->Parent %x",ListData->Parent);
    switch (e)
	{
        case E_WIN_VISIBLE:
            SEND_EVENT(ListData->Parent,LISTS_REASON_VISIBLE,0,(void*)ListData); 	
 	    	break;
        case MfwWinResume:
             SEND_EVENT(ListData->Parent,LISTS_REASON_RESUME,0,(void*)ListData); 	
	 break;	
        case MfwWinSuspend:
	   SEND_EVENT(ListData->Parent,LISTS_REASON_SUSPEND,0,(void*)ListData); 	
	 break;	
  	}
    return MFW_EVENT_CONSUMED;
}
/*a0393213 lint warning removal - This function is not used currently. So it's put under the flag. If it is required just remove the flag.*/
#ifdef MMI_LINT_WARNING_REMOVAL
static void listsIcons_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    ListIconsWinInfo    * ListData = (ListIconsWinInfo *)win_data->user;
    T_MFW_HND      * l_parent;
    SHORT            l_id;

    TRACE_FUNCTION ("listsIcons_exec_cb() start");

    switch (event)
	{
	case E_INIT:
	case E_BACK:
	case E_RETURN:
	case E_ABORT:
	case E_EXIT:
	    /* defaultreaction */
	    l_parent = ListData->Parent;
	    l_id = ListData->id;

	    /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    if (ListData->MenuListsAttr.header_toggle)
	    {
			if (g_title_timer)
			{
				tim_delete(g_title_timer);
				g_title_timer = NULL;
			}
	    }
	    /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    winDelete (win);
	    FREE_MEMORY ((void*) ListData, sizeof (ListIconsWinInfo));
	    SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
	    break;
	default:
	    return;
	}
}
#endif


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

 $Function:  listsListCbMenu  

 $Description:	 List menu handler. (mfw callback function)

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
int listsIconsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle)
{
    int Status = LISTS_OK;
    T_MFW_HND   win      = mfw_parent (mfw_header());
    T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
    ListIconsWinInfo* ListData = (ListIconsWinInfo *)win_data->user;

    TRACE_FUNCTION("listsIconsListCbMenu() ");
    switch (EventCode)
	{
        case E_MNU_SELECT:
	    ListData->ExitReason = E_MNU_SELECT;
	    ListData->MenuData->Reason = LISTS_REASON_SELECT;// MZ 14/2/01 E_MNU_SELECT;
	    ListData->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
	    ListData->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
	    /* SPR998 - SH - check if callback exists before calling it! */
		if (ListData->Callback)
	    	ListData->Callback(ListData->Parent, ListData->MenuData);
		break;
	case E_MNU_ESCAPE:
	    ListData->ExitReason = LISTS_REASON_BACK;
	    ListData->MenuData->Reason = LISTS_REASON_BACK;
	    /*NM, p023*/
	    ListData->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
	    ListData->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
	    /*NM, p023*/
	    
	    /* SPR998 - SH - check if callback exists before calling it! */
		if (ListData->Callback)
	    	ListData->Callback(ListData->Parent, ListData->MenuData);

	    break;
	case E_MNU_POSTDRAW:
	{
		T_MFW_WIN * winIconsLists_data = ((T_MFW_HDR *)winIconsLists)->data;
	    ListIconsWinInfo* winIconsListsData = (ListIconsWinInfo *)winIconsLists_data->user;		
		    winIconsListsData->ExitReason = LISTS_REASON_DRAWCOMPLETE;
	    winIconsListsData->MenuData->Reason = LISTS_REASON_DRAWCOMPLETE;
	    winIconsListsData->MenuData->CursorPosition = MenuHandle->lCursor[MenuHandle->level];
	    winIconsListsData->MenuData->ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
		winIconsListsData->MenuData->lineHeight=  MenuHandle->lineHeight;
		if (winIconsListsData->Callback)
	    	winIconsListsData->Callback(winIconsListsData->Parent, winIconsListsData->MenuData);
	}
	    break;
        default:
	    Status = LISTS_FAIL;
	    break;
	}


    return Status;
}

void listsIconsDestroy(T_MFW_HND win)
{
   	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
   	ListIconsWinInfo * ListData = (ListIconsWinInfo *)win_data->user;
    TRACE_EVENT_P1("listsIconsDestroy %x",win);

    	/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
   	if (ListData->MenuListsAttr.header_toggle)
   	{
   		if(g_title_timer)
      		{
      			tim_delete(g_title_timer);
      			g_title_timer = NULL;
		}
	}
    	/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    
       winDelete (win);
   	FREE_MEMORY ((void*) ListData, sizeof (ListIconsWinInfo));
    
}

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

 $Function:  listDisplayListMenu  

 $Description:	 Creates a list menu from data stored in NVRAM.

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
T_MFW listDisplayListMenu (MfwHnd Parent, ListMenuData *Data, ListCbFunc cbFunc,int inUnicode)
{
    // UBYTE i;  // RAVI - Not Used.
    MfwWin * win;
    MfwHnd winLists;
    T_MFW Status = LISTS_OK;

    TRACE_FUNCTION ("listDisplayListMenu() Start");

    winLists = winCreate(Parent, 0, E_WIN_VISIBLE |E_WIN_RESUME|E_WIN_SUSPEND, (MfwCb)listsWinEvent);

    if (winLists == NULL)
	{
	    Status = LISTS_FAIL;				/* Inform caller of failure. */
	    TRACE_EVENT ("win creation fails");
	}
    else
	{
	    ListWinInfo * ListData = (ListWinInfo *)ALLOC_MEMORY (sizeof (ListWinInfo));

		if (!ListData)
			{
				/* cq12719. if insufficient memory for listdata then delete window and Free allocated memory.16-03-04.MZ */
				if(NULL != winLists)
					winDelete(winLists);
				
				 TRACE_EVENT ("(ListWinInfo *)ALLOC_MEMORY fails");
				 return LISTS_FAIL;
			}

	    ListData->mmi_control.dialog = (T_DIALOG_FUNC)lists_exec_cb;
	    ListData->mmi_control.data   = ListData;
	    win = ((MfwHdr *)winLists)->data;
	    win->user = (void *) ListData;

	    ListData->Parent = Parent;
	    ListData->Callback = cbFunc;
	    ListData->winLists = winLists;
	    ListData->kbdLists =      kbdCreate(winLists,Data->KeyEvents|KEY_MAKE,         (MfwCb)listsKeyEvent);
	    ListData->kbdLists_long = kbdCreate(winLists,Data->KeyEvents|KEY_LONG,(MfwCb)listsKeyEvent);

	    if ((ListData->kbdLists == NULL) || (ListData->kbdLists_long == NULL))
		{
		    Status = LISTS_FAIL;
			TRACE_EVENT ("ListData->kbdLists fails");
		}
	    else
		{
		    /* Create initial list menu for display. */

		    /*
		     * set menu list from outside
		     */
		    ListData->MenuListsAttr = *Data->Attr; /* copy contents */

		    /* SPR#2492 - DS - Do not overwrite mode settings unless mode is zero */
		    if (ListData->MenuListsAttr.mode == 0x0000) /* Mode not yet setup */
         		    ListData->MenuListsAttr.mode = MNU_LEFT | MNU_LIST | MNU_CUR_LINE;
		    else
        		    ListData->MenuListsAttr.mode |= Data->Attr->mode;
		    
 		    ListData->MenuListsAttr.font = Data->Font; 
		    ListData->MenuListsAttr.items = Data->List;
		    ListData->MenuListsAttr.nItems = Data->ListLength;

		    /* START: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */
		   ListData->MenuListsAttr.header_toggle = Data->Attr->header_toggle;
		   if (ListData->MenuListsAttr.header_toggle)
		   	g_win = winLists;
		    /* END: x0045876, 05-June-2006 (OMAPS00060424 - Header Toggle) */


		    /*
		     * Intialize List Menu Data
		     */
		    ListData->MenuData = *Data; /* copy contents */
		    ListData->MenuData.listCol = COLOUR_LIST_XX; //Set-up colour
		    ListData->MenuData.Attr = &ListData->MenuListsAttr; /* copy data*/
		    ListData->MenuLists = mnuCreate(winLists, &ListData->MenuListsAttr,
						    E_MNU_SELECT | E_MNU_ESCAPE, 
						    (MfwCb)listsListCbMenu);
			ListData->MenuData.win = winLists;
			Data->win = winLists;
			mnuScrollMode(ListData->MenuLists,1);						
			if (Data->Strings)
				mnuLang (ListData->MenuLists,0);
			else
				mnuLang (ListData->MenuLists,mainMmiLng);

			/* SPR#1983 - SH - Set up whether menu is in unicode or not */
			if (inUnicode != 0)
			{
			    mnuDCSType(ListData->MenuLists, inUnicode); /* Unicode display */
			}
		    mnuChooseVisibleItem(ListData->MenuLists, Data->ListPosition-1);
		    mnuUnhide(ListData->MenuLists);
			TRACE_EVENT ("mmiList winShow()");
		    winShow(winLists);
		}
	}

    return Status;
}


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

 $Function:  listsKeyEvent  

 $Description:	 Keyboard event handler

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
static int listsKeyEvent (MfwEvt e, MfwKbd *k)
    /* list keyboard event handler */
{
    T_MFW_HND    win  = mfwParent(mfw_header());
    T_MFW_WIN  * win_data = ((T_MFW_HDR *)win)->data;
    ListWinInfo      * data = (ListWinInfo *)win_data->user;
    MfwMnu *MenuHandle;

	/* This trace function was added inside the fflag by vinoj to remove compilation error: 2/6/06*/

    {
        //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
       //Initialize selectKey to FALSE here. It will be set to TRUE only when a key event for KCD_MNUSELECT occurs.
       data->MenuData.selectKey = FALSE;
	if (!(e & KEY_MAKE))
	{
		return MFW_EVENT_CONSUMED;
	}


    if (e & KEY_LONG)
	{
	    switch (k->code)
		{
		case KCD_HUP: /* back to previous menu */
		    mnuEscape(data->MenuLists);
		    break;
		case KCD_RIGHT: /* Power Down */
		    return MFW_EVENT_PASSED; /* handled by idle */
		default: /* no response to all other keys */
		    return MFW_EVENT_CONSUMED;
		}
	}
    else
	{
	    switch (k->code)
		{
		case KCD_MNUUP: /* highlight previous entry */
		    mnuUp(data->MenuLists);
//GW Not needed?		    winShow(win);
		    // Only required in melody list selection.
          /*  Mar 30, 2007    REF: OMAPS00122691  x0039928 */
            /*  This event will be used to play the selected file. */

		     if(getMelodyListStatus()== TRUE)
		    {
		    		MenuHandle = mfwControl(data->MenuLists);
		    		
		    		data->MenuData.Reason = LISTS_REASON_SCROLL;
				data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
				data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; 
				SEND_EVENT(data->Parent,E_START_MELODY,0,(void*)data);		    
		    }
				 
		    if(getScrollStatus() == TRUE)
		    {
		    	// Send event to indicate that the user has scrolled list items
		     	SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);	
		    }
		    break;
		case KCD_MNUDOWN: /* highlight next entry */
		    mnuDown(data->MenuLists);
//GW Not needed?		    winShow(win);
          /*  Mar 30, 2007    REF: OMAPS00122691  x0039928 */
            /*  This event will be used to play the selected file. */

           		 if(getMelodyListStatus()== TRUE)
			{
			 	MenuHandle = mfwControl(data->MenuLists);
			 	
			 	data->MenuData.Reason = LISTS_REASON_SCROLL;
				data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
				data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; 
	    		       SEND_EVENT(data->Parent,E_START_MELODY,0,(void*)data);
			 }
				 
		      if(getScrollStatus() == TRUE)
		      {
		    	  // Send event to indicate that the user has scrolled list items
		     	  SEND_EVENT(data->Parent, LISTS_REASON_SCROLL, 0, NULL);	
		      }			 			    
		    break;
		case KCD_MNUSELECT:
                //xrashmic 5 Oct, 2005 MMI-SPR-29356, MMI-SPR-29357
                //Menu Select Key was pressed, storing this for future use.
                data->MenuData.selectKey = TRUE;                
                //Break is delibrately not used here. The control should pass through the KCD_LEFT case.
		case KCD_LEFT: /* activate this entry */
		    mnuSelect(data->MenuLists);
		    MenuHandle = mfwControl(data->MenuLists);
			if ((MenuHandle != NULL) && // Marcus: Issue 1810: 12/03/2003
			    (MenuHandle->curAttr != NULL) &&
			    winIsFocussed(win))
			{
					softKeys_displayId( TxtSoftSelect, TxtSoftBack, 0, MenuHandle->curAttr->mnuColour);
			}
		    break;
		case KCD_CALL: /* press send key */
		    data->ExitReason = LISTS_REASON_SEND;
		    data->MenuData.Reason = LISTS_REASON_SEND;
	    	MenuHandle = mfwControl(data->MenuLists);
		    data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
		    data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */

		    /* SPR998 - SH - check if callback exists before calling it! */
		    if (data->Callback)
		    	data->Callback(data->Parent, &data->MenuData);
		    	
			if (data->MenuData.autoDestroy)
			{
				/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				if (data->MenuListsAttr.header_toggle)
				{
					if (g_title_timer)
					{
						tim_delete(g_title_timer);
				     		g_title_timer = NULL;
					}
				}
				/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				winDelete (win);
	    			FREE_MEMORY ((void*)data, sizeof (ListWinInfo));
		    	}
		break;
		case KCD_HUP: /* back to previous menu */
		    data->ExitReason = LISTS_REASON_HANGUP;
		    data->MenuData.Reason = LISTS_REASON_HANGUP;
   			/*NM, p023 */
   	    	MenuHandle = mfwControl(data->MenuLists);
		    data->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
		    data->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
   			/*NM, p023 end */
		    data->Callback(data->Parent, &data->MenuData);
			if (data->MenuData.autoDestroy)
			{
			       /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
				if (data->MenuListsAttr.header_toggle)
				{
					if (g_title_timer)
					{
						tim_delete(g_title_timer);
				     		g_title_timer = NULL;
					}
				}
				/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
			    	winDelete (win);
	    		    	FREE_MEMORY ((void*)data, sizeof (ListWinInfo));
		    }
			break;
		case KCD_RIGHT: /* back to previous menu */
		    mnuEscape(data->MenuLists);
		    break;
		default: /* no response to all other keys */
		    return MFW_EVENT_CONSUMED;
		}
	}
        }
    TRACE_FUNCTION("listsKeyEvent()-end");
    return MFW_EVENT_CONSUMED;
}

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

 $Function:  listsWinEvent  

 $Description:	 window event handler

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
static int listsWinEvent(MfwEvt e, MfwWin *w)
{
    ListWinInfo * ListData = (ListWinInfo *)w->user;

    TRACE_FUNCTION("listsWinEvent()");

    switch (e)
	{
        case E_WIN_VISIBLE:
            SEND_EVENT(ListData->Parent,LISTS_REASON_VISIBLE,0,(void*)ListData); 	
		 break;	
        case MfwWinResume:
             SEND_EVENT(ListData->Parent,LISTS_REASON_RESUME,0,(void*)ListData); 	
	 break;	
        case MfwWinSuspend:
	   SEND_EVENT(ListData->Parent,LISTS_REASON_SUSPEND,0,(void*)ListData); 	
	 break;	
	}
    return MFW_EVENT_CONSUMED;
}

static void lists_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
    ListWinInfo    * ListData = (ListWinInfo *)win_data->user;
    T_MFW_HND      * l_parent;
    SHORT            l_id;

    TRACE_FUNCTION ("lists_exec_cb()");

    switch (event)
	{
	case E_INIT:
	case E_BACK:
	case E_RETURN:
	case E_ABORT:
	case E_EXIT:
	    /* defaultreaction */
	    l_parent = ListData->Parent;
	    l_id = ListData->id;

	    /* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    if (ListData->MenuListsAttr.header_toggle)
	    {
			if (g_title_timer)
			{
				tim_delete(g_title_timer);
				g_title_timer = NULL;
			}
	    }
	    /* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    winDelete (win);
	    FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
	    SEND_EVENT (l_parent, event, l_id, NULL); /* forward event to parent */
	    break;
	default:
	    return;
	}
}



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

 $Function:  listsListCbMenu  

 $Description:	 List menu handler. (mfw callback function)

 $Returns:		none.

 $Arguments:	
 
*******************************************************************************/
int listsListCbMenu(MfwEvt EventCode, MfwMnu *MenuHandle)
{
    int Status = LISTS_OK;
    T_MFW_HND   win      = mfw_parent (mfw_header());
    T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
    ListWinInfo* ListData = (ListWinInfo *)win_data->user;

    TRACE_FUNCTION("listsCbMenu()");

    switch (EventCode)
	{
        case E_MNU_SELECT:
	    ListData->ExitReason = E_MNU_SELECT;
	    ListData->MenuData.Reason = LISTS_REASON_SELECT;// MZ 14/2/01 E_MNU_SELECT;
	    ListData->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
	    ListData->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
	    /* SPR998 - SH - check if callback exists before calling it! */
		if (ListData->Callback)
	    	ListData->Callback(ListData->Parent, &ListData->MenuData);
	    break;

        case E_MNU_ESCAPE:
	    ListData->ExitReason = LISTS_REASON_BACK;
	    ListData->MenuData.Reason = LISTS_REASON_BACK;
	    /*NM, p023*/
	    ListData->MenuData.CursorPosition = MenuHandle->lCursor[MenuHandle->level];
	    ListData->MenuData.ListPosition  = MenuHandle->lCursor[MenuHandle->level]; /* True cursor position in list menu. */
	    /*NM, p023*/
	    
	    /* SPR998 - SH - check if callback exists before calling it! */
		if (ListData->Callback)
	    	ListData->Callback(ListData->Parent, &ListData->MenuData);
	    break;

        default:
	    Status = LISTS_FAIL;
	    TRACE_EVENT("Activation 77 error"); 
	    break;
	}

    /*
     * Free all allocated memory and handler
     */
	if (ListData->MenuData.autoDestroy)
	{
		/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
		if (ListData->MenuListsAttr.header_toggle)
		{
			if (g_title_timer)
			{
				tim_delete(g_title_timer);
				g_title_timer = NULL;
			}
		}
		/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    	winDelete (win);
    		FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
   	}
    return Status;
}

void listsDestroy(T_MFW_HND win)
{
   	T_MFW_WIN      * win_data = ((T_MFW_HDR *) win)->data;
   	ListWinInfo * ListData = (ListWinInfo *)win_data->user;

    	/* START: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
   	if (ListData->MenuListsAttr.header_toggle)
   	{
   		if(g_title_timer)
      		{
      			tim_delete(g_title_timer);
      			g_title_timer = NULL;
		}
	}
    	/* END: 05-June-2006, x0045876 (OMAPS00060424 - Header Toggle) */
	    
       winDelete (win);
   	FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
    
}