flashx.textLayout.events

# CompositionCompleteEvent - AS3

Package | flashx.textLayout.events
Class | public class CompositionCompleteEvent
Inheritance | CompositionCompleteEvent Event Object

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5

A TextFlow instance dispatches this event after a compose operation completes. Each text container has two states: composition and display. This event notifies you when the composition phase has ended. This provides an opportunity to make any necessary and appropriate changes to the container before you display the text. For example, you can use this event to add highlighting of certain words or characters in the text flow before the text is displayed.

The three main methods that dispatch this event are `compose()`, `updateToController()`, and `updateAllControllers()`. All three of these methods are in the StandardFlowComposer class.

Note: If the event is dispatched by the `updateAllControllers()` method, do not call `updateAllControllers()` again in your event handler function. Such a call would be a recursive call because the `updateAllControllers()` method executes both the composition and display steps. The `updateAllControllers()` dispatches this event after composition completes, but before the display step executes. The same reasoning applies to the `updateToController()` method.

View the examples

Related API Elements

flashx.textLayout.elements.TextFlow

Public Properties
Hide Inherited Public Properties
Show Inherited Public Properties

| Property | Defined By
--- | --- | ---
|  | bubbles : Boolean [read-only] Indicates whether an event is a bubbling event. | Event
|  | cancelable : Boolean [read-only] Indicates whether the behavior associated with the event can be prevented. | Event
|  | compositionLength : int The number of characters composed. | CompositionCompleteEvent
|  | compositionStart : int The start location of the text range affected by the composition, expressed as an index into the text flow. | CompositionCompleteEvent
|  | constructor : Object A reference to the class object or constructor function for a given object instance. | Object
|  | currentTarget : Object [read-only] The object that is actively processing the Event object with an event listener. | Event
|  | eventPhase : uint [read-only] The current phase in the event flow. | Event
|  | target : Object [read-only] The event target. | Event
|  | textFlow : flashx.textLayout.elements:TextFlow TextFlow on which composition has been completed. | CompositionCompleteEvent
|  | type : String [read-only] The type of event. | Event

Public Methods
Hide Inherited Public Methods
Show Inherited Public Methods

| Method | Defined By
--- | --- | ---
|  | CompositionCompleteEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, textFlow:flashx.textLayout.elements:TextFlow = null, compositionStart:int = 0, compositionLength:int = 0) Constructor | CompositionCompleteEvent
|  | clone():Event Duplicates an instance of an Event subclass. | Event
|  | formatToString(className:String, ... arguments):String A utility function for implementing the toString() method in custom ActionScript 3.0 Event classes. | Event
|  | hasOwnProperty(name:String):Boolean Indicates whether an object has a specified property defined. | Object
|  | isDefaultPrevented():Boolean Checks whether the preventDefault() method has been called on the event. | Event
|  | isPrototypeOf(theClass:Object):Boolean Indicates whether an instance of the Object class is in the prototype chain of the object specified as the parameter. | Object
|  | preventDefault():void Cancels an event's default behavior if that behavior can be canceled. | Event
|  | propertyIsEnumerable(name:String):Boolean Indicates whether the specified property exists and is enumerable. | Object
|  | setPropertyIsEnumerable(name:String, isEnum:Boolean = true):void Sets the availability of a dynamic property for loop operations. | Object
|  | stopImmediatePropagation():void Prevents processing of any event listeners in the current node and any subsequent nodes in the event flow. | Event
|  | stopPropagation():void Prevents processing of any event listeners in nodes subsequent to the current node in the event flow. | Event
|  | toLocaleString():String Returns the string representation of this object, formatted according to locale-specific conventions. | Object
|  | toString():String Returns a string containing all the properties of the Event object. | Event
|  | valueOf():Object Returns the primitive value of the specified object. | Object

Public Constants
Hide Inherited Public Constants
Show Inherited Public Constants

| Constant | Defined By
--- | --- | ---
|  | COMPOSITION_COMPLETE : String = "compositionComplete" [static] Defines the value of the type property of a compositionComplete event object | CompositionCompleteEvent

Property Detail

### compositionLength

property

`compositionLength:int`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5

The number of characters composed.

Implementation
`public function get compositionLength():int`
`public function set compositionLength(value:int):void`

### compositionStart

