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”