JabbyPanda’s travel to RIA world / 35 posts / categories / 85 comments / feed / comments feed

Applying selection dynamically to Spark RichText component

Flex 4 documentation article named "Selecting and modifying text" lists an finite final list of components that supports the selection:

   This list does not include RichText component, but luckily with a new Text Layout Framework (TLF) available starting from Flash player 10, it is quite easy to "simulate" dynamic selection of the text with some ActionScript 3 code.

   In the following example, try to drag the slider to the left and to the right to control the dynamic selection of the text of RichText component:

Get Adobe Flash player

Code listing:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/halo"
               width="200"
               height="75">
    <s:layout>
        <s:HorizontalLayout paddingLeft="25"
                            paddingTop="25"
                            paddingRight="25"/>
    </s:layout>
    <fx:Script>
        <![CDATA[
            import flashx.textLayout.edit.EditManager;
            import flashx.textLayout.edit.SelectionState;
            import flashx.textLayout.formats.TextLayoutFormat;            

            protected function highlightItem(endSelectionCharIndex : int):void
            {
                var containerFormat:TextLayoutFormat = new TextLayoutFormat();
                var paragraphFormat:TextLayoutFormat = new TextLayoutFormat();
                var characterFormat:TextLayoutFormat = new TextLayoutFormat();

                characterFormat = _selectedTextFormat;

                var selectionState : SelectionState = new SelectionState(rt.textFlow, 0, endSelectionCharIndex, _selectedTextFormat);                

                // apply format to the selection
                _textEditManager.applyFormat(
                    characterFormat,
                    paragraphFormat,
                    containerFormat,
                    selectionState);                                

                characterFormat = _notSelectedTextFormat;                

                // apply format to the rest of the text
                var notSelectionState : SelectionState = new SelectionState(rt.textFlow, endSelectionCharIndex, rt.text.length, _notSelectedTextFormat);
                _textEditManager.applyFormat(
                    characterFormat, paragraphFormat, containerFormat, notSelectionState);
            }

            protected function onRichTextCreationComplete():void
            {
                _textEditManager = new EditManager();
                rt.textFlow.interactionManager = _textEditManager;

                _selectedTextFormat = new TextLayoutFormat();
                _selectedTextFormat.backgroundColor = 0xFF99CC;
                _selectedTextFormat.color = 0x000000;

                _notSelectedTextFormat = new TextLayoutFormat();
                _notSelectedTextFormat.backgroundColor = 0xFFFFFF;
                _notSelectedTextFormat.color = 0x000000;
            }

            private var _textEditManager : EditManager;

            private var _selectedTextFormat : TextLayoutFormat;

            private var _notSelectedTextFormat : TextLayoutFormat;            

        ]]>
    </fx:Script>
    <s:RichText id="rt" text="Sample text"
                creationComplete="onRichTextCreationComplete()"/>
    <s:HSlider id="slider"
              minimum="0"
              maximum="10"
              change="highlightItem(slider.value)">
    </s:HSlider>
</s:Application>

No comments

Leave a comment

Powered by WP Hashcash