Top(J) > Dev > Power Plant > LCommander
about this bar

PowerPlant:LCommander


コマンドとコントロール

LCommanderはコマンドキー入力を制御/処理する クラスである。
コマンドというのは、ユーザのメニューの 選択もしくは対応するショートカットキーの 操作を指す。キー入力はユーザのキー操作である。
だから例えば、ラジオボタンの選択とか スクロールバーのドラッグなどは LCommanderは処理しない。これらはコントロールであり、Message として扱われる(LBroadCasterとLListenerを用いる)。
似ているので注意が必要なのは、メニューバーのプルダウンメニューと windowやdialog上のポップアップメニューである。前者はコマンドとして 扱われ、後者はコントロールの一種である。

LCommanderが取り扱うユーザの操作

・メニューバーからのメニューの選択
・Cmd+キーなどのキーボードショートカット
・キー入力

LCommanderクラスとコマンドチェーン

ユーザのコマンド/キー入力により、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)


Top(J) > Dev > Power Plant > LCommander
about this bar
created by H.M 00.05.22