|
Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本 文本布局框架控制器控制器在 MVC 设计模式将用户与视图的互动翻译成修改模型的命令。控制器也负责事件处理。对于文本布局框架,控制器包括编辑包的类、操作包的类和事件包的类。使用编辑包的类,您可以启用文本编辑和选择功能。操作包的类定义可能执行的编辑操作。事件包的类表示特定于文本布局框架的事件类型。 在文本流级别控制选择或编辑文本的能力。TextFlow 类的每个实例都有一个关联的交互管理器。可通过对象的 TextFlow.interactionManager 属性访问 TextFlow 对象的交互管理器。要启用文本选择功能,可将 SelectionManager 类的实例指定给 interactionManager 属性。要启用文本选择和编辑功能,可指定 EditManager 类的实例,而不是指定 SelectionManager 类的实例。要启用撤消操作,可创建 UndoManager 类的一个实例,并将其纳为调用 EditManager 的构造函数时的参数。UndoManager 类维护用户最新编辑活动的历史记录,并允许用户撤消或重做特定的编辑操作。上述所有三个类都包含在编辑包中。 选择管理器要使文本可供选择,请创建 SelectionManager 的实例,并将该实例与 TextFlow 实例的交互管理器相关联。例如,如果您有一个名为 flow 的 TextFlow 实例并希望它可供选择,则可以创建一个 SelectionManager 对象,然后将其分配给 flow.interactionManager 属性。 flow.interactionManager = new SelectionManager(); 将 SelectionManager 指定给 TextFlow 的交互管理器后,TextFlow 便有权访问 SelectionManager 的事件处理函数。SelectionManager 可利用这些事件处理程序对多个事件进行检测。您可以在以下情况中使用 SelectionManager 进行检测:选择文本时、容器获得或失去焦点时以及发生键盘或鼠标活动时。事件处理函数是 SelectionManager 类的方法,如果您需要自定义事件处理行为,则可以覆盖这些方法。 SelectionManager 通过管理文本范围来跟踪所选文本。可将文本范围视为一系列字符。不过,SelectionManager 将利用文本流层次的优点,从而使用更高效的技术来跟踪文本范围。文本流层次中的每个字符都有一个关联的位置,该位置相对于文本流的起始位置。字符的绝对位置是一个整数,用于描述当前字符与文本流的起始位置相隔的字符数。SelectionManager 可使用文本位置将文本范围存储为一对整数,一个整数针对距文本流起始位置最近的字符,另一个整数针对距文本流起始位置最远的字符。了解这一点很有用,因为 SelectionManager 中的许多属性和方法都引用“文本流的索引”,它等效于绝对位置,即与文本流起始位置之间的距离。 文本范围由 TextRange 类定义,该类恰好有一个名为 absoluteStart 的属性和另一个名为 absoluteEnd 的属性。这两个属性都是整数,用于表示与文本流的起始位置之间的距离。这两个属性都有前缀“absolute”,意味着它们表示的是与文本流的最开始位置之间的距离,这与前缀“relative”意思相反,后者表示的是与文本流中其它位置的任意 FlowElement 之间的距离。 编辑管理器要启用文本选择和编辑功能,可创建 EditManager 类的一个实例,并将该实例与 TextFlow 实例的交互管理器相关联。例如,要为名为 flow 的 TextFlow 实例启用编辑功能,请使用 EditManager 类: flow.interactionManager = new EditManager(); EditManager 类比 SelectionManager 类稍微复杂些,因为前者必须管理文本的插入、编辑和格式设置。EditManager 不只是跟踪选择范围,它还必须管理用户完成的一系列编辑。为了便于对这些编辑进行管理,EditManager 类创建了一个用于表示每个编辑的 FlowOperation 对象。每次用户执行插入、编辑或更改格式设置时,EditManager 都会创建一个用于表示该编辑的 FlowOperation 子类的实例。FlowOperation 对象封装执行操作和撤消操作需要的代码。例如,如果用户插入文本,EditManager 将创建 InsertTextOperation 类(该类继承自 FlowOperation 类)的实例。 事件处理在执行操作之前,EditManager 调度 FlowOperationEvent 类型的事件对象。FlowOperationEvent 对象的 type 属性设置为 FlowOperationEvent.FLOW_OPERATION_BEGIN。使用此事件,您可以监视某项操作将要开始的时间,并可通过调用 Event.preventDefault() 取消该操作。由于事件可以具备关联的默认行为,此方法因此得名。例如,在文本插入操作中,默认行为是插入文本。要防止文本插入,可在适当的时候调用 preventDefault() 方法。有大量与文本插入、键盘快捷方式和菜单选择(如剪切、复制和粘贴)等编辑任务关联的默认行为。可通过在事件处理函数中调用 preventDefault() 方法来阻止所有这些默认行为。 另一个很有用的 FlowOperationEvent 属性是 operation 属性。利用此属性,您可以查看将要执行哪种操作。operation 属性之所以存在,是因为所有操作都生成同一类型的事件 - 类型 FLOW_OPERATION_BEGINoperation 属性存储对关联的 FlowOperation 对象的引用。 EditManager 对象在执行操作后还会调度事件。调度的事件对象也是 FlowOperationEvent 类的实例,就和在执行之前调度的事件一样。然而,其 type 属性设置为常量 FLOW_OPERATION_END,而不是设置为 FLOW_OPERATION_BEGIN。 为 FLOW_OPERATION_END 事件创建事件处理函数的一个优点,是您可以更从容地处理错误。通过查看此事件对象的 error 属性,可以了解执行操作期间是否引发了错误。如果执行操作期间出现错误,该事件对象在事件对象的 error 属性中存储对该错误的引用。您可以在事件处理函数中查看此属性是否存在。如果此属性不是 null,您可以使用自己的代码处理错误。然后,您可以对 FlowOperationEvent 调用 Event.preventDefault() 以防止 Flash Player 出现该错误。 撤消管理器UndoManager 允许用户撤消和重做编辑。每个 EditManager 都有一个关联的 UndoManager。要将特定 UndoManager 与 EditManager 进行关联,请创建 UndoManager 类的实例,并将该实例作为参数传递给 EditManager 构造函数。采用这种方式,您可以与多个 EditManager 共享单个 UndoManager,这意味着可使用一个 UndoManager 管理多个 TextFlow。例如,若要对两个名为 flow1 和 flow2 的实例使用同一 UndoManager,则可将同一 UndoManager 实例作为唯一参数传递到 EditManager 构造函数。 var undoMgr:UndoManager = new UndoManager(); flow1.interactionManager = new EditManager(undoMgr); flow2.interactionManager = new EditManager(undoMgr); 如果在未指定 UndoManager 的情况下创建 EditManager,流不会包含 UndoManager 并且不启用撤消。 每个 UndoManager 都创建两个堆栈以跟踪编辑历史记录。用户执行操作时,UndoManager 会将相应的操作推送到撤消堆栈。如果用户选择撤消该操作,UndoManager 将从撤消堆栈删除或弹出该操作,并将该操作推送到重做堆栈中。可以使用 UndoManager 的 undoAndRedoItemLimit 属性配置堆栈大小。如果达到大小极限,将从堆栈中删除较早的操作。 |
|