Flash Player 10 以降、Adobe AIR 1.5 以降

Text Layout Framework のコントローラー

MVC デザインパターンのコントローラーは、ユーザーとビューとの対話を、モデルを変更するコマンドに変換します。また、コントローラーはイベントの処理も行います。Text Layout Framework の場合、コントローラーには edit、operations および events の各パッケージのクラスが含まれています。edit パッケージのクラスを使用すると、テキストの編集と選択が可能になります。operations パッケージのクラスでは、可能な編集操作が定義されます。events パッケージのクラスは、Text Layout Framework に固有のイベントタイプを表します。

テキストを選択または編集できるかどうかは、テキストフローレベルで制御されます。TextFlow クラスの各インスタンスには、関連付けられた対話マネージャーがあります。TextFlow オブジェクトの対話マネージャーには、オブジェクトの TextFlow.interactionManager プロパティを通じてアクセスできます。テキストの選択を有効にするには、SelectionManager クラスのインスタンスを interactionManager プロパティに割り当てます。テキストの選択と編集の両方を有効にするには、SelectionManager クラスのインスタンスではなく、EditManager クラスのインスタンスを割り当てます。取り消し操作を有効にするには、UndoManager クラスのインスタンスを作成し、EditManager のコンストラクターを呼び出すときに引数としてそのインスタンスを含めます。UndoManager クラスでは、ユーザーの最新の編集アクティビティのヒストリーは維持されます。また、ユーザーは特定の編集の取り消しまたはやり直しを行うことができます。これらの 3 つのクラスはすべて edit パッケージの一部です。

選択マネージャー

テキストを選択可能にするには、SelectionManager のインスタンスを作成し、それを TextFlow インスタンスの対話マネージャーに関連付けます。例えば、選択可能にしたい flow という名前の TextFlow インスタンスがある場合、SelectionManager オブジェクトを作成して、それを flow.interactionManager プロパティに割り当てます。

flow.interactionManager = new SelectionManager(); 

SelectionManager が TextFlow の対話マネージャーに割り当てられると、TextFlow は SelectionManager のイベントハンドラーにアクセスできるようになります。これらのイベントハンドラーを使用して、SelectionManager は複数のイベントを検出できます。SelectionManager を使用すると、テキストが選択されたとき、コンテナがフォーカスを得たときや失ったとき、キーボードまたはマウスの動作があったときに検出することができます。イベントハンドラーは、カスタムイベント処理ビヘイビアーが必要な場合にオーバーライドできる SelectionManager クラスのメソッドです。

SelectionManager では、テキスト範囲を管理することで、選択されたテキストを追跡します。テキスト範囲は一連の文字として考えることができます。ただし、SelectionManager では、テキストフロー階層を利用することで、より効率的なテクニックを使用してテキスト範囲を追跡します。テキストフロー階層内の各文字には、テキストフローの開始に対する相対的な位置が関連付けられています。文字の絶対位置は、テキストフローの開始と現在の文字との間にある文字数を示す整数です。テキストの位置を使用して、SelectionManager ではテキスト範囲を整数のペア(テキストフローの開始に最も近い文字に対する 1 つの整数と、テキストフローの開始から最も離れた文字に対する別の整数)として格納できます。SelectionManager のプロパティおよびメソッドの多くは、絶対位置、つまりテキストフローの開始からの距離に相当する「テキストフローへのインデックス」を参照するので、この知識は有用です。

テキスト範囲は、absoluteStart という名前のプロパティと、absoluteEnd という名前の別のプロパティを持つ TextRange クラスによって定義されます。これらのプロパティはともに、テキストフローの開始からの距離を表す整数です。両方のプロパティに、テキストフローの先頭からの距離を表していることを示す「absolute」という接頭辞が付いています。一方、「relative」という接頭辞は、テキストフロー内の他の場所にある任意の FlowElement からの距離を表しています。

編集マネージャー

テキストの選択と編集を有効にするには、EditManager クラスのインスタンスを作成し、それを TextFlow インスタンスの対話マネージャーに関連付けます。例えば、flow という名前の TextFlow インスタンスに対して編集を有効にするには、EditManager クラスを使用します。

flow.interactionManager = new EditManager(); 

