mmiband.c

来自「是一个手机功能的模拟程序」· C语言 代码 · 共 785 行 · 第 1/2 页

C
785
字号

    data->freq_win = win_create (parent_window, 0, E_WIN_VISIBLE, (T_MFW_CB)mmi_band_freq_win_cb);
    if (data->freq_win EQ NULL)
	{
		return NULL;
	}

    /* 
     * connect the dialog data to the MFW-window
     */

    data->mmi_control.dialog	= (T_DIALOG_FUNC)mmi_band_freq_exec_cb;
    data->mmi_control.data		= data;
    win							= ((T_MFW_HDR *)data->freq_win)->data;
    win->user					= (void *)data;
    data->parent				= parent_window;
	data->available_freqs		= available_freqs;
		
	winShow(data->freq_win);
    /*
     * return window handle
     */

	return data->freq_win;
}
/*******************************************************************************

 $Function:    	BandmenuItemCheck

 $Description:	Exec callback function of the listmenu's icon to be drawn
 
 $Returns:		none

 $Arguments:	0, 1
 
*******************************************************************************/
USHORT BandmenuItemCheck(struct MfwMnuTag *m, struct MfwMnuAttrTag *ma, struct MfwMnuItemTag *mi)
{ 
  UBYTE			selected_freqs;
  T_MFW_BAND_MODE mode;
  UBYTE				index;
  if (band_get_current_radio_mode(&mode, &selected_freqs) >= MFW_BAND_OK)
	{
	 if((strcmp(mi->str, Freq2Str(band_list[0]))==0) && (selected_freqs & band_list[0]))
	 	return FLAGFUNC_TRUE_ICON;
	 else if((strcmp(mi->str, Freq2Str(band_list[1]))==0) && (selected_freqs & band_list[1]))
	 	return FLAGFUNC_TRUE_ICON;
	 else if((strcmp(mi->str, Freq2Str(band_list[2]))==0) && (selected_freqs & band_list[2]))
	 	return FLAGFUNC_TRUE_ICON;
	 else if((strcmp(mi->str, Freq2Str(band_list[3]))==0) && (selected_freqs & band_list[3]))
	 	return FLAGFUNC_TRUE_ICON;
	 else if((strcmp(mi->str, Freq2Str(band_list[4]))==0) && (selected_freqs & band_list[4]))
	 	return FLAGFUNC_TRUE_ICON;
	
	// for (index=0; index<MAX_NUMBER_OF_FREQS; index++)
	// {
	// if((strcmp(mi->str, Freq2Str(band_list[index]))==0) && (selected_freqs & band_list[index]))
			
    // return FLAGFUNC_TRUE_ICON;
     else
      return FLAGFUNC_FALSE_ICON;   	
  //}
  }
}


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

 $Function:    	mmi_band_freq_exec_cb

 $Description:	Exec callback function of the information Numbers window
 
 $Returns:		none

 $Arguments:	win - window handler
 				event - mfw event
 				parameter - optional data.
 
*******************************************************************************/

