blob: 1989e1e2650b6660f4bfc18ec58a363e5c80d6dc [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IEventDispatcher;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.engine.FontPosture;
import flash.utils.getTimer;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.edit.SelectionManager;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.SpanElement;
import flashx.textLayout.elements.SubParagraphGroupElement;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.events.FlowElementMouseEvent;
import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
[SWF(width="800", height="500")]
public class EventMirrorExample extends Sprite
{
public const StatusHeight:Number = 100;
// padding around the Sprite
public const SpritePadding:Number = 25;
public var textFlow:TextFlow;
public var infoField:TextField;
public function EventMirrorExample()
{
// Display status information here
infoField = new TextField();
infoField.x = 10;
infoField.y = 40;
infoField.width = 780;
infoField.autoSize = TextFieldAutoSize.NONE;
infoField.background = true;
infoField.backgroundColor = 0x99ffff;
infoField.selectable = true;
addChild(infoField);
var s:Sprite = new Sprite();
s.x = SpritePadding;
s.y = infoField.y+StatusHeight+SpritePadding;
addChild(s);
textFlow = new TextFlow();
textFlow.fontSize = 24;
// log hits to infoField on a SubParagraphGroupElement
var s1:SpanElement = new SpanElement();
s1.text = "GroupEvent";
var s2:SpanElement = new SpanElement();
s2.text = "Listener";
s2.fontStyle = FontPosture.ITALIC;
var g:SubParagraphGroupElement = new SubParagraphGroupElement();
g.replaceChildren(0,0,s1,s2);
var p:ParagraphElement = new ParagraphElement();
p.addChild(g);
textFlow.addChild(p);
var mirror:IEventDispatcher = g.getEventMirror();
mirror.addEventListener(FlowElementMouseEvent.MOUSE_DOWN,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.MOUSE_UP,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.MOUSE_MOVE,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.ROLL_OVER,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.ROLL_OUT,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.CLICK,traceEvent);
// log hits to infoField on a SpanElement
s1 = new SpanElement();
s1.text = "Span w/Listener, ";
s2 = new SpanElement();
s2.text ="Span no listener";
p = new ParagraphElement();
p.replaceChildren(0,0,s1,s2);
textFlow.addChild(p);
mirror = s1.getEventMirror();
mirror.addEventListener(FlowElementMouseEvent.MOUSE_DOWN,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.MOUSE_UP,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.MOUSE_MOVE,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.ROLL_OVER,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.ROLL_OUT,traceEvent);
mirror.addEventListener(FlowElementMouseEvent.CLICK,traceEvent);
// roll over and roll out changes color of a span
s1 = new SpanElement();
s1.text = "Roll over and roll out changes color";
p = new ParagraphElement();
p.addChild(s1);
textFlow.addChild(p);
mirror = s1.getEventMirror();
mirror.addEventListener(FlowElementMouseEvent.ROLL_OVER,toRed);
mirror.addEventListener(FlowElementMouseEvent.ROLL_OUT,toDefault);
// click changes the text
s1 = new SpanElement();
s1.text = "Click to Toggle: Hello, World";
p = new ParagraphElement();
p.addChild(s1);
textFlow.addChild(p);
s1.getEventMirror().addEventListener(FlowElementMouseEvent.CLICK,toggleText);
// interaction manager isn't needed. Note: if its an EditManager then the CTRL key must be pressed to get mirrored events
textFlow.interactionManager = new SelectionManager();
textFlow.flowComposer.addController(new ContainerController(s,500-2*SpritePadding,500-StatusHeight-SpritePadding-infoField.y-SpritePadding));
textFlow.flowComposer.updateAllControllers();
}
public function toggleText(e:FlowElementMouseEvent):void
{
traceEvent(e);
var span:SpanElement = e.flowElement as SpanElement;
if (span)
{
span.text = span.text == "Click to Toggle: Hello, World" ? "Click to Toggle: Goodbye, World" : "Click to Toggle: Hello, World";
span.getTextFlow().flowComposer.updateAllControllers();
}
}
public function toRed(e:FlowElementMouseEvent):void
{
traceEvent(e);
e.flowElement.color = 0xff0000;
e.flowElement.getTextFlow().flowComposer.updateAllControllers();
}
public function toDefault(e:FlowElementMouseEvent):void
{
traceEvent(e);
e.flowElement.color = undefined;
e.flowElement.getTextFlow().flowComposer.updateAllControllers();
}
public function traceEvent(event:FlowElementMouseEvent):void
{ appendStatusText(event.flowElement.defaultTypeName+ " " + getTimer() + " " + event.toString() + event.originalEvent.toString()); }
public function appendStatusText(str:String):void
{
infoField.appendText(str+"\n");
infoField.scrollV = infoField.maxScrollV;
}
}
}