EditManager クラスは、テキストの挿入、編集およびフォーマットを管理する必要があるので、SelectionManager クラスより若干複雑です。EditManager では、選択範囲を単に追跡するのではなく、ユーザーによって行われた一連の編集を管理する必要があります。これらの編集の管理を容易にするために、EditManager クラスでは、各編集を表す FlowOperation オブジェクトを作成します。ユーザーが挿入、編集またはフォーマットの変更を開始するたびに、EditManager によってその編集を表す FlowOperation サブクラスのインスタンスが作成されます。FlowOperation オブジェクトでは、操作を実行するだけでなく、操作を取り消すために必要なコードがカプセル化されます。例えば、ユーザーがテキストを挿入すると、EditManager によって、FlowOperation クラスから継承した InsertTextOperation クラスのインスタンスが作成されます。

イベント処理

操作の実行前に、EditManager によって FlowOperationEvent タイプのイベントオブジェクトが送出されます。FlowOperationEvent オブジェクトの type プロパティは、FlowOperationEvent.FLOW_OPERATION_BEGIN に設定されます。このイベントによってユーザーは、操作が開始しようとするときを監視し、Event.preventDefault() を呼び出すことで操作をキャンセルできます。イベントには関連付けられたデフォルトビヘイビアーがある可能性があるので、このメソッドにはこの名前が付いています。例えば、テキストの挿入操作の場合、デフォルトビヘイビアーはテキストの挿入です。テキストが挿入されないようにするには、適切なタイミングで preventDefault() メソッドを呼び出します。様々なデフォルトビヘイビアーが編集タスク(テキスト挿入、キーボードショートカットおよびカット、コピー、ペーストのようなメニュー選択など)に関連付けられています。これらのデフォルトビヘイビアーはすべて、イベントハンドラー関数で preventDefault() メソッドを呼び出すことで回避できます。

便利な他の FlowOperationEvent プロパティには、operation プロパティがあります。このプロパティを使用すると、どの操作を実行しようとしているかをチェックできます。すべての操作によって同じタイプのイベント、つまり FLOW_OPERATION_BEGIN タイプの FlowOperationEvent インスタンスが生成されるので、operation プロパティは存在しています。operation プロパティには、関連付けられた FlowOperation オブジェクトへの参照が格納されます。

操作の実行後にも、EditManager オブジェクトによってイベントが送出されます。送出されるこのイベントオブジェクトも、実行前に送出されたイベントと同様、FlowOperationEvent クラスのインスタンスです。ただし、type プロパティは、定数 FLOW_OPERATION_BEGIN ではなく、FLOW_OPERATION_END に設定されます。

FLOW_OPERATION_END イベントのイベント処理関数を作成する利点の 1 つは、エラーをより明快に処理できることです。操作の実行中にエラーがスローされたかどうかをチェックするには、このイベントオブジェクトの error プロパティをチェックします。操作の実行中にエラーが発生すると、そのエラーへの参照がイベントオブジェクトの error プロパティに格納されます。このプロパティが存在するかどうかはイベント処理関数で確認できます。このプロパティが null でない場合は、独自のコードを使用してエラーを処理できます。その場合、FlowOperationEvent で Event.preventDefault() を呼び出すことで、Flash Player でエラーがスローされるのを回避できます。

取り消しマネージャー

UndoManager を使用すると、ユーザーは編集の取り消しおよびやり直しを行えます。各 EditManager には、関連付けられた UndoManager があります。特定の UndoManager を EditManager に関連付けるには、UndoManager クラスのインスタンスを作成し、そのインスタンスを EditManager コンストラクターの引数として渡します。この方法によってユーザーは、単一の UndoManager を複数の EditManager と共有できるようになります。つまり、単一の UndoManager によって複数の TextFlow が管理されるようになります。例えば、flow1flow2 という名前の 2 つの TextFlow インスタンスに対して同じ UndoManager を使用するには、同じ UndoManager インスタンスを EditManager コンストラクターの唯一の引数として渡します。

var undoMgr:UndoManager = new UndoManager(); 
flow1.interactionManager = new EditManager(undoMgr); 
flow2.interactionManager = new EditManager(undoMgr);

UndoManager を指定せずに EditManager を作成すると、フローには UndoManager がなく、取り消し機能は有効化されません。

各 UndoManager では、2 つのスタックを作成して編集操作履歴を追跡します。操作が実行されると、UndoManager によってその操作が取り消しスタック上にプッシュされます。ユーザーが操作の取り消しを選択すると、UndoManager によって操作が取り消しスタックから削除(つまり、ポップ)され、やり直しスタック上にプッシュされます。スタックのサイズは、UndoManager の undoAndRedoItemLimit プロパティで設定できます。サイズの制限に達した場合、より古い操作がスタックから削除されます。