blob: 225079a69cdc395c3045b5fedd15ce2e7cc570e2 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package mx.formatters
{
[ExcludeClass]
/**
* @private
* The StringFormatter class provides a mechanism for displaying
* and saving data in the specified format.
* The constructor accepts the format and an Array of tokens,
* and uses these values to create the data structures to support
* the formatting during data retrieval and saving.
*
* <p>This class is used internally by other formatters,
* and is typically not used directly.</p>
*
* @see mx.formatters.DateFormatter
*/
public class StringFormatter
{
include "../core/Version.as";
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @param format String that contains the desired format.
*
* @param tokens String that contains the character tokens
* within the specified format String that is replaced
* during data formatting operations.
*
* @param extractTokenFunc The token
* accessor method to call when formatting for display.
* The method signature is
* value: anything, tokenInfo: {token: id, begin: start, end: finish}.
* This method must return a String representation of value
* for the specified <code>tokenInfo</code>.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function StringFormatter(format:String, tokens:String,
extractTokenFunc:Function)
{
super();
formatPattern(format, tokens);
extractToken = extractTokenFunc;
}
//--------------------------------------------------------------------------
//
// Variables
//
//--------------------------------------------------------------------------
/**
* @private
*/
private var extractToken:Function;
/**
* @private
*/
private var reqFormat:String;
/**
* @private
*/
private var patternInfo:Array;
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
/**
* Returns the formatted String using the format, tokens,
* and extraction function passed to the constructor.
*
* @param value String to be formatted.
*
* @return Formatted String.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function formatValue(value:Object):String
{
var curTokenInfo:Object = patternInfo[0];
var result:String = reqFormat.substring(0, curTokenInfo.begin) +
extractToken(value, curTokenInfo);
var lastTokenInfo:Object = curTokenInfo;
var n:int = patternInfo.length;
for (var i:int = 1; i < n; i++)
{
curTokenInfo = patternInfo[i];
result += reqFormat.substring(lastTokenInfo.end,
curTokenInfo.begin) +
extractToken(value, curTokenInfo);
lastTokenInfo = curTokenInfo;
}
if (lastTokenInfo.end > 0 && lastTokenInfo.end != reqFormat.length)
result += reqFormat.substring(lastTokenInfo.end);
return result;
}
/**
* @private
* Formats a user-defined pattern String into a more usable object.
*
* @param format String that defines the user-requested pattern.
*
* @param tokens List of valid patttern characters.
*/
private function formatPattern(format:String, tokens:String):void
{
var start:int = 0;
var finish:int = 0;
var index:int = 0;
var tokenArray:Array = tokens.split(",");
reqFormat = format;
patternInfo = [];
var n:int = tokenArray.length;
for (var i:int = 0; i < n; i++)
{
start = reqFormat.indexOf(tokenArray[i]);
if (start >= 0 && start < reqFormat.length)
{
finish = reqFormat.lastIndexOf(tokenArray[i]);
finish = finish >= 0 ? finish + 1 : start + 1;
patternInfo.splice(index, 0,
{ token: tokenArray[i], begin: start, end: finish });
index++;
}
}
patternInfo.sort(compareValues);
}
/**
* @private
*/
private function compareValues(a:Object, b:Object):int
{
if (a.begin > b.begin)
return 1;
else if (a.begin < b.begin)
return -1;
else
return 0;
}
}
}