//////////////////////////////////////////////////////////////////////////////// // // 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.system.Capabilities; import flash.text.engine.TextBlock; import flashx.textLayout.compose.StandardFlowComposer; import flashx.textLayout.edit.SelectionFormat; import flashx.textLayout.formats.FormatValue; import flashx.textLayout.formats.ITextLayoutFormat; import flashx.textLayout.formats.TextDecoration; import flashx.textLayout.formats.TextLayoutFormatValueHolder; 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 TextFlow() constructor when you create a new TextFlow * instance. It allows the application to initially control how the Text Layout Framework behaves. * *

The Configuration class allows you to specify initial, paragraph and container formats for the text flow * through the textFlowInitialFormat property. It also allows you to specify initial format attributes for links, selection, * scrolling, and for handling the Tab and Enter keys.

* * @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) && (new TextBlock).hasOwnProperty("recreateTextLine"); /** 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; // TODO: make me into dictionaries private var _defaultLinkNormalFormat:ITextLayoutFormat; private var _defaultLinkActiveFormat:ITextLayoutFormat; private var _defaultLinkHoverFormat:ITextLayoutFormat; 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 true. If set to false, initializes * without default values, thereby saving some objects. The clone() method sets this * to false 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:TextLayoutFormatValueHolder; _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 TextLayoutFormatValueHolder(); scratchFormat.textDecoration = TextDecoration.UNDERLINE; scratchFormat.color = 0x0000FF;//default link color is blue _defaultLinkNormalFormat = scratchFormat; scratchFormat = new TextLayoutFormatValueHolder(); 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.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#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; } } }