📄 mmisatmenu.c
字号:
/* initialization of the dialog data */
data->list_menu_data.ListPosition = 1;/* True cursor position in list menu. */
data->list_menu_data.Font = 0;
data->list_menu_data.LeftSoftKey = TxtSoftSelect;
data->list_menu_data.RightSoftKey = TxtSoftBack;
data->list_menu_data.KeyEvents = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN |KEY_HUP;
data->list_menu_data.Reason = 0;
data->list_menu_data.Strings = TRUE;
data->list_menu_data.Attr = &sat_setup_menuAttrib;
data->list_menu_data.List = NULL; /* c030 rsa mark as first time creation */
data->list_menu_data.autoDestroy = TRUE;
// c030 rsa
/* NOBREAK */
case SAT_RETURN:
// end c030 rsa
/* (re)create the dialog handler */
if (sat_setup_menu_recreate(data) == LISTS_FAIL)
{
sat_res[SAT_ERR_INDEX] = SAT_RES_IMPOSSIBLE;
sat_res[SAT_AI_INDEX] = SatResAiNoCause;
sat_done (sat_command, sat_res, sizeof(T_SAT_RES));
sat_setup_menu_destroy (data->win);
}
break;
/* sbh - all window types are being provided with this event to destroy the window */
case SAT_DESTROY_WINDOW:
/* ...sbh */
case SAT_EXIT:
sat_setup_menu_destroy (data->win);
break;
default:
TRACE_EVENT ("sim_setup_menu_exec() unexpected event");
break;
}
}
static void sat_setup_menu_listmnu_cb (T_MFW_HND win, ListMenuData_t * ListData)
/* sat_setup_menu menu event handler */
{
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
T_sat_setup_menu * data = (T_sat_setup_menu *)win_data->user;
SatItem * item;
int index;
T_SAT_RES sat_res;
TRACE_FUNCTION ("sat_setup_menu_listmnu_cb()");
if ((win EQ NULL) || (win_data EQ NULL) || (data EQ NULL))
return;
switch (ListData->Reason)
{
case E_MNU_SELECT:
case LISTS_REASON_SELECT:
index = ListData->ListPosition; /* index of selected item */
item = &data->sat_command->c.menu.items[index]; /* selected item */
satMenuItem(item->id, 0); /* issue the answering envelope */
/* sat_setup_menu_destroy(data->win); c030 rsa do not destroy in order to keep the menu on top */
break;
case LISTS_REASON_TIMEOUT: // c015 rsa
case LISTS_REASON_BACK: /* back to previous menu */
case LISTS_REASON_HANGUP: // sbh - added so hangup key exits
case LISTS_REASON_CLEAR:
/*
* we don't need to signal <SAT_RES_USER_BACK> here, since the session itself
* has been finished immediately after sat_setup_menu_proc().
* Furthermore the entering of the menu has not been signalled to the SIM...
*/
sat_setup_menu_destroy(data->win);
break;
default:
return;
}
return;
}
/*********************************************************************
**********************************************************************
select_item DYNAMIC MENU WINDOW. DECLARATION
*********************************************************************
**********************************************************************/
typedef struct
{
/* administrative data */
T_MMI_CONTROL mmi_control;
T_MFW_HND win;
/* associated handlers */
T_MFW_HND kbd; /* sbh - keyboard handler, so window can be destroyed by user */
/* internal data */
T_SAT_CMD *sat_command; /* pointer to sat_command in parent */
ListMenuData_t list_menu_data;
} T_sat_select_item;
static void sat_select_item_destroy (T_MFW_HND window);
static void sat_select_item_exec (T_MFW_HND win, USHORT event, SHORT value, T_SAT_CMD * sat_command);
static void sat_select_item_listmnu_cb (T_MFW_HND win, ListMenuData_t * ListData);
static T_MFW sat_select_item_recreate(T_sat_select_item *data);
/*********************************************************************
**********************************************************************
select_item DYNAMIC MENU WINDOW. IMPLEMENTATION
*********************************************************************
**********************************************************************/
T_MFW_HND sat_select_item_create(MfwHnd parent_window)
{
T_sat_select_item * data = (T_sat_select_item *)ALLOC_MEMORY (sizeof (T_sat_select_item));
T_MFW_WIN * win;
TRACE_FUNCTION ("sat_select_item_create()");
/*
* Create window handler
*/
data->win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)sat_win_cb);
if (data->win EQ NULL)
{
return NULL;
}
/*
* connect the dialog data to the MFW-window
*/
data->mmi_control.dialog = (T_DIALOG_FUNC)sat_select_item_exec;
data->mmi_control.data = data;
win = ((T_MFW_HDR *)data->win)->data;
win->user = (MfwUserDataPtr)data;
data->kbd = kbdCreate( data->win, KEY_ALL, (T_MFW_CB) sat_kbd_cb); /* sbh - add keyboard handler */
/*
* return window handle
*/
win_show(data->win);
return data->win;
}
static void sat_select_item_destroy(MfwHnd own_window)
{
T_MFW_WIN * win_data;
T_sat_select_item * data;
int i;
TRACE_FUNCTION ("sat_select_item_destroy()");
if (own_window)
{
win_data = ((T_MFW_HDR *)own_window)->data;
data = (T_sat_select_item *)win_data->user;
if (data)
{
/*
* Delete WIN handler
*/
win_delete (data->win);
/*
* Free Memory
*/
for (i=0; i < data->list_menu_data.ListLength; i++)
{
sat_destroy_ITEM_ASCIIZ (data->list_menu_data.List[i].str);
}
sat_destroy_ITEM_ASCIIZ (data->list_menu_data.ListMenuHeadStr); //zhaowm 2003.0318 for avoiding mem leak
FREE_MEMORY ((U8 *)data->list_menu_data.List,
(data->list_menu_data.ListLength * sizeof (MfwMnuItem)));
data->list_menu_data.List = NULL;
FREE_MEMORY ((U8 *)data, sizeof (T_sat_select_item));
}
else
{
TRACE_EVENT ("sat_select_item_destroy() called twice");
}
}
}
static T_MFW sat_select_item_recreate(T_sat_select_item *data)
{
int i;
SatMenu * menu = &data->sat_command->c.menu;
TRACE_FUNCTION ("sat_select_item_recreate()");
#ifdef __COMPLETE_LIST_SUPPORT__ /* ??? rsa for future extension */
if ((&data->sat_command.qual & SAT_M_SELECT_HELP_AVAIL) NEQ 0)
{
data->list_menu_data.AlternateLeftSoftKey = TxtHelp; /* help available */
}
else
{
data->list_menu_data.AlternateLeftSoftKey = TxtNull; /* no help available */
}
#endif
/* allocate sufficient memory to hold the list of menu items */
data->list_menu_data.ListLength = menu->nItems; /* actual number of entries in list menu. */
data->list_menu_data.List = (MfwMnuItem *)ALLOC_MEMORY (data->list_menu_data.ListLength * sizeof (MfwMnuItem));
for (i=0; i < data->list_menu_data.ListLength; i++) /* Fill Menu List */
{
data->list_menu_data.List[i].icon = GET_ICONATTR(ICON_LISTCOMMON, 0);//&colist;/* 2004/06 sunsj modify for icon manage */
data->list_menu_data.List[i].exta = 0;
data->list_menu_data.List[i].edit = 0;
data->list_menu_data.List[i].menu = 0;
data->list_menu_data.List[i].func = 0;
/* get the correct entry in list of select_itemList */
data->list_menu_data.List[i].str = sat_create_ITEM_ASCIIZ (&menu->items[i]);
data->list_menu_data.List[i].flagFunc = (FlagFunc)item_flag_none;
}
data->list_menu_data.autoDestroy = TRUE;
// zhaowm 2002/09/04 add head title in the stk.menu
data->list_menu_data.ListMenuFlag =1;
//if (strlen(sat_create_TEXT_ASCIIZ (&menu->header))!=0)
data->list_menu_data.ListMenuHeadStr=sat_create_TEXT_ASCIIZ (&menu->header);
//else
// data->list_menu_data.ListMenuHeadStr = MmiRsrcGetText(Txtnotitle);
return listDisplayListMenu(data->win, &data->list_menu_data, (ListCbFunc)sat_select_item_listmnu_cb,0);
}
static void sat_select_item_exec (T_MFW_HND win, USHORT event, SHORT value, T_SAT_CMD * sat_command)
/* callback handler for events sent from parents or childs to to trigger some execution */
{
T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data;
T_sat_select_item * data = (T_sat_select_item *)win_data->user;
T_SAT_RES sat_res;
TRACE_FUNCTION ("sat_select_item_exec()");
switch (event)
{
case SAT_SELECT_ITEM:
/* initialization of administrative data */
data->sat_command = sat_command; /* save a pointer to the parameter for later use in callbacks */
/* initialization of the dialog data */
data->list_menu_data.ListPosition = 1;/* True cursor position in list menu. */
data->list_menu_data.Font = 0;
data->list_menu_data.LeftSoftKey = TxtSoftSelect;
data->list_menu_data.RightSoftKey = TxtSoftBack;
data->list_menu_data.KeyEvents = KEY_CLEAR | KEY_RIGHT | KEY_LEFT | KEY_MNUUP | KEY_MNUDOWN|KEY_HUP;
data->list_menu_data.Reason = 0;
data->list_menu_data.Strings = TRUE;
data->list_menu_data.Attr = &sat_select_menuAttrib;
data->list_menu_data.autoDestroy = TRUE;
/* (re)create the dialog handler */
if (sat_select_item_recreate(data) == LISTS_FAIL)
{
sat_res[SAT_ERR_INDEX] = SAT_RES_IMPOSSIBLE;
sat_res[SAT_AI_INDEX] = SatResAiNoCause;
sat_done (sat_command, sat_res, sizeof(T_SAT_RES));
sat_select_item_destroy (data->win);
}
break;
/* sbh - all window types are being provided with this event to destroy the window */
case SAT_DESTROY_WINDOW:
sat_select_item_destroy (data->win);
break;
/* ...sbh */
default:
TRACE_EVENT ("sim_select_item_exec() unexpected event");
break;
}
}
static void sat_select_item_listmnu_cb (T_MFW_HND win, ListMenuData_t * ListData)
/* sat_select_item menu event handler */
{
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
T_sat_select_item * data = (T_sat_select_item *)win_data->user;
SatItem * item;
int index;
T_SAT_RES sat_res;
if ((win EQ NULL) || (win_data EQ NULL) || (data EQ NULL))
return;
TRACE_FUNCTION ("sat_select_item_listmnu_cb()");
switch (ListData->Reason)
{
case E_MNU_SELECT:
case LISTS_REASON_SELECT:
index = ListData->ListPosition; /* index of selected item */
item = &data->sat_command->c.menu.items[index]; /* selected item */
sat_res[SAT_ERR_INDEX] = SatResSuccess;
sat_res[SAT_AI_INDEX] = SatResAiNoCause;
satItem (data->sat_command, item->id, sat_res, sizeof(T_SAT_RES)); /* issue the answering envelope */
sat_select_item_destroy(data->win);
break;
// c015 rsa
case LISTS_REASON_TIMEOUT:
sat_res[SAT_ERR_INDEX] = SAT_RES_USER_NO_RESP;
sat_res[SAT_AI_INDEX] = SatResAiNoCause;
sat_done (data->sat_command, sat_res, sizeof(T_SAT_RES));
sat_select_item_destroy(data->win);
break;
// end c015 rsa
case LISTS_REASON_CLEAR: /* abort */
case LISTS_REASON_HANGUP: /* abort */
sat_res[SAT_ERR_INDEX] = SAT_RES_USER_ABORT;
sat_res[SAT_AI_INDEX] = SatResAiNoCause;
sat_done (data->sat_command, sat_res, sizeof(T_SAT_RES));
sat_select_item_destroy(data->win);
break;
case LISTS_REASON_BACK: /* back to previous menu */
sat_res[SAT_ERR_INDEX] = SAT_RES_USER_BACK;
sat_res[SAT_AI_INDEX] = SatResAiNoCause;
sat_done (data->sat_command, sat_res, sizeof(T_SAT_RES));
sat_select_item_destroy(data->win);
break;
default:
return;
}
return;
}
// end c016 rsa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -