package
{
import flashx.textLayout.operations.InsertTextOperation;
import spark.components.TextInput;
import spark.events.TextOperationEvent;
[Exclude(name="restrict", kind="property")]
public class NumberInput extends TextInput
{
public function NumberInput()
{
updateRegex();
}
//regex pattern
private var regex:RegExp;
private var _allowNegative:Boolean = true;
/**
* Specifies whether negative numbers are permitted.
* Valid values are true or false.
*
* @default true
*/
public function set allowNegative(value:Boolean):void
{
_allowNegative = value;
updateRegex();
}
private var _fractionalDigits:int = 0;
/**
* The maximum number of digits that can appear after the decimal
* separator.
*
*
The default value is 0
*/
public function set fractionalDigits(value:int):void
{
_fractionalDigits = value;
updateRegex();
}
/**
* @private
*/
override public function set restrict(value:String):void
{
throw(new Error("You are not allowed to change the restrict property of this class. It is read-only."));
}
override protected function childrenCreated():void
{
super.childrenCreated();
//listen for the text change event
addEventListener(TextOperationEvent.CHANGING, onTextChange);
}
public function onTextChange(event:TextOperationEvent):void
{
if (regex && event.operation is InsertTextOperation)
{
// What will be the text if this input is allowed to happen
var textToBe:String = "";
// Check selection
if (selectionActivePosition > 0)
{
textToBe += text.substr(0, selectionActivePosition)
}
//append the newly entered text with the existing text
textToBe += InsertTextOperation(event.operation).text;
if (selectionAnchorPosition > 0)
{
textToBe += text.substr(selectionAnchorPosition, text.length - selectionAnchorPosition);
}
var match:Object = regex.exec(textToBe);
if (!match || match[0] != textToBe)
{
// The textToBe didn't match the expression... stop the event
event.preventDefault();
}
//special condition checking to prevent multiple dots
var firstDotIndex:int = textToBe.indexOf(".");
if( firstDotIndex != -1)
{
var lastDotIndex:int = textToBe.lastIndexOf(".");
if(lastDotIndex != -1 && lastDotIndex != firstDotIndex)
event.preventDefault();
}
}
}
private function updateRegex():void
{
var regexString:String = "\\d{0,50}";
if(_allowNegative)
regexString = "^\\-?" + regexString;
else
regexString = "^" + regexString;
if(_fractionalDigits > 0 )
regexString += "\\.?\\d{0," + _fractionalDigits.toString() + "}$";
else
regexString += "$";
regex = new RegExp(regexString);
}
}
}
{
import flashx.textLayout.operations.InsertTextOperation;
import spark.components.TextInput;
import spark.events.TextOperationEvent;
[Exclude(name="restrict", kind="property")]
public class NumberInput extends TextInput
{
public function NumberInput()
{
updateRegex();
}
//regex pattern
private var regex:RegExp;
private var _allowNegative:Boolean = true;
/**
* Specifies whether negative numbers are permitted.
* Valid values are true or false.
*
* @default true
*/
public function set allowNegative(value:Boolean):void
{
_allowNegative = value;
updateRegex();
}
private var _fractionalDigits:int = 0;
/**
* The maximum number of digits that can appear after the decimal
* separator.
*
*
The default value is 0
*/
public function set fractionalDigits(value:int):void
{
_fractionalDigits = value;
updateRegex();
}
/**
* @private
*/
override public function set restrict(value:String):void
{
throw(new Error("You are not allowed to change the restrict property of this class. It is read-only."));
}
override protected function childrenCreated():void
{
super.childrenCreated();
//listen for the text change event
addEventListener(TextOperationEvent.CHANGING, onTextChange);
}
public function onTextChange(event:TextOperationEvent):void
{
if (regex && event.operation is InsertTextOperation)
{
// What will be the text if this input is allowed to happen
var textToBe:String = "";
// Check selection
if (selectionActivePosition > 0)
{
textToBe += text.substr(0, selectionActivePosition)
}
//append the newly entered text with the existing text
textToBe += InsertTextOperation(event.operation).text;
if (selectionAnchorPosition > 0)
{
textToBe += text.substr(selectionAnchorPosition, text.length - selectionAnchorPosition);
}
var match:Object = regex.exec(textToBe);
if (!match || match[0] != textToBe)
{
// The textToBe didn't match the expression... stop the event
event.preventDefault();
}
//special condition checking to prevent multiple dots
var firstDotIndex:int = textToBe.indexOf(".");
if( firstDotIndex != -1)
{
var lastDotIndex:int = textToBe.lastIndexOf(".");
if(lastDotIndex != -1 && lastDotIndex != firstDotIndex)
event.preventDefault();
}
}
}
private function updateRegex():void
{
var regexString:String = "\\d{0,50}";
if(_allowNegative)
regexString = "^\\-?" + regexString;
else
regexString = "^" + regexString;
if(_fractionalDigits > 0 )
regexString += "\\.?\\d{0," + _fractionalDigits.toString() + "}$";
else
regexString += "$";
regex = new RegExp(regexString);
}
}
}