FreeCalypso > hg > fc-tourmaline
view src/ui/bmi/AUITextEntry.c @ 130:cf085bee523c
mmiUserData.h: bogotab fixes
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 10 Nov 2020 06:43:13 +0000 |
parents | c0052fe355d3 |
children | 70ea7526b59e |
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: AUITextEntry.c $Revision: 1.0 $Author: Condat(UK) $Date: 22/02/01 ******************************************************************************** Description: Multi-tap and other text entry methods for AUI Editor. ******************************************************************************** $History: AUITextEntry.c 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 "MmiDummy.h" #include "MmiMmi.h" #include "MmiDialogs.h" #include "MmiMain.h" #include "cus_aci.h" #include "prim.h" #ifndef PCM_2_FFS #include "pcm.h" #endif #include "ATBCommon.h" #include "ATBDisplay.h" #include "ATBEditor.h" #include "AUITextEntry.h" /******************************************************************************* STATIC DATA ********************************************************************************/ /*SPR 2175, increased KEY_PAD_MAX and changed tables to allow entry of some accented characters*/ #define KEY_PAD_MAX 6 /* API - 01/09/03 - SPR2371 - Move the new character to the end of the multitap sequence */ /* Alpha mode characters for multi-tap - lower case */ static UBYTE editAlpha [12][KEY_PAD_MAX] = { {'.', ',', '+', '-', '=', '0'}, /*Key 0*/ {' ' ,'?', '!', ';', ':', '1'}, /*Key 1*/ /* a grave a umlaut*/ {'a', 'b', 'c', '2', '\x85', '\x84'}, /*Key 2*/ /* e-grave e-acute*/ {'d', 'e', 'f', '3', '\x8a', '\x83'}, /*Key 3*/ /* i-grave*/ {'g', 'h', 'i', '4', '\x8d', '@'}, /*Key 4*/ /**/ {'j', 'k', 'l', '5', '&', '*'}, /*Key 5*/ /* o-grave o-umlaut*/ {'m', 'n', 'o', '6', '\x95', '\x94'}, /*Key 6*/ /* SS*/ {'p', 'q', 'r', 's', '7', '\xe1'}, /*Key 7*/ /* u-grave u-umlaut*/ {'t', 'u', 'v', '8', '\x97', '\x82'}, /*Key 8*/ /**/ {'w', 'x', 'y', 'z', '9', '#'}, /*Key 9*/ {'*', '*', '*', '*', '*', '*'}, /*Key star, not actually used for multitap*/ {'#', '#', '#', '#', '#', '#'} /*Key hash, not actually used for multitap*/ }; /* Alpha mode characters for multi-tap - upper case */ static UBYTE editAlphaU [12][KEY_PAD_MAX] = { {'.', ',', '+', '-', '=', '0'}, /*Key 0*/ {' ', '?', '!', ';', ':', '1'}, /*Key 1*/ /* A-umlaut cedilla*/ {'A', 'B', 'C', '2', '\x8e', '\x81'}, /*Key 2*/ /* E-acute*/ {'D', 'E', 'F', '3', '\x90', ' '}, /*Key 3*/ {'G', 'H', 'I', '4', '@', ' '}, /*Key 4*/ {'J', 'K', 'L', '5', '&', '*'}, /*Key 5*/ /* O-umlaut */ {'M', 'N', 'O', '6', '\x99', ' '}, /*Key 6*/ /* SS*/ {'P', 'Q', 'R', 'S', '7', '\xe1'}, /*Key 7*/ /* U-umlaut*/ {'T', 'U', 'V', '8', '\x9A', ' '}, /*Key 8*/ {'W', 'X', 'Y', 'Z', '9', '#'}, /*Key 9*/ {'*', '*', '*' ,'*', '*', '*'}, /*Key star, not actually used for multitap*/ {'#', '#', '#', '#', '#', '#'} /*Key hash, not actually used for multitap*/ }; /* API - 01/09/03 - SPR2371 - END*/ static void *MMIdata; /* Temporary storage for MMI pointer */ /******************************************************************************* LOCAL FUNCTION PROTOTYPES ********************************************************************************/ static int AUI_entry_Timer (MfwEvt event, MfwTim *timer); static USHORT AUI_entry_Keypress(T_AUI_ENTRY_DATA *entry_data, MfwEvt event, MfwKbd *key); /******************************************************************************* $Function: AUI_entry_Create $Description: Initialises the text entry data. Allocates memory. Creates the timer. $Returns: Pointer to the data. $Arguments: win - The window in which the editor is displayed editor - The editor update - The event to be sent to the window in order to update it *******************************************************************************/ T_AUI_ENTRY_DATA *AUI_entry_Create(T_MFW_HND win, T_ED_DATA *editor, U32 update) { T_AUI_ENTRY_DATA *entry_data = (T_AUI_ENTRY_DATA *)mfwAlloc(sizeof(T_AUI_ENTRY_DATA)); entry_data->win = win; entry_data->update = update; entry_data->editor = editor; /* SPR#1597 - SH - Always create this timer */ entry_data->editTim = tim_create(win, 1000, (MfwCb) AUI_entry_Timer); entry_data->Level = KEY_PAD_MAX-1; entry_data->Key = KCD_MAX; return entry_data; } /******************************************************************************* $Function: AUI_entry_Destroy $Description: Frees memory associated with text entry. $Returns: none. $Arguments: entry_data - The text entry data *******************************************************************************/ void AUI_entry_Destroy(T_AUI_ENTRY_DATA *entry_data) { if (entry_data->editTim) { timDelete(entry_data->editTim); } mfwFree((void *)entry_data, sizeof(T_AUI_ENTRY_DATA)); return; } /******************************************************************************* $Function: AUI_entry_EditChar $Description: Sends a character to the text editor. $Returns: None. $Arguments: data - The editor data alphachar - Character to be inserted, or NULL if key tables are to be used multitap - TRUE if multitap is in progress *******************************************************************************/ USHORT AUI_entry_EditChar (T_AUI_ENTRY_DATA *entry_data, USHORT alphachar, BOOL multitap) { T_ED_DATA *editor = entry_data->editor; TRACE_FUNCTION("AUITextEntry: AUI_entry_EditChar()"); /* If character is not provided, get it from the key table */ if (alphachar==NULL) { alphachar = AUI_entry_GetKeyChar(entry_data, ATB_edit_GetCasePref(editor)); if (!(ATB_edit_Mode(entry_data->editor, ED_MODE_ALPHA) && entry_data->Key!=KCD_MAX)) alphachar = UNICODE_SPACE; } ATB_edit_MultiTap(editor, alphachar, multitap); return alphachar; } /******************************************************************************* $Function: AUI_entry_EditDigit $Description: Sends a numeric digit/symbol to the editor $Returns: None. $Arguments: data - The editor data code - The key code of the digit to be inserted *******************************************************************************/ USHORT AUI_entry_EditDigit (T_AUI_ENTRY_DATA *entry_data, UBYTE code) { T_ED_DATA *editor = entry_data->editor; USHORT alphachar; TRACE_FUNCTION("AUITextEntry: AUI_entry_EditDigit()"); alphachar = ATB_char_Unicode(editControls[code]); ATB_edit_MultiTap(editor, alphachar, FALSE); return alphachar; } /******************************************************************************* $Function: AUI_entry_Timer $Description: executes the timer event from the edit component $Returns: none. $Arguments: *******************************************************************************/ static int AUI_entry_Timer (MfwEvt event, MfwTim *timer) { T_AUI_ENTRY_DATA *entry_data = (T_AUI_ENTRY_DATA *)MMIdata; TRACE_FUNCTION("AUIEditor: AUI_entry_Timer()"); /* SPR#2174 - SH - Only display character if we're still in multi-tap */ if (entry_data->editor->multitap) { if (ATB_edit_Mode(entry_data->editor, ED_MODE_ALPHA)) { AUI_entry_EditChar(entry_data, NULL, FALSE); entry_data->Level = KEY_PAD_MAX-1; entry_data->Key = KCD_MAX; } SEND_EVENT(entry_data->win, entry_data->update,0,0); } return 1; } /******************************************************************************* $Function: AUI_entry_StopMultitap $Description: Stops a multitap operation going on, cancelling the timer SPR#2174 - SH - Added $Returns: none. $Arguments: entry_data - The entry data *******************************************************************************/ void AUI_entry_StopMultitap(T_AUI_ENTRY_DATA *entry_data) { TRACE_FUNCTION("AUIEditor: AUI_entry_StopMultitap()"); timStop(entry_data->editTim); entry_data->editor->multitap = FALSE; entry_data->Level = KEY_PAD_MAX-1; entry_data->Key = KCD_MAX; return; } /******************************************************************************* $Function: AUI_entry_EventKey $Description: Process a keypress event. $Returns: The character that is entered, or NULL. $Arguments: *******************************************************************************/ USHORT AUI_entry_EventKey (T_AUI_ENTRY_DATA *entry_data, MfwEvt event, MfwKbd *key) { T_ED_DATA *editor = entry_data->editor; USHORT alphachar; // The character entered TRACE_FUNCTION("AUIEditor: AUI_entry_EventKey"); alphachar = AUI_entry_Keypress(entry_data, event, key); ATB_edit_Refresh(editor); return alphachar; } /******************************************************************************* $Function: AUI_entry_Keypress $Description: Process a keypress event $Returns: The character that is entered, or NULL. $Arguments: *******************************************************************************/ static USHORT AUI_entry_Keypress(T_AUI_ENTRY_DATA *entry_data, MfwEvt event, MfwKbd *key) { T_ED_DATA *editor = entry_data->editor; USHORT alphachar; /* Current multi-tap character */ T_ED_CASE_PREF casePref; TRACE_FUNCTION("AUIEditor: AUI_entry_KeypressFormat()"); alphachar = NULL; if (key->code!=KCD_HUP && editor->cursor.pos<(editor->attr->size-1)) /* SPR#1995 - SH */ { /* Multi-tap: The user presses a different key, meaning the previous character must be entered */ if (entry_data->Key != KCD_MAX && entry_data->Key != key->code) { timStop(entry_data->editTim); AUI_entry_EditChar(entry_data, alphachar, FALSE); // Show character, not multi-tap entry_data->Level = KEY_PAD_MAX-1; entry_data->Key = KCD_MAX; } casePref = ATB_edit_GetCasePref(editor); /* Work out the format character that will govern the format of this keypress */ if (editor->cursor.pos < (editor->attr->size-1) && casePref!=ED_CASEPREF_NONE) /* SPR#1995 - SH */ // Make sure we can still show a character { if (key->code <= KCD_HASH) /* SPR#1788 - SH - Now accept 0-9, * and # */ { entry_data->Key = key->code; // Store the key pressed /* Numeric */ if (casePref==ED_CASEPREF_NUM) // A numeric digit is expected { alphachar = AUI_entry_GetKeyChar(entry_data, casePref); entry_data->Level = KEY_PAD_MAX-1; // Reset multi-tap settings entry_data->Key = KCD_MAX; AUI_entry_EditChar(entry_data, alphachar, FALSE); // Show character, not multi-tap# } /* Multi-tap alphanumeric */ else // Valid format codes { alphachar = NULL; entry_data->Level++; // Increment through list of symbols if (entry_data->Level > (KEY_PAD_MAX-1)) // List wraps round entry_data->Level = 0; alphachar = AUI_entry_GetKeyChar(entry_data, casePref); if (alphachar!=NULL) // If we've found a character, and string isn't max size { AUI_entry_EditChar(entry_data, alphachar, TRUE); // Add character, multi-tap /* Need to store this handle, so timer can get access to * entry_data on callback */ MMIdata = (void *)entry_data; timStart(entry_data->editTim); } else entry_data->Key = KCD_MAX;/*a0393213 warnings removal-KEY_MAX changed to KCD_MAX*/ } } } } return alphachar; } /******************************************************************************* $Function: AUI_entry_GetKeyChar $Description: Return the character to be entered, based on the keypress $Returns: the unicode character to be entered into the text $Arguments: case - the preference for the case of the output *******************************************************************************/ USHORT AUI_entry_GetKeyChar(T_AUI_ENTRY_DATA *entry_data, T_ED_CASE_PREF casePref) { T_ED_DATA *editor = entry_data->editor; USHORT alphachar; USHORT safetycounter; /* Stops searching forever to find compatible character */ BOOL valid; /* flag to indicate whether character is accepted */ USHORT upper; USHORT lower; UBYTE caseSel = ATB_edit_GetCase(editor); /* The case selected by the user */ TRACE_FUNCTION("AUI_entry_GetKeyChar"); if (casePref==ED_CASEPREF_NUM || (casePref==ED_CASEPREF_ALPHANUM && caseSel==ED_CASE_NUM)) { alphachar = editControls[entry_data->Key]; if (entry_data->Key<=KCD_HASH) alphachar = alphachar << 8; // Gives us the ascii in the upper byte of the unicode } else { valid = FALSE; alphachar = NULL; safetycounter = 0; while (!valid && safetycounter<KEY_PAD_MAX) { upper = (USHORT)editAlphaU[entry_data->Key][entry_data->Level]; lower = (USHORT)editAlpha[entry_data->Key][entry_data->Level]; switch(casePref) { case ED_CASEPREF_ALPHANUM: if (caseSel==ED_CASE_UPPER || caseSel==ED_CASE_CAPS) alphachar = upper; else alphachar = lower; valid = TRUE; break; case ED_CASEPREF_ALPHANUM_UC: alphachar = upper; valid = TRUE; break; case ED_CASEPREF_ALPHANUM_LC: alphachar = lower; valid = TRUE; break; case ED_CASEPREF_ALPHA_UC: alphachar = upper; valid = !ATB_char_IsNumeric(alphachar); break; case ED_CASEPREF_ALPHA_LC: alphachar = lower; valid = !ATB_char_IsNumeric(alphachar); break; } if (!valid) { // find the next one that is, alphachar = NULL; safetycounter++; // (but don't search forever) entry_data->Level++; if (entry_data->Level > (KEY_PAD_MAX-1)) entry_data->Level = 0; } } alphachar = ATB_char_Unicode(alphachar); /* SPR#2342 - SH - Convert from unicode properly */ } TRACE_EVENT_P1(">>> alphachar = %d", alphachar); return alphachar; }