In this post I will introduce a proof-of-concept of AsYouTypeFormatter for Smart Office. AsYouTypeFormatter is used to “format phone numbers on-the-fly when users enter each digit.” It’s part of the open source library libphonenumber, “Google’s phone number handling library, powering Android and more.” This post complements my previous post where I discussed International phone number parsing, validation and formatting for Smart Office.
AsYouTypeFormatter
In addition to parsing, validation, and formatting, libphonenumber has a nice AsYouTypeFormatter that formats the phone number as the user types it.
You can test it with the Phone Number Parser Demo. Here’s a screenshot:
Standard Smart Office without AsYouTypeFormatter
Here is a demo of entering a phone number in the field WRPHNO in M3. Customer Open – CRS610/E in standard Smart Office (without AsYouTypeFormatter); the phone number is not validated nor formatted:
Smart Office with AsYouTypeFormatter
And here’s the same demo with AsYouTypeFormatter that’s formatting the phone number on-the-fly as I enter each digit (I typed only the digits):
Here is the complete source code for that demo:
import System; import System.Collections; import System.Windows.Controls; import libphonenumber; import MForms; package MForms.JScript { class Test { var debug; var formatter: AsYouTypeFormatter = PhoneNumberUtil.Instance.GetAsYouTypeFormatter("US"); var textboxes: ArrayList = new ArrayList(); var isTextChanging: boolean = false; // to avoid infinite loop in OnTextChanged public function Init(element : Object, args : Object, controller : Object, debug : Object) { try { // save global variables this.debug = debug; // attach to the phone fields var content = controller.RenderEngine.Content; var supportedPhoneFields: String[] = ["WRPHNO", "WRPHN2", "WRTFNO"]; for (var i: int in supportedPhoneFields) { var fieldName: String = supportedPhoneFields[i]; var textbox: TextBox = ScriptUtil.FindChild(content, fieldName); if (textbox != null) { textboxes.Add(textbox); textbox.add_TextChanged(OnTextChanged); } } controller.add_Requested(OnRequested); } catch (ex: Exception) { debug.WriteLine(ex); } } /* User is typing */ function OnTextChanged(sender: Object, e: TextChangedEventArgs) { try { if (!isTextChanging) { var textbox: TextBox = sender; if (textbox.Text.Length > 0) { // format the phone number as the user is typing it var newChar: char = textbox.Text.Substring(textbox.Text.Length - 1); var newText: String = formatter.InputDigit(newChar); isTextChanging = true; textbox.Text = newText; textbox.CaretIndex = textbox.Text.Length; isTextChanging = false; } } } catch (ex : Exception) { debug.WriteLine(ex); } } /* Clean-up */ function OnRequested(sender: Object, e: RequestEventArgs) { try { if (sender != null) { sender.remove_Requested(OnRequested); } for (var textbox: TextBox in textboxes) { if (textbox != null) { textbox.remove_TextChanged(OnTextChanged); } } } catch (ex : Exception) { debug.WriteLine(ex); } } } }
Limitations and future work
But according to this thread, AsYouTypeFormatter doesn’t support the backspace key, nor emptying the field, nor replacing a selection, nor inserting text somewhere in the middle. The solution is to handle all the cases ourselves in code. All these are already implemented in android.telephony.PhoneNumberFormattingTextWatcher. There is a partial port of Android to C# in XobotOS, “a Xamarin research project that explored porting Android 4.0 from Java/Dalvik to C#”. So to properly implement AsYouTypeFormatter in Smart Office we would need to combine libphonenumber-csharp and XobotOS.
That’s it! That was my proof-of-concept demo of AsYouTypeFormatter for Smart Office to format phone numbers in M3 Programs as the user is typing the digits.
Like, share, comment, enjoy.
/Thibaud
One thought on “AsYouTypeFormatter for Smart Office”