Prototype > C++ アプリケーションでプロトタイプを使用する > アーキテクチャー
 
アーキテクチャー
Prototypes パッケージは、Rogue Wave® Views Foundation パッケージの上で定義されており、次のタスクを実行できます。
*基本的グラフィック・オブジェクトをグループとして組み立てます (クラス IlvGroup)。
*定義済みのアクセサー・オブジェクトあるいはスクリプトを使用してグループの振る舞いを指定します。
*プロトタイプを定義し、マネージャーでプロトタイプ・インスタンスを作成します。プロトタイプは、IlvPrototype と呼ばれる IlvGroup のサブクラスです。
*プロパティー・インスタンス間のプロパティーを接続します。
*アプリケーション・オブジェクトとプロトタイプ・インスタンスをリンクします。
Prototypes パッケージのアーキテクチャーをFigure 4.1に示します。
図 4.1    Prototypes パッケージのアーキテクチャー
グループ
グループは Prototypes パッケージの基本コンポーネントです。
Prototypes パッケージで BGO を作成するには、まずグループを作成する基本 Rogue Wave Views グラフィック・オブジェクトを組み合わせる必要があります。グループ内の任意の Rogue Wave Views グラフィック・オブジェクトを使用できます。サブグループを作成して、構造化オブジェクトを構築することもできます。
グループは C++ のクラス IlvGroup で表されます。IlvGroup オブジェクトは、IlvGroupNode クラスの次のサブクラスで表示されるノードの階層を含んでいます。
*IlvGraphicNode は、グラフィック・オブジェクト (IlvGraphic のサブクラスのインスタンス) を保持するノードです。グループは、そのグラフィック要素それぞれに 1 つのグラフィック・ノードを含んでいます。
*IlvSubGroupNode は、サブグループ、つまり、他のグループに含まれるグループを保持します。このクラスは、オブジェクト階層を作成するために使用されます。
注意: IlvGroupオブジェクトと IlvGraphicSet オブジェクトは異なります。IlvGroup は、マネージャーに含まれるグラフィック・オブジェクトの論理階層です。IlvGraphicSet とは異なり、IlvGroupIlvGraphic のサブクラスではありません。IlvProtoGraphic は、IlvGroup をカプセル化してマネージャーあるいはコンテナーに配置するための IlvGraphic のサブクラスです。
IlvValueSourceNode と呼ばれる IlvGroupNode の 3 番目のクラスはパッケージには含まれていますが、現在は使用されていません。
アトリビュートおよびアクセサー・オブジェクト
Prototypes パッケージを使用すると、オブジェクトのグラフィックの外観だけでなくその振る舞いも定義できます。グループの振る舞いは、そのアトリビュート (プロパティーとも呼ばれる) によって制御されます。これらのアトリビュートは、個別名を有しグループの外部インターフェースを表します。つまり、その外観がどのようにアプリケーションから制御されるかを表します。
グループのアトリビュートおよびそれらの振る舞いは、アクセサー・オブジェクトで定義されています。各アクセサー・オブジェクトには名前とタイプがあり、設定の効果を実装したり、グループに値を取得します。いくつかのアクセサー・オブジェクトは、同じ名前を持つことができます。つまりそれらは同じアトリビュートに属するということです。これは、アトリビュート値を設定すると複数の二次作用が生じる可能性があるということです。
アクセサーは、オブジェクトの他のアトリビュートあるいはアプリケーション・データにリンクさせることができます。これらは、ユーザー・イベントあるいはアプリケーションの指示に反応してステータスあるいは外観の変更を定義し、拡張機能を使ってオブジェクトのグラフィックおよび対話的な振る舞いを指定します。アクセサー・オブジェクトは、IlvAccessor のサブクラスのインスタンスです。
言い換えれば、アクセサー・オブジェクトと値の関係は次のようになります。
*アトリビュートを通じてグループと対話します。
*グループには、それに付加されているアクセサー・オブジェクトのセットがあります。各アクセサー・オブジェクトは、BGO のアトリビュート (あるいはファセット) を定義する名前に関連付けられています。
*IlvGroup::changeValue メソッドは、与えられた名前のアクセサー・オブジェクトすべての changeValue メソッドを呼び出し、それによってアトリビュート値を設定します。
*IlvGroup::queryValue メソッドは、与えられた名前のアクセサー・オブジェクトすべての queryValue メソッドを呼び出し、それによってアトリビュート値を取得します。
*各振る舞いクラスの効果は、changeValue および queryValue メソッドの実装によって定義されています。
*いくつかのアクセサーは、ユーザー・インタラクションを通じてあるいはアプリケーションによって設定することができ、それにより他の振る舞いを連鎖的にトリガーします。
グループのアクセサー・オブジェクトとアトリビュート/振る舞いの関係を、Figure 4.2に示します。
図 4.2    アクセサー・オブジェクト、アトリビュート、および振る舞いの関係
この例は、計器を表すグループを示しています。計器には 2 つのアトリビュート、speedmax があります。
*speed アトリビュートは、それぞれグラフィック振る舞いを持つ 2 つのアクセサー・オブジェクトによって実装されます。
*回転アクセサー・オブジェクト - speed アトリビュートが変更されたとき、このアクセサー・オブジェクトは計器の針を回転させます。
*条件アクセサー・オブジェクト - speed アトリビュートが変更されたとき、このアクセサー・オブジェクトは、値が 30 を上回る場合に円の色を変更します。
*max アトリビュートは、グループ・レベルで基本的グラフィック・オブジェクトのプロパティーを参照するリファレンス・アクセサー・オブジェクトによって実装されています。max アトリビュートが変更されたとき、このアクセサー・オブジェクトはスケール・グラフィック・オブジェクトの最高速度を変更します。
次のタイプのアクセサーを、アトリビュートに付加できます。
*データ・アクセサー - データ・アイテムをどのように保存するか (ローカルまたはノード内)、そしてそのタイプは何かを示します。これらは、通常のプログラム言語における変数宣言に相当します。これらのアクセサーの 1 つのみが各アトリビュートに示されます。
*コントロール・アクセサー - 他のアトリビュートに基づいて条件指示、評価、および代入を行います。これらは、入力パラメーターを取り、他のパラメーターに対する出力効果があります。典型的な例としては、条件代入の条件アクセサーやトグル・アクセサーがあります。
*Notify アクセサー - 評価サイクルの入力ポイントを定義します。アプリケーション (pushValue を行うとき) あるいはユーザー (コールバックがコールバック・アクセサーをトリガーするとき) のいずれかが値をプッシュし、アクセサーにこれらを強制的に処理させます。アトリビュート間の接続は、評価を他の値に伝達するために Watch および Notify アクセサーによって行われます。
*表示アクセサー - グループのノードの視覚的表示へのアトリビュートの二次作用を定義します。これらは、プログラム言語の描画ライブラリーへの呼び出しに相当します。これらが設定されると、ノードの回転あるいはグラフィック・コンポーネントの可視性の変更など、グラフィック・プロパティーを変更します。
*アニメーション・アクセサー - グラフィック・アトリビュートを定期的に変更する特殊なケースの表示アクセサーです。
*その他のアクセサー - 前のカテゴリーに当てはまらない 2 つのアクセサーから構成されます。デバッグ・アクセサーおよびプロトタイプに継承アクセサーです。
定義済みアクセサー・クラスすべての完全な説明については、定義済みアクセサー を参照してください。
アクセサー・パラメーター
アクセサーは、任意のアトリビュートが設定されたときに、他のオブジェクトあるいはアトリビュートに対して実行される二次作用を定義します。つまり、プログラム言語の関数と同様に、アクセサーはその効果をカスタマイズするためにパラメーターを取らなくてはなりません。アクセサーに設定できる 4 種類のパラメーターの説明は、Table 4.1にあります。
アクセサー・パラメーター 
パラメーター・タイプ
説明
直接パラメーター
値は明示的に指定されなくてはならない文字列あるいは列挙型タイプです。
入力パラメーター
値はアクセサーが評価されるときに問い合わせが行われます。これらの値は、定数 (文字列あるいは数値)、他の値へのリファレンス (ノードのアトリビュートあるいはプロトタイプ値)、あるいは定数およびリファレンスの組み合わせである式になります。
出力パラメーター
値は、アクセサーが評価されるときに変更されます (changeValue メソッドへの呼び出しが行われます)。したがって、値は、ノードあるいはプロトタイプ値の既存のアトリビュートを参照する名前である必要があります。
オブジェクト/ノード・パラメーター
パラメーターの値は、既存ノードの名前である必要があります。いくつかのアクセサーは、パラメーターとして特定の種類のオブジェクトのみを受け取ります。たとえば、表示アクセサーはグラフィック・ノードの上でのみ機能します。
入力パラメーター式には、次を含めることができます。
*定数:数値あるいは文字列
*変数:プロトタイプ値あるいはノード・アトリビュート
*算術演算子および括弧: (+, -, *, **, /, %, ==, !=, >, >=, <, <=, &&, ||)
*定義済み関数:abs、acos、asin、atan、ceil、cos、exp、floor、log、rand、rint、round、sin、sqrt、tan。
メモ: C/C++ の場合とは異なり、rand() は整数引数を取ります。この引数が非ゼロの場合、ランダム数が生成される前にランダム生成のシードとして使用されます。そうでない場合、rand(0) は乱数ジェネレーターが最後に初期化されたときに始まる乱数シーケンスの次の整数を返します。
プロトタイプとインスタンス
グラフィックの内容とグループの振る舞いを定義すると、これをプロトタイプとして保存できます。プロトタイプは BGO のモデルです。プロトタイプを直接コーディングで作成することもできますが、通常は、Rogue Wave Views Studio でプロトタイプを作成します。コーディングによるプロトタイプの作成を参照してください。
プロトタイプは、クラス IlvProtoLibrary によって表されるプロトタイプ・ライブラリーを使用して、保管、読み込み、保存することができます。プロトタイプからプロトタイプ・インスタンスを作成できます。プロトタイプ・インスタンスはプロトタイプの完全コピーです。
プロトタイプは IlvPrototype クラスによって表され、プロトタイプ・インスタンスは IlvProtoInstance クラスで表されます。これらのクラスはどちらも IlvGroup のサブクラスです。
プロトタイプ・インスタンスをファイルに保存すると、マネージャーはそのインスタンスに対して変更されたプロパティーの値のみを書き込みます。プロトタイプ・インスタンスを構成しているグラフィック・オブジェクトは、ファイルには保存されません。したがって、プロトタイプの定義を完全に変更したり、グラフィック・オブジェクトの追加、削除などができます。変更したプロトタイプのインスタンスは、新規の定義で自動的に更新されます。
マネージャーとコンテナーでグループおよびインスタンスを表示する
グループ、プロトタイプ、およびインスタンスをアプリケーション (IlvManager あるいは IlvContainer) のパネルに表示するには、これらを IlvProtoGraphic オブジェクトに配置し、オブジェクトをマネージャーあるいはコンテナーに追加する必要があります。IlvProtoGraphic は、グループのすべてのグラフィック・オブジェクトをカプセル化するように設計されている IlvGraphic のサブクラスです。コンテナーあるいはマネージャーのプロパティーを拡張するクラスであり、便利な関数でグループを直接追加したり取得できるようにする IlvGroupHolder を使用して、グループをマネージャーに追加することもできます。このクラスは、IlvGroup の周囲でそれをラップするために IlvProtoGraphic を作成します。
メモ: 特別マネージャーおよびコンテナー・クラス IlvProtoManagerIlvProtoContainer、および IlvProtoGrapher は、コンテナーあるいはマネージャー内の IlvGroup オブジェクトの直接処理を可能にするために追加されています。これらのクラスは、互換性の理由から保持されています。これらは、古いクラスですので使用しないでください。
アトリビュートの接続
グループには読み書き可能アトリビュートがあり、それに付加されたアクセサー・オブジェクトによって定義されています。グループまたは要素の 1 つから生成されるイベントに似た Norify アトリビュートがあることもあります。
Notify アトリビュートは、他のグループのアトリビュートへ接続することができます。アトリビュートが変更されると、変更はこれに接続されているグループに伝達されます。これは、接続アトリビュートへプッシュされる Notify アトリビュートの値として参照されます。
アプリケーション・オブジェクトをプロトタイプへリンクする
プロトタイプおよびパネルを定義したら、これらを C++ で定義されている実際のアプリケーション・データおよびプロセスに接続します。
作成するインターフェースのタイプに応じて、プロトタイプをアプリケーション・オブジェクトにリンクするために使用できるメソッドが 3 つあります。
*表示にグラフィックが多く、アプリケーション・オブジェクトや値がわずかしかない場合は、直接値を与えて任意のパネルのプロトタイプ・インスタンスにアプリケーション・オブジェクトをリンクします。
これは一般的には、定義済みのグラフィック・コンポーネントのみで構成される静的な要約表示で使用されます。アプリケーション値をプロトタイプ・インスタンス経由で変更するときに、アプリケーションでユーザー入力を期待しない場合は、値の直接入力が便利です。<ILVHOME>/samples/protosbase_feed サンプルは、シンプルなコントロール・パネルにこのアプローチを使う方法を示しています。
*WYSIWYG、直接操作アプリケーション・オブジェクト・エディターを構築するために、IlvGroupMediator を使用する場合があります。このクラスで、アプリケーション・オブジェクトをパネルの任意の IlvGroup (あるいはプロトタイプ・インスタンス) にリンクさせて、このアトリビュートのインタラクティブな編集を可能にすることができます。グループ・メディエーターを使うと、アプリケーション・オブジェクトをオブジェクトのエディターとして機能する任意のプロトタイプに動的に結合したり、結合を解除させることができます。
このタイプの一般的なアプリケーションは、Prototypes Studio のガイドの詳細設定などの WYSIWYG 詳細設定です。<ILVHOME>/samples/protosinspector サンプルは、この種のエディターの例です。これは、ビューのビュー・ポイントをインタラクティブに制御する 2D 変換マトリックス・エディターの構築方法を示しています。
*任意のアプリケーション・オブジェクトにリンクされている各インスタンスで、動的にプロトタイプのインスタンスを多数作成するには、IlvProtoMediator を使用します。このクラスはプロトタイプをインスタンス化して、これを作成されたときに任意のクラスのアプリケーション・オブジェクトにリンクします。これにより、インターフェース・デザインとアプリケーション・デザインが明白に分離されます。これで各々を共通のアプリケーション・インターフェースとは別に開発できます。
このタイプの典型的なアプリケーションでは、パネルを表示させ、多数のクラスの多数のオブジェクトを表してそれを同時に編集できます。各アプリケーション・クラスはプロトタイプにリンクされており、クラスの各インスタンスはプロトタイプのインスタンスにリンクされています。
地図表示およびすべてのグラフ表示は、IlvProtoMediator を使用するプロトタイプから利益を受けるアプリケーションの例です。<ILVHOME>/samples/protos/interact_synoptic は、このタイプのアプリケーションの例で、フライトと空港の各々がプロトタイプ・インスタンスで表示されているとてもシンプルな航空シミュレータを表しています。シミュレータはフライトのアトリビュートの変更のみを扱い、プロトタイプは最善の表示を行うために描画エディターでインクリメンタルに改善できます。

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.