Operation

IOperation インターフェイスの定義

OperationDriver が Run メソッド等の引数として受け取るのが IOperation インターフェイスです。 C# による IOperation インターフェイスの定義を下記に示します。

namespace MoNo.Ctrl
{
  /// <summary>
  /// マウス等によるユーザーオペレーションを表すインターフェイスです。
  /// </summary>
  public interface IOperation : Core.IBreath
  {
        /// <summary>
        /// 必要なイベントハンドラの設定などを行い、オペレーションを開始します。
        /// オペレーションが完了したとき(終了するとき)に <paramref name="terminate"/> が呼び出されます。
        /// </summary>
        /// <param name="terminate">オペレーション終了時に呼び出される関数</param>
        void Run( Action terminate );

        /// <summary>
        /// オペレーションを終了させます。
        /// </summary>
        void Abort();

        /// <summary>
        /// オペレーションを一時的に停止(サスペンド)します。
        /// </summary>
        void Suspend();

        /// <summary>
        /// サスペンドされていたオペレーションを復帰させます。
        /// </summary>
        void Resume();

        /// <summary>
        /// オペレーションが動作中の場合に true を返します。
        /// オペレーションが起動していない場合やサスペンド状態の場合は false を返します。
        /// </summary>
        bool IsAttached { get; }

        /// <summary>
        /// オペレーションが起動されている場合に true を返します。
        /// サスペンドされている場合でも true を返します。
        /// </summary>
        bool IsEntered { get; }

        /// <summary>
        /// オペレーションがサスペンド状態かどうかを返します。
        /// </summary>
        bool IsSuspended { get; }

        /// <summary>
        /// オペレーションがイベントにアタッチされてアクティブになったときに発生するイベントです。
        /// <see cref="Resume"/>されたときにも発生します。
        /// </summary>
        event EventHandler Attached;

        /// <summary>
        /// オペレーションがイベントからデタッチされて非アクティブになったときに発生するイベントです。
        /// <see cref="Suspend"/>されたときにも発生します。
        /// </summary>
        event EventHandler Detached;

        /// <summary>
        /// オペレーションが起動されたときに発生するイベントです。
        /// <see cref="Resume"/>では発生しません。
        /// </summary>
        event EventHandler Entered;

        /// <summary>
        /// オペレーションが終了したときに発生するイベントです。
        /// <see cref="Suspend"/>では発生しません。
        /// </summary>
        event EventHandler Exited;

        /// <summary>
        /// オペレーションが<see cref="Suspend"/>されたときに発生するイベントです。
        /// </summary>
        event EventHandler Suspended;

        /// <summary>
        /// オペレーションが<see cref="Resume"/>されたときに発生するイベントです。
        /// </summary>
        event EventHandler Resumed;

        /// <summary>
        /// オペレーションが正常終了した時に発生するイベントです。
        /// <see cref="Exited"/> の前に発生します。
        /// </summary>
        event EventHandler Succeeded;
  }
}

重要な注意点があります。

IOperation のメンバーの内、Run(), Suspend(), Resume() については OperationDriver の内部で使用するためのメソッドです。 アプリケーション側でこれらのメソッドを直接呼び出さないようにして下さい。

状態遷移図

IOperationOperationDriver の動きに応じて次のように状態遷移します。

../../_images/OperationStateMachine.png

上図で AbortExit について説明を付記します。 Abort は外部から強制的にオペレーションを終了させることを意味しています。 一方 Exit はオペレーションが完了して自然に終了することを意味しています。

Operation クラス

IOperation インターフェイスを実装した代表的なクラスとして MoNo.Ctrl.Operation クラスが用意されています。 OperationDriver の節で動作確認に用いたのがこのクラスになります。

このクラスはコンストラクタ引数に System.Windows.Forms.Control あるいは MoNo.Graphics.IView を要求します。 そして、指定されたビューでのマウスイベント等を取得する機能を提供します。

下記にこのクラスの定義の一部を示します。 ビューで発生した様々なイベントを扱えることが分かるかと思います。

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<OpenGL.TouchEventArgs> Touched;
        public event EventHandler<OpenGL.GestureEventArgs> Gestured;
        ...
  }
}

このクラスを OperationDriver で Run させると、オペレーションが作動し上記のイベントハンドラが有効になります。 このオペレーションは自然に完了して終了することはなく、何らかの形で外部から Abort しない限り終了しません。

何らかの条件でオペレーションを完了させたいときには、Exit メソッドを呼び出します。