property

`compositionStart:int`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5

The start location of the text range affected by the composition, expressed as an index into the text flow.

Implementation
`public function get compositionStart():int`
`public function set compositionStart(value:int):void`

### textFlow

property

`textFlow:flashx.textLayout.elements:TextFlow`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5

TextFlow on which composition has been completed.

Implementation
`public function get textFlow():flashx.textLayout.elements:TextFlow`
`public function set textFlow(value:flashx.textLayout.elements:TextFlow):void`
Constructor Detail

### CompositionCompleteEvent

()
Constructor

`public function CompositionCompleteEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false, textFlow:flashx.textLayout.elements:TextFlow = null, compositionStart:int = 0, compositionLength:int = 0)`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5

Constructor

Parameters

| `type:String` — event type - use the static property COMPOSITION_COMPLETE.
| `bubbles:Boolean` (default = `false`)`` — Indicates whether an event is a bubbling event. This event does not bubble.
| `cancelable:Boolean` (default = `false`)`` — Indicates whether the behavior associated with the event can be prevented. This event cannot be cancelled.
| `textFlow:flashx.textLayout.elements:TextFlow` (default = `null`)`` — The TextFlow which was composed
| `compositionStart:int` (default = `0`)`` — start of composition, in terms of an index into the text flow.
| `compositionLength:int` (default = `0`)`` — length number of characters composed

Constant Detail

### COMPOSITION_COMPLETE

Constant

`public static const COMPOSITION_COMPLETE:String = "compositionComplete"`

Language Version: | ActionScript 3.0

Runtime Versions: | Flash Player 10, AIR 1.5

Defines the value of the `type` property of a `compositionComplete` event object

Examples How to use this example
CompositionCompleteEvent_example.as

This example shows how to use the CompositionCompleteEvent class to highlight a specific word in a TextFlow. This technique represents an alternative to setting the `TextLayoutFormat.backgroundColor` property before the text is composed.

The `compositionCompleteHandler()` method executes after the `updateAllControllers()` method initiates execution by composing the text, but before `updateAllControllers()` completes execution by updating the display list. This allows the event handler method to draw the highlighting of the word "shall" before the `updateAllControllers()` updates the display list.

