イベント・マネージャ

動作

各コントロールのイベント間でコントロール操作をスパゲッティ状にコーディングすることを避けるため、イベントを一元管理します。これにより、コントロール間の依存関係を排除することができます。 

バージョン

Curl Advanced UI 0.5

API説明

EventManagerクラス

  イベントを一元管理するクラスです。 

パッケージ

  COM.CURLAP.ADVANCED-UI.EVENTS

スーパークラス

  なし

プロパティ

  なし

メソッド

  register  (管理するイベントを登録) ※fromで指定したコントロールのイベントが発生した際、toのイベントを発生させることができます。
    引数1(from:EventTarget):fromコントロール
    引数2(from-event-class:ClassType):fromイベント
    引数3(to:EventTarget):toコントロール
    引数4(to-event-class):toイベント
   戻り値:int  *管理ID(EventManagerの中で一意)

  register-some-events  (管理するイベントを複数登録)
    引数1(from:EventTarget):fromコントロール
    引数2(from-event-class:ClassType):fromイベント
    引数3(to-events:{Array-of {Tuple2-of EventTarget, Event)}:toコントロールとイベント(複数)
   戻り値:{Array-of int}  *管理ID(EventManagerの中で一意)

  unregister (管理するイベントの解除)
    引数1(manage-id:int):解除する管理ID (管理IDは登録時に取得します。)
   戻り値:void 

  unregister-some-events (管理する複数イベントの解除)
    引数1(manage-ids:{Array-of int)}:解除する管理ID (管理IDは登録時に取得します。)
   戻り値:void 

  clear (すべての管理するイベントを解除)
   戻り値:void 

 

NotifyEventクラス

  呼び出し元のコントロールやイベントをもつ通知Eventです 

パッケージ

  COM.CURLAP.ADVANCED-UI.EVENTS

スーパークラス

  Event

プロパティ

  subject:EventTarget  呼び出し元のコントロール
  subject-event-class:ClassType 呼び出し元のイベント

 

利用方法

EventManagerのインスタンスを生成し、registerメソッドに呼び出し元のコントロールとイベント、呼び出すコントロールとイベントを引数にセットし、実行します。これにより、呼び出し元のイベントが発生したと同時に、呼び出し先のイベントを起動します。

{curl 6.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}
{applet manifest = “manifest.mcurl”}

{import * from COM.CURLAP.ADVANCED-UI.EVENTS}
{import * from COM.CURL.GUI.STYLED-CONTROLS}
{install-style-sheet
    {manifest-url “file”, “DEFAULT-STYLE-SHEET”}
}

{value
    || from event.
    let rf:RadioFrame =
        {RadioFrame
            {spaced-hbox
                {RadioButton label = “user”, radio-value = “user”},
                {RadioButton label = “guest”, radio-value = “guest”}
            },
            value = “user”||,
            ||{on e:ValueChanged at v:RadioFrame do
            ||    {dump e, v}
            ||}

        }

    || to event.
    let tf1:TextField =
        {TextField
            {on e:NotifyEvent at v:TextField do
                let value:String =
                    (e.subject asa ValueControl).value-as-any
                    ||{if e.subject isa RadioFrame then
                    ||    (e.subject asa RadioFrame).value
                    || else
                    ||    (e.subject asa TextField).value
                    ||}

                {if value == “user” then
                    set v.enabled? = true
                    set v.value = “”
                 else
                    set v.enabled? = false
                    {if e.subject-event-class == ValueChanged then
                        set value = {value.to-upper-clone}
                    }
                    set v.value = value
                }
                {dump e, v}
            }
        }

    let tf2:TextField =
        {TextField
            {on e:NotifyEvent at v:TextField do
                {if (e.subject asa RadioFrame).value == “user” then
                    set v.enabled? = true
                    set v.value = “”
                 else
                    set v.enabled? = false
                    set v.value = (e.subject asa RadioFrame).value
                }
            }||,
            ||{on e:ValueChanged at TextField do
            ||    || do nothing
            ||
}
        }

    || new EventManager and register.
    def manager = {EventManager}
    {manager.register rf, ValueChanged, tf1, NotifyEvent}
    {manager.register rf, ValueChanged, tf2, NotifyEvent}
    {manager.register tf2, ValueChanged, tf1, NotifyEvent}

    {spaced-vbox
        rf,
        tf1,
        tf2,
        {CommandButton
            label = “remove”,
            {on Action do
                ||{manager.unregister id2}
                {manager.clear}
            }
        }
    }
}

 

RadioFrame(rf)の値が変わったら、TextField(tf1)とTextField(tf2)のNotifyEventが実行されます。また、TextField2の値を変化させた場合、TextField1のNotifyEventが実行されます。

サンプル

イベントマネージャサンプル

関連Curl標準API

Event
EventTarget