blob: 3bd4e49791c9c2dab9e03115f6bab76306aeaf50 [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.BlendMode;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flashx.textLayout.container.TextContainerManager;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.edit.EditManager;
import flashx.textLayout.edit.EditingMode;
import flashx.textLayout.edit.IEditManager;
import flashx.textLayout.edit.ISelectionManager;
import flashx.textLayout.edit.SelectionFormat;
import flashx.textLayout.edit.SelectionFormatState;
import flashx.textLayout.edit.SelectionManager;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.IConfiguration;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
public class TCMTestFocus extends Sprite
{
private var tcm:TextContainerManager;
public function TCMTestFocus()
{
super();
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
tcm = addTextInputManagerText(10,60,200,20,"enter name here");
addTextInputManagerText(10,110,200,20,"another TCM field");
// put some TextFields up for hitting - psuedo buttons
addButton("ChgState:",20,10,60,20,null);
addButton("Focus", 110,10,60,20,stateFocusEvent);
addButton("Unfocus", 200,10,60,20,stateUnfocusedEvent);
addButton("Inactive",290,10,60,20,stateInactiveEvent);
addButton("ChgFormat:",20,30,60,20,null);
addButton("Focus", 110,30,60,20,focusEvent);
addButton("Unfocus", 200,30,60,20,unfocusedEvent);
addButton("Inactive",290,30,60,20,inactiveEvent);
}
private function addButton(text:String,x:Number,y:Number,width:Number,height:Number,handler:Function):TextField
{
var f1:TextField = new TextField();
f1.text = text;
f1.x = x; f1.y = y; f1.height = height; f1.width = width;
addChild(f1);
if (handler != null)
{
f1.border = true;
f1.borderColor = 0xff;
f1.addEventListener(MouseEvent.MOUSE_OVER,handler);
}
f1.selectable = false;
return f1;
}
// these handlers demonstrate how to transition to the different states
// checking composeState first (its tlf_internal) is useful for finding out if we are in an optimized no selection state
// checking interactionManager is useful for finding out if this is a read-only tcm. Could check tcm.editingMode as well
// its also possible to query
private function stateFocusEvent(e:Event):void
{
trace("stateFocusEvent");
if (tcm.composeState == TextContainerManager.COMPOSE_COMPOSER)
{
var im:ISelectionManager = tcm.beginInteraction();
// this has side effects - it steals focus
if (im && im.hasSelection())
{
stage.focus = null; // clear it somehow!!! (or could make sure it was already cleared)
im.setFocus();
}
tcm.endInteraction();
}
}
private function stateUnfocusedEvent(e:Event):void
{
trace("stateUnfocusedEvent");
// NOTE TO FLEX: IF the stage.focus points to the container it still gets TextInput events. Its up to you to block them in your TCM override
if (tcm.composeState == TextContainerManager.COMPOSE_COMPOSER)
{
var im:ISelectionManager = tcm.beginInteraction();
if (im)
{
// clear focus somehow!!! either of these next two lines works
//tcm.requiredFocusOutHandler(null);
if (stage.focus == tcm.container) stage.focus = null;
tcm.deactivateHandler(null);
tcm.activateHandler(null);
}
tcm.endInteraction();
}
}
private function stateInactiveEvent(e:Event):void
{
trace("stateInactiveEvent");
// NOTE TO FLEX: IF the stage.focus points to the container it still gets TextInput events. Its up to you to block them in your TCM override
if (tcm.composeState == TextContainerManager.COMPOSE_COMPOSER)
{
var im:ISelectionManager = tcm.beginInteraction();
if (im)
{
// clear focus somehow!!! either of these next two lines works
// tcm.requiredFocusOutHandler(null);
if (stage.focus == tcm.container) stage.focus = null;
tcm.deactivateHandler(null);
}
tcm.endInteraction();
}
}
private function focusEvent(e:Event):void
{
trace("focusEvent");
if (tcm.composeState == TextContainerManager.COMPOSE_COMPOSER)
{
var im:ISelectionManager = tcm.beginInteraction();
if (im)
SelectionManager(im).setSelectionFormatState(SelectionFormatState.FOCUSED);
tcm.endInteraction();
}
}
private function unfocusedEvent(e:Event):void
{
trace("unfocusedEvent");
if (tcm.composeState == TextContainerManager.COMPOSE_COMPOSER)
{
var im:ISelectionManager = tcm.beginInteraction();
if (im)
SelectionManager(im).setSelectionFormatState(SelectionFormatState.UNFOCUSED);
tcm.endInteraction();
}
}
private function inactiveEvent(e:Event):void
{
trace("inactiveEvent");
if (tcm.composeState == TextContainerManager.COMPOSE_COMPOSER)
{
var im:ISelectionManager = tcm.beginInteraction();
if (im)
SelectionManager(im).setSelectionFormatState(SelectionFormatState.INACTIVE);
tcm.endInteraction();
}
}
private static var testConfiguration:IConfiguration;
public function addTextInputManagerText(x:Number, y:Number, width:Number, height:Number, text:String):TextContainerManager
{
var bg:Sprite = new Sprite();
if (!testConfiguration)
{
// hmmm maybe clone should be on IConfiguration
var config:Configuration = (TextContainerManager.defaultConfiguration as Configuration).clone();
// different focus selection colors
config.focusedSelectionFormat = new SelectionFormat(0xffffff, 1.0, BlendMode.DIFFERENCE);
config.unfocusedSelectionFormat = new SelectionFormat(0xa8c6ee, 1.0, BlendMode.NORMAL, 0xa8c6ee, 1.0, BlendMode.NORMAL, 0);
config.inactiveSelectionFormat = new SelectionFormat(0xe8e8e8, 1.0, BlendMode.NORMAL, 0xe8e8e8, 1.0, BlendMode.NORMAL, 0);
testConfiguration = config;
}
var tm:TextContainerManager = new TextContainerManager(bg,testConfiguration);
tm.compositionWidth = NaN;
tm.compositionHeight = NaN;
tm.editingMode = EditingMode.READ_WRITE;
tm.setText(text);
/* var editManager:IEditManager = EditManager(tm.beginInteraction());
editManager.setSelection(0,0);
editManager.insertText("there should not be a blinking cursor");
tm.endInteraction(); */
tm.updateContainer();
bg.x = x;
bg.y = y;
addChild(bg);
return tm;
}
}
}