|
|
LCommanderはコマンドとキー入力を制御/処理する
クラスである。
コマンドというのは、ユーザのメニューの
選択もしくは対応するショートカットキーの
操作を指す。キー入力はユーザのキー操作である。
だから例えば、ラジオボタンの選択とか
スクロールバーのドラッグなどは
LCommanderは処理しない。これらはコントロールであり、Message
として扱われる(LBroadCasterとLListenerを用いる)。
似ているので注意が必要なのは、メニューバーのプルダウンメニューと
windowやdialog上のポップアップメニューである。前者はコマンドとして
扱われ、後者はコントロールの一種である。
LCommanderが取り扱うユーザの操作
・メニューバーからのメニューの選択
・Cmd+キーなどのキーボードショートカット
・キー入力
ユーザのコマンド/キー入力により、LCommanderクラスにその操作が
通知される。逆に言えば、コマンドやキー入力を受けて何か処理したい
オブジェクトは、LCommanderを継承すればよい。
LCommanderを継承しているクラス(コマンド/キー入力が通知されるクラス)には、
主に以下のようなものがある。
・LApplication
・LDocument
・LWindow,LDialogBox
・LEditField
・LTextEdit
・LTabGroup
それぞれのLCommanderを継承したオブジェクト(これをコマンダーと呼ぶ)の
間には、「コマンドチェーン」と呼ばれる逆さのtree構造があり、この
チェーンによってコマンドの通知の流れが決められる。
コマンダーの上位のコマンダーをスーパーコマンダーといい、各コマンダーは
一つだけスーパーコマンダーを持つ。下位のコマンダーはサブコマンダーといい、
一般に複数存在する。最上位のコマンダーはアプリケーションである。
下の図は、入力フィールドを持つダイアログのスナップショットと そのコマンドチェーンである。
コマンドチェーンのうち、常に一つのコマンダーがターゲットとなる。
上の例ではLEditFieldがターゲットである。
ユーザのコマンド入力は、ターゲットのコマンダーにまず渡される。
具体的にはターゲットのObeyCommand()が呼ばれる。
例えばLEditField::ObeyCommand()では、カット(Cmd+X)コピー(Cmd+C)
ペースト(Cmd+V)などのコマンドに対する処理が実装されている。
しかし必ずしもターゲットコマンダーがそのコマンドを処理する
必要があるとは限らないので、自分が処理しないコマンドの場合は
基底クラスのObeyCommand()に渡すのが一般的である。
LCommander::ObeyCommand()ではスーパーコマンダーに処理を渡すため、
処理の流れは下記のような感じとなる。
(ここまで00.05.22)
|
|