Sonntagは比較的シンプルな画面やUIの標準ががっちり固まっている画面を量産するような、伝統的な(?)業務アプリケーション開発で使われることを想定したフレームワークです。(逆に少数の画面で複雑なUIを実現するようなアプリケーションの開発には向いていません。例えばGoogleカレンダーみたいなのを作るにはSonntagは全然嬉しくない)
こういったアプリケーションの開発だと、Sonntag以外にもそれ固有の標準や共通仕様を実現するためのさまざまなライブラリ(共通部品とかカスタムコントロールとか呼び方はいろいろ)を用意していくと思います。そしてそれらを使って「アプリケーションロジック」を組み立てていく。
具体的なイベントやイベントターゲットに依存するような処理は、SonntagではアプリケーションロジックではなくUIの詳細だと考えて、スクリーンコマンドで無理やり実装させることは想定していません。そういった処理はたいてい、ライブラリコード側に組み込まれる方が好ましいと思われるからです。
例えば、
・○○画面の××ボタンが押された場合・・・を行う
・△△画面の□□メニューが選択された場合・・・を行う
というような処理と、
・xxにキーフォーカスがあるときにyyキーが押された場合にxxを・・・する
・aaのオブジェクトをbbにドラッグ&ドロップした場合にbbを・・・する
のような処理では粒度がまったく異なるので、これらに同じ作り方をさせなくても問題ないでしょう。
前者はSonntagのスクリーンコマンドで実装し、後者はライブラリコード側なりで(Sonntagを使わない)それぞれに適切な作り方を選択することになると思います。
define-screen-command で Event や EventTarget に直接依存させないようになっているのは一応意図した結果です。
(それらが必要なら素直に on マクロを使う)
ただし、特定のイベント発生時にスクリーンコマンドを実行したいというケースは多々考えられます。
(例えば PasswordField で Enter キーを押したらログインボタンと同じコマンドを実行したい、など)
こういった場合は以下のような記述が可能です。
Code:
{PasswordField
{bind-screen-command "login" on Action}
}
ちなみにこれは以下のコードと同等です。参考まで
Code:
{PasswordField
{on Action at v:Visual do
{if-non-null screen = v.screen then
{screen.do-command
"login",
throw-exception-on-failure? = false
}
}
}
}