blob: 034fa9870de103c9d920b76cdd584b684f78dc9a [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.elements
{
import flash.display.BlendMode;
import flash.display.Sprite;
import flash.system.Capabilities;
import flashx.textLayout.compose.StandardFlowComposer;
import flashx.textLayout.edit.SelectionFormat;
import flashx.textLayout.formats.FormatValue;
import flashx.textLayout.formats.IListMarkerFormat;
import flashx.textLayout.formats.ITextLayoutFormat;
import flashx.textLayout.formats.ListMarkerFormat;
import flashx.textLayout.formats.TextDecoration;
import flashx.textLayout.formats.TextLayoutFormat;
import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
/**
* The Configuration class is a primary point of integration between the Text Layout Framework and an application. You can
* include a Configuration object as a parameter to the <code>TextFlow()</code> constructor when you create a new TextFlow
* instance. It allows the application to initially control how the Text Layout Framework behaves.
*
* <p>The Configuration class allows you to specify initial, paragraph and container formats for the text flow
* through the <code>textFlowInitialFormat</code> property. It also allows you to specify initial format attributes for links, selection,
* scrolling, and for handling the Tab and Enter keys.</p>
*
* @includeExample examples\ConfigurationExample.as -noswf
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.formats.ITextLayoutFormat ITextLayoutFormat
* @see flashx.textLayout.edit.SelectionFormat SelectionFormat
* @see TextFlow
*/
public class Configuration implements IConfiguration
{
/** @private */
static tlf_internal function versionIsAtLeast(major:int,minor:int):Boolean
{
var versionData:Array = Capabilities.version.split(" ")[1].split(",");
return int(versionData[0]) > major || (int(versionData[0]) == major && int(versionData[1]) >= minor);
}
/** @private The player may disable the feature for older swfs. */
static tlf_internal const playerEnablesArgoFeatures:Boolean = versionIsAtLeast(10,1);
/** @private The player may disable the feature for older swfs, so its not enough to check
the Player version number, the SWF must also be marked as a version 11 SWF to use Spicy features. */
static tlf_internal const playerEnablesSpicyFeatures:Boolean = versionIsAtLeast(10,2) && (new Sprite).hasOwnProperty("needsSoftKeyboard");
static tlf_internal const hasTouchScreen:Boolean = playerEnablesArgoFeatures && Capabilities["touchScreenType"] != "none";
/** If manageTabKey and manageEnterKey are false, the client must handle those keys on their own. */
private var _manageTabKey:Boolean;
private var _manageEnterKey:Boolean;
private var _overflowPolicy:String;
private var _enableAccessibility:Boolean;
private var _releaseLineCreationData:Boolean;
private var _defaultLinkNormalFormat:ITextLayoutFormat;
private var _defaultLinkActiveFormat:ITextLayoutFormat;
private var _defaultLinkHoverFormat:ITextLayoutFormat;
private var _defaultListMarkerFormat:IListMarkerFormat;
private var _textFlowInitialFormat:ITextLayoutFormat;
private var _focusedSelectionFormat:SelectionFormat;
private var _unfocusedSelectionFormat:SelectionFormat;
private var _inactiveSelectionFormat:SelectionFormat;
// scrolling vars
private var _scrollDragDelay:Number;
private var _scrollDragPixels:Number;
private var _scrollPagePercentage:Number;
private var _scrollMouseWheelMultiplier:Number;
private var _flowComposerClass:Class;
private var _inlineGraphicResolverFunction:Function;
/** Constructor - creates a default configuration.
*
* @param initializeWithDefaults Specifies whether to initialize the configuration with
* the default values. Default is <code>true</code>. If set to <code>false</code>, initializes
* without default values, thereby saving some objects. The <code>clone()</code> method sets this
* to <code>false</code> and copies the properties from the original object.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.edit.SelectionFormat SelectionFormat
* @see flashx.textLayout.compose.StandardFlowComposer StandardFlowComposer
*/
public function Configuration(initializeWithDefaults:Boolean = true)
{
if (initializeWithDefaults)
initialize()
}
private function initialize():void
{
var scratchFormat:TextLayoutFormat;
_manageTabKey = false;
_manageEnterKey = true;
_overflowPolicy = OverflowPolicy.FIT_DESCENDERS;
_enableAccessibility = false;
_releaseLineCreationData = false;
_focusedSelectionFormat = new SelectionFormat(0xffffff, 1.0, BlendMode.DIFFERENCE);
_unfocusedSelectionFormat = new SelectionFormat(0xffffff, 0, BlendMode.DIFFERENCE, 0xffffff, 0.0, BlendMode.DIFFERENCE, 0);
_inactiveSelectionFormat = _unfocusedSelectionFormat;
scratchFormat = new TextLayoutFormat();
scratchFormat.textDecoration = TextDecoration.UNDERLINE;
scratchFormat.color = 0x0000FF;//default link color is blue
_defaultLinkNormalFormat = scratchFormat;
var listMarkerFormat:ListMarkerFormat = new ListMarkerFormat();
listMarkerFormat.paragraphEndIndent = 4;
_defaultListMarkerFormat = listMarkerFormat;
scratchFormat = new TextLayoutFormat();
scratchFormat.lineBreak = FormatValue.INHERIT;
scratchFormat.paddingLeft = FormatValue.INHERIT;
scratchFormat.paddingRight = FormatValue.INHERIT;
scratchFormat.paddingTop = FormatValue.INHERIT;
scratchFormat.paddingBottom = FormatValue.INHERIT;
scratchFormat.verticalAlign = FormatValue.INHERIT;
scratchFormat.columnCount = FormatValue.INHERIT;
scratchFormat.columnCount = FormatValue.INHERIT;
scratchFormat.columnGap = FormatValue.INHERIT;
scratchFormat.columnWidth = FormatValue.INHERIT;
_textFlowInitialFormat = scratchFormat;
_scrollDragDelay = 35;
_scrollDragPixels = 20;
_scrollPagePercentage = 7.0/8.0;
_scrollMouseWheelMultiplier = 20;
_flowComposerClass = StandardFlowComposer;
}
private var _immutableClone:IConfiguration;
/** TextFlows are configured with an immutable clone of a Configuration. Once a TextFlow is create it uses an immutable configuration. @private */
tlf_internal function getImmutableClone():IConfiguration
{
if (!_immutableClone)
{
var clonedConifg:Configuration = clone();
_immutableClone = clonedConifg;
// an immutable clone is its own immutable clone
clonedConifg._immutableClone = clonedConifg;
}
return _immutableClone;
}
/** Creates a clone of the Configuration object.
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function clone():Configuration
{
var config:Configuration = new Configuration(false);
// must copy all values
config.defaultLinkActiveFormat = defaultLinkActiveFormat;
config.defaultLinkHoverFormat = defaultLinkHoverFormat;
config.defaultLinkNormalFormat = defaultLinkNormalFormat;
config.defaultListMarkerFormat = defaultListMarkerFormat;
config.textFlowInitialFormat = _textFlowInitialFormat;
config.focusedSelectionFormat = _focusedSelectionFormat;
config.unfocusedSelectionFormat = _unfocusedSelectionFormat;
config.inactiveSelectionFormat = _inactiveSelectionFormat;
config.manageTabKey = _manageTabKey;
config.manageEnterKey = _manageEnterKey;
config.overflowPolicy = _overflowPolicy;
config.enableAccessibility = _enableAccessibility;
config.releaseLineCreationData = _releaseLineCreationData;
config.scrollDragDelay = _scrollDragDelay;
config.scrollDragPixels = _scrollDragPixels;
config.scrollPagePercentage = _scrollPagePercentage;
config.scrollMouseWheelMultiplier = _scrollMouseWheelMultiplier;
config.flowComposerClass = _flowComposerClass;
config._inlineGraphicResolverFunction = _inlineGraphicResolverFunction;
return config;
}
/** @copy IConfiguration#manageTabKey
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get manageTabKey():Boolean
{ return _manageTabKey; }
public function set manageTabKey(val:Boolean):void
{ _manageTabKey = val; _immutableClone = null; }
/**
* @copy IConfiguration#manageEnterKey
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get manageEnterKey():Boolean
{ return _manageEnterKey; }
public function set manageEnterKey(val:Boolean):void
{ _manageEnterKey = val; _immutableClone = null; }
/**
* @copy IConfiguration#overflowPolicy
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see OverflowPolicy
*/
public function get overflowPolicy():String
{ return _overflowPolicy; }
public function set overflowPolicy(value:String):void
{ _overflowPolicy = value; }
/**
* @copy IConfiguration#defaultLinkNormalFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see FlowElement#linkNormalFormat
* @see flashx.textLayout.formats.ITextLayoutFormat ITextLayoutFormat
* @see LinkElement
*/
public function get defaultLinkNormalFormat():ITextLayoutFormat
{ return _defaultLinkNormalFormat; }
public function set defaultLinkNormalFormat(val:ITextLayoutFormat):void
{ _defaultLinkNormalFormat = val; _immutableClone = null; }
/**
* @copy IConfiguration#defaultListMarkerFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see FlowElement#listMarkerFormat
* @see flashx.textLayout.formats.IListMarkerFormat IListMarkerFormat
* @see LinkElement
*/
public function get defaultListMarkerFormat():IListMarkerFormat
{ return _defaultListMarkerFormat; }
public function set defaultListMarkerFormat(val:IListMarkerFormat):void
{ _defaultListMarkerFormat = val; _immutableClone = null; }
/**
* @copy IConfiguration#defaultLinkHoverFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see FlowElement#linkHoverFormat
* @see flashx.textLayout.formats.ITextLayoutFormat ITextLayoutFormat
* @see LinkElement
*/
public function get defaultLinkHoverFormat():ITextLayoutFormat
{ return _defaultLinkHoverFormat; }
public function set defaultLinkHoverFormat(val:ITextLayoutFormat):void
{ _defaultLinkHoverFormat = val; _immutableClone = null; }
/**
* @copy IConfiguration#defaultLinkActiveFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see FlowElement#linkActiveFormat
* @see flashx.textLayout.formats.ITextLayoutFormat ITextLayoutFormat
* @see LinkElement
*/
public function get defaultLinkActiveFormat():ITextLayoutFormat
{ return _defaultLinkActiveFormat; }
public function set defaultLinkActiveFormat(val:ITextLayoutFormat):void
{ _defaultLinkActiveFormat = val; _immutableClone = null; }
/**
* @copy IConfiguration#textFlowInitialFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see TextFlow
* @see flashx.textLayout.formats.ITextLayoutFormat ITextLayoutFormat
*/
public function get textFlowInitialFormat():ITextLayoutFormat
{ return _textFlowInitialFormat; }
public function set textFlowInitialFormat(val:ITextLayoutFormat):void
{ _textFlowInitialFormat = val; _immutableClone = null; }
/**
* @copy IConfiguration#focusedSelectionFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.edit.SelectionFormat SelectionFormat
* @see flashx.textLayout.edit.SelectionManager#focusedSelectionFormat SelectionManager.focusedSelectionFormat
* @see TextFlow
*/
public function get focusedSelectionFormat():SelectionFormat
{ return _focusedSelectionFormat; }
public function set focusedSelectionFormat(val:SelectionFormat):void
{ if (val != null)
{
_focusedSelectionFormat = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#unfocusedSelectionFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.edit.SelectionFormat SelectionFormat
* @see flashx.textLayout.edit.SelectionManager#unfocusedSelectionFormat SelectionManager.unfocusedSelectionFormat
* @see TextFlow
*/
public function get unfocusedSelectionFormat():SelectionFormat
{ return _unfocusedSelectionFormat; }
public function set unfocusedSelectionFormat(val:SelectionFormat):void
{ if (val != null)
{
_unfocusedSelectionFormat = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#inactiveSelectionFormat
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.edit.SelectionFormat SelectionFormat
* @see flashx.textLayout.edit.SelectionManager#inactiveSelectionFormat SelectionManager.inactiveSelectionFormat
* @see TextFlow
*/
public function get inactiveSelectionFormat():SelectionFormat
{ return _inactiveSelectionFormat; }
public function set inactiveSelectionFormat(val:SelectionFormat):void
{
if (val != null)
{
_inactiveSelectionFormat = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#scrollDragDelay
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get scrollDragDelay():Number
{ return _scrollDragDelay; }
public function set scrollDragDelay(val:Number):void
{
if (val > 0) {
_scrollDragDelay = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#scrollDragPixels
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get scrollDragPixels():Number
{ return _scrollDragPixels; }
public function set scrollDragPixels(val:Number):void
{
if (val > 0) {
_scrollDragPixels = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#scrollPagePercentage
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get scrollPagePercentage(): Number
{ return _scrollPagePercentage; }
public function set scrollPagePercentage(val:Number):void
{
if (val > 0) {
_scrollPagePercentage = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#scrollMouseWheelMultiplier
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*/
public function get scrollMouseWheelMultiplier(): Number
{ return _scrollMouseWheelMultiplier; }
public function set scrollMouseWheelMultiplier(val:Number):void
{
if (val > 0) {
_scrollMouseWheelMultiplier = val;
_immutableClone = null;
}
}
/**
* @copy IConfiguration#flowComposerClass
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.compose.StandardFlowComposer StandardFlowComposer
* @see flashx.textLayout.elements.TextFlow TextFlow
*/
public function get flowComposerClass(): Class
{ return _flowComposerClass; }
public function set flowComposerClass(val:Class):void
{
_flowComposerClass = val;
_immutableClone = null;
}
/**
* @copy IConfiguration#enableAccessibility
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see TextFlow
*/
public function get enableAccessibility():Boolean
{ return _enableAccessibility; }
public function set enableAccessibility(val:Boolean):void
{
_enableAccessibility = val;
_immutableClone = null;
}
/**
* @copy IConfiguration#releaseLineCreationData
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.compose.StandardFlowComposer StandardFlowComposer
* @see flash.text.engine.TextBlock#releaseLineCreationData() TextBlock.releaseLineCreationData()
*/
public function get releaseLineCreationData():Boolean
{ return _releaseLineCreationData; }
public function set releaseLineCreationData(val:Boolean):void
{
_releaseLineCreationData = val;
_immutableClone = null;
}
/** Returns true if the ActionScript text engine was built with debugging code enabled. @private */
static tlf_internal function get debugCodeEnabled():Boolean
{
CONFIG::debug { return true; }
CONFIG::release { return false; }
}
/**
* @copy IConfiguration#inlineGraphicResolverFunction
*
* @playerversion Flash 10
* @playerversion AIR 1.5
* @langversion 3.0
*
* @see flashx.textLayout.elements.InlineGraphicElement InlineGraphicElement
*/
public function get inlineGraphicResolverFunction():Function
{
return _inlineGraphicResolverFunction;
}
public function set inlineGraphicResolverFunction(val:Function):void
{
_inlineGraphicResolverFunction = val;
_immutableClone = null;
}
}
}