⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmisatmenu.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 2 页
字号:

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