FreeCalypso > hg > fc-magnetite
view src/aci2/bmi/mmiDialogs.c @ 156:17ebcd005f68
dl.lib compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 10 Oct 2016 23:19:27 +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: MmiDialogs $File: MmiDialogs.c $Revision: 1.0 $Author: Condat(UK) $Date: 25/10/00 ******************************************************************************** Description:MMI Information dialogue handling. ******************************************************************************** $History: MmiDialogs.c Mar 11, 2006 REF:DR:OMAPS00061467 x0035544 Description: 27.22.4.13.3 SET UP CALL (display of icons) fails. Solution: Assigned the default values for icon data for the structure display_info in the function dlg_zeroDisplayData(). copied icon data in to the structure data->IconData and provided functionality in the function dialog_info_win_resize_cb() to display icon data appropriately on the dialog screen for SAT call setup. Sep 06 2005 REF: MMI-SPR-33548 x0012849 Jagan Description : A dialog with long message is not displayed properly. Solution : The no of lines in a dialog is increased from 4 to 15. Feb 24, 2005 REF: CRR MMI-SPR-29102 xnkulkar Description: The phone resets when user presses the ''End All' key while the SMSs are being deleted. Solution: As the user has already confirmed that all SMS messages are to be deleted, ''End All' key press is ignored till the delete operation is over. xrashmic 08 Feb, 2005 MMI-SPR-27853 Moved the T_dialog_info structure from MmiDialogs.c to MmiDialogs.h xrashmic 08 Feb, 2005 MMI-SPR-27853 Moved the T_dialog_info structure from MmiDialogs.c to MmiDialogs.h Aug 25, 2004 REF: CRR 24904 Deepa M.D Bug:cleanup compile switches used for Go-lite Fix:COLOURDISPLAY compiler switch has been added to the functions which are used only for the normal color build. Aug 16, 2004 REF: CRR 24323 Deepa M.D Bug:Clenup of sprintf used for tracing Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX Sep 01, 2004 REF: CRR 21380 Deepa M.D Bug:Not getting proper display, When Messages Memory is Full. Fix:Assigning TextId and TextString will not display both the messages. Hence we need to use TextId and TextString2 or TextId2 and TextString Jun 04,2004 CRR:13601 xpradipg - SASKEN Description: CFO interrogation display : Timer to long Fix: Timer is enabled for the information dialog. It times out after 5 seconds from the last key press. 25/10/00 Original Condat(UK) BMI version. $End *******************************************************************************/ /******************************************************************************* Include Files *******************************************************************************/ #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 "mfw_mfw.h" #include "mfw_win.h" #include "mfw_kbd.h" /* SPR#1428 - SH - New Editor changes */ #ifndef NEW_EDITOR #include "mfw_edt.h" #endif #include "mfw_tim.h" #include "mfw_phb.h" #include "mfw_sms.h" #include "mfw_icn.h" #include "mfw_mnu.h" #include "mfw_lng.h" #include "mfw_sat.h" #include "mfw_kbd.h" #include "mfw_nm.h" #include "dspl.h" #include "ksd.h" #include "psa.h" #include "MmiMain.h" #include "MmiDummy.h" //JVJE #include "MmiMsgsEdit.h" //#include "MmiLists.h" #include "MmiMmi.h" #include "MmiDialogs.h" #include "MmiLists.h" #include "MmiMenu.h" #include "MmiSoftKeys.h" /* JF Modified */ #include "MmiBookController.h" #include "cus_aci.h" #include "prim.h" #ifndef PCM_2_FFS #include "pcm.h" #endif #include "mmiColours.h" void dlg_initDisplayData_type( T_DISPLAY_DATA *displayInfo, U32 displayCol, int dlgType, T_BITMAP* dlgBitmap , int dlgSKFormat ); /* * START NEW PART */ static T_MFW_HND dialog_info_create (T_MFW_HND parent_win); static void dialog_info (T_MFW_HND win, USHORT event, SHORT value, void * parameter); static int dialog_info_win_cb (T_MFW_EVENT event, T_MFW_WIN * win); static int dialog_info_win_resize_cb (T_MFW_EVENT event, T_MFW_WIN * win); static T_MFW_CB dialog_info_tim_cb (T_MFW_EVENT event, T_MFW_TIM * tc); static int dialog_info_kbd_cb (T_MFW_EVENT event, T_MFW_KBD * keyboard); static int dialog_info_kbd_long_cb (T_MFW_EVENT event, T_MFW_KBD * keyboard); void mmi_dialogs_insert_animation_CB (T_MFW_EVENT event, T_MFW_TIM *tc); void mmi_dialogs_animation_new_CB (T_MFW_EVENT event, T_MFW_TIM *tc); MfwRect calcLayout( int dlgType, int dataSx, int dataSy, int bmpSx, int bmpSy) { MfwRect area; int px,py; int sx,sy; TRACE_EVENT_P5("dlgType,= %d, dataSx = %d, dataSy = %d, bmpSx = %d, bmpSy = %d", dlgType, dataSx, dataSy, bmpSx, bmpSy); /*Adjust area available for drawing by the border */ switch (dlgType & DLG_BORDER_VERTICAL) { case DLG_BORDER_VERTICAL_0: sx =bmpSx; break; case DLG_BORDER_VERTICAL_1: sx =bmpSx*6/8; break; case DLG_BORDER_VERTICAL_2: sx =bmpSx*4/8; break; case DLG_BORDER_VERTICAL_3: sx =bmpSx*3/8; break; } if (sx < dataSx) sx = dataSx; px = 0; switch (dlgType & DLG_BORDER_HORIZONTAL) { case DLG_BORDER_HORIZONTAL_0: sy =bmpSy; break; case DLG_BORDER_HORIZONTAL_1: sy =bmpSy*6/8; break; case DLG_BORDER_HORIZONTAL_2: sy =bmpSy*4/8; break; case DLG_BORDER_HORIZONTAL_3: sy =bmpSy*3/8; break; } if (sy < dataSy) sy = dataSy; py = 0; switch (dlgType & (DLG_INFO_LAYOUT_LEFT | DLG_INFO_LAYOUT_RIGHT)) { case DLG_INFO_LAYOUT_CENTRE: //display info in centre of display px = px + (sx-dataSx)/2; sx = dataSx; break; case DLG_INFO_LAYOUT_RIGHT: //all info is displayed at the foot of trhe display px = px+(sx-dataSx); sx = dataSx; break; case DLG_INFO_LAYOUT_LEFT: //display all info at the top of the bitmap sx = dataSx; break; default: //display info over entire area break; } switch (dlgType & (DLG_INFO_LAYOUT_BOTTOM | DLG_INFO_LAYOUT_TOP)) { case DLG_INFO_LAYOUT_CENTRE: //display info in centre of display py = py + (sy-dataSy)/2; sy = dataSy; break; case DLG_INFO_LAYOUT_BOTTOM: //all info is displayed at the foot of trhe display py = py+(sy-dataSy); sy = dataSy; break; case DLG_INFO_LAYOUT_TOP: //display all info at the top of the bitmap sy = dataSy; break; default: //display info over entire area break; } area.px = px; area.py = py; area.sx = sx; area.sy = sy; //Area sx/sy must be no smaller than dataSx/Sy return (area); } /******************************************************************************* $Function: info_dialog $Description: Common information dialog $Returns: Dialogue info win $Arguments: parent win, display info *******************************************************************************/ T_MFW_HND info_dialog (T_MFW_HND parent_win, T_DISPLAY_DATA * display_info) { T_MFW_HND win; display_info->SoftKeyStrings = FALSE; win = dialog_info_create (parent_win); if (win NEQ NULL) { SEND_EVENT (win, DIALOG_INIT, 0, display_info); } return win; } /******************************************************************************* $Function: info_dialog_softkeystrings $Description: Common information dialog, sets "softkeystrings" to TRUE $Returns: Dialogue info win $Arguments: parent win, display info, leftsoftkey, rightsoftkey *******************************************************************************/ T_MFW_HND info_dialog_softkeystrings (T_MFW_HND parent_win, T_DISPLAY_DATA * display_info) { T_MFW_HND win; display_info->SoftKeyStrings = TRUE; win = dialog_info_create (parent_win); if (win NEQ NULL) { SEND_EVENT (win, DIALOG_INIT, 0, display_info); } return win; } /******************************************************************************* $Function: dialog_info_create $Description: Creation of an information dialog $Returns: Dialogue info win $Arguments: parent win *******************************************************************************/ static T_MFW_HND dialog_info_create (T_MFW_HND parent_win) { T_MFW_WIN * win_data; T_dialog_info * data = (T_dialog_info *)ALLOC_MEMORY (sizeof (T_dialog_info)); TRACE_FUNCTION ("dialog_info_create()"); data->info_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)dialog_info_win_resize_cb); if (data->info_win EQ 0) return 0; /* * Create window handler */ data->mmi_control.dialog = (T_DIALOG_FUNC)dialog_info; data->mmi_control.data = data; data->parent_win = parent_win; win_data = ((T_MFW_HDR *)data->info_win)->data; win_data->user = (void *)data; /* * return window handle */ return data->info_win; } /******************************************************************************* $Function: dialog_info_destroy $Description: Destruction of an information dialog $Returns: void $Arguments: win *******************************************************************************/ void dialog_info_destroy (T_MFW_HND own_window) { T_MFW_WIN * win = ((T_MFW_HDR *)own_window)->data; T_dialog_info * data = (T_dialog_info *)win->user; TRACE_FUNCTION ("dialog_info_destroy()"); if (own_window == NULL) { TRACE_EVENT ("Error :- Called with NULL Pointer"); return; } if (data) { /* * Exit TIMER & KEYBOARD Handle */ kbd_delete (data->info_kbd); tim_delete (data->info_tim); if(data->animation_timer != 0) { timDelete(data->animation_timer); if (data->icon != 0) icnDelete(data->icon); } /* * Delete WIN Handler */ win_delete (data->info_win); /* * Free Memory */ FREE_MEMORY ((void *)data, sizeof (T_dialog_info)); } } void dlg_zeroDisplayData( T_DISPLAY_DATA *displayInfo) { TRACE_EVENT("dlg_zeroDisplayData()"); if (displayInfo == NULL) return; memset (displayInfo, 0x00, sizeof(T_DISPLAY_DATA)); displayInfo->LeftSoftKey = 0; displayInfo->RightSoftKey = 0; displayInfo->LSKString = NULL; displayInfo->RSKString = NULL; displayInfo->TextString = NULL; displayInfo->TextString2 = NULL; displayInfo->WrapStrings = 0; displayInfo->TextId = 0; displayInfo->TextId2 = 0; displayInfo->SoftKeyStrings = FALSE; displayInfo->Identifier = 0; displayInfo->anim_time = 0; displayInfo->number_of_frames = 0; displayInfo->current_frame = 0; //x0035544 Feb 07, 2006 DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON displayInfo->IconData.width = 0; displayInfo->IconData.height = 0; displayInfo->IconData.dst = NULL; displayInfo->IconData.selfExplanatory = FALSE; #endif dlg_initDisplayData_events( displayInfo, NULL, 0, 0); /* GW#2294 COLOUR_STATUS has been used for all popups - change this to default instead of COLOUR_POPUP .*/ dlg_initDisplayData_type( displayInfo, COLOUR_STATUS, 0, NULL, 0 ); /* GW #2294 02/07/03 - The default bitmap is set-up here to allow us to disable it for some dialogs (if required) */ displayInfo->bgdBitmap = icon_getBgdBitmap(BGD_CLOUD); } void dlg_initDisplayData_TextId( T_DISPLAY_DATA *displayInfo, int lsk, int rsk, int str1, int str2, int colId) { if (displayInfo == NULL) return; dlg_zeroDisplayData(displayInfo); displayInfo->LeftSoftKey = (USHORT)lsk; displayInfo->RightSoftKey = (USHORT)rsk; displayInfo->TextId = str1; displayInfo->TextId2 = str2; displayInfo->displayCol = colId ; } void dlg_initDisplayData_TextStr( T_DISPLAY_DATA *displayInfo, int lsk, int rsk,char *str1, char *str2, int colId) { if (displayInfo == NULL) return; dlg_zeroDisplayData(displayInfo); displayInfo->LeftSoftKey = (USHORT)lsk; displayInfo->RightSoftKey = (USHORT)rsk; displayInfo->TextString = str1; displayInfo->TextString2 = str2; displayInfo->displayCol = colId ; } void dlg_initDisplayData_events( T_DISPLAY_DATA *displayInfo, T_VOID_FUNC callback, int timer, T_MFW_EVENT keyEvents) { displayInfo->Callback = callback; displayInfo->Time = timer; displayInfo->KeyEvents = keyEvents; } void dlg_initDisplayData_type( T_DISPLAY_DATA *displayInfo, U32 displayCol, int dlgType, T_BITMAP* dlgBitmap, int dlgSkFormat ) { displayInfo->displayCol = displayCol; displayInfo->dlgType = dlgType; displayInfo->bgdBitmap = dlgBitmap; } /******************************************************************************* $Function: dialog_info $Description: Dialog function for information dialog $Returns: void $Arguments: win, window handle event, value, parameter *******************************************************************************/ void dialog_info (T_MFW_HND win, USHORT event, SHORT value, void * parameter) { T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; T_DISPLAY_DATA * display_info = (T_DISPLAY_DATA *)parameter; TRACE_FUNCTION ("dialog_info()"); switch (event) { case DIALOG_INIT: /* * Initialize dialog */ #if defined (WIN32) { /***************************Go-lite Optimization changes Start***********************/ //Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P1( "Identifier %d", display_info->Identifier); /***************************Go-lite Optimization changes end***********************/ } #endif /* * Create timer and keyboard handler */ data->info_tim = tim_create (win, display_info->Time, (T_MFW_CB)dialog_info_tim_cb); data->info_kbd = kbd_create (win, KEY_ALL, (T_MFW_CB)dialog_info_kbd_cb); data->info_kbd_long = kbd_create(win,KEY_ALL|KEY_LONG,(MfwCb)dialog_info_kbd_long_cb); /* * Store any other data */ data->KeyEvents = display_info->KeyEvents; data->TextString = display_info->TextString; data->LeftSoftKey = display_info->LeftSoftKey; data->RightSoftKey = display_info->RightSoftKey; data->SoftKeyStrings = display_info->SoftKeyStrings; // SH - TRUE if using strings rather than IDs data->LSKString = display_info->LSKString; // Text for left soft key data->RSKString = display_info->RSKString; // Text for right soft key data->TextId = display_info->TextId; data->Identifier = display_info->Identifier; data->Callback = display_info->Callback; data->TextString2 = display_info->TextString2; data->TextId2 = display_info->TextId2; data->WrapStrings = display_info->WrapStrings; //GW-SPR#762 data->dlgCol = display_info->displayCol; data->dlgType = display_info->dlgType; data->dlgBgdBitmap = display_info->bgdBitmap; data->dlgSkFormat = 0; data->current_frame = display_info->current_frame; data->number_of_frames = display_info->number_of_frames; data->icon_array = (MfwIcnAttr*)display_info->icon_array; data->animation_timer = 0; //x0035544 Feb 07, 2006 DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON if(display_info->IconData.dst != NULL) { data->IconData.width = display_info->IconData.width; data->IconData.height = display_info->IconData.height; data->IconData.dst = display_info->IconData.dst; data->IconData.selfExplanatory = display_info->IconData.selfExplanatory; } else { data->IconData.dst = NULL; data->IconData.selfExplanatory = FALSE; data->IconData.width =0; data->IconData.height =0; } #endif TRACE_EVENT_P1("anim_time = %d", display_info->anim_time); TRACE_EVENT_P1("data->anim_time = %d", data->anim_time); if(display_info->anim_time != 0) { data->animation_timer = timCreate(win,display_info->anim_time,(MfwCb)mmi_dialogs_animation_new_CB); timStart(data->animation_timer); } if (display_info->Time NEQ FOREVER) tim_start (data->info_tim); win_show (win); break; case DIALOG_DESTROY: dialog_info_destroy(win); break; } } /******************************************************************************* $Function: dialog_info_win_cb $Description: Callback function for information dialog $Returns: void $Arguments: window handle event, win *******************************************************************************/ //GW-SPR#762-Added code to wraps txtString2 if there is room on the display to allow //very long numbers to be displayed. #define MAX_LINE_CHAR MAX_LINE static int dialog_info_win_cb (T_MFW_EVENT event, T_MFW_WIN * win) { T_dialog_info * data = (T_dialog_info *)win->user; char buffer[MAX_LINE_CHAR+1]; int yPos,bufPos,nLines; TRACE_FUNCTION ("dialog_info_win_cb()"); if (data EQ 0) return 1; switch (event) { case E_WIN_VISIBLE: if (win->flags & E_WIN_VISIBLE) { /* * Print the information dialog */ /* * Clear Screen */ dspl_ClearAll(); /* * Print softkeys */ icnShow(data->icon); if (data->SoftKeyStrings) displayCustSoftKeys(data->LSKString, data->RSKString); // SH - display text softkeys else displaySoftKeys(data->LeftSoftKey, data->RightSoftKey); // display ID softkeys /* * Print information */ /*MC SPR 1257, having to shift everything up 1 line as string wrapping for second string causes softkey overwrite when in Chinese*/ if (data->TextId NEQ 0) { ALIGNED_PROMPT(LEFT,0,DSPL_TXTATTR_CURRENT_MODE, data->TextId); } else if (data->TextString NEQ NULL) { #ifdef EASY_TEXT_ENABLED if (data->TextString[0] == 0x80) //MC if this is a unicode string displayAlignedText(LEFT, 0, DSPL_TXTATTR_UNICODE, &data->TextString[2]); else #endif displayAlignedText(LEFT, 0, DSPL_TXTATTR_NORMAL, data->TextString); } if (data->TextId2 NEQ 0) { ALIGNED_PROMPT(LEFT,Mmi_layout_first_line()/*MC*/,DSPL_TXTATTR_CURRENT_MODE, data->TextId2); } else if (data->TextString2 NEQ NULL) { #ifdef EASY_TEXT_ENABLED if (data->TextString2[0] == 0x80 ) //MC if this is a unicode string displayAlignedText(LEFT, Mmi_layout_first_line()/*MC*/, DSPL_TXTATTR_UNICODE, &data->TextString2[2]); else #endif { if ((data->WrapStrings & WRAP_STRING_2) && (strlen(data->TextString2) > MAX_LINE_CHAR)) { //Display text over a number of lines yPos = Mmi_layout_first_line();/*MC*/ bufPos = 0; nLines = Mmi_number_of_lines_without_icons_on_top()-2;//starting on 2nd line while ((bufPos <strlen(data->TextString2)) && (nLines >=0)) { memcpy(buffer,&data->TextString2[bufPos],MAX_LINE_CHAR); bufPos = bufPos + MAX_LINE_CHAR; buffer[MAX_LINE_CHAR] = 0x00; displayAlignedText(LEFT, yPos, 0, buffer); yPos = yPos + Mmi_layout_line_height(); nLines--; } } else { displayAlignedText(LEFT, Mmi_layout_second_line(),DSPL_TXTATTR_NORMAL, data->TextString2); } } } } break; default: return 0; } return 1; } /******************************************************************************* $Function: dialog_info_win_cb $Description: Callback function for information dialog $Returns: void $Arguments: window handle event, win GW SPR#2294 02/07/03 - Removed Unicode specific code as the 'display' routines called to calculate the string length and output the text should correctly handle the 0x80 unicode tag at the start. Modified the display code to wrap the text in the second text string. Modified the window drawing code so that if the text will not fit in the dialog box with the background bitmap, a pop-up 'box' will be drawn instead. If this will still not be large enough, the entire screen is used. For the C-sample, there is no bitmap. Modified the code to use an array of values to position the text output. GW SPR#2294 08/07/03 - Added code to expand the dialog box to include the animation (if any). *******************************************************************************/ // Allow 4 lines of text (0..3) for dialogs // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // To display a dialog properly when it contain lengthy message - No of lines increased. #define MAX_DLG_LINES (15) //Allow up to 40 chars of text on a dialog line #define MAX_WRAP_CHAR (42) //Allow us to wrap text from line 2 to lines 2,3 and 4 lines #define MAX_WRAP_LINES (MAX_DLG_LINES-1) #define DLG_USE_BITMAP 0x0001 //use bitmap if present #define DLG_USE_RECTANGLE 0x0002 //use a rectangle #define DLG_USE_FULL_SCREEN 0x0004 //use full-screen #define DLG_LINE1 0 #define DLG_LINE2 1 static int dialog_info_win_resize_cb (T_MFW_EVENT event, T_MFW_WIN * win) { T_dialog_info * data = (T_dialog_info *)win->user; // T_DISPLAY_DATA * display_info; // RAVI int xPos[MAX_DLG_LINES]; int yPos[MAX_DLG_LINES]; // Sep 06 2005 REF: MMI-SPR-33548 x0012849 //The size of array str and strlen are increased by 1, so that the last elements holds data // which is used while wrapping the text. char* str[MAX_DLG_LINES+1]; int strLen[MAX_DLG_LINES+1]; int i; char* lskStr,*rskStr; int wx = 0; //,wy,sx=0,sy=0; // RAVI int wy = 0; // RAVI int sx = 0; // RAVI int sy = 0; // RAVI int fullScreen = DLG_USE_RECTANGLE; int yOfs; int yBmpOfs = 0; MfwRect skArea; //x0035544 Feb 15, 2006. DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON USHORT titleIconWidth = 0; #endif MfwRect area; int scrWidth = 0; //available width for the display // RAVI - Assignment to 0. // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // temp_ptr is used while wrapping the text. // Now str2[][] is not required. char *temp_ptr; int nChar; t_font_bitmap bmp; // t_font_bitmap* bmpPtr = &bmp; // RAVI - Not Referenced. int drawWinType; int nLines; int linePos=0; int lineLen = 0; int wrapLine = 1; /*GW #2294*/ const int charWidth = dspl_GetTextExtent("0",1); TRACE_FUNCTION ("dialog_info_win_cb()"); //x0035544 Feb 15, 2006. DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON if (data->IconData.dst != NULL) { if (data->IconData.width > TITLE_ICON_WIDTH) { titleIconWidth = TITLE_ICON_WIDTH; } else { titleIconWidth = data->IconData.width ; } } else { titleIconWidth = 0; } #endif if (data EQ 0) return 1; switch (event) { case E_WIN_VISIBLE: if (win->flags & E_WIN_VISIBLE) { /* * Print the information dialog */ for (i=0;i<MAX_DLG_LINES;i++) { xPos[i]=0; yPos[i] = Mmi_layout_line_height()*i; str[i]=NULL; strLen[i]=0; } // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // Assign the values to last elments of the array str and strLen str[MAX_DLG_LINES] = NULL; strLen[MAX_DLG_LINES] = 0; yOfs = Mmi_layout_line_height()/4; if (data->TextId != 0) str[DLG_LINE1] = MmiRsrcGetText( data->TextId); else str[DLG_LINE1] = data->TextString; if (data->TextId2 != 0) str[DLG_LINE2] = MmiRsrcGetText( data->TextId2); else str[DLG_LINE2] = data->TextString2; if (data->SoftKeyStrings!=0) { lskStr = data->LSKString; rskStr = data->RSKString; } else { if (data->LeftSoftKey != TxtNull) lskStr = MmiRsrcGetText(data->LeftSoftKey); else lskStr = NULL; if (data->RightSoftKey != TxtNull) rskStr = MmiRsrcGetText(data->RightSoftKey); else rskStr = NULL; } if ((str[DLG_LINE1]!= NULL) || (str[DLG_LINE2]!=NULL)) { //Draw a window for status info if (str[DLG_LINE2] == NULL) { sy = Mmi_layout_line_height()+yOfs*2; // 18 or 12 } else { sy = Mmi_layout_line_height()*2+yOfs*3; // 33 or 22 } //MC, if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE) { //calculate longest string - use this to calc width of window sx = 0; if ((lskStr!=NULL) || (rskStr!=NULL)) { sy = sy+Mmi_layout_softkeyHeight()+yOfs*2; sx = sx + 10; if (lskStr != NULL) { sx = sx + dspl_GetTextExtent(lskStr, 0); } if (rskStr != NULL) { sx = sx + dspl_GetTextExtent(rskStr,0); } } for (i=DLG_LINE1;i<=DLG_LINE2;i++) { strLen[i] = dspl_GetTextExtent(str[i],0); } /* Work out the desired width of the dialog. If we can wrap line 2 and it is long, wrap it */ if (data->WrapStrings & WRAP_STRING_2) nLines = MAX_WRAP_LINES; else nLines = 1; #ifdef COLOURDISPLAY if (data->dlgBgdBitmap!=NULL) { //we only have room to split line 2 into 'max_lines_dlg_popup' lines in the pop-up. //NB this should be calculated depending on the height of the popup bitmap. const int max_lines_dlg_popup=2; if (nLines>max_lines_dlg_popup) nLines = max_lines_dlg_popup; scrWidth = (data->dlgBgdBitmap->area.sx * 3)/4; //the max width is about 3/4 of the pop-up if ( (strLen[DLG_LINE2] > (scrWidth-charWidth)*nLines) || (strLen[DLG_LINE1] > scrWidth)) { //recalculate width below. if (data->WrapStrings & WRAP_STRING_2) nLines = MAX_WRAP_LINES; fullScreen = DLG_USE_RECTANGLE; } else { fullScreen = DLG_USE_BITMAP; //Leave width as is } } #else //On a C-sample, limit pop-up lines to 2 extra (any more - use entire screen) { const int max_lines_dlg_popup=2; if (nLines>max_lines_dlg_popup) nLines = max_lines_dlg_popup; } #endif if (fullScreen == DLG_USE_RECTANGLE) { //see if we can display as a pop-up if (SCREEN_SIZE_X < 128) scrWidth = SCREEN_SIZE_X-6; else scrWidth = (SCREEN_SIZE_X*7)/8; if ( strLen[DLG_LINE2] > (scrWidth-charWidth)*nLines) { //Cannot fit in as a pop-up - use full screen fullScreen = DLG_USE_FULL_SCREEN; scrWidth = SCREEN_SIZE_X; } else { //We can fit it in - but we may want to reduce the width for a nicer look. } } /* * Wrap second text line (e.g. for long phone numbers.) */ if (strLen[DLG_LINE2] > scrWidth-charWidth) { //If we can fit the string on 2 lines - do it. if (data->WrapStrings & WRAP_STRING_2) { if (str[DLG_LINE2][0] != 0x80) //not unicode { wrapLine = 0; lineLen = strlen(str[DLG_LINE2]); // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // memset is not required any more . //Now the last element of the str[] will point to the second string of the dialog str[MAX_DLG_LINES] = str[DLG_LINE2]; // Now move the second line of text to the last element of the arrya strLen[MAX_DLG_LINES] = strLen[DLG_LINE2];// put the right value for the length of the string str[DLG_LINE2] = NULL ; // Assign NULL to the second element of the array. while ((wrapLine < MAX_WRAP_LINES) && (linePos<lineLen)) { // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // Instead of DLG_LINE2 use MAX_DLG_LINES nChar = dspl_GetNcharToFit (&str[MAX_DLG_LINES][linePos], (USHORT)scrWidth); if (nChar > MAX_WRAP_CHAR) nChar = MAX_WRAP_CHAR; // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // Allocate MAX_WRAP_CHAR no of bytes temp_ptr = (char*)mfwAlloc(MAX_WRAP_CHAR); if(NULL == temp_ptr) return 0; // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // Now the destination of memcpy is temp_ptr instead of str2[wrapLine] and the source is str[MAX_DLG_LINES] instead of str[DLG_LINE2] memcpy(temp_ptr,&str[MAX_DLG_LINES][linePos],nChar); // Now the source data is from the last element of the array. linePos = linePos+nChar; ////GW - even if we cannot display the entire string - it is better than what we would have otherwise // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // Assign the value of pointer temp_ptr to str[] str[DLG_LINE2+wrapLine] = temp_ptr; temp_ptr = NULL; strLen[DLG_LINE2 + wrapLine] = dspl_GetTextExtent(str[DLG_LINE2+wrapLine],0); wrapLine++; } } else { //Unicode is more problematic - we need the 0x80 at the front of the string //for the call to 'dspl_GetNcharToFit'. This will involve copying the entire remainder //of 'str2' into a temporary buffer. At the moment, we only wrap numbers so this //code will wait until it is required. // str[3] = "Code not written!!"; //issue warning // strLen[3] = dspl_GetTextExtent(str[3],0); fullScreen = DLG_USE_FULL_SCREEN; //error - use full screen } } } //Calculate longest line of text (including softkeys - sx already set to the softkey width) for (i=0;i< MAX_DLG_LINES;i++) { if (strLen[i]>sx) sx = strLen[i]; } if (sx > SCREEN_SIZE_X-charWidth) sx = SCREEN_SIZE_X; else { if (sx > SCREEN_SIZE_X/2) sx = sx + charWidth; else sx = sx + charWidth*2; } if (sy> sx) sx = sy; wx = (SCREEN_SIZE_X-sx)/2; if (wx<0) wx=0; } if (sy > SCREEN_SIZE_Y) wy = 0; else if (SCREEN_SIZE_Y > 2*sy) wy = (SCREEN_SIZE_Y*2/3-sy)/2; //display in middle of top 2/3 of screen else wy = (SCREEN_SIZE_Y-sy)/2; //display in middle of screen if (wy < 10) wy = wy/2; if ((wx == 0) || (wy==0)) { //not enough room to display as a window - use whole screen fullScreen = DLG_USE_FULL_SCREEN; } #ifdef COLOURDISPLAY if ((data->icon_array != NULL) && (fullScreen != DLG_USE_BITMAP)) { //The dialog has an animation - we must make the pop-up large enough to support this if (sx < data->icon_array[0].area.sx) sx = data->icon_array[0].area.sx; yBmpOfs = data->icon_array[0].area.py + data->icon_array[0].area.sy; wy = data->icon_array[0].area.py; sy = sy + data->icon_array[0].area.sy; } #endif } else { //We have no strings to display - clear entire screen fullScreen = DLG_USE_FULL_SCREEN; } /****************************** * Draw window (full screen/pop-up) *****************************/ if (fullScreen != DLG_USE_FULL_SCREEN) dspl_unfocusDisplay(); area.px = 0; area.py = 0; area.sx = sx; area.sy = sy; resources_setColour(data->dlgCol); drawWinType = DSPL_WIN_CENTRE; if (fullScreen!=DLG_USE_FULL_SCREEN) { t_font_bitmap bmp; t_font_bitmap* bmpPtr = NULL; for (i=0;i<MAX_DLG_LINES;i++) { //centre text xPos[i] = wx+(sx-strLen[i])/2; yPos[i] = wy+yOfs+yBmpOfs+Mmi_layout_line_height()*i; } #ifdef COLOURDISPLAY if ((data->dlgBgdBitmap != NULL) && (fullScreen==DLG_USE_BITMAP)) { bmp.format = data->dlgBgdBitmap->icnType; bmp.height = data->dlgBgdBitmap->area.sy; bmp.width = data->dlgBgdBitmap->area.sx; bmp.bitmap = data->dlgBgdBitmap->icons; bmpPtr = &bmp; area = calcLayout(data->dlgType, sx, sy, bmp.width, bmp.height); //Adjust size of available area depending on bitmap properties/dlgType. //dlgType== 0 =>display info in centre of bitmap if (data->dlgType == 0) { //If the bmp is bigger than the data we will move the bmp to //lie over the centre of the data area.px = area.px - (bmp.width - sx)/2; area.py = area.py - (bmp.height- sy)/2; } for (i=0;i<MAX_DLG_LINES;i++) { xPos[i] = xPos[i] + area.px; yPos[i] = yPos[i] + area.py; } TRACE_EVENT_P3("wy = %d, yOfs = %d, area.py = %d",wy,yOfs,area.py); if( data->dlgBgdBitmap->icnType != ICON_TYPE_1BIT_UNPACKED ) dspl_SetBgdColour( COL_TRANSPARENT ); } else { sy = sy + (wrapLine-2)*Mmi_layout_line_height(); area.sy = sy; } #else if (wrapLine>1) { sy = sy + (wrapLine-1)*Mmi_layout_line_height(); area.sy = sy; } #endif // Sep 06 2005 REF: MMI-SPR-33548 x0012849 //If length of the dialog is bigger than screen then start the dialog from the top corner. if(sy+wy >= SCREEN_SIZE_Y && sy < SCREEN_SIZE_Y) if(wy>0 && wy < sy) { wy = (SCREEN_SIZE_Y - sy ) /2 ;// centre the dialog if(wy < 0) wy=0; for (i=0;i<MAX_DLG_LINES;i++) yPos[i] = wy+yOfs+yBmpOfs+Mmi_layout_line_height()*i; } dspl_DrawWin( wx,wy,sx,sy, drawWinType , bmpPtr); } else { dspl_ClearAll(); sx = 84; for (i=0;i<MAX_DLG_LINES;i++) { xPos[i] = 0; yPos[i] = Mmi_layout_line(i+1); } } /****************************** * Print softkeys *****************************/ icnShow(data->icon); if ((lskStr != NULL) || (rskStr != NULL)) { if (fullScreen==DLG_USE_FULL_SCREEN) Mmi_layout_softkeyArea( &skArea ); else { skArea.px = area.px+wx; skArea.sx = area.sx; skArea.py = area.py+wy+area.sy-Mmi_layout_softkeyHeight()-1; skArea.sy = Mmi_layout_softkeyHeight(); } softKeys_displayStrXY(lskStr, rskStr, data->dlgSkFormat, data->dlgCol, &skArea); } /****************************** * Print dialog text *****************************/ for (i=0;i<MAX_DLG_LINES;i++) { /* GW#2294 No need to draw zero length strings .*/ if ((str[i] != NULL) && (strLen[i] > 0)) { //x0035544 Feb 15, 2006. DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON if(data->IconData.selfExplanatory == FALSE) dspl_TextOut(xPos[i] + titleIconWidth, yPos[i], DSPL_TXTATTR_NORMAL, str[i] ); #else dspl_TextOut(xPos[i] , yPos[i], DSPL_TXTATTR_NORMAL, str[i] ); #endif } } //x0035544 Feb 15, 2006. DR:OMAPS00061467 #ifdef FF_MMI_SAT_ICON if(data->IconData.dst != NULL) { if(str[DLG_LINE2] == NULL) { if ((data->IconData.width > TITLE_ICON_WIDTH) || (data->IconData.height > TITLE_ICON_HEIGHT)) { dspl_BitBlt2(xPos[0], yPos[0], 8, 10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR); } else dspl_BitBlt2(xPos[0], yPos[0], data->IconData.width, data->IconData.height, (void*)data->IconData.dst, 0, BMP_FORMAT_256_COLOUR); } else { if ((data->IconData.width > TITLE_ICON_WIDTH) || (data->IconData.height > TITLE_ICON_HEIGHT)) { dspl_BitBlt2(xPos[DLG_LINE2], yPos[DLG_LINE2], 8, 10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR); } else dspl_BitBlt2(xPos[DLG_LINE2], yPos[DLG_LINE2],data->IconData.width, data->IconData.height, (void*)data->IconData.dst, 0, BMP_FORMAT_256_COLOUR); } } #endif resources_restoreColour(); } break; default: return 0; } // Sep 06 2005 REF: MMI-SPR-33548 x0012849 // Now free the allocated memory if (strLen[MAX_DLG_LINES] > scrWidth-charWidth) if (data->WrapStrings & WRAP_STRING_2) if (str[MAX_DLG_LINES][0] != 0x80) { for(i=DLG_LINE2;i<MAX_DLG_LINES;i++) { if(NULL != str[i] && strLen[i] > 0) mfwFree((U8*)str[i],MAX_WRAP_CHAR); } str[MAX_DLG_LINES]=NULL; } return 1; } /******************************************************************************* $Function: dialog_info_tim_cb $Description: Callback function for the dialog info timer. $Returns: MFW event handler $Arguments: window handle event, timer control block *******************************************************************************/ static T_MFW_CB dialog_info_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc) { T_MFW_HND win = mfw_parent (mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; T_MFW_HND parent_win = data->parent_win; USHORT Identifier = data->Identifier; void (* Callback)() = data->Callback; #if defined (WIN32) { /***************************Go-lite Optimization changes Start***********************/ //Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P1 ("Identifier %d", data->Identifier);); /***************************Go-lite Optimization changes end***********************/ } #endif /* ** SPR#1744 NDH ** Move the dialog destory in front of the Callback to make the processing consistent ** with the Right Keypress and Hangup Processing. Also to ensure that the dialog is ** removed when the screen is redrawn. */ dialog_info_destroy (win); if (Callback) (Callback) (parent_win, Identifier, INFO_TIMEOUT); return 0; } /******************************************************************************* $Function: dialog_info_kbd_cb $Description: Keyboard event handler $Returns: status int $Arguments: window handle event, keyboard control block *******************************************************************************/ static int dialog_info_kbd_cb (T_MFW_EVENT event, T_MFW_KBD *keyboard) { T_MFW_HND win = mfw_parent (mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; T_MFW_HND parent_win = data->parent_win; USHORT Identifier = data->Identifier; void (* Callback)() = data->Callback; TRACE_FUNCTION("dialog_info_kbd_cb"); switch (keyboard->code) { case KCD_LEFT: if (data->KeyEvents & KEY_LEFT ) { dialog_info_destroy (win); if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_LEFT); } break; case KCD_RIGHT: if (data->KeyEvents & KEY_RIGHT) { dialog_info_destroy (win); if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_RIGHT); } break; case KCD_HUP: if (data->KeyEvents & KEY_HUP || data->KeyEvents & INFO_KCD_ALL) { dialog_info_destroy (win); if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_HUP); } break; case KCD_MNUUP: if (data->KeyEvents & KEY_MNUUP) { if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_UP); } break; case KCD_MNUDOWN: if (data->KeyEvents & KEY_MNUDOWN) { if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_DOWN); } break; //MZ 7/3/01 used to start a call. case KCD_CALL: if (data->KeyEvents & KEY_CALL ) { dialog_info_destroy (win); if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_OFFHOOK); } break; default: if (data->KeyEvents & INFO_KCD_ALL) { /* Note: The variable Identifier is overwritten with the keycode of the dialog; we need it only for the Multicall Control !! */ Identifier = keyboard->code; dialog_info_destroy (win); if (Callback) (Callback) (parent_win, Identifier, INFO_KCD_ALL); } break; } return MFW_EVENT_CONSUMED; } static int dialog_info_kbd_long_cb(T_MFW_EVENT event, T_MFW_KBD *keyboard){ return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: mmi_dialog_information_screen $Description: $Returns: $Arguments: *******************************************************************************/ T_MFW_HND mmi_dialog_information_screen(T_MFW_HND parent_win, int TxtId, char* text, T_VOID_FUNC call_back, USHORT identifier) { T_DISPLAY_DATA display_info; dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, TxtId, TxtNull, COLOUR_STATUS); dlg_initDisplayData_events( &display_info, call_back, THREE_SECS, KEY_ALL ); //Sep 01, 2004 REF: CRR 21380 Deepa M.D //Assigning TextId and TextString will not display both the messages. //Hence we need to use TextId and TextString2 or TextId2 and TextString display_info.TextString2 = text; display_info.Identifier = identifier; return info_dialog(parent_win,&display_info); //information screen } T_MFW_HND mmi_dialog_information_screen_forever(MfwHnd win,int TextId, char* TextStr, int colour) { T_DISPLAY_DATA DisplayInfo; dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TextId, TxtNull, colour); dlg_initDisplayData_events( &DisplayInfo, NULL, FOREVER, KEY_HUP ); DisplayInfo.TextString = TextStr; return info_dialog(win, &DisplayInfo); } /******************************************************************************* $Function: mmi_dialogs_insert_icon $Description: Displays one icon in a dialog $Returns: none $Arguments: win, pointer to an icon *******************************************************************************/ void mmi_dialogs_insert_icon (T_MFW_HND win_dialog ,MfwIcnAttr *icon) { T_MFW_WIN * win_data = ((T_MFW_HDR *)win_dialog)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; data->icon = icnCreate(win_dialog,icon,E_ICN_VISIBLE,NULL); icnUnhide(data->icon); winShow(win_dialog); } /******************************************************************************* $Function: mmi_dialogs_insert_animation $Description: starts an animation in a dialog $Returns: none $Arguments: win, animation time, pointer to an icon, number of frames *******************************************************************************/ void mmi_dialogs_insert_animation (T_MFW_HND win_dialog , S32 anim_time ,MfwIcnAttr *icon ,UBYTE number_of_frames) { T_MFW_WIN * win_data = ((T_MFW_HDR *)win_dialog)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; data->number_of_frames = number_of_frames; data->current_frame = 0; data->icon_array = icon; data->current_icon = data->icon_array; data->icon = icnCreate(win_dialog,data->current_icon,E_ICN_VISIBLE,NULL); icnUnhide(data->icon); data->animation_timer = timCreate(win_dialog,anim_time,(MfwCb)mmi_dialogs_insert_animation_CB); timStart(data->animation_timer); winShow(win_dialog); } /******************************************************************************* $Function: mmi_dialogs_insert_animation_CB $Description: destroys the current icon and starts the next icon $Returns: none $Arguments: timer event, timer control block *******************************************************************************/ void mmi_dialogs_insert_animation_CB (T_MFW_EVENT event, T_MFW_TIM *tc) { T_MFW_HND win = mfw_parent (mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; icnDelete(data->icon); if (data->current_frame < (data->number_of_frames-1)) { data->current_frame++; data->current_icon++; } else { data->current_frame = 0; data->current_icon = data->icon_array; } data->icon = icnCreate(win,data->current_icon,E_ICN_VISIBLE,NULL); icnUnhide(data->icon); timStart(data->animation_timer); winShow(win); } /***************************Go-lite Optimization changes Start***********************/ //Aug 25, 2004 REF: CRR 24904 Deepa M.D //This function is used only for the Color build.Hence it is put under the //COLOURDISPLAY compiler switch #ifdef COLOURDISPLAY void mmi_dialogs_insert_animation_new (T_DISPLAY_DATA *animateInfo , S32 anim_time ,MfwIcnAttr* icon ,UBYTE number_of_frames) { TRACE_EVENT("mmi_dialogs_insert_animation_new()"); animateInfo->number_of_frames = number_of_frames; animateInfo->current_frame = 0; animateInfo->icon_array = icon; animateInfo->anim_time = anim_time; } #endif /***************************Go-lite Optimization changes end***********************/ void mmi_dialogs_animation_new_CB (T_MFW_EVENT event, T_MFW_TIM *tc) { T_MFW_HND win = mfw_parent (mfw_header()); T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data; T_dialog_info * data = (T_dialog_info *)win_data->user; char * idData; int px, py, sx, sy; MfwIcnAttr* icn_array; MfwIcnAttr* icn; TRACE_EVENT("mmi_dialogs_insert_animation_new_CB()"); data->current_frame = (data->current_frame +1) % data->number_of_frames; TRACE_EVENT_P1("data->current_frame = %d", data->current_frame); TRACE_EVENT_P1("number_of_frames = %d", data->number_of_frames); icn_array = (MfwIcnAttr*)data->icon_array; TRACE_EVENT_P1("data->icon_array = %x", (int)data->icon_array); icn = &icn_array[data->current_frame]; px = icn->area.px; py = icn->area.py; sx = icn->area.sx; sy = icn->area.sy; TRACE_EVENT_P4("px = %d, py = %d, sx = %d, sy = %d", icn->area.px,icn->area.py,icn->area.sx,icn->area.sy); idData = icn->icons; dspl_BitBlt2(px,py,sx,sy,(void*)idData,0,0x02); timStart(data->animation_timer); } //Jun 04,2004 CRR:13601 xpradipg - SASKEN /******************************************************************************* $Function: InfoDialogTimRestart $Description: restarts the information dialog timer $Returns: none $Arguments: window handler *******************************************************************************/ void InfoDialogTimRestart(T_MFW_HND win) { T_MFW_WIN * win_data; T_dialog_info * data; win_data = ((T_MFW_HDR *)win)->data; data = (T_dialog_info *)win_data->user; tim_stop(data->info_tim); tim_start(data->info_tim); } // Feb 24, 2005 CRR:29102 xnkulkar - SASKEN // As the user has already confirmed that all SMS messages are to be deleted, KEY_HUP is not // registered. /******************************************************************************* $Function: mmi_dialog_information_screen_delete_all $Description: Displays the information screen during "Delete All" operation $Returns: Handle of information dialog $Arguments: window handle, text id, text string and generic status window *******************************************************************************/ T_MFW_HND mmi_dialog_information_screen_delete_all(MfwHnd win,int TextId, char* TextStr, int colour) { T_DISPLAY_DATA DisplayInfo; dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TextId, TxtNull, colour); dlg_initDisplayData_events( &DisplayInfo, NULL, FOREVER, NULL ); DisplayInfo.TextString = TextStr; return info_dialog(win, &DisplayInfo); }