Oracle® Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド 11gリリース1 (11.1.1.7.0) B52029-07 |
|
![]() 前 |
![]() 次 |
この章では、ADF階層ビューア・コンポーネントを使用してデータを表示する方法、および階層表示のカスタマイズ・オプションについて説明します。
この章では、次の項目について説明します。
ADF階層ビューアのデータ・バインディングの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項を参照してください。
階層ビューア・コンポーネントは階層データの視覚表示に使用できます。階層データにはデータ内にマスター/ディテール関係が含まれています。たとえば、組織内の従業員間の関係に関する情報が含まれるデータ・コレクションから、組織図をレンダリングする階層ビューア・コンポーネントを作成することもできます。
JDeveloperでは、コンポーネント・ギャラリからJSFページにコンポーネントをドラッグ・アンド・ドロップする場合、または『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項での説明のとおり、「階層ビューアの作成」ダイアログを使用して階層ビューア・コンポーネントを作成する場合、JSFページに次の要素が生成されます。
dvt:hierarchyViewer
この要素はdvt:node
要素およびdvt:link
要素をラップします。
dvt:node
ノードは階層のデータを参照する形状です(たとえば、組織の従業員またはネットワークのコンピュータ)。表示するデータを参照するdvt:node
要素の子要素を構成します。dvt:node
要素は、様々なズーム・レベル(100%、75%、50%および25%)でコンテンツを表示する1つ以上のf:facet
要素の使用をサポートします。f:facet
要素は、ADFデータ視覚化dvt:panelCard
コンポーネントに加えてaf:outputText
、af:image
およびaf:panelGroupLayout
などの多数のADF Facesコンポーネントの使用をサポートします。
実行時に、ノードにはユーザーにノード間のナビゲートを可能にし、デフォルトで他のノードを表示または非表示にできるコントロールが含まれます。ノード・コンテンツの指定とズーム・レベルの定義の詳細は、31.4.1項「ノード・コンテンツの指定方法」を参照してください。
dvt:link
1つのノードを別のノードに接続するdvt:link
要素の属性の値を設定します。リンクの外観のカスタマイズ方法とラベルの追加方法の詳細は、31.8.4項「リンクとラベルの表示の構成方法」を参照してください。
dvt:panelCard
パネル・カード要素には、アニメーションを使用して(コンテンツを横にスライドしたり、ノードを反転したりするなど)ノード要素ごとに複数のコンテンツ参照セットを動的に切り替えるメソッドがあります。
各ズーム・レベルのf:facet
タグは、指定したズーム・レベルで表示するようにコンテンツを定義する1つ以上のaf:showDetailItem
要素を含むdvt:panelCard
要素の使用をサポートします。実行時に、エンド・ユーザーはaf:showDetailItem
要素が参照するコンテンツを動的に切り替えるノードのコントロールを使用します。詳細は、31.7項「パネル・カードの使用」を参照してください。
注意: 他の要素とは異なり、コンポーネント・ギャラリを使用して階層ビュータを作成するときにデフォルトのクイック・レイアウト・オプションを選択した場合、 |
階層ビューア・コンポーネントでは、af:panelGroupLayout
、af:spacer
、af:separator
などの要素を使用して、ノードでのコンテンツの表示方法を定義します。例31-1に、コンポーネント・パレットから挿入してコンポーネントを作成する場合に生成されるコードを示します。この例では、階層ビューア要素に関連するコードが強調表示されています。
例31-1 階層ビューアのサンプル・コード
<dvt:hierarchyViewer id="hierarchyViewer1" layout="hier_vert_top"
styleClass="AFStretchWidth">
<dvt:link linkType="orthogonalRounded" id="l1"/>
<dvt:node width="233" height="330" id="n1">
<f:facet name="zoom100">
<af:panelGroupLayout layout="vertical" styleClass="AFStretchWidth AFHVNodeStretchHeight AFHVNodePadding" id="pgl3"> <af:panelGroupLayout layout="horizontal" id="pgl4"> <af:panelGroupLayout styleClass="AFHVNodeImageSize" id="pgl2"> <af:image id="i1"/> </af:panelGroupLayout> <af:spacer width="5" height="5" id="s1"/> <af:panelGroupLayout layout="vertical" id="pgl1"> <af:outputText value=" attribute value1 " styleClass="AFHVNodeTitleTextStyle" id="ot6"/> <af:outputText value=" attribute value2" styleClass="AFHVNodeSubtitleTextStyle" id="ot8"/> <af:outputText value=" attribute value3" styleClass="AFHVNodeTextStyle" id="ot7"/> </af:panelGroupLayout> </af:panelGroupLayout> <af:spacer height="5" id="s4"/> <af:separator id="s3"/> <af:spacer height="5" id="s2"/><dvt:panelCard effect="slide_horz" styleClass="AFHVNodePadding" id="pc1">
<af:showDetailItem text="first group title " id="sdi1">
<af:panelFormLayout styleClass="AFStretchWidth AFHVNodeStretchHeight AFHVNodePadding" id="pfl2"> <af:panelLabelAndMessage label="attribute label4" styleClass="AFHVPanelCardLabelStyle" id="plam4"> <af:outputText value="attribute value4" styleClass="AFHVPanelCardTextStyle" id="ot4"/> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="attribute label5" styleClass="AFHVPanelCardLabelStyle" id="plam2"> <af:outputText value="attribute value5" styleClass="AFHVPanelCardTextStyle" id="ot2"/> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="attribute label6" styleClass="AFHVPanelCardLabelStyle" id="plam3"> <af:outputText value="attribute value6" styleClass="AFHVPanelCardTextStyle" id="ot3"/> </af:panelLabelAndMessage> </af:panelFormLayout></af:showDetailItem>
<af:showDetailItem text="second group title " id="sdi2">
<af:panelFormLayout styleClass="AFStretchWidth AFHVNodeStretchHeight AFHVNodePadding" id="pfl1"> <af:panelLabelAndMessage label="attribute label7" styleClass="AFHVPanelCardLabelStyle" id="plam5"> <af:outputText value="attribute value7" styleClass="AFHVPanelCardTextStyle" id="ot5"/> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="attribute label8" styleClass="AFHVPanelCardLabelStyle" id="plam1"> <af:outputText value="attribute value8" styleClass="AFHVPanelCardTextStyle" id="ot1"/> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="attribute label9" styleClass="AFHVPanelCardLabelStyle" id="plam6"> <af:outputText value="attribute value9" styleClass="AFHVPanelCardTextStyle" id="ot9"/> </af:panelLabelAndMessage> </af:panelFormLayout></af:showDetailItem>
</dvt:panelCard>
</af:panelGroupLayout></f:facet>
</dvt:node>
</dvt:hierarchyViewer>
階層ビューアは、階層データおよびマスター/ディテール関係を視覚的に表示します。図31-1に、コントロール・パネル、多数のノードおよびノードを接続するリンクを含む実行時の階層ビューア・コンポーネントのセグメントを示します。
コントロール・パネルでは、ユーザーが実行時に階層ビューア・コンポーネントの位置と外観を操作できるコントロールが提供されます。デフォルトで、図31-2に示すとおり、階層ビューア・コンポーネントの左上隅に非表示状態で表示されます。
コントロール・パネルが別の場所に表示されるように構成することはできません。ユーザーは、図31-2に示すコントロール・パネルの非表示または表示ボタンをクリックして、コントロール・パネルを非表示にするか開きます。図31-3に、展開されたコントロール・パネルを示します。
実行時にコントロール・パネルがユーザーに表示されないように階層ビューア・コンポーネントを構成できます。手順の詳細は、31.8.3項「コントロール・パネルの表示の構成方法」を参照してください。
表31-1では、コントロール・パネルのコントロールでユーザーに提供される機能を説明します。パネル・セレクタは、階層ビューア・コンポーネントのノードに、1つ以上のaf:showDetailItem
要素を持つdvt:panelCard
要素が含まれていると自動的に有効になります。階層ビューア・コンポーネントで次のいずれかのレイアウトが使用されていると、レイアウト・セレクタが自動的に表示されます。
垂直方向、上から下
水平方向、左から右
ツリー
放射
円
階層ビューア・コンポーネントのレイアウトの詳細は、31.1.3項「使用可能な階層ビューアのレイアウト・オプション」を参照してください。
表31-1 コントロール・パネルの要素
コントロール | 名前 | 説明 |
---|---|---|
![]() |
パン制御 |
ユーザーはビューポート内の階層ビューア・コンポーネントを再配置できます。 |
![]() |
ズームしてあわせる |
ユーザーはビューポート内にすべてのノードが表示されるように、階層ビューア・コンポーネントにズームできます。 |
![]() |
ズーム制御 |
ユーザーは、階層ビューア・コンポーネントにズームできます。 |
![]() |
非表示/表示 |
コントロール・パネルを表示または非表示にします。 |
![]() |
パネル・セレクタ |
定義したノード・パネルのリストが表示されます。ユーザーはパネル・セレクタを使用して、すべてのノードを同じパネルに一度に表示できます。 |
![]() |
レイアウト・セレクタ |
レイアウトの選択を可能にします。ユーザーは階層ビューア・コンポーネントのレイアウトを、階層ビューア・コンポーネントによって提示されるレイアウト・オプションの1つに定義したレイアウトから変更できます。詳細は、31.1.3項「使用可能な階層ビューアのレイアウト・オプション」を参照してください。 |
階層ビューアは、ノードの選択、展開、横方向移動に関する状態管理をサポートします。ユーザーがノードを選択または展開したり、同じ親内で左または右に移動して、次のノード・セットを表示する場合、タブ付パネルのように、移動後にページに戻ると、その状態は維持されます。状態管理は、disclosedRowKeys
、selectedRowKeys
、lateralNavigationRowKeys
などの階層ビューア属性でサポートされます。
階層ビューアは、ノード・コンテンツ、検索パネル、および検索結果の表示で双方向テキストをサポートします。双方向テキストは、両方向のテキスト(右から左(RTL)および左から右(LTR))のテキストを含むテキストです。これは、通常、アラビア語やヘブライ語のスクリプトなどの各種アルファベットが含まれるテキストです。階層ビューアは、あるノード・ビューから次のノード・ビューへのパネル・カードの反転用の双方向サポートも提供します。
階層ビューアは、コンポーネントのtype
属性で指定される次のレイアウトを使用できます。
hier_vert_top
- 上から下への垂直方向
hier_vert_bottom
- 下から上への垂直方向
hier_horz_left
- 左から右への水平方向
hier_horz_right
- 右から左への水平方向
hier_horz_start
- 水平方向。ロケールによって向きが決まります。
hier_horz_end
- 水平方向。ロケールによって向きが決まります。
tree
- ツリー。インデントされたツリー
radial
- 放射状。ルート・ノードが中央に配置され、後続の子レベルがそれぞれの親ノードから外側に向かって放射状に広がります。
circle
- 円。ルート・ノードが中央に配置され、すべてのリーフ・ノードが同心円に配置されるレイアウト。親ノードは円の内側に配置されます。
図31-4に、階層ビューア・コンポーネントの円レイアウトの例を示します。
ページにコンポーネントを挿入する際(データ・コントロール・パネルからデータ・コレクションと階層ビューア・コンポーネントをバインドするか、コンポーネント・パレットからコンポーネントを挿入して後からデータにバインドする)、階層ビューアの初期レイアウトを定義できます。使用可能なレイアウトは、図31-5に示すように、コンポーネント・ギャラリの「階層ビューア・タイプ」領域に表示されます。
注意: 円レイアウトは、コンポーネント・ギャラリでは使用できません。円レイアウトで階層ビューアを作成するには、プロパティ・インスペクタで |
図31-5に示す選択のように、コンポーネント・ギャラリの「クイック・スタート・レイアウト」領域では、ノードの複数のコンテンツ・セットをサポートするdvt:panelCard
要素の生成を選択することもできます。
デフォルトでは、階層ビューア・コンポーネントはFlash Playerでレンダリングします。Flash 10以上がクライアントで使用できない場合や印刷が目的の場合、階層ビューアはHTMLでレンダリングされます。HTMLレンダリングはFlashレンダリングにできるかぎり細かく従いますが、いくつかの相違があります。次の例外を除き、ほとんどの場合、階層ビューアの表示と機能はサポートされます。
分離ノードおよびリストア・ノードは使用できません。
ノードの形状は長方形に制限されます。
リンクの場合、リンクの終点コネクタはサポートされません。リンク・タイプは直交に制限され、リンク・スタイルは実線に制限されます。
コントロール・パネルの場合、パネル・カードはすべて切り替えることができません。パンはスクロール・バーに制限され、ズームおよびズーム・フィットは4つのズーム・ファセットに制限されます。
検索はサポートされません。
メール可能なページはサポートされません。
ノードの詳細を示すホバー・ウィンドウはサポートされません。
階層ビューア・コンポーネントには、1つ以上のディテール・コレクションと1つのマスター・ディテール・コレクションとの間にマスター/ディテール関係が存在するデータ・コレクションが必要です。階層ビューア・コンポーネントでは、ADF Faces tree
コンポーネントと同じデータ・モデルが使用されます。データ・コレクションをまずADF Faces tree
コンポーネントにバインドすることによって、データ・コレクションを階層ビューア・コンポーネントにバインドできるかどうかテストできます。ADF Faces tree
コンポーネントを使用してデータ・コレクションをナビゲートできれば、階層ビューア・コンポーネントにバインドすることができます。
JSFページに階層ビューア・コンポーネントを追加すると、JDeveloperによりJSFページのページ定義ファイルにツリー・バインディングが追加されます。ツリー・バインディングでノードにデータを移入する方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のマスター/ディテール・オブジェクトの表示にツリーを使用する方法に関する項を参照してください。
ユーザーが階層ビューア・コンポーネントのルート・ノードから下方向にナビゲートできるようにするには、階層ビューア・コンポーネントでノードにバインドするデータ・コレクションに再帰的アクセッサが含まれている必要があります。階層ビューア・コンポーネントのナビゲートの詳細は、31.5項「階層ビューアのナビゲート」を参照してください。
階層ビューアをコンポーネント・パレットからページにドラッグすることで、階層ビューアを作成できます。階層ビューア作成時にデータのバインドを選択することも、階層ビューア作成の後にデータのバインドを追加することもできます。
アプリケーションでFusionテクノロジ・スタックが使用される場合、データ・コントロールを使用して階層ビューアを作成することもできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項を参照してください。
JSFページに階層ビューアを追加するには、コンポーネント・パレットを使用します。ページに階層ビューア・コンポーネントをドラッグ・アンド・ドロップすると、階層ビューアの作成ダイアログがコンポーネント・ギャラリに使用可能な階層ビューア・レイアウトのカテゴリを説明とともに表示し、階層ビューアの作成時に視覚的に支援します。図31-5に、上から下の垂直方向レイアウト・タイプが選択された階層ビューアのコンポーネント・ギャラリ・ダイアログを示します。
階層ビューア・レイアウトを選択して、ページに階層ビューアが追加されると、プロパティ・インスペクタを使用して、データ値を指定し、階層ビューアに追加の表示属性を構成できます。または、作成中にデータのバインドを選択し、プロパティ・インスペクタを使用して追加の表示属性を構成することができます。
プロパティ・インスペクタで、各属性フィールドのドロップダウン・メニューを使用して、プロパティの説明、およびEL式ビルダーまたはその他の専用ダイアログの表示などのオプションを表示できます。図31-6に、階層ビューア・コンポーネントのAncestor Levels
属性のドロップダウン・メニューを示します。
注意: アプリケーションでFusionテクノロジ・スタックが使用される場合、データ・コントロールを使用して階層ビューアを作成でき、バインドが行われます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項を参照してください。 |
ページに階層ビューアを追加する手順:
コンポーネント・パレットのADFデータ視覚化ページで、階層ビューアパネルから階層ビューアをページにドラッグ・アンド・ドロップし、階層ビューアの作成ダイアログを開きます。
ダイアログを使用して、階層ビューアのレイアウト・タイプを選択します。ダイアログのヘルプを参照するには、「ヘルプ」をクリックするか、[F1]を押します。
プロパティ・インスペクタで、階層ビューアの属性を表示します。ヘルプ・ボタンを使用して、hierarchyViewer
コンポーネントの完全なタグ・ドキュメントを表示します。
「共通」セクションを開きます。このセクションを使用して、次の属性を設定します。
Layout:階層ビューアの階層のレイアウトを指定します。
祖先のレベル (サブメニューの表示): 初期レンダリングで表示する祖先レベルの数を指定するdisplayLevelsAncestor
属性の設定に使用します。このプロパティはゼロから始まります。値0は、ルートの上の祖先レベルが表示されないことを意味します。デフォルト値は0です。
「構成」をクリックすれば、「祖先表示の構成」ダイアログが開き、使用する祖先データ・コレクションを指定できます。
子孫のレベル (サブメニューの表示): 初期レンダリングで表示する子孫レベルの数を指定するdisplayLevelsChildren
属性の設定に使用します。このプロパティはゼロから始まります。値0は、ルートの下の子レベルが表示されず、ルート自体は表示されることを意味します。デフォルト値は1で、ルートおよび子の最初のレベルが表示されることを意味します。
注意:
|
レベル当たりのノード (サブメニューを表示): 展開された親ノードごとに一度にフェッチされ、表示される子ノードの数を指定するlevelFetchSize
属性の設定に使用します。階層ビューアに表示される横方向のナビゲーション・コントロールを使用すれば、追加の子ノードをフェッチし、表示できます。デフォルト値は25です。
「階層ビューア・データ」セクションを開きます。このセクションを使用して、次の属性を設定します。
Value: 階層ビューアのデータ・モデルを指定し、javax.faces.TreeModel
のインスタンスにすることができます。
Var: 階層ビューア・データ・コレクションの各要素の参照に使用される変数を指定します。このコンポーネントのレンダリングが完了すると、この変数は削除されるか、その前の値に戻ります。
「外観」セクションを開きます。このセクションを使用して、次の属性を設定します。
Summary:階層ビューアの説明を入力します。この説明は、スクリーン・リーダーのユーザーがアクセスします。
EmptyText:階層ビューアにデータが表示されない場合に表示するテキストを指定します。
「動作」セクションを開きます。このセクションを使用して、次の属性を設定します。
ControlPanelBehavior:コントロール・パネルの動作を指定します。詳細は、31.8.3項「コントロール・パネルの表示の構成方法」を参照してください。
Panning: パンの動作を指定します。デフォルト値は、クリック・アンド・ドラッグ・パンに対するdefaultです。自動3Dティルト・パンが有効なクリック・アンド・ドラッグ・パンのティルト値も指定できます。
ノードは、実行時に階層ビューア・コンポーネントの個々の要素を示す形状です。階層ビューア・コンポーネントの個々の要素の例には、組織図の従業員またはネットワーク・ダイアグラムのコンピュータが含まれます。デフォルトで、階層ビューア・コンポーネントの各ノードには、ユーザーが次のことを実行できるコントロールが含まれています。
階層ビューア・コンポーネントの他のノードへのナビゲート
各ノードの上部には、親ノードを表示するか、階層ビューアのアンカー・ノードとして選択するリストア・ボタンまたは分離ボタンが1つあります。例外は階層ビューア・コンポーネントの最上部のノードで、理由はこのノードには親ノードがなく分離できないからです。
階層ビューア・コンポーネントで現在選択されているノードの子ノードの表示または非表示
リーフ・ノードではないすべてのノードの下部には、「表示」または「非表示」ボタンが表示されます。ユーザーがこれらのアイコンのいずれかをクリックすると、コンポーネントによりRowDisclosureEvent
イベントが生成されます。このイベントに対応する処理を実行するには、 af:tree
コンポーネントと同じ方法でカスタムのrowDisclosureListener
メソッドを登録します。詳細は、10.5.4項「プログラムを使用したノードの開閉について」を参照してください。
パネル・カードを使用して、階層ビューア・コンポーネントが参照するノードの様々な情報セットを表示する場合、ノードの下部にあるコントロールにより、アクティブ・ノードの情報セットを変更できます。詳細は、31.7項「パネル・カードの使用」を参照してください。
図31-7に、エンド・ユーザーがアンカー・ノードとしてノードを分離し、子ノードを表示して、アクティブ・ノードの様々な情報セットを表示するようにノードを変更できるコントロールを含むノード例を示します。ノードのコントロールの構成方法の詳細は、31.4.2項「ノードのコントロールの構成方法」を参照してください。
基本的なノード・タイプは4つあります。
ルート・ノードは、階層ビューア・コンポーネントで表示可能な最上ノードです。ルート・ノードは、常にツリー・コンポーネントから返される階層のルートになります。通常、一度に表示されるルート・ノードは1つのみです。ただし、実装するユース・ケースによって、複数のルート・ノードが表示される場合もあります(ファミリ・ツリーの場合など)。
アンカー・ノードは、階層ビューア・コンポーネントがレンダリングされると必ずフォーカスされるノードです。表示されるアンカー・ノードは常に1つのみです。
ツリー・ノードに子ノードが定義されていて、階層ビューア・コンポーネントのdisplayLevelsAncestor
プロパティが0
に等しい場合は、アンカー・ノードはルート・ノードと同じになります。実行時に、ユーザーがsetAnchorListener
プロパティに指定された値を持つ別のノードをダブルクリックすると、そのノードがアンカー・ノードになります。子ノードがあるかどうかによって、アンカー・ノードも内部ノードまたはリーフ・ノードにすることができます。アンカー・ノードの指定方法の詳細は、31.4.4項「ノード定義と特定のデータ行セットを関連付ける方法」を参照してください。
アンカー・ノードより上に、1つ以上の祖先レベルを指定できます。詳細は、31.4.5項「アンカー・ノードの祖先レベルの指定方法」を参照してください。
内部ノードは、子ノードを持つノードです。
リーフ・ノードは、子ノードを持たないノードです。
図31-8に、階層ビューア・コンポーネントのレイアウトによって、ノードを別のタイプにする方法を示します。
ノードには、ノードにナビゲートして、ノードを表示または非表示にできるコントロールがデフォルトで含まれますが、階層ビューア・コンポーネントを作成するときに、クイック・スタート・レイアウトを使用した場合を除き、ノードにコンテンツはデフォルトで含まれません。実行時にノードによってレンダリングされるコンテンツを定義する必要があります。『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項での説明のとおり、データ・バインディングと階層ビューア・コンポーネントを関連付けると、ノード・コンテンツを指定できます。
デフォルトで、作成する階層ビューア・コンポーネントにはズーム・レベル100%のファセット要素を1つ持つノードが1つ作成されます。
<f:facet name="zoom100"/>
次のズーム・レベルを使用して、さらに3つのファセット要素のインスタンスを階層ビューア・コンポーネントに挿入できます。
25%: zoom25
50%: zoom50
75%: zoom75
階層ビューアをズーム・アウトして、表示するノードを増やし、各ノードで利用可能な表示領域を減らす場合、これらのズーム・レベル定義を使用すると、ノード・コンテンツの読みやすさが向上します。1つ以上のファセット要素内で使用可能なデータ・コレクションのサブセットを定義できます。たとえば、名前、場所および数など、会社の部署に関するデータを参照するノード属性を持つデータ・コレクションがある場合、部署の名前と数のノード属性を参照する、ズーム・レベル50%のファセット要素を指定できます。
実行時、どのズーム・レベルでノード上にカーソルを置いても、ズーム・レベル100%でノード・コンテンツを表示するホバー・ウィンドウが自動的に表示されるため、ズーム・レベルに関係なく情報をすべて表示できます。ノードが階層ビューアで選択されている場合、ホバー・ウィンドウ上のコントロールはアクティブです。
挿入する各ファセット要素は、他のコンポーネントの参照に使用できます。次のコンポーネントから1つ以上を使用して、階層ビューア・コンポーネントのノードにコンテンツを定義できます。ノード・コンポーネントのファセットは、次のコンポーネントをサポートします。
af:commandButton
af:commandImageLink
af:commandLink
af:commandMenuItem
af:goButton
af:goLink
af:image
af:image
コンポーネントの使用方法の詳細は、31.8.2項「階層ビューアにイメージを含める方法」を参照してください。
af:menu
af:outputFormatted
af:outputText
af:panelFormLayout
af:panelGroupLayout
panelGroupLayout
コンポーネントの使用方法の詳細は、8.13.1項「panelGroupLayoutコンポーネントの使用方法」を参照してください。
af:panelLabelAndMessage
af:separator
af:showDetailItem
af:showPopupBehavior
af:showPopupBehavior
コンポーネントの使用方法の詳細は、31.6.3項「ポップアップ・ウィンドウを起動するための階層ビューアの構成方法」を参照してください。
af:spacer
dvt:panelCard
dvt:panelCard
コンポーネントの使用方法の詳細は、31.7項「パネル・カードの使用」を参照してください。
注意: サポートされないコンポーネントは、設計時に反転されます。 |
階層ビューア・コンポーネントにノードを追加する手順:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「dvt:hierarchyViewerの中に挿入」→「ノード」を選択します。
次のエントリがJSFページに表示されます。
<dvt:node> <f:facet name="zoom100"/> </dvt:node>
構造ウィンドウでdvt:nodeノードを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタで、適切なプロパティを構成します。
たとえば、ノード・コンポーネントとアクセッサを関連付けるには、type
プロパティに値を設定します。
<dvt:node type="model.rootEmp model.HvtestView"/>
詳細は、31.4.3項「アクセッサのノード定義の指定方法」を参照してください。
ノード・コンポーネント(dvt:node
)では、リストア、分離、表示または非表示などのコントロールを実行時に表示するかどうかを決定できる多くのプロパティが公開されます。実行時のノードのサイズと形状を決定するプロパティも公開されます。
ノードにコントロールを構成する手順:
構造ウィンドウでdvt:node
コンポーネントを右クリックし、「プロパティに移動」を選択します。
表31-2に説明されているとおり、プロパティ・インスペクタの外観セクションでdvt:node
コンポーネントのプロパティを構成します。
表31-2 ノード構成プロパティ
実行する手順 | プロパティに設定する値 |
---|---|
表示または非表示コントロールをノードに表示するかしないかを構成します。 |
コントロールを非表示にするには、 |
リストアまたは分離コントロールをノードに表示するかしないかを構成します。 |
ノードでこれらのコントロールを非表示にするには、
|
ノードの高さと幅を構成します。 |
|
ノードの形状を選択します。 |
「図形」ドロップダウン・リストから値を選択します。使用可能な値は次のとおりです。
|
プロパティ・インスペクタの「スタイル」セクションのプロパティの構成の詳細は、20.4項「コンポーネントのスタイル・プロパティの変更」を参照してください。
ホバー・ディテール・ウィンドウは、ノード上をカーソルが移動すると自動的に表示され、そのノードに設定されるshape
属性が反映されます。たとえば、ノードのshape
属性がroundedRect
の場合、図31-9に示すように、ディテール・ウィンドウの属性も同じになります。
76-100%のズーム・レベルでないノードをホバーしているとき、ディテール・ウィンドウの表示を無効化できます。詳細は、31.8.5項「ホバー・ディテール・ウィンドウの無効化の方法」を参照してください。
デフォルトで、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項での説明のとおり、「階層ビューアの作成」ダイアログを使用して、階層ビューア・コンポーネントを作成する場合は、ノード・コンポーネントをアクセッサと関連付けます。「階層ビューアの作成」ダイアログでは、ノード・コンポーネントのtype
プロパティが特定のアクセッサに設定されます。
ノード・コンポーネントのtype
プロパティを構成して、指定された1つ以上のアクセッサを使用できます。あるいは、31.4.4項「ノード定義と特定のデータ行セットを関連付ける方法」での説明のとおり、アクセッサ間でノード定義を使用するようにノード・コンポーネントのrendered
プロパティを構成できます。階層ビューア・コンポーネントで特定のデータ行にどのノード定義を使用するかを決定する場合、最初にtype
プロパティの一致があるかどうかを確認します。
type
プロパティと一致し、rendered
プロパティの値がtrue
(デフォルト)の場合、階層ビューア・コンポーネントでノード定義が使用されます。
type
プロパティと一致しない場合、階層ビューア・コンポーネントではrendered
プロパティの値がtrue
と評価されるかどうかが確認されます。rendered
プロパティの評価の結果は、type
には影響しません。
ノード・コンポーネントのrendered
プロパティを使用して、ノードを特定のデータ行セットまたは単一データ行と関連付けることができます。rendered
プロパティでは、ブール値を使用して、true
またはfalse
に評価してノード定義に関連付けるデータ行を決定するEL式を記述できます。たとえば、肩書に基づくデータをノードに表示するとします。ノード・コンポーネントのrendered
プロパティに対して、肩書が指定した値(この例ではCEO
)と一致する場合にtrue
と評価する次の疑似EL式のようなEL式を記述します。
rendered="#{node.title == 'CEO'}"
ノード・コンポーネントのrendered
プロパティをこのように使用する場合は、そのノード・コンポーネントのtype
プロパティの値は定義しません。
階層ビューア・コンポーネントのアンカー・ノードは、ツリー・バインディングによって返される階層のルートです。ユース・ケースによって、複数のルート・ノードにすることができます(1人以上のマネージャのいる組織図をレンダリングする階層ビューア・コンポーネントなど)。実行時に階層ビューア・コンポーネントをレンダリングすると、フォーカスのあるノードがアンカー・ノードになります。実行時に、ユーザーがsetAnchorListener
プロパティに指定された値を持つ別のノードをダブルクリックすると、そのノードがアンカー・ノードになります。
アンカー・ノードの上のレベル(祖先レベル)を1つ以上表示するように階層ビューアを構成できます。たとえば、企業の従業員を検索する場合、従業員の上の管理チェーンを表示できます。displayLevelsAncestor
プロパティを使用して、祖先レベルを指定します。
アンカー・ノードの祖先レベル数を指定する手順:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタで、「共通」セクションを開きます。
実行時に、アンカー・ノードの上に表示する祖先ノードのレベル数をdisplayLevelsAncestor
プロパティで指定します。
たとえば、アンカー・ノードの祖先レベルの数に2
を入力すると、JSFページに次のエントリが表示されます。
displayLevelsAncestor="2"
JSFページへの変更を保存します。
デフォルトで、階層ビューア・コンポーネントのルート・ノードと内部ノードには下方向へのナビゲーションが構成されています。階層ビューア・コンポーネントで上方向へのナビゲーションを行い、ユーザーが同じレベルのノード間をナビゲートしたときに表示されるノードの数を決定できるように構成することができます。
ノード・タイプの詳細は、31.4項「階層ビューアでのノードの管理」を参照してください。
階層ビューア・コンポーネントの上方向ナビゲーションを構成する場合、階層ビューア・コンポーネントのnavigateUpListener
プロパティの値を構成します。
階層ビューア・コンポーネントの上方向へのナビゲーションを構成する手順:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタで、動作セクションを開きます。NavigateUpフィールドに、ユーザーが新しいアンカー・ノードにナビゲートしたときに、新しいアンカー・ノードを参照するようにデータ・モデルを更新するメソッドを指定する階層ビューア・コンポーネントのnavigateUpListener
の値を記述します。
値の指定にヘルプが必要な場合は、上へナビゲート・ドロップダウン・メニューからメソッド式ビルダーを選び、メソッド式ビルダー・ダイアログに入ります。「メソッド式ビルダー」ダイアログでのヘルプには、「ヘルプ」をクリックするか、[F1]を押してください。
ページを保存します。
階層ビューア・コンポーネントのノード間の同レベル・ナビゲーションはデフォルトで有効にされています。階層ビューア・コンポーネントを構成して、一度に表示するノードの数を決定できます。これを行うと、ユーザーに次のナビゲートを可能にするコントロールが表示されます。
左または右にナビゲートして、次のノードのセットを表示
使用可能なノードのコレクションで最初または最後のノードのセットにナビゲート
階層ビューア・コンポーネントの同レベル・ナビゲーションを構成する手順:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタで「共通」セクションを開き、実行時に表示するノードの数をレベルごとのノード数フィールド(levelFetchSize
)で指定します。
たとえば、ノードの数に3
を入力すると、JSFページに次のエントリが表示されます。
levelFetchSize="3"
「OK」をクリックします。
実行時に、階層ビューア・コンポーネントのlevelFetchSize
プロパティの値として指定したノードの数が、階層ビューア・コンポーネントによってレンダリングされます。階層ビューア・コンポーネントは、ユーザーが次のことを実行できるコントロールもレンダリングします。
左または右にナビゲートして、次のノードのセットを表示
使用可能なノードのコレクションで最初または最後のノードのセットにナビゲート
図31-10に、levelFetchSize="3"
の場合の実行時の例を示します。ユーザーがコントロール上にマウスを移動させると、ユーザーにノードの最後のセットへのナビゲートを可能にするコントロールが表示されます。
階層ビューア・コンポーネントを構成して、ポップアップ・ウィンドウを起動し、機能およびOracle Fusion Webアプリケーションの他のページからのデータが示されたメニューを表示します。
デフォルトでは、階層ビューアのパンは、コンポーネントをクリックおよびドラッグしてビューを再配置するか、コントロール・パネルのパン制御を使用することで行われます。ノードの数が多い階層ビューアでは、階層ビューアで一度に1ページを参照するのではなく、階層ビューアにアニメーションを使用して階層ビューア・ノードから視覚的に進む3Dティルト・パン効果を開始できます。その効果は、ビューのエッジ方向に開始すると、エッジのノードの終端に達するまで自動的に持続します。図31-11に、ビューのエッジに達したティルト・パン効果を示します。
ティルト・パン効果を使用するには、まずノードのコンテンツの受入れ可能なビューについて、階層ビューでズーム・レベルを調整する必要があります。次の方法で効果を開始できます。
定期的なパンを短時間行った後、コントロール・パネルのパン制御でクリックおよびドラッグして、ティルト・パンを開始します。
ビュー・ポート全域のビューの1/3の距離をクリックおよびドラッグします。
ビューのエッジ近くでカーソルをクリックしたまま、その方向でティルト・パンを開始します。
ティルト・パン効果が開始すると、ビュー内でカーソルを移動して、ビューからパンの方向を変更できます。ビューのノードを選択してティルト・パンを終了します。
階層ビューアの3Dティルト・パン効果を構成するには、panning
プロパティをtilt
に設定します。
デフォルトでは、実行時に階層ビューアのノードをクリックすると、そのノードが選択されます。この相互作用をカスタマイズするには、dvt:node
コンポーネントのclickBehavior
属性を設定します。このプロパティの有効な値は次のとおりです。
focus
- ノードはフォーカスを受け入れ、クリックすると選択されます(デフォルト)。
expandCollapse
- 子ノードの要素の展開または折りたたみが、その現在の展開状態に応じて行われます。
isolateRestore
- ノードは、その現在の状態に応じて分離またはリストアされます。
none
- ノードをクリックしても何も行われません。
階層ビューア・ノードからポップアップ・ウィンドウを起動するには、af:showPopupBehavior
タグの値を指定して、コマンド・コンポーネント(af:commandButton
など)からポップアップ・ウィンドウを起動します。階層ビューア・コンポーネントのノードのf:facet
要素内で、ポップアップを起動するコマンド・コンポーネントをネストする必要があります。このシナリオで使用されるaf:showPopupBehavior
タグのtriggerType
プロパティでは、次の値のみがをサポートされます。
action
mouseHover
たとえば、図31-12に、ノードのHR Detailリンクから起動するモーダル・ポップアップを示します。
例31-2に、ポップアップを作成するサンプル・コードを示します。この例では、階層ビューアのデータは、XMLParser
マネージドBeanに保存される。
例31-2 ポップアップを作成するサンプル・コード
<af:popup id="modalPopup" contentDelivery="lazyUncached" eventContext="launcher" launcherVar="source"> <af:setPropertyListener from="#{XMLParser.employees.rowData}" to="#{XMLParser.source}" type="popupFetch"/> <af:dialog title="Employee HR Detail" id="d2"> <af:panelFormLayout id="pfl1"> <af:panelLabelAndMessage label="Name" id="plam1"> <af:outputText value="#{XMLParser.source.firstName} #{XMLParser.source.lastName}" id="ot1"/> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="Title" id="plam2"> <af:outputText value="#{XMLParser.source.title}" id="ot2"/> </af:panelLabelAndMessage> <af:panelLabelAndMessage label="Phone" id="plam3"> <af:outputText value="#{XMLParser.source.workPhone}" id="ot3"/> </af:panelLabelAndMessage> </af:panelFormLayout> </af:dialog> </af:popup>
例31-3に、コマンド・コンポーネントからポップアップを起動するサンプル・コードを示します。簡潔にするために<af:panelGroupLayout>
、<af:spacer>
および<af:separator>
などの要素は、サンプル・コードには含まれません。
例31-3 コマンド・コンポーネントからポップアップを起動するサンプル・コード
<f:facet name="zoom100"> ... <dvt:panelCard effect="slide_horz" ... <af:showDetailItem text="Popup Demo" ...<af:commandButton text="Click for modal popup" id="cb1">
<af:showPopupBehavior popupId="::modalPopup"
triggerType="action"
align="endAfter"
alignId="cb1"/>
</af:commandButton>
... </showDetailItem> </dvt:panelCard> </f:facet>
af:showPopupBehavior
タグの使用の詳細は、13.4項「ポップアップ要素の起動」を参照してください。
階層ビューア内でノード・コンポーネント(dvt:node
)を構成し、af:menu
コンポーネントを使用することによってメニューを起動させることができます。af:menu
コンポーネントには1つ以上のaf:commandMenuItem
要素を構成できます。階層ビューア・コンポーネント内のノードでは、af:menu
コンポーネントのネストはサポートされていません。図31-13に、ユーザーがノード上でマウスをホバーさせたときに表示される、ポップアップ・メニューを示します。
例31-4に、コンテキスト・メニューを作成するサンプル・コードを示します。
例31-4 コンテキスト・メニューのサンプル・コード
<af:popup id="popupDialog" contentDelivery="lazyUncached" > <af:menu id="m1"> <af:commandMenuItem text="Send an IM" id="cmi1"/> <af:commandMenuItem text="Look at details" id="cmi2"/> </af:menu> </af:popup>
af:menu
コンポーネントの使用方法の詳細は、第13章「ポップアップ・ダイアログ、メニューおよびウィンドウの使用」を参照してください。
階層ビューアは、次のドラッグ・アンド・ドロップのシナリオをサポートします。
階層ビューア内で、1つ以上のノードをドラッグ・アンド・ドロップします
階層ビューアから1つ以上のノードを別のコンポーネントにドラッグします
別のコンポーネントから階層ビューアに1つ以上のアイテムをドラッグします
図31-14に、その中でのドラッグ・アンド・ドロップを可能とするように構成した階層ビューアを示します。この例では、ノードをクリックし0.5秒を超えて保持すると、バックグラウンドにドラッグして階層内の別のルートにしたり、別のノードにドラッグしてそのノードの子として追加したりすることができます。
図31-15に、階層ビューアのバックグラウンドへのドラッグの結果を示します。Nancy Greenとその部下は、今は階層における新しいツリーとして示されます。
ノードを別のノードにドラッグすると、ドラッグされたノードとその子は、ターゲット・ノードの子となる。図31-16に、Nina Evansのデータを含むノードへのドラッグの結果を示します。Nancy Greenとその部下は、今はNina Evansの部下として示されます。
図31-17に、af:outputFormatted
コンポーネントとの間のドラッグやドロップを可能とするように構成された、同じ階層ビューアの例を示します。この例では、ユーザーは1つ以上のノードをドロップ・テキストにドラッグでき、かつテキストは変化して、ユーザーがどのノードをドラッグし、どの操作を実行したかを示します。ユーザーがドラッグ・テキストから階層ビューア・ノードかバックグラウンドにドラッグした場合、テキストは変化して、テキストがどこでドラッグされ、どの操作が実行されたかを示します。
図31-18に、ユーザーがJames MarlowとNina Evansのデータを含むノードをドロップ・テキストにドラッグした後の、同じ階層ビューアを示します。
ユーザーがドラッグ・テキストから階層ビューア・ノードかバックグラウンドにドラッグした場合、テキストは変化して、テキストがどこでドラッグされ、どの操作が実行されたかを示します。図31-19に、ユーザーがテキストを階層ビューアのバックグラウンドへドラッグした後の、同じ階層ビューアを示します。
階層ビューアにドラッグのサポートを追加するには(これによりコンポーネントや他の階層ビューアがそこからノードのドラッグが可能となりますが)、af:dragSource
タグを階層ビューアに付加し、af:dropTarget
タグをドラッグを受け取るコンポーネントに追加します。ドラッグを受け取るコンポーネントはorg.apache.myfaces.trinidad.model.RowKeySet
データ・フレーバをaf:dropTarget
の子として含み、かつドロップ・イベントへの応答のため、dropListener
メソッドを定義する必要があります。
階層ビューアにドロップのサポートを追加するには(これによりコンポーネントや他の階層ビューアがそこへのアイテムのドラッグが可能となりますが)、af:dropTarget
タグを階層ビューアに追加し、その階層ビューアがサポートするデータ・フレーバを含めます。dropListener
メソッドを、ドロップ・イベントに応答するマネージドBeanに追加します。
次の手順は、図31-17に示すaf:outputFormattedコンポーネントの、単一のドラッグ・ソースあるいはドロップ・ターゲットとして、階層を設定する方法を示します。ADF FacesあるいはADF データ可視化コンポーネント上でのドラッグ・アンド・ドロップの構成に関する詳細は、第34章「ドラッグ・アンド・ドロップ機能の追加」を参照してください。
開始する前に:
階層ビューアの属性や階層ビューアの子タグが機能にどのような影響を与えるかについて理解しておくと役立ちます。詳細は、31.1.1項「階層ビューア・コンポーネントの理解」を参照してください。
次のタスクを完了する必要があります。
ページに階層ビューアを追加します。詳細は次の項を参照してください。
ドラッグ・アンド・ドロップをサポートするのに必要な追加コンポーネントを作成します。
たとえば、図31-17の中のページはaf:panelGroupLayout
コンポーネントを使用し、このコンポーネントはaf:outputFormatted
とaf:panelList
コンポーネントを含み、ユーザーに手順を提供します。このページはまたaf:panelSplitter
コンポーネントを使用して、ドラッグ・アンド・ドロップaf:outputFormatted
コンポーネント・テキストを階層ビューアから分割します。
例31-5に、追加コンポーネントの、完了したページ・セクションを示します。階層ビューアのノードの詳細は省略されています。
例31-5 階層ビューアのドラッグ・アンド・ドロップ例のサンプル・コード
<af:panelStretchLayout id="psl1" topHeight="auto" endWidth="auto"> <f:facet name="top"> <af:panelGroupLayout id="pgl1" layout="horizontal"> <af:spacer width="10" height="10" id="s1"/> <af:panelGroupLayout id="pgl2"> <af:outputFormatted value="Hierarchy Viewer Drag and Drop Example" id="of1" inlineStyle="font-size:small; font-weight:bold"/> <af:panelList id="pl1"> <af:outputFormatted value="Click and hold on a node for more than one-half second to initiate the drag. Use Ctrl+Click to select multiple nodes." id="of2" inlineStyle="font-size:x-small"/> <af:outputFormatted value="Drag one or more nodes from the hierarchy viewer to the drop text. The text will change to show which node(s) you dragged and the operation performed." id="of3" inlineStyle="font-size:x-small;"/> <af:outputFormatted value="Drag the drag text to one of the hierarchy viewer nodes or background. The text will change to show where you dropped it and the operation performed." id="of4" inlineStyle="font-size:x-small;"/> </af:panelList> </af:panelGroupLayout> </af:panelGroupLayout> </f:facet> <f:facet name="center"> <af:panelSplitter id="ps1" orientation="horizontal" splitterPosition="125" positionedFromEnd="false" styleClass="AFStretchWidth"> <f:facet name="first"> <af:panelSplitter id="ps2" orientation="vertical"> <f:facet name="first"> <af:panelGroupLayout id="pgl3" layout="vertical"> <af:separator id="s2"/> <af:outputFormatted value="#{hvBean.dropText}" id="of5" inlineStyle="font-size:small; font-weight:bold" clientComponent="true"> <af:dropTarget dropListener="#{hvBean.fromDropListener}">
<af:dataFlavor flavorClass="org.apache.myfaces.trinidad.model.RowKeySet"/>
</af:dropTarget>
</af:outputFormatted> <af:separator id="s3"/> </af:panelGroupLayout> </f:facet> <f:facet name="second"> <af:panelGroupLayout id="pgl4"> <af:separator id="s4"/> <af:outputFormatted value="#{hvBean.dragText}" id="of6" inlineStyle="font-size:small; font-weight:bold;" clientComponent="true"> <af:componentDragSource/> </af:outputFormatted> </af:panelGroupLayout> </f:facet> </af:panelSplitter> </f:facet> <f:facet name="second"> <dvt:hierarchyViewer id="hierarchyViewer1" layout="hier_vert_top" styleClass="AFStretchWidth" var="node" value="#{XMLParser.employees}" contentDelivery="immediate" detailWindow="none" summary="Hierarchy Viewer Drag and Drop Example" controlPanelBehavior="initExpanded" navigateUpListener="#{XMLParser.doNavigateUp}"> <dvt:link linkType="orthogonalRounded" id="l1"/> <dvt:node width="233" height="330" id="n1" setAnchorListener="#{XMLParser.doSetAnchor}" showNavigateUp="#{node.topNode == false}" showExpandChildren="#{node.hasChildren}"> <f:facet name="zoom100"> .... remaining node details omitted<af:dragSource actions="COPY LINK MOVE" defaultAction="COPY"/>
<af:dropTarget dropListener="#{hvBean.toDropListener}"
actions="COPY MOVE LINK">
<af:dataFlavor flavorClass="java.lang.Object"/>
</af:dropTarget>
</dvt:hierarchyViewer> </f:facet> </af:panelSplitter> </f:facet> </af:panelStretchLayout>
af:outputFormatted
コンポーネントについての追加情報は、第16章「出力コンポーネントの使用」を参照してください。af:panelGroupLayout
コンポーネンントや他のページ・レイアウト・コンポーネントに関するヘルプについては、第8章「Webページ上のコンテンツの編集」を参照してください。
階層ビューアのドラッグ・アンド・ドロップを構成するには:
階層ビューアをドロップ・ターゲットとして構成するには、コンポーネント・パレットで、操作パネルから、ドロップ・ターゲットタグをドラッグし、階層ビューアの子としてドロップします。
ドロップ・ターゲットを挿入ダイアログで、ドロップ・リスナーの名前を入力するか、ドロップダウン・メニューを使用して編集を選び、ドロップ・リスナー・メソッドを階層ビューアのマネージドBeanに追加してください。または、ドロップダウン・メニューを使用して式ビルダーを選び、ドロップ・リスナーのEL式を入力してください。
たとえば、toDropListener()
という名前のメソッドをhvBean
という名前のマネージドBeanに追加するには、編集を選び、ドロップダウン・メニューからhvBeanを選択し、新規をメソッドフィールドの右でクリックして、toDropListener()
メソッドを作成します。
例31-6はサンプルのドロップ・リスナーと図31-17で示される階層ビューアのサポート・メソッドを示します。
例31-6 階層ビューアのサンプル・ドロップ・リスナー
// imports needed by methods import java.util.Map; import oracle.adf.view.rich.dnd.DnDAction; import oracle.adf.view.rich.event.DropEvent; import oracle.adf.view.rich.datatransfer.DataFlavor; import oracle.adf.view.rich.datatransfer.Transferable; import org.apache.myfaces.trinidad.context.RequestContext; import org.apache.myfaces.trinidad.render.ClientRowKeyManager; import javax.faces.context.FacesContext; import oracle.adf.view.faces.bi.component.hierarchyViewer.UIHierarchyViewer; import javax.faces.component.UIComponent; // variables need by methods private String dragText = "Drag this text onto a node or the hierarchy viewer background"; // drop listener public DnDAction toDropListener(DropEvent event) { Transferable transferable = event.getTransferable(); DataFlavor<Object> dataFlavor = DataFlavor.getDataFlavor(Object.class); Object transferableObj = transferable.getData(dataFlavor); if(transferableObj == null) return DnDAction.NONE; // Build up the string that reports the drop information StringBuilder sb = new StringBuilder(); // Start with the proposed action sb.append("Drag Operation: "); DnDAction proposedAction = event.getProposedAction(); if(proposedAction == DnDAction.COPY) { sb.append("Copy<br>"); } else if(proposedAction == DnDAction.LINK) { sb.append("Link<br>"); } else if(proposedAction == DnDAction.MOVE) { sb.append("Move<br>"); } // Then add the rowKeys of the nodes that were dragged UIComponent dropComponent = event.getDropComponent(); Object dropSite = event.getDropSite(); if(dropSite instanceof Map) { String clientRowKey = (String) ((Map) dropSite).get("clientRowKey"); Object rowKey = getRowKey(dropComponent, clientRowKey); sb.append("Drop Site: "); if(rowKey != null) { sb.append("Node: "); sb.append(getLabel(dropComponent, rowKey)); } else { sb.append("Background"); } } // Update the output text this._dragText = sb.toString(); RequestContext.getCurrentInstance().addPartialTarget(event.getDragComponent()); return event.getProposedAction(); } private String getLabel(UIComponent component, Object rowKey) { // save the current rowkey because we will lose this state in the for-loop // when we setRowKey and then get the rowData UIXHierarchy hierarchy = (UIXHierarchy)component; Object savedKey = hierarchy.getRowKey(); try { if(component instanceof UIHierarchyViewer) { UIHierarchyViewer hv = (UIHierarchyViewer) component; hv.setRowKey(rowKey); Employee rowData = (Employee) hv.getRowData(); return rowData.getFirstName() + " " + rowData.getLastName(); } } finally { hierarchy.setRowKey(savedKey); } return null; } private Object getRowKey(UIComponent component, String clientRowKey) { if(component instanceof UIHierarchyViewer) { UIHierarchyViewer hv = (UIHierarchyViewer) component; ClientRowKeyManager crkm = hv.getClientRowKeyManager(); return crkm.getRowKey(FacesContext.getCurrentInstance(), component, clientRowKey); } return null; } public String getDragText() { return _dragText; }
注意: このメソッドは、階層ビューアの属性を定義する この例で使用されている |
「OK」をクリックして、「データ・フレーバの挿入」ダイアログに入力します。
データ・フレーバを挿入ダイアログで、ドロップ・ターゲットが受け入れるオブジェクトを入力します。または、ドロップダウン・メニューを使用してオブジェクトの階層をナビゲートし、希望するオブジェクトを選択します。
たとえば、af:outputFormatted
コンポーネントがテキストを階層ビューアにドラッグできるようにするには、java.lang.Object
をデータ・フレーバの挿入ダイアログに入力します。
構造ウィンドウでaf:dropTarget
コンポーネントを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタにおいて、「アクション」フィールドに、ドロップ・ターゲットが受け入れる操作のリストを、空白で区切って入力します。許容値は、COPY
、MOVE
またはLINK
です。値を指定しない場合、ドロップ・ターゲットはCOPY
を使用します。
たとえば、「アクション」フィールドに次を入力し、すべての操作を可能にします。
COPY MOVE LINK
階層ビューアをドロップ・ターゲットとして使用するには、次を実行します。
コンポーネント・パレットで、Operationsパネルから、ドラッグ元タグをドラッグのソースとなるコンポーネントの子としてドラッグ・アンド・ドロップします。
たとえば、ドラッグ元タグをaf:outputFormatted
コンポーネントの子としてドラッグ・アンド・ドロップします。
コンポーネントの値のフィールドでは、ステップ2でドロップ・リスナーで階層ビューアに作成したパブリック変数を参照します。
たとえば、toDropListener()
という名前のドロップ・リスナーとdropText
という名前の変数には、コンポーネントの値のフィールドに、次を入力します。
#{hvBean.dropText}
階層ビューアをドラッグ・ソースとして構成するには、コンポーネント・パレットで、操作パネルから、ドラッグ元タグを、階層ビューアの子としてドラッグ・アンド・ドロップします。
プロパティ・インスペクタにおいて、「アクション」フィールドに、ドロップ・ターゲットが受け入れる操作のリストを、空白で区切って入力します。許容値は、COPY
、MOVE
またはLINK
です。
たとえば、「アクション」フィールドに次を入力し、すべての操作を可能にします。
COPY MOVE LINK
ドラッグ・ソースがサポートするデフォルトのアクションを指定するには、DefaultAction属性のドロップダウン・メニューを使用して、「コピー」,、「移動」または「リンク」を選択します。
図31-17におけるドラッグ・アンド・ドロップの例での階層ビューアは、移動
をデフォルトのアクションとして使用しています。
他のコンポーネントを階層ビューアからのドラッグのドロップ・ターゲットとするには、以下を実行します。
コンポーネント・パレットで、「Operations」パネルから、「ドロップ・ターゲット」を、ドロップを受け取るコンポーネント上にドラッグ・アンド・ドロップします。
たとえば、図31-17におけるドラッグ・アンド・ドロップの例のページは、ドロップの結果を表示するaf:outputFormatted
コンポーネントを含んでいます。
ドロップ・ターゲットを挿入ダイアログで、ドロップ・リスナーの名前を入力するか、ドロップダウン・メニューを使用して編集を選び、ドロップ・リスナー・メソッドを適切なマネージドBeanに追加してください。または、ドロップダウン・メニューを使用して式ビルダーを選び、ドロップ・リスナーのEL式を入力してください。
たとえば、fromDropListener()
という名前のメソッドをhvBean
という名前のマネージドBeanに追加するには、編集を選び、ドロップダウン・メニューからhvBeanを選択し、新規をメソッドフィールドの右でクリックして、fromDropListener()
メソッドを作成します。
例31-7は、図31-17に表示される階層ビューアのサンプル・ドロップ・リスナーを示します。この例は同じインポートとヘルパー・メソッドを使用しており、それらはここには含まれていません。
例31-7 階層ビューアをドラッグ・ソースとして使用するコンポーネントのサンプル・ドロップ・リスナー
// Additional import needed for listener import org.apache.myfaces.trinidad.model.RowKeySet; // Variables needed by method private String dropText = "Drop a node here"; // Drop listener public DnDAction fromDropListener(DropEvent event) { Transferable transferable = event.getTransferable(); DataFlavor<RowKeySet> dataFlavor = DataFlavor.getDataFlavor(RowKeySet.class); RowKeySet rowKeySet = transferable.getData(dataFlavor); if(rowKeySet == null || rowKeySet.getSize() <= 0) return DnDAction.NONE; // Build up the string that reports the drop information StringBuilder sb = new StringBuilder(); // Start with the proposed action sb.append("Drag Operation: "); DnDAction proposedAction = event.getProposedAction(); if(proposedAction == DnDAction.COPY) { sb.append("Copy<br>"); } else if(proposedAction == DnDAction.LINK) { sb.append("Link<br>"); } else if(proposedAction == DnDAction.MOVE) { sb.append("Move<br>"); } // Then add the rowKeys of the nodes that were dragged sb.append("Nodes: "); UIComponent dragComponent = event.getDragComponent(); for(Object rowKey : rowKeySet) { sb.append(getLabel(dragComponent, rowKey)); sb.append(", "); } // Remove the trailing , sb.setLength(sb.length()-2); // Update the output text this.dropText = sb.toString(); RequestContext.getCurrentInstance().addPartialTarget(event.getDropComponent()); return event.getProposedAction(); }
「OK」をクリックして、「データ・フレーバの挿入」ダイアログに入力します。
「データ・フレーバの挿入」ダイアログで、org.apache.myfaces.trinidad.model.RowKeySet
を入力します。
たとえば、af:outputFormatted
コンポーネントがテキストを階層ビューアにドラッグできるようにするには、org.apache.myfaces.trinidad.model.RowKeySet
をデータ・フレーバの挿入ダイアログに入力します。
構造ウィンドウでaf:dropTarget
コンポーネントを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタにおいて、「アクション」フィールドに、ドロップ・ターゲットが受け入れる操作のリストを、空白で区切って入力します。許容値は、COPY
、MOVE
またはLINK
です。値を指定しない場合、ドロップ・ターゲットはCOPY
を使用します。
たとえば、「アクション」フィールドに次を入力し、すべての操作を可能にします。
COPY MOVE LINK
コンポーネントの値のフィールドでは、ステップ2でドロップ・リスナーでツリーマップあるいはサンバーストに作成したパブリック変数を参照します。
たとえば、fromDropListener()
という名前のドロップ・リスナーとdragText
という名前の変数には、コンポーネントの値フィールドに、次を入力します。
#{hvBean.dragText}
パネル・カード・コンポーネントを階層ビューア・コンポーネントとともに使用して、階層ビューア・コンポーネントが参照するノードに異なった情報のセットを保持できます。パネル・カード・コンポーネントは、ノード要素の内側の領域で、1つ以上のaf:showDetailItem
要素を含めることができます。
各af:showDetailItem
要素がコンテンツの1セットを参照します。たとえば、組織図をレンダリングする階層ビューア・コンポーネントに組織内の従業員のノードを含めることができます。このノードには、1つのaf:showDetailItem
要素、および給与情報を参照するもう1つのaf:showDetailItem
要素を使用して連絡先情報を参照するパネル・カード・コンポーネントを含めることができます。
パネル・カード・コンポーネントには、実行時に1つのaf:showDetailItem
要素によって参照されるコンテンツが表示されます。パネル・カード・コンポーネントによって、ナビゲーション・ボタン、およびユーザーがaf:showDetailItem
要素によって参照されるデータのセット間の切替えを行えるようにする他のコントロールがレンダリングされます。ユーザーがデータの異なったセット間で切替えを行えるようにするコントロールは、オプションの遷移効果を使用して構成できます。たとえば、パネル・カードがaf:showDetailItem
要素によって参照されるデータのセットと、別のaf:showDetailItem
要素によって参照される別のデータのセットとの間を水平にスライドするように構成できます。
パネル・カード・コンポーネントは、JSFページの構造ウィンドウでFacet zoom要素を選択した場合に表示されるポップアップ・メニューを使用して、階層ビューア・コンポーネントをレンダリングするJSFページに挿入できます。
パネル・カードを作成する手順:
構造ウィンドウで、パネル・カードを作成するノード内のズーム・レベルを右クリックします。
f:facet - zoom100などを選択します。
選択したファセットにpanelGroupLayout
コンポーネントが含まれない場合、「f:facet - zoomlevelの中に挿入」→「パネル・グループ・レイアウト」を選択してパネル・カードのコンテナを作成します。
プロパティ・インスペクタを使用してpanelGroupLayout
コンポーネントの属性を構成します。
panelGroupLayout
コンポーネント構成に関するヘルプについては、第8.13.1項「panelGroupLayoutコンポーネントの使用方法」を参照してください。
構造ウィンドウで、af:panelGroupLayoutノードを右クリックし、「パネル・グループ・レイアウトの中に挿入」→「パネル・カード」を選び、パネル・カードを作成します。
プロパティ・インスペクタを使用して、パネル・カードのプロパティを構成します。
たとえば、パネル・カード・コンポーネントで「効果」プロパティの値を設定します。有効な値は次のとおりです。
slide_horz (デフォルト)
一方から新しいコンテンツがスライドして表示され、古いコンテンツが反対側にスライドして消えていきます。
immediate
コンテンツは遷移効果なしで直ちに表示されます。
node_flip_horz
ノード全体がめくれて、新しいコンテンツが表示されます。
flip_horz
showDetailItemがめくれて新しいコンテンツが表示されます。
構造ウィンドウでdvt:panelCardを右クリックし、dvt:panelCardの中に挿入→「詳細アイテムの表示」を選択します。
プロパティ・インスペクタを使用して、挿入するaf:showDetailItem
要素のプロパティを構成します。
実行時に、ノードが表示され、パネル・カード・コンポーネントが1つ表示されます。ユーザーは、パネル・カードの下部にあるナビゲーション・ボタンをクリックして、パネル・カードのaf:showDetailItem
子要素のいずれかによって参照されるコンテンツの次のセットにナビゲートできます。
図31-20に、2つの異なる子要素af:showDetailItem
が情報の異なるセット(ContactおよびAddress)を参照する場合のパネル・カード・コンポーネントを含むノードを示します。例のコントロールには、パネル・カードをスライドする矢印と、表示するパネル・カードを直接選択するボタンがあります。両方のコントロール・オプションのツールチップの表示。
階層ビューアのコンポーネントのサイズや外観をカスタマイズできます。たとえば、イメージの追加、コントロール・パネルの表示の構成、リンクおよびラベルのカスタマイズなどです。
階層ビューア・コンポーネントの外観は、第20章「スタイルおよびスキンを使用した外観のカスタマイズ」での説明のとおり、スキンおよびコンポーネント・スタイル属性を変更することによって変更できます。
階層ビューア・コンポーネントのサイズは、プロパティ・インスペクタを使用して、階層ビューア・コンポーネントの属性の数に値を設定することによって調整できます。
デフォルトで、階層ビューアのサイズは、AFStretchWidth
スタイル設定のstyleClass
属性を使用し、利用可能なスペースの幅に合せて構成される。この設定は、プロパティ・インスペクタのスタイルの項目の値を構成することで、追加や修正が可能です。
階層ビューアのサイズを調整する手順:
階層ビューア・コンポーネントを含むJSFページの構造ウィンドウで、dvt:hierarchyViewerノードを選択し、プロパティに移動を選びます。
プロパティ・インスペクタにおいて、事前定義されたスタイル・クラスを使用して幅や高さを指定するには、styleClass属性にスタイル名を入力するか、編集を属性のドロップダウン・メニューから選び、1つ以上の事前定義されたスタイルを選択します。
幅や高さに特定の値を入れるには、InlineStyle属性に値を入力します。:
width
パーセント(%
)かピクセル(px
)で値を入力します。階層ビューアのスタイル属性は自動的にAFStretchWidthに設定されているので、幅を100%に設定するのに値を入力する必要はありません。
height
パーセント(%
)またはピクセル(px
)で値を記述します。heightのデフォルト値は600px
です。
InlineStyle
プロパティに入力する最終値には、次の例に示す構文を使用する必要があります。
幅:75%;高さ:600px;
JSFページへの変更を保存します。
スタイルおよびスキンの適用についての詳細は、第20章「スタイルおよびスキンを使用した外観のカスタマイズ」を参照してください。
実行時に階層ビューア・コンポーネントのノードがイメージに表示されるように階層ビューア・コンポーネントを構成できます。これは、組織図に画像を表示するような場合に便利です。目的のイメージのURLにバインドされるソース属性を含むaf:image
コンポーネントを挿入します。次のコード例では、イメージ・ディレクトリに保存されているファイルからイメージをレンダリングします。
<af:panelGroupLayout> <af:image source="images/person_id=#{node.PersonId}" inlineStyle="width:64px;height:90px;"/> </af:panelGroupLayout>
af:panelGroupLayout
コンポーネントの詳細は、8.13.1項「panelGroupLayoutコンポーネントの使用方法」を参照してください。
実行時に階層ビューア・コンポーネントによってレンダリングされる場合、コントロール・パネルが次のように機能するように、31.1.2項「階層ビューアの要素と用語」で説明されているとおり、階層ビューア・コンポーネントを構成できます。
開いたまたは表示状態での表示
閉じたまたは非表示状態での表示
ユーザーに対して非表示
コントロール・パネルの表示を構成する手順:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「プロパティに移動」を選択します。
「外観」セクションを開き、ControlPanelBehaviorドロップダウン・リストから次の値のいずれかを選択します。
hidden
実行時にコントロール・パネルを表示しない場合は、この値を選択します。
initCollapsed
これがデフォルト値です。コントロール・パネルは、実行時に閉じたまたは非表示状態で表示されます。
initExpanded
実行時にコントロール・パネルを開いたまたは表示状態で表示する場合は、この値を選択します。
JSFページへの変更を保存します。
階層ビューアでは、ノード間の関係はノードをつなぐ線で表されます。リンクは、ラベルを含めるように構成できます。図31-21に、階層ビューアのリンクとラベルを示します。
リンクとラベルの外観をカスタマイズするには、階層ビューアのdvt:link
要素のプロパティを設定します。図31-22に、linkStype
属性に値dashDot
が設定されたリンクを示します。
リンクとラベルの表示のカスタマイズ手順:
構造ウィンドウでdvt:linkノードを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタで、次の属性を設定して、階層ビューアのノード間のリンクの外観を必要に応じてカスタマイズします。
linkStyle
- リンクのスタイルを設定します(点線や破線など)。
linkColor
- リンクの色を設定します。
linkWidth
- リンクの幅をピクセル単位で設定します。
linkType
- リンクのタイプを設定します。1つの直角に適合する直線やなめらかな曲線など。
endConnectorType
- リンク接続の終端のスタイルをnone
(デフォルト)またはarrowOpen
に設定します。
プロパティ・インスペクタで、label
プロパティのリンクに関連付けられるラベルのテキストも入力します。
あるいは、子ノードに基づいてリンク・ラベルをスタンプ・アウトするEL式を指定します。たとえば、ノードのvar
属性が、リンクに関連付けられる子ノードを参照する次のようなEL式を記述します。
label="{node.relationship}"
必要に応じて、プロパティ・インスペクタで、rendered
プロパティを使用して、ノード間の特定の関係のリンクをスタンプします。リンクが関係を表すかどうかを判別するためにtrue
またはfalse
に評価されるEL式を記述できるように、プロパティはブール値を受け入れます。たとえば、レポート作成の関係に基づいて表示するリンクがあるとします。ノード・コンポーネントのrendered
プロパティに対して、関係が指定した値(この例では(CONSULTANT
)と一致する場合にtrue
と評価する次の疑似EL式のようなEL式を記述します。
rendered="#{node.relationship == "CEO"}
デフォルトでは、ズーム・レベルが76-100%のとき、ホバー・ウィンドウが自動的に表示されます。ユーザーの階層ビューアがポップアップを使用している場合、ホバー・ウィンドウはそのポップアップ表示と干渉する可能性があります。階層ビューアのdetailWindow
属性を使用して、ズーム・レベルが76-100%のときにホバー・ウィンドウの表示を消すことができます。
階層ビューアのホバー・ウィンドウを無効化するには:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「プロパティに移動」を選択します。
プロパティ・インスペクタで動作セクションを開き、DetailWindowドロップダウン・リストから次の値の1つを選択します。
default
これがデフォルト値です。ホバー・ウィンドウは、常時無効化されます。
none
ズーム・レベルが76-100%のときにホバー・ウィンドウを表示したくない場合はこの値を選択します。
階層ビューアの検索機能は、階層ビューアのデータ構造を調べて、スクロール可能なリストで一致を提供します。検索結果をダブルクリックすると、一致するノードを階層ビューアのアンカー・ノードとして表示できます。有効な場合、検索パネルが階層ビューアの右上隅に表示され、結果は検索パネルの下に表示されます。図31-23に、検索パネルのサンプルを示します。
図31-24に、検索結果のサンプルを示します。
検索を有効にするには、dvt:hierarchyViewer
タグの子タグとしてdvt:search
タグを追加し、結果の処理方法を指定するには、dvt:search
の子タグとしてdvt:searchResults
を追加します。
階層ビューアでの検索の構成手順:
構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「dvt:hierarchyViewerの中に挿入」→dvt:searchを選択します。
プロパティ・インスペクタで、次の属性を設定して検索機能を構成します。
value
: 検索テキストを保持する変数を指定します。
actionListener
: 検索を実行する場合に呼び出されるリスナーを入力します。
initialBehavior
: 検索パネルが最初に表示される方法を指定します。有効な値は、最初に折りたたむ場合はinitCollapsed
、最初に展開する場合はinitExpanded
、ビューから完全に非表示にする場合はhidden
になります。
必要に応じて、値がname="end"
のf:facet
を追加して、階層ビューア・コンポーネントの外部の高度な検索を起動するコンポーネントを指定します。このファセットには、データ・セットの広範囲な検索を起動するコンポーネント(af:commandLink
など)を1つのみ含める必要があります。詳細は、12.4項「問合せコンポーネントの使用」を参照してください。
構造ウィンドウでdvt:searchノードを右クリックし、「dvt:searchの中に挿入」→dvt:searchResultsを選択します。
プロパティ・インスペクタで、次の属性を設定して検索結果の表示を構成します。
value
: 検索結果のデータ・モデルを指定します。これは、oracle.adf.view.faces.bi.model.DataModel
のインスタンスにする必要があります。
var
: 階層ビューアのコレクションの各要素を参照するために使用するEL変数の名前を入力します。このコンポーネントのレンダリングが完了すると、この変数は削除されます(またはその前の値に戻ります)。
varStatus
: varStatus
情報を参照するために使用するEL変数の名前を入力します。このコンポーネントのレンダリングが完了すると、この変数は削除されます(またはその前の値に戻ります)。
resultListener
: 検索結果の行の選択後に呼び出されるアクション・リスナーの参照を指定します。
emptyText
: 結果が戻されない場合に表示するテキストを指定します。
fetchSize
: 一度にフェッチする結果行の数を指定します。
構造ウィンドウでdvt:searchResultsノードを右クリックし、「dvt:searchResultsの中に挿入」→「ADF Faces」→af:setPropertyListenerと選択します。
プロパティ・インスペクタで、次の属性を設定して、結果モデルの検索結果ノードを、対応する階層ビューア・モデルにマップします。
from
: 値のソースを、定数またはEL式で指定します。
to
: 値のターゲットを指定します。
type
: action
を値として選択します。
構造ウィンドウでdvt:searchResultsノードを右クリックし、「dvt:searchResultsの中に挿入」→f:facet(値はname="content"
)と選択します。
構造ウィンドウでf:facet content
ノードを右クリックし、次の手順を実行して、検索結果をスタンプ・アウトするコンポーネントを指定します。
ADF Facesのaf:panelGroupLayout
要素を挿入して、検索結果の出力をラップします。
ADF Facesの出力コンポーネントを挿入して、検索結果を表示します。次に例を示します。
<af:outputText value="#{resultRow.Lastname} " id="ot1" inlineStyle="color:blue;"/> <af:outputText value="#{resultRow.Firstname}" id="ot2"/>
スタンプされたそれぞれの行は、dvt:searchResults
タグのvar
属性を使用して現在の行を参照します。
例31-8に、階層ビューアで検索を構成するサンプル・コードを示します。
例31-8 階層ビューアの検索のサンプル・コード
<dvt:hierarchyViewer> <dvt:search id="searchId" value="#{bindings.lastNameParam.inputValue}" actionListener="#{bindings.ExecuteWithParams1.execute}"> <f:facet name="end"> <af:commandLink text="Options"> <af:showPopupBehavior popupId="::mypop" triggerType="action"/> </af:commandLink> </f:facet> <dvt:searchResults id="searchResultId" emptyText="#{bindings.searchResult1.viewable ? 'No match.' : 'Access Denied.'}" fetchSize="25" value="#{bindings.searchResult1.collectionModel}" resultListener="#{bindings.ExecuteWithParams.execute}" var="resultRow"> <af:setPropertyListener from="#{resultRow.Id}" to="#{bindings.employeeId.inputValue}" type="action"/> <f:facet name="content"> <af:panelGroupLayout inlineStyle="width:110px;height:20px;"> <af:outputText value="#{resultRow.Lastname} " id="ot1" inlineStyle="color:blue;"/> <af:outputText value="#{resultRow.Firstname}" id="ot2"/> </af:panelGroupLayout> </f:facet> </dvt:searchResults> </dvt:search> </dvt:hierarchyViewer>