blob: c5e600855a5b7ba341b40d026a40864322d55e73 [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 flashx.textLayout.formats
{
import flashx.textLayout.debug.Debugging;
import flashx.textLayout.debug.assert;
import flashx.textLayout.property.*;
import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
import flash.text.engine.TabAlignment;
/**
* The TabStopFormat class represents the properties of a tab stop in a paragraph. You can set the <code>TextLayoutFormat.tabstops</code> property to an array of TabStopFormat objects.
* @includeExample examples\TabStopFormat_example.as -noswf
* @see flashx.textLayout.elements.TabElement
* @see flashx.textLayout.formats.TextLayoutFormat#tabStops
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public class TabStopFormat implements ITabStopFormat
{
/** @private */
static public const positionProperty:Property = Property.NewNumberProperty("position",0,false,Vector.<String>([Category.TABSTOP]),0,10000);
/** @private */
static public const alignmentProperty:Property = Property.NewEnumStringProperty(
"alignment",TabAlignment.START,false,Vector.<String>([Category.TABSTOP])
,TabAlignment.START
,TabAlignment.CENTER
,TabAlignment.END
,TabAlignment.DECIMAL
);
/** @private */
static public const decimalAlignmentTokenProperty:Property = Property.NewStringProperty("decimalAlignmentToken",null,false,Vector.<String>([Category.TABSTOP]));
static private var _description:Object = {
position:positionProperty
, alignment:alignmentProperty
, decimalAlignmentToken:decimalAlignmentTokenProperty
}
/** Property descriptions accessible by name. @private */
static tlf_internal function get description():Object
{ return _description; }
/** @private */
static private var _emptyTabStopFormat:ITabStopFormat;
/**
* Returns an ITabStopFormat instance with all properties set to <code>undefined</code>.
* @private
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
static tlf_internal function get emptyTabStopFormat():ITabStopFormat
{
if (_emptyTabStopFormat == null)
_emptyTabStopFormat = new TabStopFormat();
return _emptyTabStopFormat;
}
private var _position:*;
private var _alignment:*;
private var _decimalAlignmentToken:*;
/**
* Return the value of the style specified by the <code>styleProp</code> parameter
* which specifies the style name.
*
* @param styleProp The name of the style whose value is to be retrieved.
* @return The value of the specified style. The type varies depending on the type of the style being
* accessed. Returns <code>undefined</code> if the style is not set.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function getStyle(styleName:String):*
{ return this[styleName]; }
/**
* Set the value of the style specified by the <code>styleProp</code> parameter
* which specifies the style name to <code>value</code>.
*
* @param styleProp The name of the style whose value is to be set.
* @param value The value to set.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function setStyle(styleName:String,value:*):void
{ this[styleName] = value; }
/**
* The position of the tab stop, in pixels, relative to the start edge of the column.
* <p>Legal values are numbers from 0 to 10000 and FormatValue.INHERIT.</p>
* <p>Default value is undefined indicating not set.</p>
* <p>If undefined during the cascade this property will have a value of 0.</p>
* @see FormatValue#INHERIT
*
* @throws RangeError when set value is not within range for this property
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get position():*
{ return _position; }
public function set position(newValue:*):void
{ _position = positionProperty.setHelper(_position,newValue); }
[Inspectable(enumeration="start,center,end,decimal,inherit")]
/**
* The tab alignment for this tab stop.
* <p>Legal values are TabAlignment.START, TabAlignment.CENTER, TabAlignment.END, TabAlignment.DECIMAL, FormatValue.INHERIT.</p>
* <p>Default value is undefined indicating not set.</p>
* <p>If undefined during the cascade this property will have a value of TabAlignment.START.</p>
* @see FormatValue#INHERIT
*
* @throws RangeError when set value is not within range for this property
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
* @see flash.text.engine.TabAlignment
*/
public function get alignment():*
{ return _alignment; }
public function set alignment(newValue:*):void
{ _alignment = alignmentProperty.setHelper(_alignment,newValue); }
/**
* The alignment token to be used if the alignment is DECIMAL.
* <p>Default value is undefined indicating not set.</p>
* <p>If undefined during the cascade this property will have a value of null.</p>
*
* @throws RangeError when set value is not within range for this property
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get decimalAlignmentToken():*
{ return _decimalAlignmentToken; }
public function set decimalAlignmentToken(newValue:*):void
{ _decimalAlignmentToken = decimalAlignmentTokenProperty.setHelper(_decimalAlignmentToken,newValue); }
/**
* Creates a new TabStopFormat object. All settings are empty or, optionally, are initialized from the
* supplied <code>initialValues</code> object.
*
* @param initialValues optional instance from which to copy initial values.
*
* @see #defaultFormat
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function TabStopFormat(initialValues:ITabStopFormat = null)
{
if (initialValues)
apply(initialValues)
}
/**
* Copies TabStopFormat settings from the <code>values</code> ITabStopFormat instance into this TabStopFormat object.
* If <code>values</code> is <code>null</code>, this TabStopFormat object is initialized with undefined values for all properties.
* @param values optional instance from which to copy values.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function copy(values:ITabStopFormat):void
{
if (values == null)
values = emptyTabStopFormat;
this.position = values.position;
this.alignment = values.alignment;
this.decimalAlignmentToken = values.decimalAlignmentToken;
}
/**
* Concatenates the values of properties in the <code>incoming</code> ITabStopFormat instance
* with the values of this TabStopFormat object. In this (the receiving) TabStopFormat object, properties whose values are <code>FormatValue.INHERIT</code>,
* and inheriting properties whose values are <code>undefined</code> will get new values from the <code>incoming</code> object.
* Non-inheriting properties whose values are <code>undefined</code> will get their default values.
* All other property values will remain unmodified.
*
* @param incoming instance from which values are concatenated.
* @see flashx.textLayout.formats.FormatValue#INHERIT
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function concat(incoming:ITabStopFormat):void
{
this.position = positionProperty.concatHelper(this.position, incoming.position);
this.alignment = alignmentProperty.concatHelper(this.alignment, incoming.alignment);
this.decimalAlignmentToken = decimalAlignmentTokenProperty.concatHelper(this.decimalAlignmentToken, incoming.decimalAlignmentToken);
}
/**
* Concatenates the values of properties in the <code>incoming</code> ITabStopFormat instance
* with the values of this TabStopFormat object. In this (the receiving) TabStopFormat object, properties whose values are <code>FormatValue.INHERIT</code>,
* and inheriting properties whose values are <code>undefined</code> will get new values from the <code>incoming</code> object.
* All other property values will remain unmodified.
*
* @param incoming instance from which values are concatenated.
* @see flashx.textLayout.formats.FormatValue#INHERIT
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function concatInheritOnly(incoming:ITabStopFormat):void
{
this.position = positionProperty.concatInheritOnlyHelper(this.position, incoming.position);
this.alignment = alignmentProperty.concatInheritOnlyHelper(this.alignment, incoming.alignment);
this.decimalAlignmentToken = decimalAlignmentTokenProperty.concatInheritOnlyHelper(this.decimalAlignmentToken, incoming.decimalAlignmentToken);
}
/**
* Replaces property values in this TabStopFormat object with the values of properties that are set in
* the <code>incoming</code> ITabStopFormat instance. Properties that are <code>undefined</code> in the <code>incoming</code>
* ITabStopFormat instance are not changed in this object.
*
* @param incoming instance whose property values are applied to this TabStopFormat object.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function apply(incoming:ITabStopFormat):void
{
var val:*;
if ((val = incoming.position) !== undefined)
this.position = val;
if ((val = incoming.alignment) !== undefined)
this.alignment = val;
if ((val = incoming.decimalAlignmentToken) !== undefined)
this.decimalAlignmentToken = val;
}
/**
* Compares properties in ITabStopFormat instance <code>p1</code> with properties in ITabStopFormat instance <code>p2</code>
* and returns <code>true</code> if all properties match.
*
* @param p1 instance to compare to <code>p2</code>.
* @param p2 instance to compare to <code>p1</code>.
*
* @return true if all properties match, false otherwise.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
static public function isEqual(p1:ITabStopFormat,p2:ITabStopFormat):Boolean
{
if (p1 == null)
p1 = emptyTabStopFormat;
if (p2 == null)
p2 = emptyTabStopFormat;
if (p1 == p2)
return true;
if (!positionProperty.equalHelper(p1.position, p2.position))
return false;
if (!alignmentProperty.equalHelper(p1.alignment, p2.alignment))
return false;
if (!decimalAlignmentTokenProperty.equalHelper(p1.decimalAlignmentToken, p2.decimalAlignmentToken))
return false;
return true;
}
/**
* Sets properties in this TabStopFormat object to <code>undefined</code> if they match those in the <code>incoming</code>
* ITabStopFormat instance.
*
* @param incoming instance against which to compare this TabStopFormat object's property values.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function removeMatching(incoming:ITabStopFormat):void
{
if (incoming == null)
return;
if (positionProperty.equalHelper(this.position, incoming.position))
this.position = undefined;
if (alignmentProperty.equalHelper(this.alignment, incoming.alignment))
this.alignment = undefined;
if (decimalAlignmentTokenProperty.equalHelper(this.decimalAlignmentToken, incoming.decimalAlignmentToken))
this.decimalAlignmentToken = undefined;
}
/**
* Sets properties in this TabStopFormat object to <code>undefined</code> if they do not match those in the
* <code>incoming</code> ITabStopFormat instance.
*
* @param incoming instance against which to compare this TabStopFormat object's property values.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function removeClashing(incoming:ITabStopFormat):void
{
if (incoming == null)
return;
if (!positionProperty.equalHelper(this.position, incoming.position))
this.position = undefined;
if (!alignmentProperty.equalHelper(this.alignment, incoming.alignment))
this.alignment = undefined;
if (!decimalAlignmentTokenProperty.equalHelper(this.decimalAlignmentToken, incoming.decimalAlignmentToken))
this.decimalAlignmentToken = undefined;
}
static private var _defaults:TabStopFormat;
/**
* Returns a TabStopFormat object with default settings.
* This function always returns the same object.
*
* @return a singleton instance of ITabStopFormat that is populated with default values.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
static public function get defaultFormat():ITabStopFormat
{
if (_defaults == null)
{
_defaults = new TabStopFormat();
Property.defaultsAllHelper(_description,_defaults);
}
return _defaults;
}
}
}