void mmi_band_freq_exec_cb (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
    T_MFW_WIN		*win_data = ((T_MFW_HDR *) win)->data;
    T_FREQ_INFO		*data = (T_FREQ_INFO *)win_data->user;
	UBYTE			numberOfEntries;
	int				index;
	T_MFW_BAND_MODE maxMode;
	char			*menuItem;
	UBYTE			selected_freqs;
	T_MFW_BAND_MODE mode;
	
    TRACE_FUNCTION ("mmi_band_freq_exec_cb()");
	
    switch (event)
	{
		case BAND_INIT:

			TRACE_EVENT("mmi_band_freq_exec_cb() Event:BAND_INIT");

			 /* initialization of administrative data */

			data->menu_list_data = (ListMenuData *)ALLOC_MEMORY(sizeof(ListMenuData));

			if(!data->menu_list_data)
			{
				TRACE_EVENT("Failed memory alloc 1 ");
				return;
			}

			band_get_radio_modes(&maxMode, &data->available_freqs);

			/* Run through the list of possible frequencies first to obtain
			 the number of frequencies permitted (how many will be in the menu) */
			 
			numberOfEntries = 0;
			data->max_menu_item_len = 0;
			
			for (index=0; index<MAX_NUMBER_OF_FREQS; index++)
			{
				if (data->available_freqs & band_list[index])
				{
					data->type[numberOfEntries] = band_list[index];
					numberOfEntries++;
				}
				menuItem = Freq2Str(band_list[index]);
				if (strlen(menuItem)>data->max_menu_item_len)
					data->max_menu_item_len = strlen(menuItem);
			}

			/* If there are no entries, show "Empty List" message and exit */
			
			if (numberOfEntries==0)
			{
				ShowMessage(data->parent, TxtEmptyList, TxtNull,0);
				mmi_band_freq_list_destroy(win);
				return;
			}

			/* Get the status of all the frequencies */
			
			if (band_get_current_radio_mode(&mode, &selected_freqs) >= MFW_BAND_OK)
			{
				/* If we're not in manual choose manual */
				if (mode!=MFW_BAND_MODE_Manual)
				{
					selected_freqs = data->available_freqs;	/* SH - default when choosing manual is all */
					band_radio_mode_switch(MFW_BAND_MODE_Manual, selected_freqs);
				}
			
				/* Allocate the memory for the list structure */
				
				data->no_of_entries = numberOfEntries;
				
				data->menu_list_data->List = (T_MFW_MNU_ITEM *)ALLOC_MEMORY( numberOfEntries * sizeof(T_MFW_MNU_ITEM) );

				if(!data->menu_list_data->List)
				{
					TRACE_EVENT("Failed memory alloc 2");
					return;
				}

				/* Allocate memory for the menu texts, and populate the list structure */
				
				numberOfEntries = 0;
				
				for (index=0; index<MAX_NUMBER_OF_FREQS; index++)
				{					
					if (data->available_freqs & band_list[index])
					{
						/* Allocate text string length - +2 is for Null term & status char */
						data->menu_text[numberOfEntries] =
						   (char *)ALLOC_MEMORY((data->max_menu_item_len)*sizeof(char)); //xsf changed 2002.09.25
							//(char *)ALLOC_MEMORY((data->max_menu_item_len+2)*sizeof(char));

						/* Put a "-" at the start if the item is selected */
					/*	
						if (selected_freqs & band_list[index])
						{
							strcpy(data->menu_text[numberOfEntries], "-");
						}
						else
						{
							strcpy(data->menu_text[numberOfEntries], " ");
						}

						strcat(data->menu_text[numberOfEntries], Freq2Str(band_list[index]));*/
						
						/* 2004/06 sunsj modify for picture manage */
						data->menu_list_data->List[numberOfEntries].icon = GET_ICONATTR(ICON_SITUATION3, 0);//&situation3Icon; //0;
						data->menu_list_data->List[numberOfEntries].exta = 0;
						data->menu_list_data->List[numberOfEntries].edit = 0;
						data->menu_list_data->List[numberOfEntries].menu = 0;
						data->menu_list_data->List[numberOfEntries].func = NULL;
						
						data->menu_list_data->List[numberOfEntries].str  = Freq2Str(band_list[index]);//data->menu_text[numberOfEntries];
						data->menu_list_data->List[numberOfEntries].flagFunc = BandmenuItemCheck;
						numberOfEntries++;
					}
				}

		   		data->menu_list_data->ListLength =numberOfEntries;
				data->menu_list_data->ListPosition = 1;
				data->menu_list_data->CursorPosition = 1;
				data->menu_list_data->SnapshotSize = numberOfEntries;
				data->menu_list_data->Font = 0;
				data->menu_list_data->LeftSoftKey = TxtSoftSelect;
				data->menu_list_data->RightSoftKey = TxtSoftBack;
				data->menu_list_data->KeyEvents = KEY_ALL;
				data->menu_list_data->Reason = 0;
				data->menu_list_data->Strings = TRUE;
		 		data->menu_list_data->Attr   = &Freq_menuAttrib;
				data->menu_list_data->autoDestroy    = FALSE;
				data->menu_list_data->ListMenuFlag =1;   //xsf add for list menu title 2002.09.25
                data->menu_list_data->ListMenuHeadStr = (char *) MmiRsrcGetText(TxtManual);
		 		/* Create the dynamic menu window */
		  	    listDisplayListMenu(win, data->menu_list_data,(ListCbFunc)mmi_band_freq_list_cb,0);
			}
	  		else		/* We haven't been able to read the status */
			{
				ShowMessage(win, TxtNull,TxtReadError, REMIND_FAILURE);
			}
		
			break;

		case BAND_DESTROY:
			TRACE_EVENT("mmi_band_freq_exec_cb() Event:BAND_DESTROY");
		    /*     
		     * Free Memory
		     */
			numberOfEntries = data->no_of_entries;

		    for (index=0; index<numberOfEntries; index++)
	    	{
				//xsf changed 10.11 FREE_MEMORY((UBYTE *)data->menu_text[index],(data->max_menu_item_len+2)*sizeof(char));
				FREE_MEMORY((UBYTE *)data->menu_text[index],(data->max_menu_item_len)*sizeof(char));
	    	}

			if (data->menu_list_data != NULL)
			{
				FREE_MEMORY ((void *)data->menu_list_data->List, numberOfEntries * sizeof (T_MFW_MNU_ITEM));
			    FREE_MEMORY ((void *)data->menu_list_data, sizeof (ListMenuData));			    
			}

			FREE_MEMORY ((void *)data, sizeof (T_FREQ_INFO));
			break;
			
		default:
		    break;
	}
}


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

 $Function:    	mmi_band_freq_list_cb

 $Description:	Callback function for the info num list.
 
 $Returns:		none
 
 $Arguments:	Parent - parent window.
 				ListData - Menu item list
