     }
 
     /**
-     *  Sets the selection range.
+     *  Sets the selection range and.  If the text is not editable or selectable
+     *  this will also implicitly make the text selectable.
      */
     public function setSelection(anchorPosition:int = 0,
                                  activePosition:int = int.MAX_VALUE):void
     {
-        textFlow.interactionManager.setSelection(anchorPosition,
-                                                 activePosition);
-        textFlow.flowComposer.updateAllContainers();
-    }
+        if (getEditingMode(textFlow.interactionManager) == EditingMode.READ_ONLY)
+        {
+            switchInteractionManager(textFlow, selectionManager);
+            _selectable = true;
+        }
+
+        textFlow.interactionManager.setSelection(anchorPosition, activePosition);
+        textFlow.flowComposer.updateAllContainers();                               
+      }
     
     /**
      *  Inserts the specified text as if you had typed it.

                new DisplayObjectContainerController(this));
            textFlow.flowComposer = flowComposer;
            
            // Give it an EditManager to make it editable.
            
            var editManager:TextViewEditManager = 
                new TextViewEditManager(mx_internal::undoManager);
            
            // TODO! Temporary workaround because selectionColor
            // isn't getting set for FxApplications.
            var selectionColor:* = getStyle("selectionColor");
            if (selectionColor === undefined)
                selectionColor = 0xB5D5FF;
            var unfocusedAlpha:Number =
                selectionVisibility != TextSelectionVisibility.WHEN_FOCUSED ? 
                1.0 : 0.0;
            var inactiveAlpha:Number =
                selectionVisibility == TextSelectionVisibility.ALWAYS ?
                1.0 : 0.0;
            editManager.focusSelectionFormat = new SelectionFormat(
                selectionColor, 1.0, BlendMode.NORMAL);
            editManager.noFocusSelectionFormat = new SelectionFormat(
                getStyle("unfocusedSelectionColor"), unfocusedAlpha,
                BlendMode.NORMAL);
            editManager.inactiveSelectionFormat = new SelectionFormat(
                getStyle("inactiveSelectionColor"), inactiveAlpha,
                BlendMode.NORMAL);
            
            textFlow.interactionManager = editManager;

            // Listen to events from the TextFlow and its EditManager.
            addListeners(textFlow);

        
        return textFlow;
    }
    
    /**
     *  @private
     *  Initialize the ISelectionManager with the default values.
     */
    private function initInteractionManager(instanceManager:ISelectionManager):void
    {        
        var selectionColor:* = getStyle("selectionColor");
        var unfocusedAlpha:Number =
            selectionVisibility != TextSelectionVisibility.WHEN_FOCUSED ? 
            1.0 : 0.0;
        var inactiveAlpha:Number =
            selectionVisibility == TextSelectionVisibility.ALWAYS ?
            1.0 : 0.0;
        instanceManager.focusSelectionFormat = new SelectionFormat(
            selectionColor, 1.0, BlendMode.NORMAL);
        instanceManager.noFocusSelectionFormat = new SelectionFormat(
            getStyle("unfocusedSelectionColor"), unfocusedAlpha,
            BlendMode.NORMAL);
        instanceManager.inactiveSelectionFormat = new SelectionFormat(
            getStyle("inactiveSelectionColor"), inactiveAlpha,
            BlendMode.NORMAL);                    
    }
        
    /**
     *  @private
     *  Persist the edit manager so that any formatting that was set is 
     *  maintained.
     */
    private var _editManager:TextViewEditManager = null;
    
    /**
     *  @private
     */
    private function get editManager():TextViewEditManager
    {
        if (_editManager == null)
        {
            _editManager = new TextViewEditManager(mx_internal::undoManager);    
            initInteractionManager(_editManager);                
        }           
        return _editManager; 
    }
    
    /**
     *  @private
     *  Create a new selection manager.  The initial selection is -1, -1.
     */
    private function get selectionManager():ISelectionManager
    {
        var selectionManager:ISelectionManager = new SelectionManager();
        initInteractionManager(selectionManager);
        return selectionManager; 
    }

    /**
     *  @private
     */
    private function setInteractionManager(textFlow:TextFlow):void
    {
        if (enabled)
        {
            if (_editable)
            {
                // Give it an EditManager to make it editable. Editable implies selectable.
                switchInteractionManager(textFlow, editManager);
                return;
            }   
            else if (_selectable)
            {
                // Give it a SelectionManager to enable selection for cut/paste.
                switchInteractionManager(textFlow, selectionManager);
                return;                            
            }
        }        
        
        // Not enabled or enabled and neither editable nor selectable.
        switchInteractionManager(textFlow, null);
    }

    /**
     *  @private
     *  To preserve the selection anchor position across selection managers.
     */
    private var _priorSelectionAnchorPosition:int = -1;

    /**
     *  @private
     *  To preserve the selection active position across selection managers.
     */
    private var _priorSelectionActivePosition:int = -1;

    /**
     *  @private
     *  Return the editing mode of the interaction manager
     *      EditingMode.READ_ONLY   (neither selectable nor editable)
     *      EditingMode.READ_SELECT (selectable and not editable)
     *      EditingMode.READ_WRITE  (selectable and editable)
     */
    private function getEditingMode(manager:ISelectionManager):String
    {
        return manager ? manager.editingMode : EditingMode.READ_ONLY;
    }
    
    /**
     *  @private
     *  Switch the interaction manager, preserving the selection from the
     *  current intereration manager.  When the TextFlow's interaction manager
     *  is changed, it will cause a selection change event and the selection
     *  will be cleared.  The selection then needs to be reset to maintain it 
     *  across interaction managers.
     */
    private function switchInteractionManager(
                                textFlow:TextFlow,
                                selectionManager:ISelectionManager):void
    {
        // Nothing to switch.  The current manager will work.
        if (getEditingMode(textFlow.interactionManager) == 
                getEditingMode(selectionManager))
            return;
     
        // Save the current selection since switching the interaction
        // manager will clear the selection.                   
        if (textFlow.interactionManager != null)
        {
            _priorSelectionAnchorPosition = textFlow.interactionManager.anchorPosition;
            _priorSelectionActivePosition = textFlow.interactionManager.activePosition;
        }

        // Swap in a new manager.            
        textFlow.interactionManager = selectionManager;

        // Restore the prior selection in the new selection manager.
        if (textFlow.interactionManager != null)
        {
            textFlow.interactionManager.setSelection(
                        _priorSelectionAnchorPosition, 
                        _priorSelectionActivePosition);
        }
        
        // ToDo: don't think this is really needed
        textFlow.flowComposer.updateAllContainers();        

    }
    
    /**
     *  @private
     */
