=================================================
Operation
=================================================
IOperation インターフェイスの定義
=================================================
OperationDriver が Run メソッド等の引数として受け取るのが ``IOperation`` インターフェイスです。
C# による IOperation インターフェイスの定義を下記に示します。
.. code-block:: csharp
namespace MoNo.Ctrl
{
///
/// マウス等によるユーザーオペレーションを表すインターフェイスです。
///
public interface IOperation : Core.IBreath
{
///
/// 必要なイベントハンドラの設定などを行い、オペレーションを開始します。
/// オペレーションが完了したとき(終了するとき)に が呼び出されます。
///
/// オペレーション終了時に呼び出される関数
void Run( Action terminate );
///
/// オペレーションを終了させます。
///
void Abort();
///
/// オペレーションを一時的に停止(サスペンド)します。
///
void Suspend();
///
/// サスペンドされていたオペレーションを復帰させます。
///
void Resume();
///
/// オペレーションが動作中の場合に true を返します。
/// オペレーションが起動していない場合やサスペンド状態の場合は false を返します。
///
bool IsAttached { get; }
///
/// オペレーションが起動されている場合に true を返します。
/// サスペンドされている場合でも true を返します。
///
bool IsEntered { get; }
///
/// オペレーションがサスペンド状態かどうかを返します。
///
bool IsSuspended { get; }
///
/// オペレーションがイベントにアタッチされてアクティブになったときに発生するイベントです。
/// されたときにも発生します。
///
event EventHandler Attached;
///
/// オペレーションがイベントからデタッチされて非アクティブになったときに発生するイベントです。
/// されたときにも発生します。
///
event EventHandler Detached;
///
/// オペレーションが起動されたときに発生するイベントです。
/// では発生しません。
///
event EventHandler Entered;
///
/// オペレーションが終了したときに発生するイベントです。
/// では発生しません。
///
event EventHandler Exited;
///
/// オペレーションがされたときに発生するイベントです。
///
event EventHandler Suspended;
///
/// オペレーションがされたときに発生するイベントです。
///
event EventHandler Resumed;
///
/// オペレーションが正常終了した時に発生するイベントです。
/// の前に発生します。
///
event EventHandler Succeeded;
}
}
重要な注意点があります。
``IOperation`` のメンバーの内、``Run()``, ``Suspend()``, ``Resume()`` については
``OperationDriver`` の内部で使用するためのメソッドです。
アプリケーション側でこれらのメソッドを直接呼び出さないようにして下さい。
状態遷移図
========================================
``IOperation`` は ``OperationDriver`` の動きに応じて次のように状態遷移します。
.. image:: OperationStateMachine.png
上図で ``Abort`` と ``Exit`` について説明を付記します。
``Abort`` は外部から強制的にオペレーションを終了させることを意味しています。
一方 ``Exit`` はオペレーションが完了して自然に終了することを意味しています。
Operation クラス
========================================
``IOperation`` インターフェイスを実装した代表的なクラスとして ``MoNo.Ctrl.Operation`` クラスが用意されています。
OperationDriver の節で動作確認に用いたのがこのクラスになります。
このクラスはコンストラクタ引数に ``System.Windows.Forms.Control`` あるいは ``MoNo.Graphics.IView`` を要求します。
そして、指定されたビューでのマウスイベント等を取得する機能を提供します。
下記にこのクラスの定義の一部を示します。
ビューで発生した様々なイベントを扱えることが分かるかと思います。
.. code-block:: csharp
namespace MoNo.Ctrl
{
public class Operation : IOperation, ...
{
...
public event MouseEventHandler MouseDown;
public event MouseEventHandler MouseUp;
public event MouseEventHandler MouseClick;
public event MouseEventHandler MouseDoubleClick;
public event MouseEventHandler MouseMove;
public event MouseEventHandler MouseWheel;
public event KeyEventHandler KeyDown;
public event KeyEventHandler KeyUp;
public event KeyPressEventHandler KeyPress;
public event PreviewKeyDownEventHandler PreviewKeyDown;
public event EventHandler SizeChanged;
public event PaintEventHandler Paint;
public event EventHandler Touched;
public event EventHandler Gestured;
...
}
}
このクラスを OperationDriver で Run させると、オペレーションが作動し上記のイベントハンドラが有効になります。
このオペレーションは自然に完了して終了することはなく、何らかの形で外部から Abort しない限り終了しません。
何らかの条件でオペレーションを完了させたいときには、``Exit`` メソッドを呼び出します。