*******************************************************************************/

void mmi_band_freq_list_cb(T_MFW_HND * Parent, ListMenuData * ListData)
{
    T_MFW_WIN			*win_data	= ((T_MFW_HDR *)Parent)->data;
    T_FREQ_INFO 		*data		= (T_FREQ_INFO *)win_data->user;
    int					index;
    T_MFW_BAND_MODE		mode;
    UBYTE				selected_freqs;
    UBYTE               returnstatus;

	if ((ListData->Reason EQ LISTS_REASON_BACK) || (ListData->Reason EQ LISTS_REASON_CLEAR))
	{
		listsDestroy(ListData->win);
	    mmi_band_freq_list_destroy(data->freq_win);
	}
	else if((ListData->Reason EQ LISTS_REASON_SELECT) || (ListData->Reason EQ LISTS_REASON_OK))     //xsf add for list menu KCD_OK=KCD_LEFT 2003.02.18
	{
		if (band_get_current_radio_mode(&mode, &selected_freqs) >= MFW_BAND_OK)
		{
			selected_freqs ^= data->type[ListData->ListPosition]; /* Toggle this band */
			returnstatus = band_radio_mode_switch(MFW_BAND_MODE_Manual, selected_freqs);
			
			if ( returnstatus >= MFW_BAND_OK)  //>= to ==
			{
				/* Update the status of all menu entries with a '-' or not */
				
			/*xsf remarked this 10.11 for (index=0; index<data->no_of_entries; index++)
				{			
					if (selected_freqs & data->type[index])
					{
						data->menu_text[index][0] = '-';
					}
					else
					{
						data->menu_text[index][0] = ' ';
					}
				}*/

                winShow(ListData->win);  
				//winShow(Parent);
			}
			else
			{
				data->available_freqs ^= data->type[ListData->ListPosition]; /* Undo change */
				ShowMessage(Parent, TxtNull,TxtFailed, REMIND_FAILURE);
			}	   
		}
		else
		{
			ShowMessage(Parent, TxtNull,TxtFailed, REMIND_FAILURE);
		}
	}	
}


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

 $Function:    	mmi_band_freq_list_destroy

 $Description:	Destroy the info num window.
 			
 $Returns:		none

 $Arguments:	own_window- current window
*******************************************************************************/

static void mmi_band_freq_list_destroy(MfwHnd own_window)
{
    T_MFW_WIN		*win_data;
    T_FREQ_INFO		*data;
	UBYTE			numberOfEntries;
	int				index;
	
    TRACE_FUNCTION ("mmi_band_freq_list_destroy()");
	
    if (own_window)
	{
	    win_data = ((T_MFW_HDR *)own_window)->data;
	    data = (T_FREQ_INFO *)win_data->user;

	    if (data)
		{
		    /*     
		     * Free Memory
		     */
			SEND_EVENT (own_window, BAND_DESTROY, 0, 0);
		    /*
		     * Delete WIN handler
		     */ 
		    win_delete (own_window);
		}
	    else
		{
		    TRACE_EVENT ("mmi_band_freq_list_destroy() called twice");
		}
	}
}


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

 $Function:    	mmi_band_freq_win_cb

 $Description:	Window callback function for the info numbers window.
 
 $Returns:		none

 $Arguments:	w - mfw window handler
 				e - mfw event
 				
*******************************************************************************/

static int mmi_band_freq_win_cb (MfwEvt e, MfwWin *w)    /* yyy window event handler */
{
	TRACE_FUNCTION ("mmi_band_freq_win_cb()");
	switch (e)
	{
		case MfwWinVisible:  /* window is visible  */
			break;
		case MfwWinFocussed: /* input focus / selected   */	
		case MfwWinDelete:   /* window will be deleted   */   
			
		default:	    
			return MFW_EVENT_REJECTED;
	}
	return MFW_EVENT_CONSUMED;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?