Copy

    package flashx.textLayout.events.examples
    {
        import flash.display.Graphics;
        import flash.display.Sprite;
        import flash.geom.Rectangle;
        import flash.text.engine.TextLine;

        import flashx.textLayout.compose.StandardFlowComposer;
        import flashx.textLayout.compose.TextFlowLine;
        import flashx.textLayout.container.ContainerController;
        import flashx.textLayout.conversion.TextConverter;
        import flashx.textLayout.elements.FlowLeafElement;
        import flashx.textLayout.elements.ParagraphElement;
        import flashx.textLayout.elements.TextFlow;
        import flashx.textLayout.events.CompositionCompleteEvent;

        public class CompositionCompleteEvent_example extends Sprite
        {
            private var wordToHighlight:String = "shall";
            private var poemContainer:Sprite;
            private var txtFlow:TextFlow;
            private var controller:ContainerController;
            private const poem:String = "Sonnet 18\n" +
            "Shall I compare thee to a summer's day?\n" +
            "Thou art more lovely and more temperate:\n" +
            "Rough winds do shake the darling buds of May,\n" +
            "And summer's lease hath all too short a date:\n" +
            "Sometime too hot the eye of heaven shines,\n" +
            "And often is his gold complexion dimmed,\n" +
            "And every fair from fair sometime declines,\n" +
            "By chance, or nature's changing course untrimmed:\n" +
            "But thy eternal summer shall not fade,\n" +
            "Nor lose possession of that fair thou ow'st,\n" +
            "Nor shall death brag thou wand'rest in his shade,\n" +
            "When in eternal lines to time thou grow'st,\n" +
            "So long as men can breathe or eyes can see,\n" +
            "So long lives this, and this gives life to thee.\n" +
            "William Shakespeare\n";

            public function CompositionCompleteEvent_example()
            {
                     poemContainer = new Sprite();
                     txtFlow = new TextFlow();

                poemContainer.x = 30;
                poemContainer.y = 30;
                this.stage.addChild( poemContainer );

                controller = new ContainerController(poemContainer, 300, 230);
                controller.verticalScrollPolicy = flashx.textLayout.container.ScrollPolicy.OFF;
                txtFlow = TextConverter.importToFlow( poem, TextConverter.PLAIN_TEXT_FORMAT );
                txtFlow.flowComposer = new StandardFlowComposer();

                txtFlow.addEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, compositionCompleteHandler);
                txtFlow.flowComposer.addController( controller );

                txtFlow.flowComposer.updateAllControllers();
            }

            private function compositionCompleteHandler(event:CompositionCompleteEvent):void {
                if (event.textFlow == txtFlow) {
                    checkForMatchingWord();
                }
            }

            private function checkForMatchingWord():void {
                var currentLeaf:FlowLeafElement = txtFlow.getFirstLeaf();
                var currentParagraph:ParagraphElement = currentLeaf ? currentLeaf.getParagraph() : null;

                while (currentParagraph) { // iterate over all paragraphs in the text flow
                    var paraStart:uint = currentParagraph.getAbsoluteStart();
                    var currWordBoundary:int = 0;
                    var nextWordBoundary:int = 0;
                    var pattern:RegExp = new RegExp(wordToHighlight, "i");

                    while (true) { // iterate over letters in a word
                        nextWordBoundary = currentParagraph.findNextWordBoundary(currWordBoundary);
                        if (nextWordBoundary == currWordBoundary) {
                            break; // end of paragraph; break of inner while loop
                        }
                        var word:String = '';
                        var indexInLeaf:int = currWordBoundary + paraStart - currentLeaf.getAbsoluteStart();
                        var wordLen:uint = nextWordBoundary - currWordBoundary;

                        while (true){ // traverse consecutive leaf elements looking for 'wordLen' characters

                            // Take as many characters from the current leaf as possible to meet the quota of 'wordLen'
                            var consumeCount:uint = indexInLeaf + wordLen <= currentLeaf.textLength ? wordLen : currentLeaf.textLength - indexInLeaf;
                            word += currentLeaf.text.substr (indexInLeaf, consumeCount);

                            wordLen -= consumeCount;
                            if (!wordLen)
                                break;

                            // Quota not met; move to the next leaf
                            // Also reset the index where the next leaf will be scanned
                            currentLeaf = currentLeaf.getNextLeaf();
                            indexInLeaf = 0;
                        }
                        if (pattern.test(word)) {
                            highlightWord(currWordBoundary, nextWordBoundary, word, paraStart);
                        }
                        currWordBoundary = nextWordBoundary;
                    }

                    // At this point, currentLeaf is the last leaf in currentParagraph. Move to the next paragraph.
                    currentLeaf = currentLeaf.getNextLeaf();
                    currentParagraph = currentLeaf ? currentLeaf.getParagraph() : null;
                }
            }

            private function highlightWord(begin:int, end:int, word:String, paraStart:int):void {

                var absoluteBegin:int = paraStart + begin;
                var absoluteEnd:int = paraStart + end;

                var startTextFlowLineIndex:int = txtFlow.flowComposer.findLineIndexAtPosition(absoluteBegin);
                var endTextFlowLineIndex:int = txtFlow.flowComposer.findLineIndexAtPosition(absoluteEnd);
                var txtFlowLine:TextFlowLine = txtFlow.flowComposer.getLineAt(startTextFlowLineIndex);
                var txtLine:TextLine = txtFlowLine.getTextLine();

                // get the bounds of the first and last Atom of the textLine
                var startbounds:Rectangle = txtLine.getAtomBounds(txtLine.getAtomIndexAtCharIndex(begin));
                var endbounds:Rectangle = txtLine.getAtomBounds(txtLine.getAtomIndexAtCharIndex(end));

                var box:Sprite = new Sprite();
                var g:Graphics = box.graphics;

                g.lineStyle(1, 0xFFFF00, 0.5); // set line style
                g.beginFill(0xFFFF00, 0.3); // set fill style
                // draw a rectangle around the specified boundaries
                g.drawRect(startbounds.left, startbounds.top, (endbounds.x - startbounds.x), startbounds.height);
                txtLine.addChild(box);
            }
        }
    }

© 2015 Adobe Systems Incorporated. All rights reserved.
Mon Apr 10 2017, 12:28 PM -07:00