| 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 | 
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.
	 
Related API Elements
| 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 | |
| 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 | ||
|  | 
	 Duplicates an instance of an Event subclass. | Event | |
|  | 
	 A utility function for implementing the toString() method in custom 
	 ActionScript 3.0 Event classes. | Event | |
|  | 
	 Indicates whether an object has a specified property defined. | Object | |
|  | 
	Checks whether the preventDefault() method has been called on the event. | Event | |
|  | 
	 Indicates whether an instance of the Object class is in the prototype chain of the object specified 
	 as the parameter. | Object | |
|  | 
	Cancels an event's default behavior if that behavior can be canceled. | Event | |
|  | 
	 Indicates whether the specified property exists and is enumerable. | Object | |
|  | 
     Sets the availability of a dynamic property for loop operations. | Object | |
|  | 
	Prevents processing of any event listeners in the current node and any subsequent nodes in 
	the event flow. | Event | |
|  | 
	Prevents processing of any event listeners in nodes subsequent to the current node in the 
	event flow. | Event | |
|  | 
	 Returns the string representation of this object, formatted according to locale-specific conventions. | Object | |
|  | 
	Returns a string containing all the properties of the Event object. | Event | |
|  | 
	 Returns the primitive value of the specified object. | Object | |
| Constant | Defined By | ||
|---|---|---|---|
| COMPOSITION_COMPLETE : String = "compositionComplete" [static]  
	     Defines the value of the type property of a compositionComplete event object 
	      | CompositionCompleteEvent | ||
| compositionLength | property | 
| 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| 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 | 
| 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 
	     
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.
 
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);
        }
    }
}
Thu Dec 4 2014, 05:50 PM -08:00