view src/aci2/bmi/mmiLists.c @ 640:16eb1b9640dc

target gtm900 renamed to gtm900mgc2 This change reflects the fact that the build target in question supports MGC2GSMT hardware only, and will NOT work on other hw that confusing bears the same end user name of GTM900, neither the LoCosto-based GTM900-C nor the Calypso-based MG01GSMT that has a different and incompatible RFFE. If we ever get our hands on a piece of MG01GSMT hw and add support for it, that other target will be named gtm900mg01.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 31 Jan 2020 00:46:07 +0000
parents 3c2acfa1a72f
children
line wrap: on
line source

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

					CONDAT (UK)

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

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.                                 
                                                                              
********************************************************************************

 $Project name:	Basic MMI                                                      
 $Project code:	BMI (6349)                                                           
 $Module:		MMI
 $File:		    MmiLists.c
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    22/02/01                                                      
                                                                               
********************************************************************************
                                                                              
 Description:

  

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

 $History: MmiLists.c

       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 "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 "gdi.h"
#include "audio.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

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);


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

 $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()");

    winLists = winCreate(Parent, 0, E_WIN_VISIBLE, (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;

		    /*
		     * 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;

	
    TRACE_FUNCTION("listsKeyEvent()");
       //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.
		    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);		    
		    }

		    // May 24, 2005    REF: CRR 29358  x0021334
		    // Description: CT_PTCRB 27.22.4.9.8 fails: wrong terminal response
		    // Required when user scrolls list items. Depeneding on this, the timer needs
		    // to be restarted for another 20 seconds.
		    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);

		    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);
			 }

		      // May 24, 2005    REF: CRR 29358  x0021334
		      // Description: CT_PTCRB 27.22.4.9.8 fails: wrong terminal response
		      // Required when user scrolls list items. Depeneding on this, the timer needs
		      // to be restarted for another 20 seconds.
		      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)
			{
			    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)
			{
			    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:
            if (w->flags & E_WIN_VISIBLE)
			{
        		dspl_ClearAll();
				softKeys_displayId(ListData->MenuData.LeftSoftKey, ListData->MenuData.RightSoftKey, 0, ListData->MenuListsAttr.mnuColour );
			}
#ifdef FF_MMI_RINGTONE
                    SEND_EVENT(ListData->Parent,E_VISIBLE_MELODY,0,(void*)ListData);                  
#endif
	    	break;
#ifdef FF_MMI_RINGTONE
        case MfwWinSuspend:
		 SEND_EVENT(ListData->Parent,E_SUSPEND_MELODY,0,(void*)ListData); 	
		 break;	
#endif
        default:
	    return MFW_EVENT_PASSED;
	  //  break;   // RAVI
	}
    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;
	    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)
	{
	    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;
    winDelete (win);
   	FREE_MEMORY ((void*) ListData, sizeof (ListWinInfo));
    
}