FreeCalypso > hg > fc-tourmaline
diff src/ui/bmi/AUITextEntry.c @ 3:67bfe9f274f6
src/ui: import of src/ui3 from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:33:10 +0000 |
parents | |
children | c0052fe355d3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ui/bmi/AUITextEntry.c Fri Oct 16 06:33:10 2020 +0000 @@ -0,0 +1,563 @@ +/******************************************************************************* + + 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; +}