I've been trying to figure out the TLF way to show a hand cursor on roll
over on InlineGraphicElement and it seems the FlowElementMouseEventManager
is preventing that with the _needsCtrlKey flag. This is set automatically
by ContainerController when in edit mode in line ~3200:

var needsCtrlKey:Boolean = (interactionManager != null &&
interactionManager.editingMode == EditingMode.READ_WRITE);

It looks like it wasn't meant to handle much else except LinkElements. So
I've been trying to come up with alternatives and maybe a long term
solution.

First, I tried to add an event mirror to the IGE to set the Mouse cursor
manually:

inlineGraphicElement = editManager.insertInlineGraphic(source, null, null,
options, operationState);
var eventMirror:IEventDispatcher =
inlineGraphicElement.tlf_internal::getEventMirror();

eventMirror.addEventListener(FlowElementMouseEvent.ROLL_OVER,
flowElementRollOver);

protected function flowElementRollOver(event:Event):void {
    Mouse.cursor = MouseCursor.BUTTON;
}

But the FlowElementMouseEventManager class dispatchFlowElementMouseEvent
method prevents roll over events from being dispatched unless the CTRL key
is down:

        tlf_internal function dispatchFlowElementMouseEvent(type:String,
originalEvent:MouseEvent):Boolean
        {
            // Mimick old behavior, and emit only rollOut events if Ctrl
key is not down
            if (_needsCtrlKey && !originalEvent.ctrlKey && type !=
FlowElementMouseEvent.ROLL_OUT)
                return false;

        }

I'm thinking maybe that a property on FlowElement such as
currentElement.interactiveInEditMode property. This would be false by
default but if true then the CTRL is not necessary. Then we can check that
and continue to dispatch all events. In the event listeners we would set
the Mouse.cursor how we like. This sort of feels hacky though as you'll see
from LinkElement. It places the cursor control outside of a FlowElement's
class.

Is it a bug that it's not dispatching events I've attached listeners too?
Should the CTRL key condition be removed? It seems like it's a work around
for link elements and it shouldn't affect non link elements.

The other approach is to mimic how LinkElement handles it.

        /** @private
         * The ElementMouseEventManager calls this method directly. Note
that the mouse
         * coordinates are unrelated to any coordinate in the container or
this element.
         */
        tlf_internal function
mouseOverHandler(mgr:FlowElementMouseEventManager, evt:MouseEvent):void
        {
            mgr.setHandCursor(true);
            setToState(evt.buttonDown ? LinkState.ACTIVE : LinkState.HOVER);
        }

But the code in FlowElementMouseEventManager is specific to LinkElement. It
checks if the element is of type LinkElement and if not it exits out. It's
not setup to handle generic element types.

I then thought if I can edit or extend FlowElementMouseEventManager to
handle generic types then we can extend InlineGraphicElement with the same
handlers as LinkElement. But IGE are created by ParaEdit class createImage
method that hard codes the instance class to an InlineGraphicElement.

Next I tried to access the FlowElementMouseEventManager instance to see if
I could extend it, assign my own but it's marked private in
ContainerController. So no other element types can set the Mouse cursor.

Should it be accessible in the textFlow like the interaction manager?
Anyway, any ideas appreciated.

Reply via email to