オブザーバー
マネージャーの状態の変更時にアプリケーションに通知することができます。この通知機構は、
IlvObserver のサブクラスである
IlvManagerObserver に基づいています。オブザーバーはアプリケーションにより作成され、マネージャーに設定されます。マネージャーは
理由と呼ばれる特定の状況でオブザーバーへのメッセージ送信を管理します。
通知メッセージは理由に応じて異なるカテゴリーに分類されます。オブザーバーに
インタレスト・マスク (interest mask) を設定することにより、1 つまたは複数のカテゴリーのメッセージを受信するよう選択することができます。通知理由がオブザーバーのインタレスト・マスクのカテゴリーに属している場合、マネージャーはオブザーバーにメッセージを送信します。これらのカテゴリーを
Table 3.1 に示します。
通知カテゴリー
カテゴリーの説明 | マスク |
一般 | IlvMgrMsgGeneralMask |
マネージャー・ビュー | IlvMgrMsgViewMask |
マネージャー・レイヤー | IlvMgrMsgLayerMask |
マネージャーの内容 | IlvMgrMsgContentsMask |
オブジェクト・ジオメトリー | IlvMgrMsgObjectGeometryMask |
通知メッセージを受け取るアプリケーションには、
IlvManagerObserver のサブクラスを定義し、仮想メンバー関数
update をオーバーロードする必要があります。オブザーバーはこのメンバー関数で、理由および通知に関する追加情報を含む
IlvManagerMessage のインスタンスまたはサブクラスを受け取ります。
一般通知
このカテゴリーはマネージャーについての一般的な通知です。
Interest mask:IlvMgrMsgGeneralMask
マネージャーを削除します。
理由:IlvMgrMsgDelete
マネージャー・ビュー通知
このカテゴリーはマネージャー・ビューで行われた操作についての通知です。
Interest mask:IlvMgrMsgViewMask
ビューをマネージャーに追加します。
理由:IlvMgrMsgAddView
マネージャーからビューを削除します。
理由:IlvMgrMsgRemoveView
ビューのインタラクターを設定します。
理由:IlvMgrMsgSetInteractor
ビューのトランスフォーマーを設定します。
理由:IlvMgrMsgSetTransformer
マネージャー・レイヤー通知
このカテゴリーはマネージャー・レイヤーで行われた操作についての通知です。
Interest mask:IlvMgrMsgLayerMask
レイヤーをマネージャーに追加します。
理由:IlvMgrMsgAddLayer
マネージャーからレイヤーを削除します。
理由:IlvMgrMsgRemoveLayer
レイヤーのインデックスを変更します。
理由:IlvMgrMsgMoveLayer
2 つのレイヤー間でインデックスを交換します。
理由:IlvMgrMsgSwapLayer
レイヤーの名前を設定します。
理由:IlvMgrMsgLayerName
レイヤーの可視性を設定します。
理由:IlvMgrMsgLayerVisibility
レイヤーの選択性を設定します。
理由:IlvMgrMsgLayerSelectability
マネージャーの内容通知
このカテゴリーはマネージャーの内容の変更についての通知です。
Interest mask:IlvMgrMsgContentsMask
グラフィック・オブジェクトをマネージャーに追加します。
理由:IlvMgrMsgAddObject
マネージャーからグラフィック・オブジェクトを削除します。
理由:IlvMgrMsgRemoveObject
グラフィック・オブジェクトのレイヤーを設定します。
理由:IlvMgrMsgObjectLayer
グラフィック・オブジェクト・ジオメトリー通知
このカテゴリーはオブジェクトのジオメトリーの変更についての通知です (たとえば、移動、リサイズおよび回転)。
Interest mask:IlvMgrMsgObjectGeometryMask
グラフィック・オブジェクトのジオメトリーを変更します。
理由:IlvMgrMsgObjectGeometry
例
レイヤーおよびビューの追加または削除についての通知を受信するオブザーバーの実装は次のようになります。
class MyManagerObserver : public IlvManagerObserver { public: MyManagerObserver(IlvManager* manager) : IlvManagerObserver(manager, IlvMgrMsgLayerMask | IlvMgrMsgViewMask) {} virtual void update(IlvObservable* o, IlAny arg); }; |
update メンバー関数:
void MyManagerObserver::update(IlvObservable* obs, IlAny arg) { IlvManager* manager = ((IlvManagerObservable*)obs)->getManager(); switch(((IlvManagerMessage*) arg)->_reason) { // __ Notification on manager view case IlvMgrMsgAddView: IlvPrint("Add view notification"); break; case IlvMgrMsgRemoveView: IlvPrint("Remove view notification"); break; // __ Notification on manager layer case IlvMgrMsgAddLayer: IlvPrint("Add layer notification:%d", ((IlvManagerLayerMessage*)arg)->getLayer()); break; case IlvMgrMsgRemoveLayer: IlvPrint("Remove layer notification:%d", ((IlvManagerLayerMessage*)arg)->getLayer()); break; default: IlvPrint("Unhandled notification"); break; } } |
オブザーバーをマネージャーに付加します。
MyManagerObserver* observer = new MyManagerObserver(manager);
Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.