Text Layout Framework 概述系列(五)编辑组件

  当我们讨论Text Layout Frmaework的编辑组件时,才更能体现MVC设计模式,因为编辑组件包括了控制层的功能。编辑组件封装了处理用户与视图层交互的代码以及通过将用户动作传输给命令来修改模型层的代码。
  编辑组件通过三个类实现了控制层的功能,它们可以用来选择文本,编辑文本,以及取消以前的操作。SelectionManager类定义了一些用来 管理文本选择的属性和方法。EditManager类则帮助你来插入,编辑,格式化文本。UndoManager类维护一个用户最近操作的历史记录,这样 就可以让用户撤销或重复以前的操作。
  能否选择和编辑文本是在TextFow层控制的。每个TextFlow的实例都有一个对应的管理交互的对象(interaction manager),它实际上是TextFlow.interactionManager属性。通过将SelectionManager类的实例赋给这个属 性就可以激活选择文本的功能,将EditManager类的实例赋给这个属性可以同时激活选择和编辑功能。 你可以通过创建一个SelectionManager对象然后将它赋给TextFlow的interactionManager属性来激活文本的选 择功能。例如,如果你有一个叫做flow的TextFlow对象并且你想让它的内容是可选的,你可以建立一个SelectionManager对象并将它 赋值给它的interactionManager属性:
  flow.interactionManager = new SelectionManager();
  在这之后,TextFlow就可以访问SelectionManager的事件处理函数。通过这些事件处理函数,SelectionManager 不仅能够探测到什么时候文本被选择,什么时候容器获得或者失去焦点,同样可以探测到键盘和鼠标事件。事件处理函数是SelectionManager类的 方法,如果你需要的话可以重写它们。
  SelectionManager通过管理文本段(text ranges)来跟踪被选中的文本。理论上,可以将文本段(text ranges)看做一个字符序列。SelectionManager通过利用文本流层次结构使用高效的技术来追踪文本段(text ranges)。每个文本流层次结构中的字符都有一个与之对应的位置,这个所谓的位置是与文本流的开头相对应的。一个字符的绝对位置是一个正整数,它描述 了当前字符与文本起始位置字符之间有多少个字符。通过文本位置(text position),SelectionManager可以使用整数对来存储文本段,一个整数表示该文本段离起始字符最近的字符的位置,另一个则表示离起 始字符最远的字符的位置。理解这些是十分有用的,因为SelectionManager中的许多属性和方法中有关于"an index into the text flow"的描述,这实际上指的是字符的绝对位置,即离文本流起始字符的距离。文本段实际上是TextRange类的实例,而这个类恰好有两个分别叫做 absoluteStart和absoluteEnd的属性。两个属性都是int型,它们分别表示距离文本流起始字符的距离。而且两个属性都用 "absolute"前缀来显式地表示它们是到文本流起始位置的距离。与之相对应的是"relative"前缀,它表示与一个任意的文本元素的距离。 如果想同时激活文本的选择和编辑功能,则需要创建一个EditManager得实例,然后将它赋值给TextFlow对象的interactionManager属性。例如: EditManager类与SelectionManager类相比稍微复杂一些,因为它需要管理插入,编辑和格式化文本,而不仅仅是追踪文本 段,EditManager必须要管理一系列用户对文本做过的改变。为了方便这些编辑行为的管理,EditManager通过FlowOperation 对象来表示每个编辑行为。每次用户初始化了一个插入,编辑或者格式化的动作,EditManager都会创建一个FlowOperation对象来封装必 要的代码,这不仅可以实现对应的操作,而且可以用来取消该操作。例如,如果用户插入文本,EditManager创建一个继承自 FlowOperation类的InsertTextOperation对象。
  在实际执行之前,EditManager会先抛出一个FlowOperationEvent事件。这个事件对象的type属性被设为 FlowOperationEvent.FLOW_OPERATION_BEGIN。这允许你监听操作什么时候准备执行,这时候你可以通过调用 Event.preventDefault()来取消该操作。这个方法叫这样的名字是因为每个事件都有一个与之对应的默认的行为。例如,当文本被插入文本 段时,表示文本插入的事件将在文本被实际插入前被抛出。这样的话我们就说这个事件的默认行为是将文本插入文本段。因为如果你不主动取消该事件,文本就会被 插入。有许多与编辑行为相关联的默认行为,例如插入,键盘快捷键以及像剪贴,赋值,粘贴这样的菜单操作。所有的默认行为都可以通过在事件处理函数中调用 Event.preventDefault()来取消。
  由于所有类型的操作都产生同样类型的事件-一个叫FLOW_OPERATION_BEGIN的FlowOperationEvent对象,你只能通 过FlowOperationEvent类的operation属性来区分。operation属性保存了FlowOperation对象的引用。
  在执行了一个操作后,EditManager同样会抛出一个事件对象。这个对象依然是一个FlowOperationEvent类的实例,但它的 type属性是FlowOperationEvent.FLOW_OPERATION_END。你可以通过FlowOperationEvent对象的 error属性来检查该操作执行时是否抛出了错误。如果操作执行的时候发生了错误,EditManager将在FlowOperationEvent事件 抛出之前,在该事件的的error属性中保存该错误对象的引用。你可以通过调用 Event.PreventDefault()方法来阻止flash player抛出错误。
  The Undo Manager
  UndoManager允许用户取消和重复以前的编辑操作。每个EditManager有一个关联的UndoManager。你可以通过创建一个 UndoManager类的实例并将其作为EditManager构造函数的一个参数来将其与EditManager关联。这允许你在多个 EditManager中共享一个UndoManager对象,这意味着一个单独的UndoManager可以管理多个文本流。例如: 如果你创建了一个没有初始化UndoManager的EditManager,系统会自动创建一个该TextFlow专属的UndoManager。例如,下面的代码,每个文本流都有其对应的独立的UndoManager: UndoManager会建立两个跟踪操作历史记录的栈。每当操作执行的时候UndoManager将操作对象推进undo栈。如果用户选择取消该 操作,UndoManager将该操作对象从undo栈删除,然后将它推进redo栈。栈的大小可以通过UndoManager的 undoAndRedoItemLimit来配置。如果到达了上限,最早的操作将首先被删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值