FreeCalypso > hg > fc-tourmaline
view src/ui/bmi/AUIEditor.c @ 230:baa738eeb842
FCBM code implemented in first pass
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 01 May 2021 10:05:53 +0000 |
parents | 70ea7526b59e |
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: AUIEditor.c $Revision: 1.0 $Author: Condat(UK) $Date: 22/02/01 ******************************************************************************** Description: Generic MMI Editor. ******************************************************************************** $History: AUIEditor.c May 15, 2006 DR: OMAPS00075852 - xreddymn Description: New SMS and Message Full indications will not be seen by user when CB is enabled, because CB messages have higher priority. Solution: CB messages and New SMS or Message Full indications are displayed in two different zones on the Idle screen. Changes: Added new display zone which is located one line above the softkeys. Mar 14, 2006 DR: OMAPS00061468 - x0035544. Description: SAT 27.22.4.22.2 SET UP IDLE MODE TEXT (Icon support) fails Solution : In the function AUI_edit_SetDefault() set the default value for display_type to SAT_ICON_NONE. Jan 16, 2006 DR: OMAPS00061460 - Shashi Shekar B.S. Description: SAT Icon support Solution : SAT icon support added. Dec-20-2004 MMI-SPR-27382 xreddymn Added NULL window handle check for AUI_edit_Destroy Sep 2, 2004 REF: CRR 21370 xkundadu Description: Giving wrong expected result by long press on "#" key Fix: When user presses long on '#' key it will display 'p'. Changed the long press of '*' key to display 'w'. Jul 22,2004 CRR:21605 xrashmic - SASKEN Description: After deleting all the characters in the editor the case does not change to sentence case. Fix: After deleting a character, check if editor is empty and then set the case to sentence case only if the user has not modified the case. Jul 29, 2004 REF: CRR:20892 xrashmic - SASKEN Description: By Long press on Left/Right key at 'Message Editor' screen, cursor not scrolling continuously Fix: The Long press of left/right key is now handled in AUI_edit_KbdLongCB. The continuous long press of a key was being ignored for all keys. Now only for left and right keys this is handled, for rest of the keys the continuos long press is ignored. 31/01/02 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 "mfw_mfw.h" #include "mfw_win.h" #include "mfw_kbd.h" #include "mfw_tim.h" #include "mfw_phb.h" #include "mfw_sms.h" #include "mfw_ss.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 "mfw_cm.h" #include "mfw_edt.h" #include "dspl.h" #include "ksd.h" #include "psa.h" #include "ATBCommon.h" #include "ATBDisplay.h" #include "ATBEditor.h" #include "AUIEditor.h" #include "MmiDummy.h" #include "MmiMmi.h" #include "MmiDialogs.h" #include "MmiLists.h" #include "MmiMenu.h" #include "MmiSoftKeys.h" #include "MmiIdle.h" #include "cus_aci.h" #include "prim.h" #ifndef PCM_2_FFS #include "pcm.h" #endif #include "Mmiicons.h" #include "MmiBookShared.h" #include "mmiSmsMenu.h" #include "mfw_ffs.h" #ifdef EASY_TEXT_ENABLED #include "MmiDictionary.h" #endif #include "mmiColours.h" #include "ATBCommon.h" #include "ATBDisplay.h" #include "ATBEditor.h" #include "AUITextEntry.h" #include "AUIEditor.h" #include "AUIEditor_i.h" #include "AUISymbol.h" /* Mar 08, 2006 REF:ER OMAPS00065168 */ #ifdef NEPTUNE_BOARD #include "audio.h" #endif #ifndef MFW_EVENT_PASSED #define MFW_EVENT_PASSED 0 #endif #define TRACE_AUIEditor // Def/undef this to show/hide the trace_events for this file static void AUI_edit_ClearPredText(T_AUI_EDITOR_INFO *data); /* API - 08/07/03 - CQ10728*/ static void AUI_Edit_Display_Only_CB(T_MFW_HND win, USHORT Identifier, SHORT reason); static void AUI_Edit_Display_Only_Destroy (T_MFW_HND window); /* API - 08/07/03 - CQ10728 END*/ /******************************************************************************* Static Data ********************************************************************************/ /* eZiText icon */ static const unsigned char TextIconeZiTextSmall[] = { 0x03,0x03,0x18,0x7c,0xcc,0x08,0x10,0x0c }; // Jul 22,2004 CRR:21605 xrashmic - SASKEN // This variable would tell us if the user had changed the case explicitly UBYTE CaseChanged = FALSE; #define ED_IND_UPPER "ABC" #define ED_IND_LOWER "abc" #define ED_IND_CAPS "Abc" #define ED_IND_NUM "123" #define ED_IND_NONE "---" /******************************************************************************* $Function: AUI_edit_Start $Description: Start the editor. $Returns: None. $Arguments: None. *******************************************************************************/ T_MFW_HND AUI_edit_Start(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data) { T_MFW_HND win; TRACE_FUNCTION ("AUI_edit_Start()"); win = AUI_edit_Create(parent, editor_data); return win; } /******************************************************************************* $Function: AUI_edit_QuickStart $Description: Start the editor. $Returns: Dialog handler for the editor. $Arguments: win - the parent window TitleId - the text id of the title (or NULL) TitleString - the text string of the title (or NULL) buffer - the unicode input buffer len - maximum length of the text entered editor_info - the T_AUI_EDITOR_DATA structure (allocated but empty) *******************************************************************************/ T_MFW_HND AUI_edit_QuickStart(T_MFW_HND win, USHORT TitleId, UBYTE *TitleString, USHORT *buffer, USHORT len, T_AUI_EDITOR_DATA *editor_info, T_AUI_EDIT_CB editor_cb) { TRACE_FUNCTION ("AUI_edit_QuickStart()"); AUI_edit_SetDisplay(editor_info, ZONE_FULL_SK_TITLE, COLOUR_EDITOR, EDITOR_FONT); AUI_edit_SetEvents(editor_info, 0, TRUE, FOREVER, editor_cb); AUI_edit_SetBuffer(editor_info, ATB_DCS_UNICODE, (UBYTE *)buffer, len); AUI_edit_SetTextStr(editor_info, TxtSoftOK, TxtDelete, TitleId, TitleString); AUI_edit_SetAltTextStr(editor_info, 0, NULL, TRUE, TxtSoftBack); /* create the dialog handler */ return AUI_edit_Start(win, editor_info); /* start the common editor */ } /******************************************************************************* $Function: AUI_edit_Create $Description: Create the editor. $Returns: Pointer to the editor's window. $Arguments: parent - The parent window. *******************************************************************************/ static T_MFW_HND AUI_edit_Create(T_MFW_HND parent, T_AUI_EDITOR_DATA *editor_data) { T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)ALLOC_MEMORY (sizeof (T_AUI_EDITOR_INFO)); T_MFW_WIN *win_data; TRACE_FUNCTION ("AUI_edit_Create()"); /* Create window handler */ data->win = win_create(parent, 0, E_WIN_VISIBLE, (T_MFW_CB)AUI_edit_WinCb); // Create window if (data->win==NULL) // Make sure window exists { return NULL; } /* Connect the dialog data to the MFW-window */ data->mmi_control.dialog = (T_DIALOG_FUNC)AUI_edit_ExecCb; /* Setup the destination for events */ data->mmi_control.data = data; data->parent = parent; win_data = ((T_MFW_HDR *)data->win)->data; win_data->user = (void *)data; data->kbd = kbd_create(data->win, KEY_ALL,(T_MFW_CB)AUI_edit_KbdCb); data->kbd_long = kbd_create(data->win, KEY_ALL|KEY_LONG,(T_MFW_CB)AUI_edit_KbdLongCb); data->editor = ATB_edit_Create(&data->editor_data.editor_attr,0); data->editor_data = *editor_data; // Jul 22,2004 CRR:21605 xrashmic - SASKEN // The initial value of this variable should be false. i.e the user has still not changed the case. CaseChanged=FALSE; AUI_edit_Init(data->win); SEND_EVENT(data->win, E_ED_INIT, 0, 0); /* Return window handle */ return data->win; } /******************************************************************************* $Function: AUI_edit_Init $Description: Initialise the editor. $Returns: Pointer to the editor's window. $Arguments: win - The editor window *******************************************************************************/ static void AUI_edit_Init(T_MFW_HND win) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; T_ATB_TEXT text={0,0,NULL}; TRACE_FUNCTION("AUI_edit_Init()"); data->editor->update = ED_UPDATE_FULL; data->predText.len = 0; /* Blank out predictive text buffer */ /* Set up title information */ data->hasTitle = FALSE; data->title.len = 0; /* Blank out title buffer */ if (data->editor_data.TitleId!=NULL) { data->hasTitle = TRUE; text.data = (UBYTE *)GET_TEXT(data->editor_data.TitleId); } else if (data->editor_data.TitleString!=NULL) { data->hasTitle = TRUE; text.data = data->editor_data.TitleString; } /* If title exists, get its dcs and length */ if (data->hasTitle) { if (text.data[0]==0x80) { text.data += 2; /* Skip over two unicode indicator bytes */ text.dcs = ATB_DCS_UNICODE; } #ifdef EASY_TEXT_ENABLED else if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) { text.dcs = ATB_DCS_UNICODE; } #endif else { text.dcs = ATB_DCS_ASCII; } text.len = ATB_string_Length(&text); /* Allocate memory for the title and copy the text there */ data->title.data = (UBYTE *)ALLOC_MEMORY((text.len + 1)*ATB_string_Size(&text)); ATB_string_Copy(&data->title, &text); } /* Set up correct parameters for easytext */ #ifdef EASY_TEXT_ENABLED if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA)) { /* Allocate word buffer memory */ data->predText.data = (UBYTE *)ALLOC_MEMORY((ED_PREDTEXT_MAX+1)*sizeof(UBYTE)); data->predText.dcs = ATB_DCS_ASCII; data->predText.len = 0; FFS_flashData.PredTextAvailable = TRUE; Initialize_Dict(Mmi_getCurrentLanguage()/*SPR1508*/, 0); ResetDictSearch(); } #endif /* Initialise editor */ ATB_edit_Init(data->editor); /* Initialise text entry */ data->entry_data = AUI_entry_Create(data->win, data->editor, E_ED_UPDATE); /* If there's a timeout, create the timer */ if (data->editor_data.timeout && (data->editor_data.timeout != FOREVER)) { data->timer = tim_create(data->win, data->editor_data.timeout, (T_MFW_CB)AUI_edit_TimerCb); tim_start(data->timer); } else { data->timer = NULL; } /* Title timer, if required, is set up in WinCb */ data->title_timer = NULL; return; } /******************************************************************************* $Function: AUI_edit_Destroy $Description: Destroy the editor. $Returns: None. $Arguments: window - The editor window. *******************************************************************************/ void AUI_edit_Destroy(T_MFW_HND win) { T_MFW_WIN *win_data; T_AUI_EDITOR_INFO *data; #ifdef TRACE_AUIEditor TRACE_FUNCTION ("AUI_edit_Destroy()"); #endif if (win == NULL) { #ifdef TRACE_AUIEditor TRACE_EVENT ("Error : Called with NULL Pointer"); #endif return; } // xreddymn Dec-21-2004 MMI-SPR-27382: Added NULL window handle check for AUI_edit_Destroy win_data = ((T_MFW_HDR *)win)->data; if(win_data == NULL) return; data = (T_AUI_EDITOR_INFO *)win_data->user; if (data) { /* Free memory allocated for easytext buffer */ #ifdef EASY_TEXT_ENABLED if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA) && data->predText.data ) { TRACE_EVENT("Freeing predictive text buffer"); FREE_MEMORY((void *)data->predText.data, (ED_PREDTEXT_MAX+1)*sizeof(UBYTE)); } #endif /* Free memory allocated for title */ if (data->hasTitle) { FREE_MEMORY(data->title.data, (data->title.len + 1)*ATB_string_Size(&data->title)); } /* Delete timers */ if (data->timer) { tim_delete(data->timer); data->timer = NULL; } if (data->title_timer) { tim_delete(data->title_timer); data->title_timer = NULL; } win_delete (data->win); /* Free editor memory */ AUI_entry_Destroy(data->entry_data); ATB_edit_Destroy(data->editor); FREE_MEMORY ((void *)data, sizeof (T_AUI_EDITOR_INFO)); } return; } /******************************************************************************* $Function: AUI_edit_ExecCb $Description: Dialog function for editor. $Returns: None. $Arguments: None. *******************************************************************************/ static void AUI_edit_ExecCb(T_MFW_HND win, USHORT event, USHORT value, void *parameter) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; T_MFW_HND parent_win = data->parent; USHORT alphachar; /* Store these in case editor is destroyed on callback */ USHORT Identifier = data->editor_data.Identifier; T_AUI_EDIT_CB Callback = data->editor_data.Callback; UBYTE destroyEditor = data->editor_data.destroyEditor; /* Mar 08, 2006 REF:ER OMAPS00065168 */ #ifdef NEPTUNE_BOARD UBYTE ringer; #endif #ifdef TRACE_AUIEditor TRACE_FUNCTION ("AUI_edit_ExecCb()"); #endif switch (event) { /* Initialise */ case E_ED_INIT: TRACE_EVENT("E_ED_INIT"); win_show(data->win); break; /* Destroy the editor */ case E_ED_DESTROY: AUI_edit_Destroy(data->win); break; /* De-initialise editor */ case E_ED_DEINIT: TRACE_EVENT("E_ED_DEINIT"); /* Mar 08, 2006 REF:ER OMAPS00065168 */ /* Stop playing ring tone on key press */ #ifdef NEPTUNE_BOARD ringer = getcurrentSMSTone(); audio_StopSoundbyID( AUDIO_BUZZER, ringer ); vsi_t_sleep(0,10); /* small delay */ #endif if (Callback) (Callback) (parent_win, Identifier, value); if(destroyEditor) AUI_edit_Destroy(data->win); break; /* Insert a character */ case E_ED_INSERT: alphachar = (USHORT)value; /* If value is set, insert character */ if (alphachar!=NULL) { ATB_edit_Char(data->editor, alphachar, TRUE); #ifdef EASY_TEXT_ENABLED if(FFS_flashData.PredTextAvailable && FFS_flashData.PredTextSelected && ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT)) { if ((alphachar == UNICODE_FULLSTOP) ||(alphachar == UNICODE_EXCLAMATION) || (alphachar == UNICODE_QUESTION)) { ATB_edit_Char(data->editor, UNICODE_SPACE, TRUE); } } #endif } else /* If parameter is set, insert string */ if (parameter!=NULL) { ATB_edit_InsertString(data->editor, (T_ATB_TEXT *)parameter); } win_show(data->win); break; /* Update word wrap & redraw editor window */ case E_ED_UPDATE: //ATB_edit_Refresh(data->editor); /* SPR#2342 - SH */ win_show(data->win); break; default: break; } return; } /******************************************************************************* $Function: AUI_edit_WinCb $Description: Editor window event handler. $Returns: None. $Arguments: event - the event win - the editor window *******************************************************************************/ static int AUI_edit_WinCb(T_MFW_EVENT event, T_MFW_WIN *win_data) { T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; T_ED_DATA *editor = data->editor; USHORT scrollBarSize; USHORT scrollBarPos; SHORT editX = editor->attr->win_size.px; SHORT editY = editor->attr->win_size.py; SHORT editWidth = editor->attr->win_size.sx; SHORT editHeight = editor->attr->win_size.sy; char lengthIndC[12]; /* Strings for the header */ T_ATB_TEXT string; USHORT stringWidth; USHORT stringHeight; T_ATB_TEXT title; USHORT titleWidth; USHORT titleHeight; USHORT textLen; T_DS_TEXTFORMAT format; BOOL showIcons; /* Flag that stores whether icons (e.g. alignment icons) should be shown */ USHORT leftSK; USHORT rightSK; USHORT textIndex; T_ATB_TEXT newTitle; USHORT lastSpace; USHORT character; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON SHORT titleIconWidth = 0; SHORT iconX; SHORT iconY; #endif #ifdef TRACE_AUIEditor TRACE_FUNCTION ("AUI_edit_WinCb()"); #endif if (!data) return MFW_EVENT_CONSUMED; switch(event) { case E_WIN_VISIBLE: /* window is visible */ if (win_data->flags & E_WIN_VISIBLE) { // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON if (editor->attr->TitleIcon.data != NULL) { if (editor->attr->TitleIcon.width > TITLE_ICON_WIDTH) { titleIconWidth = TITLE_ICON_WIDTH; } else { titleIconWidth = editor->attr->TitleIcon.width; } } else { titleIconWidth = 0; } #endif textLen = data->editor->attr->text.len; ATB_edit_LineGet(data->editor, data->editor->winStartLine); if (editor->update==ED_UPDATE_TRIVIAL) editor->update = ED_UPDATE_DEFAULT; TRACE_EVENT("Updating whole screen."); /* Show the edited text */ /* Don't update editor text if in ED_UPDATE_PARTIAL */ if (editor->update!=ED_UPDATE_PARTIAL) { ATB_edit_Show(data->editor); } /* Set the colour for drawing title and scrollbar */ resources_setTitleColour(COLOUR_EDITOR); /* TITLE */ if (data->editor_data.zone_id & ZONE_TITLE) { dspl_Clear(0,0, SCREEN_SIZE_X-1, editY-1); /* Display the title, if it exists */ string.len = 0; string.dcs = ATB_DCS_ASCII; title.len = 0; title.dcs = ATB_DCS_ASCII; if (data->hasTitle) { title.data = data->title.data; title.len = data->title.len; title.dcs = data->title.dcs; } /* Uppercase/lowercase indicator */ if (!ATB_edit_Mode(editor, ED_MODE_READONLY)) { switch(ATB_edit_GetCasePref(editor)) { case ED_CASEPREF_ALPHA_UC: case ED_CASEPREF_ALPHANUM_UC: string.data = (UBYTE *)ED_IND_UPPER; break; case ED_CASEPREF_ALPHA_LC: case ED_CASEPREF_ALPHANUM_LC: string.data = (UBYTE *)ED_IND_LOWER; break; case ED_CASEPREF_ALPHANUM: if (ATB_edit_GetCase(editor)==ED_CASE_UPPER) string.data = (UBYTE *)ED_IND_UPPER; else if (ATB_edit_GetCase(editor)==ED_CASE_LOWER) string.data = (UBYTE *)ED_IND_LOWER; else if (ATB_edit_GetCase(editor)==ED_CASE_CAPS) string.data = (UBYTE *)ED_IND_CAPS; else string.data = (UBYTE *)ED_IND_NUM; break; case ED_CASEPREF_NUM: string.data = (UBYTE *)ED_IND_NUM; break; default: string.data = (UBYTE *)ED_IND_NONE; break; } string.len = ATB_string_Length(&string); #ifdef EASY_TEXT_ENABLED /* Display predicted word in header */ if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected) { if (ATB_edit_CapitaliseWord(data->editor)) /* Word is capitalised */ string.data = (UBYTE *)ED_IND_CAPS; else string.data = (UBYTE *)ED_IND_LOWER; string.len = ATB_string_Length(&string); if(data->predText.len!=0) { title.data = data->predText.data; title.len = data->predText.len; title.dcs = data->predText.dcs; } } #endif if (ATB_edit_Mode(editor, ED_MODE_ALPHA) && title.len==0) { /* SPR#1995 - SH - 'size' includes null terminator, so * remaining characters is size-1 */ #ifdef LSCREEN sprintf(lengthIndC, "%d/%d", textLen, editor->attr->size-1); #else sprintf(lengthIndC, "%d", editor->attr->size-textLen-1); #endif title.data = (UBYTE *)lengthIndC; title.len = ATB_string_Length(&title); } } /* Draw the string to the right of the editor - the case/format indicator, and icons (if appropriate) */ stringWidth = 0; stringHeight = 0; showIcons = FALSE; if (string.len) { TRACE_EVENT("Displaying string on right"); ATB_display_SetFormatAttr(&format, 0, FALSE); /* Set format to format at cursor */ stringWidth = ATB_display_StringWidth(&string, &format)+2; stringHeight = ATB_display_StringHeight(&string, &format); ATB_display_Text(SCREEN_SIZE_X-stringWidth+2,0, &format, &string); showIcons = TRUE; /* If showing case, show icons */ } #ifdef EASY_TEXT_ENABLED /* Display ezitext icon to the left of the case indicator */ if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected == TRUE) { if (data->predText.len==0) // Show icons only if there's no predicted text entry currently showIcons = TRUE; else showIcons = FALSE; } #endif /* Show icons to the left of the case indicator */ if (showIcons) { #ifdef EASY_TEXT_ENABLED /* Display ezitext icon to the left of the case indicator */ if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected == TRUE) { stringWidth += 8; dspl_BitBlt(SCREEN_SIZE_X-stringWidth+2, 0,8,8,0,(char*)TextIconeZiTextSmall,0); } #endif if (stringHeight<Mmi_layout_line_height()) stringHeight = Mmi_layout_line_height(); } /* Draw the string to the left of the screen - the editor title, or the number of characters * remaining free in the buffer, or the predicted text word. */ titleWidth = 0; titleHeight = 0; if (title.len) { ATB_display_SetFormatAttr(&format, 0, FALSE); /* Clear format */ titleWidth = ATB_display_StringWidth(&title, &format)+2; titleHeight = ATB_display_StringHeight(&title, &format); /* Check to see if title fits into top line - if it doesn't, * we will need display a section of it. */ if (titleWidth>(SCREEN_SIZE_X-stringWidth-2)) { /* Create timer if it doesn't exist */ if (!data->title_timer) { data->title_timer = tim_create(data->win, 3000, (T_MFW_CB)AUI_edit_TitleTimerCb); data->title_pos = 0; data->title_next_pos = 0; tim_start(data->title_timer); } titleWidth = 0; textIndex = data->title_pos; lastSpace = 0; while (titleWidth<(SCREEN_SIZE_X-stringWidth-2) && textIndex<title.len) { character = ATB_string_GetChar(&title, textIndex); titleWidth+=ATB_display_GetCharWidth(character, &format); textIndex++; if (character==UNICODE_SPACE) lastSpace = textIndex; } TRACE_EVENT_P1("Characters that fit: %d", textIndex); /* Calculate next start position */ if (textIndex==title.len) data->title_next_pos = 0; else { /* Word wrap to last space, if there was one */ if (lastSpace>0) textIndex = lastSpace; data->title_next_pos = textIndex; } TRACE_EVENT_P1("Next position: %d", data->title_next_pos); newTitle.len = textIndex-data->title_pos; newTitle.data = (UBYTE *)ALLOC_MEMORY((newTitle.len+1)*ATB_string_Size(&title)); newTitle.dcs = title.dcs; for (textIndex=0; textIndex<newTitle.len; textIndex++) { ATB_string_SetChar(&newTitle, textIndex, ATB_string_GetChar(&title, data->title_pos+textIndex)); } ATB_string_SetChar(&newTitle, newTitle.len, UNICODE_EOLN); // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON /* Check if the icon is self-explanatory, GSM 11.14, Sec 6.5.4, 12.32. If the icon is to displayed, move the text by icon width. */ if (editor->attr->TitleIcon.selfExplanatory == FALSE) ATB_display_Text(titleIconWidth+1,0,&format, &newTitle); #else ATB_display_Text(0,0,&format, &newTitle); #endif FREE_MEMORY((UBYTE *)newTitle.data, (newTitle.len+1)*ATB_string_Size(&title)); } else // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON { /* Check if the icon is self-explanatory, GSM 11.14, Sec 6.5.4, 12.32. If the icon is to displayed, move the text by icon width. */ if (editor->attr->TitleIcon.selfExplanatory == FALSE) ATB_display_Text(titleIconWidth+1,0,&format, &title); } #else ATB_display_Text(0,0,&format, &title); #endif #ifdef EASY_TEXT_ENABLED /* Provides a cursor in the predicted word, so the user can tell which of the characters * entered are being used to select the word. */ if(ATB_edit_Mode(editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextSelected && data->predText.len!=0) { ATB_display_Cursor(&data->predText, data->predTextChar.pos, ED_CURSOR_BLOCK, data->predTextChar.lineWidth, 0, data->predTextChar.width, data->predTextChar.height); } #endif } // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON if(editor->attr->TitleIcon.data != NULL) { if (titleHeight == 0) titleHeight = TITLE_ICON_HEIGHT; /* Display '?' icon if the size is bigger, else display the icon*/ if ((editor->attr->TitleIcon.width > TITLE_ICON_WIDTH) || (editor->attr->TitleIcon.height > TITLE_ICON_HEIGHT)) { /* iconY calculates place hoilder to place the icon at the center of the screen. */ iconX = 1; iconY = 1+ ((titleHeight-2) / 2) - (10 / 2); dspl_BitBlt2(iconX, iconY, 8, 10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR); } else { /* iconY calculates place hoilder to place the icon at the center of the screen. */ iconX = 1; iconY = 1+ ((titleHeight-2) / 2) - (editor->attr->TitleIcon.height / 2); dspl_BitBlt2(iconX, iconY, editor->attr->TitleIcon.width, editor->attr->TitleIcon.height, (void*)editor->attr->TitleIcon.data, 0, BMP_FORMAT_256_COLOUR); } } #endif /* Draw line on top */ if (stringHeight>titleHeight) titleHeight = stringHeight; /* Non colour display - draw line between title texts*/ #ifndef LSCREEN if (titleHeight>0) { if (stringWidth==0) stringWidth = 1; /* Make sure end of line is on-screen */ dspl_DrawLine(titleWidth, titleHeight/2, SCREEN_SIZE_X-stringWidth, titleHeight/2); /* Line between title & indicator */ } #endif } /* SCROLLBAR */ if (data->editor_data.zone_id & ZONE_SCROLLBAR) { dspl_Clear(editX+editWidth, editY, editX+editWidth+ED_SCROLLBAR_WIDTH-1, editY+editHeight-1); /* Vertical scrollbar - only show if editor is taller than view size */ if (editor->totalHeight > 0 && editor->viewHeight<editor->totalHeight) { dspl_DrawLine(editX+editWidth, editY, editX+editWidth, editY+editHeight-1); scrollBarSize = editor->viewHeight * editHeight / editor->totalHeight; if (scrollBarSize>editHeight) scrollBarSize = editHeight; scrollBarPos = editor->viewStartPos * editHeight / editor->totalHeight; dspl_DrawLine(editX+editWidth+1, editY+scrollBarPos, editX+editWidth+1, editY+scrollBarPos+scrollBarSize); dspl_DrawLine(editX+editWidth+2, editY+scrollBarPos, editX+editWidth+2, editY+scrollBarPos+scrollBarSize); } } /* SOFTKEYS */ if (data->editor_data.zone_id & ZONE_SOFTKEYS) { #ifdef EASY_TEXT_ENABLED /* If a word is being entered, display OK and Delete */ if (ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT) && data->predText.len!=0 && FFS_flashData.PredTextSelected == TRUE) { leftSK = TxtSoftOK; rightSK = TxtDelete; } else #endif { /* Entered less than the required number of chars: Alternate Left Softkey appears */ if (textLen < data->editor_data.min_enter) { leftSK = data->editor_data.AltLeftSoftKey; } else { leftSK = data->editor_data.LeftSoftKey; } /* Buffer is empty and alternative rsk enabled: alternative rsk appears */ if (textLen==0 && data->editor_data.change_rsk_on_empty) { rightSK = data->editor_data.AltRightSoftKey; } else { rightSK = data->editor_data.RightSoftKey; } } displaySoftKeys(leftSK, rightSK); } /* Finished drawing screen */ } break; default: return MFW_EVENT_PASSED; // break; // RAVI } data->editor->update = ED_UPDATE_DEFAULT; return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: AUI_edit_KbdCb $Description: Editor keyboard event handler $Returns: None. $Arguments: event - the keyboard event keyboard *******************************************************************************/ static int AUI_edit_KbdCb(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_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; #if (BOARD != 61) && defined(EASY_TEXT_ENABLED) T_ATB_TEXT *PredText = &data->predText; USHORT character; #endif ED_RES result; TRACE_FUNCTION("AUI_edit_KbdCb()"); /* Suppress unwanted long keypresses */ data->doNextLongPress = TRUE; /* next Key_long event is correct */ /* Restart the timer */ if (data->timer !=NULL) { tim_stop(data->timer); tim_start(data->timer); } #ifdef EASY_TEXT_ENABLED if (FFS_flashData.PredTextSelected==FALSE || !ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT)) { /* Predictive text is off */ #endif switch (keyboard->code) { /* UP key */ case KCD_MNUUP: /* For DSample, up and down move cursor up and down a line in all modes */ #ifdef LSCREEN ATB_edit_MoveCursor(data->editor, ctrlUp, TRUE); /* For other samples, up and down move left and right when not in read only mode */ #else if (ATB_edit_Mode(data->editor, ED_MODE_READONLY)) /* Acts as up key in read-only mode */ { ATB_edit_MoveCursor(data->editor, ctrlUp, TRUE); } else { ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE); } #endif data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update */ win_show(data->win); break; /* DOWN key */ case KCD_MNUDOWN: /* For DSample, up and down move cursor up and down a line in all modes */ #ifdef LSCREEN ATB_edit_MoveCursor(data->editor, ctrlDown, TRUE); /* For other samples, up and down move left and right when not in read only mode */ #else if (ATB_edit_Mode(data->editor, ED_MODE_READONLY)) /* Act as down key in read-only mode */ { ATB_edit_MoveCursor(data->editor, ctrlDown, TRUE); } else { ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE); /* Otherwise, move cursor left */ } #endif data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; /* For DSample, left and right keys move cursor left and right */ #ifdef LSCREEN /* MENU LEFT */ case KCD_MNULEFT: ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE); /* Move cursor left */ data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; /* MENU RIGHT */ case KCD_MNURIGHT: ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE); /* Move cursor right */ data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; #endif /* LEFT SOFT KEY */ case KCD_LEFT: if (data->editor_data.editor_attr.text.len < data->editor_data.min_enter) { /* Entered less than the required number of chars */ if (data->editor_data.AltLeftSoftKey!=TxtNull) { /* an alternate softkey is defined: execute it */ SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_ALTERNATELEFT, NULL); } } else if (data->editor_data.LeftSoftKey!=TxtNull) { /* Left Softkey is enabled (and entered sufficient number of chars): execute it * get the orginal text back into the editor instead of the hide buffer ( only filled with '*') */ if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN)) { ATB_edit_HiddenExit(data->editor); } SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_LEFT, NULL); } break; /* HANGUP key */ case KCD_HUP: if (data->editor_data.RightSoftKey NEQ TxtNull) /* Right softkey is enabled: execute it */ { SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_HUP, NULL); /* Deinitialise the editor */ } break; /* SEND KEY */ case KCD_CALL: if (data->editor_data.editor_attr.text.len >= data->editor_data.min_enter) { /* Send this event to generate an MO call in SMS editor */ SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_CALL, NULL); } break; /* RIGHT SOFT KEY */ case KCD_RIGHT: TRACE_EVENT("KCD_RIGHT"); if (ATB_edit_Mode(data->editor, ED_MODE_READONLY)) /* in read only mode, */ { TRACE_EVENT("SENDING DEINIT EVENT"); SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL); /* just deinitialise editor */ } else /* otherwise, RSK acts as clear key */ { /* If multitap is in progress, delete current character * rather than previous character */ if (data->editor->multitap) { AUI_entry_StopMultitap(data->entry_data); /* Cancel multitap */ result = ATB_edit_DeleteRight(data->editor, TRUE); /* SPR#2342 - SH */ } else { result = ATB_edit_DeleteLeft(data->editor, TRUE); /* SPR#2342 - SH */ } /* If we delete from first character in the editor, exit editor */ if (result==ED_DONE) { SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL); } else { win_show(data->win); } } break; /* Switch text mode: uppercase, lowercase */ case KCD_HASH: if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA)) { // Jul 22,2004 CRR:21605 xrashmic - SASKEN // The user has explicitly changed the case. When // the editor becomes empty, we should not reset the // case to sentence case CaseChanged=TRUE; switch(ATB_edit_GetCase(data->editor)) { case ED_CASE_LOWER: // Jul 22,2004 CRR:21605 xrashmic - SASKEN // The user has changed the case to sentence case. // when the editor becomes empty, we have to reset // the case to sentence case. CaseChanged=FALSE; ATB_edit_SetCase(data->editor, ED_CASE_CAPS); break; case ED_CASE_CAPS: ATB_edit_SetCase(data->editor, ED_CASE_UPPER); break; case ED_CASE_UPPER: ATB_edit_SetCase(data->editor, ED_CASE_LOWER); /* If easy text selected, switch to it */ #ifdef EASY_TEXT_ENABLED if (ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT) && FFS_flashData.PredTextAvailable) { FFS_flashData.PredTextSelected = TRUE; } #endif break; case ED_CASE_NUM: ATB_edit_SetCase(data->editor, ED_CASE_LOWER); break; } } else { /* SPR#1788 - SH - Forbid '#' entry in read only mode */ if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY)) AUI_entry_EventKey(data->entry_data, event, keyboard); } win_show(data->win); break; case (KCD_STAR): /* If we're in apha mode and not in read-only mode, display the symbol screen */ if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA) && !ATB_edit_Mode(data->editor, ED_MODE_READONLY)) { AUI_symbol_Start (data->win, E_ED_INSERT); } else { /* SPR#1788 - SH - Allow '*' to be entered in numeric mode */ if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY)) AUI_entry_EventKey(data->entry_data, event, keyboard); } win_show(data->win); break; /* KEY ENTRY 0 - 9 */ case KCD_0: case KCD_1: case KCD_2: case KCD_3: case KCD_4: case KCD_5: case KCD_6: case KCD_7: case KCD_8: case KCD_9: if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY)) { AUI_entry_EventKey(data->entry_data, event, keyboard); win_show(data->win); } break; } #ifdef EASY_TEXT_ENABLED } else /* Short key press in EasyText */ { if(FFS_flashData.PredTextAvailable == TRUE) { switch (keyboard->code) { case KCD_MNUUP: if(PredText->len==0) { #ifdef LSCREEN ATB_edit_MoveCursor(data->editor, ctrlUp, TRUE); /* For other samples, up and down move left and right when not in read only mode */ #else ATB_edit_MoveCursor(data->editor,ctrlRight, TRUE); #endif data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update */ win_show(data->win); } break; case KCD_MNUDOWN: if(PredText->len==0) { #ifdef LSCREEN ATB_edit_MoveCursor(data->editor, ctrlDown, TRUE); /* For other samples, up and down move left and right when not in read only mode */ #else ATB_edit_MoveCursor(data->editor,ctrlLeft, TRUE); #endif data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update */ win_show(data->win); } break; #ifdef LSCREEN case KCD_MNURIGHT: if(PredText->len==0) { ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE); data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update */ win_show(data->win); } break; case KCD_MNULEFT: if(PredText->len==0) { ATB_edit_MoveCursor(data->editor,ctrlLeft, TRUE); data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update */ win_show(data->win); } break; #endif case KCD_LEFT: if(PredText->len==0) { if (data->editor_data.LeftSoftKey NEQ TxtNull) { SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_LEFT, NULL); } } else { if ((data->editor_data.editor_attr.text.len + PredText->len) < data->editor_data.editor_attr.size) { if (ATB_string_GetChar(PredText,0)!=UNICODE_STAR) { /* Capitalise first letter of words and the letter 'I' */ if (ATB_edit_CapitaliseWord(data->editor) || (PredText->len==1 && ATB_string_GetChar(PredText, 0)==ATB_char_Unicode('i'))) { ATB_string_SetChar(PredText, 0, ATB_edit_FindCapital(ATB_string_GetChar(PredText, 0)));/*SPR1508*/ } character = ATB_edit_GetCursorChar(data->editor, -1); if ( character != UNICODE_SPACE && character != UNICODE_EOLN) { ATB_string_MoveRight(PredText,0,1,ED_PREDTEXT_MAX); ATB_string_SetChar(PredText, 0, UNICODE_SPACE); } ATB_edit_InsertString(data->editor,PredText); } } ResetDictSearch(); AUI_edit_ClearPredText(data); ATB_edit_SetCase(data->editor, ED_CASE_LOWER); win_show(data->win); } break; case KCD_HUP: if (data->editor_data.RightSoftKey NEQ TxtNull) /* Right softkey is enabled: execute it */ { SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_HUP, NULL); } break; case KCD_RIGHT: if(PredText->len==0) { if(ATB_string_GetChar(&data->editor_data.editor_attr.text, 0)!=UNICODE_EOLN) { ATB_edit_Char(data->editor,ctrlBack,TRUE); win_show(data->win); } else { /* leave editor if buffer already empty */ SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL); } } else { if (PredText->len==1) { DictBackSpace((char *)data->predText.data); AUI_edit_ClearPredText(data); ATB_edit_SetCase(data->editor, ED_CASE_LOWER); } else { DictBackSpace((char *)data->predText.data); data->predTextChar.pos--; /* char deleted, move cursor pos back */ AUI_edit_CalcPredText(data); } win_show(data->win); } break; case KCD_2: case KCD_3: case KCD_4: case KCD_5: case KCD_6: case KCD_7: case KCD_8: case KCD_9: if (PredText->len==0) { AUI_edit_ClearPredText(data); } if (DictAlphaKeyPress(keyboard->code,(char *)PredText->data)) { PredText->len = ATB_string_Length(PredText); data->predTextChar.pos++; /* The keypress was used to find a word, advance cursor */ AUI_edit_CalcPredText(data); } win_show(data->win); break; case KCD_HASH: switch(ATB_edit_GetCase(data->editor)) { /* Press # once to switch into capitalise mode */ case ED_CASE_CAPS: ATB_edit_SetCase(data->editor, ED_CASE_LOWER); /* Switch out of easy text mode, if we're not entering a word */ if (PredText->len==0) { FFS_flashData.PredTextSelected = FALSE; } break; default: ATB_edit_SetCase(data->editor, ED_CASE_CAPS); break; } win_show(data->win); break; case KCD_STAR: if (PredText->len==0) { AUI_symbol_Start (data->win, E_ED_INSERT); } else { int i; MoreCandidates((char *)PredText->data, &i); AUI_edit_CalcPredText(data); win_show(data->win); } break; case KCD_0: case KCD_1: if (PredText->len!=0) { if ((data->editor_data.editor_attr.text.len + PredText->len) < MAX_MSG_LEN) { /* If char b4 cursor full stop/question/exclamation (or last char space and char b4 full stop) */ if (ATB_edit_CapitaliseWord(data->editor) || (PredText->len==1 && ATB_string_GetChar(PredText,0)==ATB_char_Unicode('i'))) ATB_string_SetChar(PredText, 0, ATB_edit_FindCapital(ATB_string_GetChar(PredText, 0)));/*SPR1508*/ /* Capitalise first letter of char. If char before cursor not space, insert space */ character = ATB_edit_GetCursorChar(data->editor, -1); if (ATB_string_GetChar(PredText, 0) != UNICODE_STAR) { if (keyboard->code == KCD_1) { /* Insert space at end of string */ ATB_string_SetChar(PredText, PredText->len, UNICODE_SPACE); PredText->len++; ATB_string_SetChar(PredText, PredText->len, UNICODE_EOLN); if ( character!=UNICODE_SPACE && character!=UNICODE_EOLN) { /* Insert space at start of string */ ATB_string_MoveRight(PredText, 0, 1, ED_PREDTEXT_MAX); ATB_string_SetChar(PredText, 0, UNICODE_SPACE); } } else { /* Insert space and full stop at end of string */ ATB_string_SetChar(PredText, PredText->len, UNICODE_FULLSTOP); PredText->len++; ATB_string_SetChar(PredText, PredText->len, UNICODE_SPACE); PredText->len++; ATB_string_SetChar(PredText, PredText->len, UNICODE_EOLN); if ( character!=UNICODE_SPACE && character!=UNICODE_EOLN) { /* Insert space at start of string */ ATB_string_MoveRight(PredText, 0, 1, ED_PREDTEXT_MAX); ATB_string_SetChar(PredText, 0, UNICODE_SPACE); } } ATB_edit_InsertString(data->editor, PredText); } } AUI_edit_ClearPredText(data); ResetDictSearch(); ATB_edit_SetCase(data->editor, ED_CASE_LOWER); win_show(data->win); } break; /* Any key */ default: if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY)) /* ignore normal keys if in read-only mode */ { AUI_entry_EventKey(data->entry_data, event, keyboard); ATB_edit_Char(data->editor,ctrlBack,TRUE); win_show(data->win); } break; } } } #endif return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: AUI_edit_KbdLongCb $Description: Editor keyboard event handler for long keypresses $Returns: None. $Arguments: event - the keyboard event keyboard *******************************************************************************/ static int AUI_edit_KbdLongCb(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_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; #if (BOARD != 61) && defined(EASY_TEXT_ENABLED) T_ATB_TEXT *PredText = &data->predText; #endif ED_RES result; #ifdef TRACE_AUIEditor TRACE_FUNCTION("AUI_edit_KbdLongCb()"); #endif /* Suppress unwanted long keypresses */ if ( data->doNextLongPress ) data->doNextLongPress = FALSE; /* mark Key_long event as consumed but do current long press */ // Jul 29, 2004 REF: CRR:20892 xrashmic - SASKEN // Description: By Long press on Left/Right key at 'Message Editor' screen, // cursor not scrolling continuously // Fix: The continuous long press of a key was being ignored for all keys. // Now only for left and right keys this is handled. else if(!(keyboard->code==KCD_MNULEFT ||keyboard->code== KCD_MNURIGHT)) { return MFW_EVENT_CONSUMED; /* don't do current long press */ } /* Restart the timer */ if (data->timer !=NULL) { tim_stop(data->timer); tim_start(data->timer); } #ifdef EASY_TEXT_ENABLED if (FFS_flashData.PredTextSelected == FALSE || !ATB_edit_Mode(data->editor, ED_MODE_PREDTEXT)) { /* Predictive text is off */ #endif switch (keyboard->code) { // Jul 29, 2004 REF: CRR:20892 xrashmic - SASKEN // Description: By Long press on Left/Right key at 'Message Editor' screen, // cursor not scrolling continuously // Fix: The Long press of left/right key is now handled in AUI_edit_KbdLongCB. case KCD_MNULEFT: ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE); /* Move cursor left */ data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; case KCD_MNURIGHT: ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE); /* Move cursor right */ data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; case KCD_RIGHT: result = ATB_edit_ClearAll(data->editor); /* Otherwise, clear the editor */ /* If buffer is empty, right soft key causes exit from editor */ if (result==ED_DONE) { SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL); } else { win_show(data->win); } break; /* KEY ENTRY 0 */ case KCD_0: /* Alpha mode: insert a '0' */ if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA)) { if (keyboard->code<=KCD_HASH) { ATB_edit_DeleteLeft(data->editor, FALSE); /* SPR#2342 - SH */ AUI_entry_EditDigit(data->entry_data, keyboard->code); // enter the character, not multi-tap win_show(data->win); } } /* Number mode: insert a '+'*/ else if (!ATB_edit_Mode(data->editor, ED_MODE_READONLY)) /* ignore normal keys if in read-only mode */ { if (ATB_edit_Mode(data->editor, ED_MODE_HIDDEN)) /* in hidden mode do not allow entering of '+' */ { ATB_edit_DeleteLeft(data->editor, TRUE); /* remove the '0'. SPR#2342 - SH */ } else { ATB_edit_Char(data->editor,ctrlBack,FALSE); /* remove the '0' */ ATB_edit_Char(data->editor,UNICODE_PLUS,TRUE); /* insert the '+' */ } win_show(data->win); } break; case (KCD_STAR): /* MZ cq11414 add Pause Character */ ATB_edit_DeleteLeft(data->editor, FALSE); //Sep 2, 2004 REF: CRR 21370 xkundadu //Changed the long press of '*' key to display 'w' AUI_entry_EditChar(data->entry_data, ATB_char_Unicode('w'), FALSE); win_show(data->win); break; case (KCD_HASH): /* In alphanumeric mode, a long hold of # selects number case */ if (ATB_edit_GetCasePref(data->editor)==ED_CASEPREF_ALPHANUM) ATB_edit_SetCase(data->editor, ED_CASE_NUM); else { /* MZ cq11414 add Wait Character */ ATB_edit_DeleteLeft(data->editor, FALSE); //Sep 2, 2004 REF: CRR 21370 xkundadu //Changed the long press of '#' key to display 'p' AUI_entry_EditChar(data->entry_data, ATB_char_Unicode('p'), FALSE); } win_show(data->win); break; /* KEY ENTRY 1 - 9 */ case KCD_1: case KCD_2: case KCD_3: case KCD_4: case KCD_5: case KCD_6: case KCD_7: case KCD_8: case KCD_9: /* Insert equivalent numeric character, only possible in Alpha modes */ if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA)) { if (keyboard->code<=KCD_HASH) { ATB_edit_DeleteLeft(data->editor, FALSE); /* SPR#2342 - SH */ AUI_entry_EditDigit(data->entry_data, keyboard->code); // enter the character, not multi-tap win_show(data->win); } } break; } #ifdef EASY_TEXT_ENABLED } else { if(FFS_flashData.PredTextAvailable == TRUE) { switch (keyboard->code) { // Jul 29, 2004 REF: CRR:20892 xrashmic - SASKEN // Description: By Long press on Left/Right key at 'Message Editor' // screen, cursor not scrolling continuously // Fix: The Long press of left/right key is now handled in // AUI_edit_KbdLongCB. case KCD_MNULEFT: ATB_edit_MoveCursor(data->editor, ctrlLeft, TRUE); /* Move cursor left */ data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; case KCD_MNURIGHT: ATB_edit_MoveCursor(data->editor, ctrlRight, TRUE); /* Move cursor right */ data->editor->update = ED_UPDATE_TRIVIAL; /* This flag speeds up update - no change to text */ win_show(data->win); break; case KCD_RIGHT: /*empty predictive text string */ if(PredText->len!=0) { PredText->len = 0; ATB_string_SetChar(PredText, 0, UNICODE_EOLN); ResetDictSearch(); win_show(data->win); } else /*empty whole editor */ { if(data->editor_data.editor_attr.text.len > 0 ) { ATB_edit_ClearAll(data->editor); win_show(data->win); } else { /* leave editor if buffer already empty */ SEND_EVENT (win, E_ED_DEINIT, INFO_KCD_RIGHT, NULL); } } break; case(KCD_STAR): AUI_symbol_Start(data->win, E_ED_INSERT); break; case (KCD_HASH): break; /* KEY ENTRY 1 - 9 */ case KCD_0: case KCD_1: case KCD_2: case KCD_3: case KCD_4: case KCD_5: case KCD_6: case KCD_7: case KCD_8: case KCD_9: if(PredText->len==0) { /* Insert equivalent numeric character, only possible in Alpha modes */ if (ATB_edit_Mode(data->editor, ED_MODE_ALPHA)) { if (keyboard->code<=KCD_HASH) { ATB_edit_DeleteLeft(data->editor, FALSE); /* SPR#2342 - SH */ AUI_entry_EditDigit(data->entry_data, keyboard->code); // enter the character, not multi-tap } } win_show(data->win); } break; } } } #endif return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: AUI_edit_TimerCb $Description: Callback function for the editor info timer. $Returns: None. $Arguments: event - the event type timer - the timer *******************************************************************************/ static int AUI_edit_TimerCb (T_MFW_EVENT event, T_MFW_TIM *timer) { T_MFW_HND win = mfw_parent (mfw_header()); // T_MFW_HND parent_win = data->parent; // RAVI // USHORT Identifier = data->editor_data.Identifier; // RAVI // T_AUI_EDIT_CB Callback = data->editor_data.Callback; // RAVI TRACE_FUNCTION("AUI_edit_TimerCb"); #if 0 AUI_edit_Destroy(data->win); if (Callback) (Callback) (parent_win, Identifier, INFO_TIMEOUT); #else SEND_EVENT (win, E_ED_DEINIT, INFO_TIMEOUT, NULL); #endif return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: AUI_edit_TitleTimerCb $Description: Callback function for the editor title timer. Recalculates title_pos so that the next part of the string is displayed. $Returns: None. $Arguments: event - the event type timer - the timer *******************************************************************************/ static int AUI_edit_TitleTimerCb (T_MFW_EVENT event, T_MFW_TIM *timer) { /* Use the mfwHeader property of the timer to get the window */ T_MFW_HND win = mfw_parent(timer->mfwHeader); T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; TRACE_FUNCTION("AUI_edit_TitleTimerCb"); /* SPR#1597 - SH - Since there may be multiple timers running at once, only call win_show if the window is focussed. */ if (winIsFocussed(win)) { if (data->title_next_pos!=data->title_pos) { data->title_pos = data->title_next_pos; } data->editor->update = ED_UPDATE_PARTIAL; /* Don't update editor text */ win_show(data->win); tim_start(data->title_timer); } return MFW_EVENT_CONSUMED; } /******************************************************************************* $Function: AUI_edit_CalcPredText $Description: Calculate properties of predicted text string. $Returns: None. $Arguments: data - The AUI editor data *******************************************************************************/ static void AUI_edit_CalcPredText(T_AUI_EDITOR_INFO *data) { USHORT character; T_ATB_TEXT dummy; data->predText.len = ATB_string_Length(&data->predText); /* Get position of current entry */ dummy.data = data->predText.data; dummy.dcs = data->predText.dcs; dummy.len = data->predTextChar.pos; data->predTextChar.lineWidth = ATB_display_StringWidth(&dummy, &data->predTextChar.format); data->predTextChar.lineHeight = ATB_display_StringHeight(&dummy, &data->predTextChar.format); /* Get width and height of current character */ character = ATB_string_GetChar(&data->predText, data->predTextChar.pos); data->predTextChar.width = ATB_display_GetCharWidth(character, &data->predTextChar.format); data->predTextChar.height = ATB_display_GetCharHeight(character, &data->predTextChar.format); return; } /******************************************************************************* $Function: AUI_edit_ClearPredText $Description: Clear the predictive text buffer $Returns: None. $Arguments: data - The AUI editor data *******************************************************************************/ static void AUI_edit_ClearPredText(T_AUI_EDITOR_INFO *data) { data->predText.len = 0; ATB_string_SetChar(&data->predText,0,UNICODE_EOLN); memset(&data->predTextChar, 0, sizeof(T_ED_CHAR)); return; } /******************************************************************************* $Function: AUI_edit_InsertString $Description: Insert a string into the editor $Returns: Pointer to the editor's window. $Arguments: win - The editor window string - The string to insert dcs - The dcs of the string *******************************************************************************/ void AUI_edit_InsertString(T_MFW_HND win, UBYTE *string, T_ATB_DCS dcs) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; T_ATB_TEXT text; text.data = string; text.dcs = dcs; text.len = ATB_string_Length(&text); ATB_edit_InsertString(data->editor, &text); return; } /******************************************************************************* $Function: AUI_edit_InsertChar $Description: Insert a character into the editor $Returns: Pointer to the editor's window. $Arguments: win - The editor window character - The character to insert *******************************************************************************/ void AUI_edit_InsertChar(T_MFW_HND win, USHORT character) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; ATB_edit_Char(data->editor, character, TRUE); return; } /******************************************************************************* $Function: AUI_edit_GetSpecificWindowSIze $Description: Sets up window size $Returns: None. $Arguments: attr - The ATB editor attributes zone_id - Specifies the window size (See ZONE_... in header file) *******************************************************************************/ #ifndef LSCREEN //Sizes defined for CSAMPLE editore #define BOOKDETAILS_EDITOR_SIZE 0, 0, SCREEN_SIZE_X-4, Mmi_layout_line(LAST_LINE_TOP) #define NUMBER_EDITOR_SIZE 0, 12, SCREEN_SIZE_X , MNU3LINE #define PHONEBOOK_DLG_EDITOR_SIZE 4, Mmi_layout_line(3)+2, SCREEN_SIZE_X-4, SCREEN_SIZE_Y-(Mmi_layout_line(3)+2) #define BOOKSDN_EDITOR_SIZE 34, Mmi_layout_line(3)+2, 50, Mmi_layout_line(1)+2 //MMIbooksearchwindow //#define BOOKSEARCH_EDITOR_SIZE 0, Mmi_layout_line(SECOND_LAST_LINE_TOP), SCREEN_SIZE_X, Mmi_layout_line(1) //MMICall #define CALL_EDITOR_SIZE 4,28,SCREEN_SIZE_X-4, 20 #define CALLSCRATCHPAD_EDITOR_SIZE 6, Mmi_layout_line(2),SCREEN_SIZE_X-6, 16 //MMIServices #define SERVICE_CREATE_EDITOR_SIZE 4,Mmi_layout_line(1)+2,SCREEN_SIZE_X-4, MNU3LINE #define PASSWORD_EDITOR_SIZE 0, 12, SCREEN_SIZE_X , 13 #define EM_EDITOR_SIZE 0, 0, SCREEN_SIZE_X-4, Mmi_layout_line(LAST_LINE_TOP) //From MMIIdle //GW Changed window height from 30 (27?) to 24. #define WIN_DIALLING_SIZE 0,Mmi_layout_line_icons(2), SCREEN_SIZE_X,24 #define WIN_DIALLING_C_SIZE 0,Mmi_layout_line_icons(1),SCREEN_SIZE_X,32 //Positions for editor windows in mmismssend #define PHNO_EDITOR_SIZE 0, (Mmi_layout_line(1)+2), SCREEN_SIZE_X, 20 //NB defines below used twice, second time START/SIZE_Y was same as START/SIZE_Y above #define CENTRE_EDITOR_SIZE 0, Mmi_layout_line(1), SCREEN_SIZE_X, MNU3LINE+3 //And for MMIServices - moved here from mmiservices.c #define SAT_EDITOR_SIZE 6,30,SCREEN_SIZE_X-6, 20 #define RPWD_EDITOR_SIZE 0,12,SCREEN_SIZE_X,13 //MMIBookCallDetails #define PHB_EDITOR_SIZE 4,0,SCREEN_SIZE_X-4, ALLBUT2LINE //MMIPins #define PIN_EDIT_RESET_SIZE 12,20,84-12,16 //MMITimeDate #define TIMEDATE_EDITOR_AREA_SIZE 0,10,70,10 #endif /* GW SPR#1840 26/03/03 - Copied from MMieditor.c*/ #ifndef LSCREEN static void setSize(T_ATB_WIN_SIZE *win, int px, int py, int sx, int sy) { win->px = px; win->py = py; win->sx = sx; win->sy = sy; } #endif void AUI_edit_GetSpecificWindowSize(T_ED_ATTR* attr, int zone_id ) { switch (zone_id) { case ZONE_SMALL_EDITOR: attr->win_size.px = 6; attr->win_size.py = Mmi_layout_IconHeight()*2; attr->win_size.sx = SCREEN_SIZE_X-attr->win_size.px; attr->win_size.sy = Mmi_layout_line_height()*2+4; break; case ZONE_BOTTOM_LINE: attr->win_size.px = 0; attr->win_size.py = SCREEN_SIZE_Y - Mmi_layout_line_height() - Mmi_layout_softkeyHeight(); attr->win_size.sx = SCREEN_SIZE_X-attr->win_size.px; attr->win_size.sy = Mmi_layout_line_height(); break; case ZONE_BOTTOM_LINE_FIND: //used for phonebook search attr->win_size.px = dspl_GetTextExtent(MmiRsrcGetText(TxtFind),0); attr->win_size.py = SCREEN_SIZE_Y - Mmi_layout_line_height() - Mmi_layout_softkeyHeight(); attr->win_size.sx = SCREEN_SIZE_X-attr->win_size.px; attr->win_size.sy = Mmi_layout_line_height(); break; #ifndef LSCREEN case BOOKDETAILS_EDITOR: setSize(&attr->win_size,BOOKDETAILS_EDITOR_SIZE); break; case NUMBER_EDITOR: setSize(&attr->win_size,NUMBER_EDITOR_SIZE); break; case PHONEBOOK_DLG_EDITOR: setSize(&attr->win_size,PHONEBOOK_DLG_EDITOR_SIZE); break; case BOOKSDN_EDITOR: setSize(&attr->win_size,BOOKSDN_EDITOR_SIZE); break; // case BOOKSEARCH_EDITOR: setSize(&attr->win_size,BOOKSEARCH_EDITOR_SIZE); break; case CALL_EDITOR: setSize(&attr->win_size,CALL_EDITOR_SIZE); break; case CALLSCRATCHPAD_EDITOR: setSize(&attr->win_size,CALLSCRATCHPAD_EDITOR_SIZE); break; case SERVICE_CREATE_EDITOR: setSize(&attr->win_size,SERVICE_CREATE_EDITOR_SIZE); break; case PASSWORD_EDITOR: setSize(&attr->win_size,PASSWORD_EDITOR_SIZE); break; case EM_CREATE_EDITOR: setSize(&attr->win_size,EM_EDITOR_SIZE); break;/*SPR#1840*/ case WIN_DIALLING: case WIN_DIALLING_CB: if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) setSize(&attr->win_size,WIN_DIALLING_C_SIZE); else setSize(&attr->win_size,WIN_DIALLING_SIZE); break; case WIN_DIALLING_SMS: if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) { setSize(&attr->win_size,0,Mmi_layout_line_icons(1),SCREEN_SIZE_X,24);/*SPR#1840*/ } else setSize(&attr->win_size,WIN_DIALLING_SIZE); break; case WIN_DIALLING_SAT: if (Mmi_getCurrentLanguage() == CHINESE_LANGUAGE) setSize(&attr->win_size,WIN_DIALLING_C_SIZE); else setSize(&attr->win_size,WIN_DIALLING_SIZE); break; case PHNO_EDITOR: setSize(&attr->win_size,PHNO_EDITOR_SIZE); break; case CENTRE_EDITOR: setSize(&attr->win_size,CENTRE_EDITOR_SIZE); break; case SAT_EDITOR : setSize(&attr->win_size,SAT_EDITOR_SIZE); break; case RPWD_EDITOR: setSize(&attr->win_size,RPWD_EDITOR_SIZE); break; case PHB_EDITOR: setSize(&attr->win_size,PHB_EDITOR_SIZE); break; case PIN_EDIT_RESET: setSize(&attr->win_size,PIN_EDIT_RESET_SIZE); break; case TIMEDATE_EDITOR_AREA: setSize(&attr->win_size,TIMEDATE_EDITOR_AREA_SIZE); break; #endif default: break; } } /******************************************************************************* $Function: AUI_edit_CalculateWindow $Description: Sets up window size $Returns: None. $Arguments: attr - The ATB editor attributes zone_id - Specifies the window size (See ZONE_... in header file) SPR#1559 - SH - this is now a pointer to the zone_id, allowing the zone_id to be modified by this function *******************************************************************************/ void AUI_edit_CalculateWindow(T_ED_ATTR* attr, int *zone_id_pointer ) { int zone_id = *zone_id_pointer; attr->win_size.px = 0; attr->win_size.py = 0; attr->win_size.sx = SCREEN_SIZE_X; attr->win_size.sy = SCREEN_SIZE_Y; if (zone_id == ZONE_BORDER_EDITOR) { //Leave border on left/right of screen. attr->win_size.px = 4; attr->win_size.sx = attr->win_size.sx - 2*attr->win_size.px; zone_id = ZONE_FULLSOFTKEYS; *zone_id_pointer = zone_id; } else if ((zone_id != 0x0000) && ((zone_id &0xF000)==0xF000))/*SPR#1840*/ { AUI_edit_GetSpecificWindowSize(attr,zone_id); return; } else if (zone_id == 0) { zone_id = ZONE_FULLSOFTKEYS; *zone_id_pointer = zone_id; } if (zone_id & ZONE_ICONS) attr->win_size.py = attr->win_size.py + Mmi_layout_IconHeight(); if (zone_id & ZONE_SOFTKEYS) attr->win_size.sy = attr->win_size.sy - Mmi_layout_softkeyHeight(); if (zone_id & ZONE_TITLE) attr->win_size.py = attr->win_size.py + Mmi_layout_TitleHeight(); if (zone_id & ZONE_CASE_ABC) attr->win_size.sy = attr->win_size.sy - Mmi_layout_line_height(); if (zone_id & ZONE_SCROLLBAR) attr->win_size.sx = attr->win_size.sx - ED_SCROLLBAR_WIDTH; attr->win_size.sy = attr->win_size.sy - attr->win_size.py; if ((zone_id & ZONE_FULLSCREEN) == ZONE_FULLSCREEN) return; /*Else window is not entire screen */ switch (zone_id & ZONE_FULL_HEIGHT) { case ZONE_FULL_HEIGHT: break; case ZONE_TOPHALF_HEIGHT: attr->win_size.sy = attr->win_size.sy/2; break; case ZONE_MIDDLE_HEIGHT: attr->win_size.sy = attr->win_size.sy/2; attr->win_size.py = attr->win_size.py+attr->win_size.sy/2; break; case ZONE_BOTTOMHALF_HEIGHT: attr->win_size.sy = attr->win_size.sy/2; attr->win_size.py = attr->win_size.py+attr->win_size.sy; break; case ZONE_BOTTOMTWOLINES_HEIGHT: attr->win_size.py = attr->win_size.py+attr->win_size.sy-Mmi_layout_line_height()*2; attr->win_size.sy = Mmi_layout_line_height()*2; break; /* xreddymn OMAPS00075852 May-15-2006 * This display zone is located one line above the softkeys. */ case ZONE_MIDDLETWOLINES_HEIGHT: attr->win_size.py = attr->win_size.py+attr->win_size.sy-Mmi_layout_line_height()*3; attr->win_size.sy = Mmi_layout_line_height()*2; break; default: //No action break; } switch (zone_id & ZONE_FULL_WIDTH) { case ZONE_FULL_WIDTH: break; case ZONE_LEFTHALF_WIDTH: attr->win_size.sx = attr->win_size.sx/2; break; case ZONE_MIDDLE_WIDTH : attr->win_size.sx = attr->win_size.sx/2; attr->win_size.px = attr->win_size.px+attr->win_size.sx/2; break; case ZONE_RIGHTHALF_WIDTH: attr->win_size.sx = attr->win_size.sx/2; attr->win_size.px = attr->win_size.px+attr->win_size.sx; break; default: //No action break; } } /******************************************************************************* $Function: AUI_edit_SetDefault $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. *******************************************************************************/ void AUI_edit_SetDefault(T_AUI_EDITOR_DATA *editor_data) { /* Set everything to zero... */ /* SPR#1559 - Move CalculateWindow to below */ memset(editor_data, 0, sizeof(T_AUI_EDITOR_DATA)); /* Except these things... */ editor_data->editor_attr.colour = COLOUR_EDITOR; editor_data->editor_attr.font = EDITOR_FONT; editor_data->editor_attr.cursor = ED_CURSOR_BAR; editor_data->editor_attr.mode = ED_MODE_ALPHA; editor_data->editor_attr.text.dcs = ATB_DCS_ASCII; editor_data->timeout = FOREVER; editor_data->destroyEditor = TRUE; editor_data->zone_id = ZONE_FULL_SK_TITLE; // Shashi Shekar B.S., a0876501, Jan 16, 2006, DR: OMAPS00061460 #ifdef FF_MMI_SAT_ICON editor_data->editor_attr.TitleIcon.data = NULL; editor_data->editor_attr.TitleIcon.width = 0; editor_data->editor_attr.TitleIcon.height = 0; editor_data->editor_attr.TitleIcon.isTitle = FALSE; //x0035544 Mar 14, 2006 DR:OMAPS00061468 //set the default value for display_type to SAT_ICON_NONE editor_data->editor_attr.TitleIcon.display_type = SAT_ICON_NONE; editor_data->editor_attr.TitleIcon.selfExplanatory = FALSE; #endif /* SPR#1559 - SH - CalculateWindow moved here; pointer to zone_id used */ AUI_edit_CalculateWindow(&editor_data->editor_attr, &editor_data->zone_id); ATB_display_ClearFormat(&editor_data->editor_attr.startFormat); return; } /******************************************************************************* $Function: AUI_edit_SetDisplay $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. zone_id - Type of editor screen (see header file for ZONE_...) colour - Colour of the editor *******************************************************************************/ void AUI_edit_SetDisplay(T_AUI_EDITOR_DATA *editor_data, int zone_id, int colour, UBYTE font ) { /* SPR#1559 - SH - Use pointer to zone_id */ AUI_edit_CalculateWindow(&editor_data->editor_attr, &zone_id); editor_data->zone_id = zone_id; editor_data->editor_attr.colour = colour; editor_data->editor_attr.font = font; return; } /******************************************************************************* $Function: AUI_edit_SetEvents $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. *******************************************************************************/ void AUI_edit_SetEvents(T_AUI_EDITOR_DATA *editor_data, USHORT Identifier, BOOL destroyEditor, ULONG timeout, T_AUI_EDIT_CB Callback) { if (editor_data) { editor_data->Identifier = Identifier; editor_data->destroyEditor = destroyEditor; editor_data->timeout = timeout; editor_data->Callback = Callback; } return; } /******************************************************************************* $Function: AUI_edit_SetMode $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. mode - Editor mode (see header file for ED_MODE_...) cursor - Editor cursor (see header file for ED_CURSOR_...) *******************************************************************************/ void AUI_edit_SetMode(T_AUI_EDITOR_DATA *editor_data, USHORT mode, USHORT cursor ) { if (editor_data) { editor_data->editor_attr.mode = mode; editor_data->editor_attr.cursor = cursor; } return; } /******************************************************************************* $Function: AUI_edit_SetBuffer $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. dcs - Data coding scheme of text (see ATB_DCS_...) text - The text in the appropriate coding scheme size - Maximum size of the edit buffer in characters *******************************************************************************/ void AUI_edit_SetBuffer(T_AUI_EDITOR_DATA *editor_data, UBYTE dcs, UBYTE *text, USHORT size) { if (editor_data) { editor_data->editor_attr.text.dcs = dcs; editor_data->editor_attr.text.data = text; editor_data->editor_attr.text.len = ATB_string_Length(&editor_data->editor_attr.text); editor_data->editor_attr.size = size; } return; } /******************************************************************************* $Function: AUI_edit_SetTextStr $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. LeftSoftKey, RightSoftKey - Text IDs of the softkeys TitleId - Text ID for the title TextString - Text string for the title, used if TitleId is 0 *******************************************************************************/ void AUI_edit_SetTextStr(T_AUI_EDITOR_DATA *editor_data, USHORT LeftSoftKey, USHORT RightSoftKey, USHORT TitleId, UBYTE *TitleString) { if (editor_data) { editor_data->LeftSoftKey = LeftSoftKey; editor_data->RightSoftKey = RightSoftKey; editor_data->AltRightSoftKey = RightSoftKey; editor_data->TitleId = TitleId; editor_data->TitleString = TitleString; } return; } /******************************************************************************* $Function: AUI_edit_SetAltTextStr $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. min_enter - No of characters needed to be entered AltLeftSoftKey - Text ID of alternate left softkey change_rsk_on_empty - TRUE if alternative right soft key is used for empty buffer AltRightSoftKey - Text ID of alternative right softkey *******************************************************************************/ void AUI_edit_SetAltTextStr(T_AUI_EDITOR_DATA *editor_data, UBYTE min_enter, USHORT AltLeftSoftKey, BOOL change_rsk_on_empty, USHORT AltRightSoftKey) { if (editor_data) { editor_data->AltLeftSoftKey = AltLeftSoftKey; editor_data->min_enter = min_enter; editor_data->AltRightSoftKey = AltRightSoftKey; editor_data->change_rsk_on_empty = change_rsk_on_empty; } return; } /******************************************************************************* $Function: AUI_edit_SetFormatStr $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. formatstr - The formatted input string preformat - TRUE if format codes are to be inserted into text before editing filler - If preformat is true, this character will be used to pad out the provided string *******************************************************************************/ void AUI_edit_SetFormatStr(T_AUI_EDITOR_DATA *editor_data, char *formatstr, BOOL preformat, char filler) { USHORT textIndex; USHORT formatIndex; // USHORT character; // RAVI TRACE_FUNCTION("AUI_edit_SetFormatStr()"); if (editor_data) { editor_data->editor_attr.FormatString = formatstr; /* SPR#1983 - SH - *m and *M strings are freeform, no preformatting required */ if (preformat && strcmp(formatstr, "*m")!=0 && strcmp(formatstr, "*M")!=0) { formatIndex = 0; textIndex = 0; /* SPR#1983 - SH - Ensure formatting doesn't write over null terminator */ while (formatstr[formatIndex]!=0 && !strchr("123456789*", formatstr[formatIndex]) && /* Exit at delimited field */ textIndex<(editor_data->editor_attr.size-1)) { /* Encountered fixed character */ if (formatstr[formatIndex]=='\\') { formatIndex++; ATB_string_SetChar(&editor_data->editor_attr.text, textIndex, ATB_char_Unicode(formatstr[formatIndex])); } /* If editor text has run out, fill the rest with our filler character */ else if (textIndex>editor_data->editor_attr.text.len) { ATB_string_SetChar(&editor_data->editor_attr.text, textIndex, ATB_char_Unicode(filler)); } if(formatstr[formatIndex]!=0) /*a0393213 lint warnings removal - 'Possible access of out-of-bounds pointer'*/ { formatIndex++; textIndex++; } } } } return; } /******************************************************************************* $Function: AUI_edit_SetFormatAttr $Description: Sets up standard editor attributes. $Returns: None. $Arguments: editor_data - The MMI editor data that is to be modified. startFormat - Pointer to text formatting data structure *******************************************************************************/ void AUI_edit_SetFormatAttr(T_AUI_EDITOR_DATA *editor_data, UBYTE attr) { if (editor_data) { editor_data->editor_attr.startFormat.attr = attr; } return; } /******************************************************************************* $Function: AUI_edit_SetAttr $Description: Set some standard editor attributes $Returns: None. $Arguments: attr - The editor attr *******************************************************************************/ void AUI_edit_SetAttr(T_ED_ATTR *attr, int zone_id, ULONG colour, UBYTE font, USHORT mode, USHORT cursor, T_ATB_DCS dcs, UBYTE *text, USHORT size) { /* Populate the structure with the parameters */ /* SPR#1559 - SH - Use pointer to zone_id */ AUI_edit_CalculateWindow(attr, &zone_id ); attr->colour = colour; attr->font = font; attr->mode = mode; attr->cursor = cursor; attr->text.dcs = dcs; attr->text.data = text; attr->text.len = ATB_string_Length(&attr->text); attr->size = size; return; } /* API - 08/07/03 - CQ10728 - Query your own number with a D1 SIM*/ /******************************************************************************* $Function: AUI_Edit_Display_Only $Description: Sets up the display requirements for the Editor & also shows it $Returns: None. $Arguments: win - parent window, LSK - Left Soft Key, RSK - Right Soft Key string1 - String details, string2 - String details, Title - Editor title string *******************************************************************************/ void AUI_Edit_Display_Only(T_MFW_HND win, int LSK, int RSK, char *string1, char *string2, int Title) { T_MFW_WIN *win_data = ((T_MFW_HDR *)win)->data; T_AUI_EDITOR_INFO *data = (T_AUI_EDITOR_INFO *)win_data->user; T_AUI_EDITOR_DATA display_editor_info; int size = MAX_RO_EDITOR_LEN; AUI_edit_SetDefault(&display_editor_info); /* Include title for colour display */ #ifdef COLOURDISPLAY AUI_edit_SetDisplay(&display_editor_info, ZONE_FULL_SK_TITLE_SCROLL, COLOUR_EDITOR, EDITOR_FONT); #else /* COLOURDISPLAY */ AUI_edit_SetDisplay(&display_editor_info, ZONE_FULL_SK_SCROLL, COLOUR_EDITOR, EDITOR_FONT); #endif /* COLOURDISPLAY */ AUI_edit_SetMode(&display_editor_info, ED_MODE_ALPHA | ED_MODE_READONLY, ED_CURSOR_NONE); AUI_edit_SetEvents(&display_editor_info, 0, FALSE, FOREVER, (T_AUI_EDIT_CB) AUI_Edit_Display_Only_CB); AUI_edit_SetTextStr(&display_editor_info, LSK, RSK, Title, NULL); /* SPR#2672 - SH - Allocate buffer dynamically */ data->displayBuffer = (char *)ALLOC_MEMORY(size); strcpy(data->displayBuffer, string1); if(string2 != NULL) { strcat(data->displayBuffer, "\n"); strcat(data->displayBuffer, string2); } if (data->displayBuffer[0]==(char)0x80) { AUI_edit_SetBuffer(&display_editor_info, ATB_DCS_UNICODE, (UBYTE *)&data->displayBuffer[2], size/2); } else { AUI_edit_SetBuffer(&display_editor_info, ATB_DCS_ASCII, (UBYTE *)&data->displayBuffer[0], size); } data->win = AUI_edit_Start(win,&display_editor_info); /* start the editor */ } /******************************************************************************* $Function: AUI_Edit_Display_Only_CB $Description: Handles the key call back from the Read only Editor $Returns: None. $Arguments: *******************************************************************************/ static void AUI_Edit_Display_Only_CB(T_MFW_HND win, USHORT Identifier, SHORT reason) { T_MFW_WIN * win_data = ((T_MFW_HDR *) win)->data; T_AUI_EDITOR_INFO * data = (T_AUI_EDITOR_INFO *)win_data->user; TRACE_EVENT("AUI_Edit_Display_Only_CB"); switch(reason) { case INFO_KCD_RIGHT: case INFO_KCD_HUP: TRACE_EVENT("INFO_KCD_RIGHT/HUP"); AUI_Edit_Display_Only_Destroy(data->win); break; default: TRACE_EVENT("Err: Default"); break; } } /******************************************************************************* $Function: AUI_Edit_Display_Only_Destroy $Description: Destroy the Read only information Editor $Returns: none $Arguments: own_window - current window handler *******************************************************************************/ static void AUI_Edit_Display_Only_Destroy(MfwHnd own_window) { T_MFW_WIN * win_data; T_AUI_EDITOR_INFO * data; // USHORT i; // RAVI TRACE_FUNCTION ("SmsRead_R_TEXTEDT2_destroy()"); if (own_window) { win_data = ((T_MFW_HDR *)own_window)->data; data = (T_AUI_EDITOR_INFO *)win_data->user; if (data) { /* * Delete WIN handler */ /* SPR#2672 - SH - Delete buffer */ if (data->displayBuffer!=NULL) { FREE_MEMORY((void *)data->displayBuffer, MAX_RO_EDITOR_LEN); } /* SPR#1428 - SH - New Editor changes */ #ifdef NEW_EDITOR AUI_edit_Destroy(data->win); #else /* NEW_EDITOR */ editor_destroy(data->win); #endif /* NEW_EDITOR */ win_delete (data->win); FREE_MEMORY ((void *)data, sizeof (T_AUI_EDITOR_INFO)); } else { TRACE_EVENT ("SmsRead_R_TEXTEDT2_destroy() called twice"); } } } /* API - 08/07/03 - CQ10728 END*/