ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド
11gリリース1(11.1.1.9.0)
B52029-12
  目次へ移動
目次

前
 
次
 

31 階層ビューア・コンポーネントの使用方法

この章では、ADF階層ビューア・コンポーネントを使用してデータを表示する方法、および階層表示のカスタマイズ・オプションについて説明します。

この章では、次の項目について説明します。

ADF階層ビューアのデータ・バインディングの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項を参照してください。

31.1 階層ビューアの概要

階層ビューア・コンポーネントは階層データの視覚表示に使用できます。階層データにはデータ内にマスター/ディテール関係が含まれています。たとえば、組織内の従業員間の関係に関する情報が含まれるデータ・コレクションから、組織図をレンダリングする階層ビューア・コンポーネントを作成することもできます。

31.1.1 階層ビューア・コンポーネントの理解

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:outputTextaf: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:panelGroupLayoutaf:spacerおよびaf:separatorなどの要素を使用して、ノードでコンテンツをどのように表示するかを定義します。例31-1に、コンポーネント・パレットから挿入してコンポーネントを作成する場合に生成されるコードを示します。例では、階層ビューアの要素関連のコードが強調表示されています。

例31-1 階層ビューアのサンプル・コード

<dvt:hierarchyViewer id="hv1" 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="pgl1">
      <af:panelGroupLayout layout="horizontal" id="pgl3">
      <af:panelGroupLayout styleClass="AFHVNodeImageSize" id="pgl4">
        <af:image source="#{null}" styleClass="AFHVNodeImageSize" id="i1"/>
      </af:panelGroupLayout>
      <af:spacer width="5" height="5" id="s3"/>
      <af:panelGroupLayout layout="vertical" id="pgl2">
        <af:outputText value=" attribute value1 "
                       styleClass="AFHVNodeTitleTextStyle"
                       id="ot9"/>
        <af:outputText value=" attribute value2"
                       styleClass="AFHVNodeSubtitleTextStyle"
                       id="ot8"/>
        <af:outputText value=" attribute value3"
                       styleClass="AFHVNodeTextStyle" id="ot5"/>
        </af:panelGroupLayout>
      </af:panelGroupLayout>
      <af:spacer height="5" id="s2"/>
      <af:separator id="s1"/>
      <af:spacer height="5" id="s4"/>
      <dvt:panelCard effect="slide_horz" styleClass="AFHVNodePadding"
                     id="pc1">
        <af:showDetailItem text="first group title " id="sdi1">
          <af:panelFormLayout
              styleClass="AFStretchWidth AFHVNodeStretchHeight AFHVNodePadding"
              id="pfl1">
            <af:panelLabelAndMessage label="attribute label4"
                                     styleClass="AFHVPanelCardLabelStyle"
                                     id="plam3">
              <af:outputText value="attribute value4"
                             styleClass="AFHVPanelCardTextStyle"
                             id="ot4"/>
            </af:panelLabelAndMessage>
            <af:panelLabelAndMessage label="attribute label5"
                                     styleClass="AFHVPanelCardLabelStyle"
                                     id="plam4">
              <af:outputText value="attribute value5"
                             styleClass="AFHVPanelCardTextStyle"
                             id="ot1"/>
            </af:panelLabelAndMessage>
            <af:panelLabelAndMessage label="attribute label6"
                                     styleClass="AFHVPanelCardLabelStyle"
                                     id="plam5">
              <af:outputText value="attribute value6"
                             styleClass="AFHVPanelCardTextStyle"
                             id="ot7"/>
            </af:panelLabelAndMessage>
          </af:panelFormLayout>
          </af:showDetailItem>
          <af:showDetailItem text="second group title " id="sdi2">
            <af:panelFormLayout
                styleClass="AFStretchWidth AFHVNodeStretchHeight AFHVNodePadding"
                id="pfl2">
              <af:panelLabelAndMessage label="attribute label7"
                                       styleClass="AFHVPanelCardLabelStyle"
                                       id="plam2">
                <af:outputText value="attribute value7"
                               styleClass="AFHVPanelCardTextStyle"
                               id="ot2"/>
              </af:panelLabelAndMessage>
              <af:panelLabelAndMessage label="attribute label8"
                                       styleClass="AFHVPanelCardLabelStyle"
                                       id="plam1">
                <af:outputText value="attribute value8"
                               styleClass="AFHVPanelCardTextStyle"
                               id="ot6"/>
              </af:panelLabelAndMessage>
              <af:panelLabelAndMessage label="attribute label9"
                                       styleClass="AFHVPanelCardLabelStyle"
                                       id="plam6">
                <af:outputText value="attribute value9"
                               styleClass="AFHVPanelCardTextStyle"
                               id="ot3"/>
              </af:panelLabelAndMessage>
            </af:panelFormLayout>
          </af:showDetailItem>
        </dvt:panelCard>
      </af:panelGroupLayout>
    </f:facet>
  </dvt:node>
</dvt:hierarchyViewer>

31.1.2 階層ビューアの要素と用語

階層ビューアは、階層データおよびマスター/ディテール関係を視覚的に表示します。図31-1に、コントロール・パネル、多数のノードおよびノードを接続するリンクを含む実行時の階層ビューア・コンポーネントのセグメントを示します。

図31-1 コントロール・パネルとノードが表示された階層ビューア・コンポーネント

コントロール・パネルとノードが表示された階層ビューア・コンポーネント

コントロール・パネルでは、ユーザーが実行時に階層ビューア・コンポーネントの位置と外観を操作できるコントロールが提供されます。デフォルトで、図31-2に示すとおり、階層ビューア・コンポーネントの左上隅に非表示状態で表示されます。

図31-2 非表示状態のコントロール・パネル

非表示状態のコントロール・パネル

コントロール・パネルが別の場所に表示されるように構成することはできません。ユーザーは、図31-2に示すコントロール・パネルの非表示または表示ボタンをクリックして、コントロール・パネルを非表示にするか開きます。図31-3に、展開されたコントロール・パネルを示します。

図31-3 表示状態のコントロール・パネル

表示状態のコントロール・パネル

実行時にコントロール・パネルがユーザーに表示されないように階層ビューア・コンポーネントを構成できます。手順の詳細は、31.8.3項「コントロール・パネルの表示の構成方法」を参照してください。

表31-1では、コントロール・パネルのコントロールでユーザーに提供される機能を説明します。パネル・セレクタは、階層ビューア・コンポーネントのノードに、1つ以上のaf:showDetailItem要素を持つdvt:panelCard要素が含まれていると自動的に有効になります。階層ビューア・コンポーネントで次のいずれかのレイアウトが使用されていると、レイアウト・セレクタが自動的に表示されます。

  • 上から下の垂直方向

  • 左から右の水平方向

  • ツリー

  • 放射

階層ビューア・コンポーネントのレイアウトの詳細は、31.1.3項「使用可能な階層ビューアのレイアウト・オプション」を参照してください。

表31-1 コントロール・パネルの要素

コントロール 名前 説明
ズーム制御

パン制御

ユーザーはビューポート内の階層ビューア・コンポーネントを再配置できます。

「ズームしてあわせる」コントロール

ズームしてあわせる

ユーザーはビューポート内にすべてのノードが表示されるように、階層ビューア・コンポーネントにズームできます。

ズーム制御

ズーム制御

ユーザーは、階層ビューア・コンポーネントにズームできます。

コントロール・パネルの非表示または表示

非表示/表示

コントロール・パネルを表示または非表示にします。

パネル・セレクタ

パネル・セレクタ

パネル・カードを構成した場合は、定義したaf:showDetailItem要素のリストを表示します。ユーザーはパネル・セレクタを使用して、すべてのノードを同じパネルに一度に表示できます。

レイアウト・セレクタ

レイアウト・セレクタ

レイアウトの選択を可能にします。ユーザーは、階層ビューア・コンポーネントのレイアウトを定義したレイアウトからコンポーネントによって提示される別のレイアウト・オプションの1つに変更できます。詳細は、31.1.3項「使用可能な階層ビューアのレイアウト・オプション」を参照してください。


階層ビューアは、ノードの選択、展開、横方向移動に関する状態管理をサポートします。ユーザーがノードを選択または展開したり、同じ親内で左または右に移動して、次のノード・セットを表示する場合、タブ付パネルのように、移動後にページに戻ると、その状態は維持されます。状態管理は、disclosedRowKeysselectedRowKeyslateralNavigationRowKeysなどの階層ビューア属性でサポートされます。

階層ビューアでは、ノード・コンテンツでの双方向テキスト、検索パネルおよび検索結果の表示がサポートされています。双方向テキストとは、右から左(RTL)と左から右(LTR)の両方の方向性のテキストを含むテキストです。一般に、アラビア語やヘブライ語などの異なるタイプのアルファベットのテキストが含まれます。階層ビューアでは、1つのノード・ビューから次のノード・ビューへパネル・カードをめくったり、コントロール・パネルや検索パネルの要素が定義されている場合はそれらの位置を切り替えるのにも、双方向のサポートが提供されています。

31.1.3 使用可能な階層ビューアのレイアウト・オプション

階層ビューアは、コンポーネントのlayout属性で指定される次のレイアウトを使用できます。

  • hier_vert_top - 上から下への垂直方向

  • hier_vert_bottom - 下から上への垂直方向

  • hier_horz_left - 左から右への水平方向

  • hier_horz_right - 右から左への水平方向

  • hier_horz_start - 水平方向。ロケールによって向きが決まります。

  • hier_horz_end - 水平方向。ロケールによって向きが決まります。

  • tree - ツリー。インデントされたツリー

  • radial - 放射状。ルート・ノードが中央に配置され、後続の子レベルがそれぞれの親ノードから外側に向かって放射状に広がります。

  • circle - 円。ルート・ノードが中央に配置され、すべてのリーフ・ノードが同心円に配置されるレイアウト。親ノードは円の内側に配置されます。

    図31-4に、階層ビューア・コンポーネントの円レイアウトの例を示します。

    図31-4 階層ビューアの円形レイアウト

    階層ビューアの円形レイアウト

コンポーネントをページに挿入する際、データ・コレクションを階層ビューア・コンポーネントにバインドする場合はデータ・コントロールから、コンポーネントを挿入し後からデータにバインドする場合はコンポーネント・パレットから、階層ビューアの初期レイアウトを定義できます。使用可能なレイアウトは、図31-5に示すように、「階層ビューアの作成」ダイアログの「階層ビューア・タイプ」領域に表示されます。

図31-5 階層ビューア・レイアウト

「作成」ダイアログの階層ビューア・レイアウト

注意:

hier_horz_startおよびhier_horz_endレイアウトは「階層ビューアの作成」ダイアログでは使用できません。階層ビューアをこれらのいずれかのレイアウトで作成するために、プロパティ・インスペクタでdvt:hierarchyViewerレイアウト属性にhier_horz_startまたはhier_horz_end値を指定する必要があります。

31.1.4 階層ビューアのレンダリングとイメージ形式に関する必知事項

デフォルトでは、階層ビューア・コンポーネントのレンダリングはHTML5で行われます。ブラウザでHTML5がサポートされておらず、クライアントでFlash 10以上が使用可能な場合、階層ビューアはFlash Playerでレンダリングされます。HTML5およびFlash10以上が使用できない場合、階層ビューアはHTML4でレンダリングされます。HTMLレンダリングはHTML5およびFlashレンダリングにできるかぎり細かく従いますが、いくつかの相違があります。通例、階層ビューアの表示および機能は、次の例外を除いてサポートされます。

  • 分離ノードおよびリストア・ノードは使用できません。

  • ノードの形状は長方形に制限されます。

  • リンクの場合、リンクの終点コネクタはサポートされません。リンク・タイプは直交に制限され、リンク・スタイルは実線に制限されます。

  • コントロール・パネルの場合、パネル・カードはすべて切り替えることができません。パンはスクロール・バーに制限され、ズームおよびズーム・フィットは4つのズーム・ファセットに制限されます。

  • 検索はサポートされません。

  • メール可能なページはサポートされません。

  • ノードの詳細を示すホバー・ウィンドウはサポートされません。

31.2 階層ビューアのデータ要件

階層ビューア・コンポーネントには、1つ以上のディテール・コレクションと1つのマスター・ディテール・コレクションとの間にマスター/ディテール関係が存在するデータ・コレクションが必要です。階層ビューア・コンポーネントでは、ADF Faces treeコンポーネントと同じデータ・モデルが使用されます。データ・コレクションをまずADF Faces treeコンポーネントにバインドすることによって、データ・コレクションを階層ビューア・コンポーネントにバインドできるかどうかテストできます。ADF Faces treeコンポーネントを使用してデータ・コレクションをナビゲートできれば、階層ビューア・コンポーネントにバインドすることができます。

JSFページにデータバインドされた階層ビューア・コンポーネントを追加すると、JDeveloperによりJSFページのページ定義ファイルにツリー・バインディングが追加されます。ツリー・バインディングでノードにデータを移入する方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のマスター/ディテール・オブジェクトの表示にツリーを使用する方法に関する項を参照してください。

ユーザーが階層ビューア・コンポーネントのルート・ノードから下方向にナビゲートできるようにするには、階層ビューア・コンポーネントでノードにバインドするデータ・コレクションに再帰的アクセッサが含まれている必要があります。階層ビューア・コンポーネントのナビゲートの詳細は、31.5項「階層ビューアのナビゲート」を参照してください。

31.3 階層ビューアの作成

階層ビューアをコンポーネント・パレットからページにドラッグすることで、階層ビューアを作成できます。階層ビューア作成時にデータのバインドを選択することも、階層ビューア作成の後にデータのバインドを追加することもできます。

アプリケーションでFusionテクノロジ・スタックが使用される場合、データ・コントロールを使用して階層ビューアを作成することもできます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項を参照してください。

31.3.1 ページへの階層ビューアの追加方法

JSFページに階層ビューアを追加するには、コンポーネント・パレットを使用します。ページに階層ビューア・コンポーネントをドラッグ・アンド・ドロップすると、「階層ビューアの作成」ダイアログがコンポーネント・ギャラリに使用可能な階層ビューア・レイアウトのカテゴリを説明とともに表示し、階層ビューアの作成時に視覚的に支援します。図31-5に、上から下の垂直方向レイアウト・タイプが選択された階層ビューアの「階層ビューアの作成」ダイアログを示します。

階層ビューア・レイアウトを選択して、ページに階層ビューアが追加されると、プロパティ・インスペクタを使用して、データ値を指定し、階層ビューアに追加の表示属性を構成できます。または、作成中にデータのバインドを選択し、プロパティ・インスペクタを使用して追加の表示属性を構成することができます。

プロパティ・インスペクタで、各属性フィールドのドロップダウン・メニューを使用して、プロパティの説明、およびEL式ビルダーまたはその他の専用ダイアログの表示などのオプションを表示できます。図31-6に、階層ビューア・コンポーネントのLayout属性のドロップダウン・メニューを示します。

図31-6 階層ビューアのLayout属性のドロップダウン・メニュー

hv layout属性のドロップダウン・メニュー

注意:

アプリケーションでFusionテクノロジ・スタックが使用される場合、データ・コントロールを使用して階層ビューアを作成でき、バインドが行われます。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項を参照してください。

ページに階層ビューアを追加する手順:

  1. コンポーネント・パレットの「ADFデータ視覚化」ページで、「階層ビューア」パネルから階層ビューアをページにドラッグ・アンド・ドロップし、「階層ビューアの作成」ダイアログを開きます。

    ダイアログを使用して、階層ビューアのレイアウト・タイプを選択し、「OK」をクリックします。ダイアログのヘルプを参照するには、「ヘルプ」をクリックするか、[F1]を押します。

  2. プロパティ・インスペクタで、階層ビューアの属性を表示します。ヘルプ・ボタンを使用して、hierarchyViewerコンポーネントの完全なタグ・ドキュメントを表示します。

  3. 「共通」セクションを開きます。このセクションを使用して、次の属性を設定します。

    • Layout:階層ビューアの階層のレイアウトを指定します。

    • 祖先のレベル (サブメニューの表示): 初期レンダリングで表示する祖先レベルの数を指定するdisplayLevelsAncestor属性の設定に使用します。このプロパティはゼロから始まります。値0は、ルートの上の祖先レベルが表示されないことを意味します。デフォルト値は0です。

      「構成」をクリックすれば、「祖先表示の構成」ダイアログが開き、使用する祖先データ・コレクションを指定できます。

    • 子孫のレベル (サブメニューの表示): 初期レンダリングで表示する子孫レベルの数を指定するdisplayLevelsChildren属性の設定に使用します。このプロパティはゼロから始まります。値0は、ルートの下の子レベルが表示されず、ルート自体は表示されることを意味します。デフォルト値は1で、ルートおよび子の最初のレベルが表示されることを意味します。


      注意:

      disclosedRowKeys属性を使用して、初期のレンダリングの間に表示する子レベルの数を指定することもできます。disclosedRowKeysdisplayLevelsChildrenの属性を両方指定すると、disclosedRowKeys属性がdisplayLevelsChildrenよりも優先されます。

    • レベル当たりのノード (サブメニューを表示): 展開された親ノードごとに一度にフェッチされ、表示される子ノードの数を指定するlevelFetchSize属性の設定に使用します。階層ビューアに表示される横方向のナビゲーション・コントロールを使用すれば、追加の子ノードをフェッチし、表示できます。デフォルト値は25です。

  4. 「階層ビューア・データ」セクションを開きます。このセクションを使用して、次の属性を設定します。

    • Value: 階層ビューア用のデータ・モデルを指定します。データ・モデルはjavax.faces.TreeModelのインスタンスの可能性があります。属性のドロップダウン・メニューを使用して、「式ビルダー」を選択し、階層ビューアのデータ・モデルを含む、バインディングまたはマネージドbeanを選択することもできます。

    • Var: 階層ビューア・データ・コレクションの各要素の参照に使用される変数を指定します。このコンポーネントのレンダリングが完了すると、この変数は削除されるか、その前の値に戻ります。

  5. 「外観」セクションを開きます。このセクションを使用して、次の属性を設定します。

    • Summary:階層ビューアの説明を入力します。この説明は、スクリーン・リーダーのユーザーがアクセスします。

    • EmptyText:階層ビューアにデータが表示されない場合に表示するテキストを指定します。

  6. 「動作」セクションを開きます。このセクションを使用して、次の属性を設定します。

    • ControlPanelBehavior:コントロール・パネルの動作を指定します。詳細は、31.8.3項「コントロール・パネルの表示の構成方法」を参照してください。

    • Panning: パンの動作を指定します。デフォルト値は、クリック・アンド・ドラッグ・パンに対するautoです。noneを指定してパンを無効にすることもできます。

31.4 階層ビューアでのノードの管理

ノードは、実行時に階層ビューア・コンポーネントの個々の要素を示す形状です。階層ビューア・コンポーネントの個々の要素の例には、組織図の従業員またはネットワーク・ダイアグラムのコンピュータが含まれます。デフォルトで、階層ビューア・コンポーネントの各ノードには、ユーザーが次のことを実行できるコントロールが含まれています。

  • 階層ビューア・コンポーネントの他のノードへのナビゲート

    各ノードの上部には1つの「リストア」または分離ボタンが含まれ、親ノードを表示するか、階層ビューア内でアンカー・ノードとしてノードを分離します。例外は階層ビューア・コンポーネントの最上部のノードで、理由はこのノードには親ノードがなく分離できないからです。

  • 階層ビューア・コンポーネントで現在選択されているノードの子ノードの表示または非表示

    1つの「表示」ボタンまたは「非表示」ボタンが、各ノードの下部に表示されます。ユーザーがこれらのアイコンのいずれかをクリックすると、コンポーネントによりRowDisclosureEventイベントが生成されます。このイベントに対応する処理を実行するには、 af:treeコンポーネントと同じ方法でカスタムのrowDisclosureListenerメソッドを登録します。詳細は、10.5.4項「プログラムを使用したノードの開閉に関する必知事項」を参照してください。

階層ビューア・コンポーネントで参照するノードの様々な情報セットを表示するためにパネル・カードを使用する場合、ノードの下部にあるコントロールにより、ユーザーはアクティブ・ノードで情報セットを変更できます。詳細は、31.7項「パネル・カードの使用方法」を参照してください。

図31-7に、エンド・ユーザーがアンカー・ノードとしてノードを分離し、子ノードを表示し、アクティブ・ノードで様々なセットの情報を表示するためにノードを変更することができるコントロール付きのノードの例を示します。ノードのコントロールの構成方法の詳細は、31.4.2項「ノードのコントロールの構成方法」を参照してください。

図31-7 ノード・コントロール

ノード・コントロール。

基本的なノード・タイプは4つあります。

  • ルート・ノードは、階層ビューア・コンポーネントで表示可能な最上ノードです。ルート・ノードは、常にツリー・コンポーネントから返される階層のルートになります。通常、一度に表示されるルート・ノードは1つのみです。ただし、実装するユース・ケースによって、複数のルート・ノードが表示される場合もあります(ファミリ・ツリーの場合など)。

  • アンカー・ノードは、階層ビューア・コンポーネントがレンダリングされると必ずフォーカスされるノードです。表示されるアンカー・ノードは常に1つのみです。

    ツリー・ノードに子ノードが定義されていて、階層ビューア・コンポーネントのdisplayLevelsAncestorプロパティが0に等しい場合は、アンカー・ノードがルート・ノードと同じになる場合があります。実行時に、ユーザーがsetAnchorListenerプロパティに指定された値を持つ別のノードをダブルクリックすると、そのノードがアンカー・ノードになります。子ノードがあるかどうかによって、アンカー・ノードも内部ノードまたはリーフ・ノードにすることができます。アンカー・ノードの指定方法の詳細は、31.4.4項「ノード定義を特定のデータ行のセットに関連付ける方法」を参照してください。

    アンカー・ノードより上に、1つ以上の祖先レベルを指定できます。詳細は、31.4.5項「アンカー・ノードの祖先レベルの指定方法」を参照してください。

  • 内部ノードは、子ノードを持つノードです。

  • リーフ・ノードは、子ノードを持たないノードです。

図31-8に、階層ビューア・コンポーネントのレイアウトによって、ノードを別のタイプにする方法を示します。

図31-8 ノード・タイプおよび位置

階層ビューア・コンポーネントのノード・タイプ

31.4.1 ノード・コンテンツの指定方法

ノードにはデフォルトで、ユーザーにノードへのナビゲートを可能にし、ノードを表示または非表示にできるコントロールが含まれますが、デフォルトでコンテンツは含まれません。実行時にノードによってレンダリングされるコンテンツを定義する必要があります。『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%未満のズーム・レベルでノードに移動すると、100%のズーム・レベルでノードのコンテンツを表示するホバー・ウィンドウが自動的に表示され、ユーザーはズーム・レベルに関係なく、すべての情報を見ることができます。ホバー・ウィンドウ上のコントロールは、階層ビューアでそのノードが選択されているときにアクティブになります。

挿入する各ファセット要素は、他のコンポーネントの参照に使用できます。次のコンポーネントから1つ以上を使用して、階層ビューア・コンポーネントのノードにコンテンツを定義できます。ノード・コンポーネント・ファセットでは、次のコンポーネントをサポートしています。


注意:

サポートされていないコンポーネントには、設計時にフラグが付けられています。

階層ビューア・コンポーネントにノードを追加する手順:

  1. 構造ウィンドウで「dvt:hierarchyViewer」ノードを右クリックし、「dvt:hierarchyViewerの中に挿入」「ノード」を選択します。

    次のエントリがJSFページに表示されます。

    <dvt:node>
      <f:facet name="zoom100"/>
    </dvt:node>
    
  2. 構造ウィンドウで「dvt:node」を右クリックし、「プロパティに移動」を選択します。

  3. プロパティ・インスペクタで、適切なプロパティを構成します。

    たとえば、shapeプロパティの値を、ノードの形状をデフォルトの角が丸い長方形から楕円またはアクセッサ付きの長方形に変更するように設定します。

31.4.2 ノードのコントロールの構成方法

ノード・コンポーネント(dvt:node)では、リストア、分離、表示または非表示などのコントロールを実行時に表示するかどうかを決定できる多くのプロパティが公開されます。実行時のノードのサイズと形状を決定するプロパティも公開されます。

ノードにコントロールを構成する手順:

  1. 構造ウィンドウでdvt:nodeコンポーネントを右クリックし、「プロパティに移動」を選択します。

  2. 表31-2に説明されているとおり、プロパティ・インスペクタの「外観」セクションでdvt:nodeコンポーネントのプロパティを構成します。

    表31-2 ノード構成プロパティ

    これを行うには: プロパティに設定する値:

    表示または非表示コントロールをノードに表示するかしないかを構成します。

    showExpandChildrenFalseに設定して、コントロールを非表示にします。デフォルトでは、このプロパティはTrueに設定されています。

    リストアまたは分離コントロールをノードに表示するかしないかを構成します。

    showIsolateプロパティをFalseに設定してノード上のこれらのコントロールを非表示にします。デフォルトでは、このプロパティはtrueに設定されています。

    「上へナビゲート」コントロールをノードに表示するかどうかを構成します。

    showNavigateUpプロパティをFalseに設定してノード上のこのコントロールを非表示にします。デフォルトでは、このプロパティはtrueに設定されています。

    showNavigateUpプロパティをtrueに設定した場合は、31.5.1項「階層ビューアでの上方向へのナビゲーションの構成方法」での説明のとおり、階層ビューア・コンポーネントのnavigateUpListenerプロパティにも値を設定する必要があります。

    ノードの高さと幅を構成します。

    widthプロパティおよびheightプロパティの値を設定します。

    ノードの形状を選択します。

    「図形」ドロップダウン・リストから値を選択します。使用可能な値は次のとおりです。

    • ellipse

    • rect

    • roundedRect (デフォルト)


  3. プロパティ・インスペクタの「スタイル」セクションのプロパティの構成の詳細は、20.4項「コンポーネントのスタイル・プロパティの変更」を参照してください。

ホバー・ディテール・ウィンドウは、ズーム・レベルが76%未満のときにノード上をカーソルが移動すると自動的に表示され、そのノードに設定されるshape属性が反映されます。たとえば、ノードのshape属性がroundedRectの場合、図31-9に示すように、ディテール・ウィンドウの属性も同じになります。

76-100%のズーム・レベルでないノードをホバーしているとき、ディテール・ウィンドウの表示を無効化できます。詳細は、31.8.5項「ホバー・ディテール・ウィンドウの無効化の方法」を参照してください。

図31-9 階層ビューア・ノードでのホバー・ウィンドウ

階層ビューア・ノードのモーダル・ポップアップ

31.4.3 アクセッサのノード定義の指定方法

デフォルトで、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のデータバインドされた階層ビューアの作成に関する項での説明のとおり、「階層ビューアの作成」ダイアログを使用して、階層ビューア・コンポーネントを作成する場合は、ノード・コンポーネントをアクセッサと関連付けます。「階層ビューアの作成」ダイアログでは、ノード・コンポーネントのtypeプロパティが特定のアクセッサに設定されます。

ノード・コンポーネントのtypeプロパティを構成して、指定された1つ以上のアクセッサを使用できます。または、31.4.4項「ノード定義を特定のデータ行セットに関連付ける方法」での説明のとおり、アクセッサ全体にわたり1つのノード定義を使用するようにノード・コンポーネントのrenderedプロパティを構成することができます。階層ビューア・コンポーネントにより特定のデータ行にどのノード定義を使用するかが決定される場合、まずtypeプロパティで一致するものがないかがチェックされます。

  • typeプロパティが一致し、renderedプロパティ値がtrue (デフォルト)の場合、階層ビューア・コンポーネントでは、ノード定義を使用します。

  • typeプロパティと一致しない場合、階層ビューア・コンポーネントではrenderedプロパティの値がtrueと評価されるかどうかが確認されます。renderedプロパティの評価の結果は、typeには影響しません。

31.4.4 ノード定義を特定のデータ行セットに関連付ける方法

ノード・コンポーネントのrenderedプロパティを使用して、ノードを特定のデータ行のセットまたは単一データ行と関連付けることができます。renderedプロパティでは、ブール値を使用して、trueまたはfalseに評価してノード定義に関連付けるデータ行を決定するEL式を記述できます。たとえば、肩書に基づくデータをノードに表示するとします。ノード・コンポーネントのrenderedプロパティに対して、肩書が指定した値(この例ではCEO)と一致する場合にtrueと評価する次の疑似EL式のようなEL式を記述します。

rendered="#{node.title == 'CEO'}"

ノード・コンポーネントのrenderedプロパティをこのように使用する場合は、そのノード・コンポーネントのtypeプロパティの値は定義しません。

31.4.5 アンカー・ノードの祖先レベルの指定方法

階層ビューア・コンポーネントのアンカー・ノードは、ツリー・バインディングによって返される階層のルートです。ユースケースによって、ルート・ノードを複数にすることができます(1人以上のマネージャのいる組織図をレンダリングする階層ビューア・コンポーネントなど)。実行時に階層ビューア・コンポーネントをレンダリングすると、フォーカスのあるノードがアンカー・ノードになります。実行時に、ユーザーがsetAnchorListenerプロパティに指定された値を持つ別のノードをダブルクリックすると、そのノードがアンカー・ノードになります。

階層ビューアを構成して、アンカー・ノードの上に1つ以上のレベル(祖先レベル)を表示することができます。たとえば、ある会社の従業員を検索する場合、その従業員の上の管理職の系統を表示できます。displayLevelsAncestorプロパティを使用して、祖先レベルを指定します。

アンカー・ノードの祖先レベル数を指定する手順:

  1. 構造ウィンドウで「dvt:hierarchyViewer」を右クリックし、「プロパティに移動」を選択します。

  2. プロパティ・インスペクタで、「共通」セクションを開きます。

  3. 実行時に、アンカー・ノードの上に表示する祖先ノードのレベル数をdisplayLevelsAncestorプロパティで指定します。

    たとえば、アンカー・ノードの祖先レベルの数に2を入力すると、JSFページに次のエントリが表示されます。

    displayLevelsAncestor="2"

  4. JSFページへの変更を保存します。

31.5 階層ビューアのナビゲート

デフォルトで、階層ビューア・コンポーネントのルート・ノードと内部ノードには下方向へのナビゲーションが構成されています。階層ビューア・コンポーネントで上方向へのナビゲーションを行い、ユーザーが同じレベルのノード間をナビゲートしたときに表示されるノードの数を決定できるように構成することができます。

ノード・タイプの詳細は、31.4項「階層ビューアでのノードの管理」を参照してください。

31.5.1 階層ビューアでの上方向へのナビゲーションの構成方法

階層ビューア・コンポーネントの上方へのナビゲーションを構成する場合、階層ビューア・コンポーネントのnavigateUpListenerプロパティの値を構成します。

階層ビューア・コンポーネントの上方向へのナビゲーションを構成する手順:

  1. 構造ウィンドウで「dvt:hierarchyViewer」を選択し、「プロパティに移動」を選択します。

  2. プロパティ・インスペクタで、「動作」セクションを開きます。NavigateUpフィールドに、ユーザーが新しいアンカー・ノードにナビゲートしたときに、新しいアンカー・ノードを参照するようにデータ・モデルを更新するメソッドを指定する階層ビューア・コンポーネントのnavigateUpListenerの値を記述します。

    値の指定にヘルプが必要な場合は、「上へナビゲート」ドロップダウン・メニューからメソッド式ビルダーを選び、メソッド式ビルダー・ダイアログに入ります。「メソッド式ビルダー」ダイアログでのヘルプには、「ヘルプ」をクリックするか、[F1]を押してください。

  3. ページを保存します。

31.5.2 階層ビューアでの同レベル・ナビゲーションの構成方法

階層ビューア・コンポーネントのノード間の同レベル・ナビゲーションはデフォルトで有効にされています。階層ビューア・コンポーネントを構成して、一度に表示するノードの数を決定できます。これを行うと、ユーザーに次のナビゲートを可能にするコントロールが表示されます。

  • 左または右にナビゲートして、次のノードのセットを表示

  • 使用可能なノードのコレクションで最初または最後のノードのセットにナビゲート

階層ビューア・コンポーネントの同レベル・ナビゲーションを構成する手順:

  1. 構造ウィンドウでdvt:hierarchyViewerノードを右クリックし、「プロパティに移動」を選択します。

  2. プロパティ・インスペクタで「共通」セクションを開き、実行時に表示するノードの数をレベルごとのノード数フィールド(levelFetchSize)で指定します。

    たとえば、ノードの数に3を入力すると、JSFページに次のエントリが表示されます。

    levelFetchSize="3"

  3. 「OK」をクリックします。

31.5.3 階層ビューアで同レベル・ナビゲーションを構成する場合の処理

実行時に、階層ビューア・コンポーネントのlevelFetchSizeプロパティの値として指定したノードの数が、階層ビューア・コンポーネントによってレンダリングされます。階層ビューア・コンポーネントは、ユーザーが次のことを実行できるコントロールもレンダリングします。

  • 左または右にナビゲートして、次のノードのセットを表示

  • 使用可能なノードのコレクションで最初または最後のノードのセットにナビゲート

図31-10に、levelFetchSize="3"の場合の実行時の例を示します。ユーザーがコントロール上にマウスを移動させると、ユーザーにノードの最後のセットへのナビゲートを可能にするコントロールが表示されます。

図31-10 同レベル・ナビゲーションを使用した階層ビューア・コンポーネント

階層ビューアの横のナビゲーション。

31.6 階層ビューア・コンポーネントへの対話性の追加

階層ビューア・コンポーネントを構成して、ポップアップ・ウィンドウを起動し、機能およびOracle Fusion Webアプリケーションの他のページからのデータが示されたメニューを表示します。

31.6.1 パンの構成方法

デフォルトでは、階層ビューアのパンは、コンポーネントをクリックおよびドラッグしてビューを再配置するか、コントロール・パネルのパン制御を使用することで行われます。

panningプロパティをnoneに設定することで、パン効果を無効化できます。

31.6.2 ノード選択アクションを構成する方法

デフォルトでは、階層ビューアのノードを実行時にクリックして、ノードを選択します。dvt:nodeコンポーネントでclickBehavior属性を設定することにより、この相互作用をカスタマイズできます。このプロパティの有効な値は次のとおりです。

  • focus - ノードはフォーカスされ、クリックすると選択されます(デフォルト)。

  • expandCollapse - 子ノード要素は、現在の展開状態に応じて、展開または縮小されます。

  • isolateRestore - ノードは、現在の状態に応じて、分離またはリストアされます。

  • none - ノードをクリックしても何も起こりません。

31.6.3 ポップアップ・ウィンドウを起動するための階層ビューアの構成

af:showPopupBehaviorタグの値を指定し、コマンド・コンポーネント(af:commandButtonなど)から起動することにより、階層ビューア・ノードからポップアップ・ウィンドウを起動できます。階層ビューア・コンポーネントのノードのf:facet要素内で、ポップアップを起動するコマンド・コンポーネントをネストする必要があります。このシナリオで使用されるaf:showPopupBehaviorタグのtriggerTypeプロパティは、次の値のみをサポートします。

  • action

  • mouseHover

たとえば、図31-11は、ノード内のHR Detailリンクから起動されたモーダル・ポップアップを示しています。

図31-11 階層ビューア・ノードのモーダル・ポップアップ

階層ビューア・ノードのモーダル・ポップアップ。

例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項「ポップアップ要素の起動」を参照してください。

31.6.4 階層ビューアのドラッグ・アンド・ドロップの構成

階層ビューアは、次のドラッグ・アンド・ドロップのシナリオをサポートします。

  • 階層ビューア内で、1つ以上のノードをドラッグ・アンド・ドロップします

  • 階層ビューアから1つ以上のノードを別のコンポーネントにドラッグします

  • 別のコンポーネントから階層ビューアに1つ以上のアイテムをドラッグします

図31-12に、その中でのドラッグ・アンド・ドロップを可能とするように構成した階層ビューアを示します。この例では、ノードをクリックし0.5秒を超えて保持すると、バックグラウンドにドラッグして階層内の別のルートにしたり、別のノードにドラッグしてそのノードの子として追加したりすることができます。

図31-12 ノード・ドラッグを示す階層ビューア

階層ビューアでドラッグされたノード

図31-13に、階層ビューアのバックグラウンドへのドラッグの結果を示します。Nancy Greenとその部下は、今は階層における新しいツリーとして示されます。

図31-13 バックグラウンドへのノード・ドラッグ後の階層ビューア

バックグラウンドへのノード・ドラッグ後の階層ビューア

ノードを別のノードにドラッグすると、ドラッグされたノードとその子は、ターゲット・ノードの子となる。図31-14に、Nina Evansのデータを含むノードへのドラッグの結果を示します。Nancy Greenとその部下は、今はNina Evansの部下として示されます。

図31-14 別のノードへのノード・ドラッグ後の階層ビューア

別のノードへのノード・ドラッグを示す階層ビューア

図31-15に、af:outputFormattedコンポーネントとの間のドラッグやドロップを可能とするように構成された、同じ階層ビューアの例を示します。この例では、ユーザーは1つ以上のノードをドロップ・テキストにドラッグでき、かつテキストは変化して、ユーザーがどのノードをドラッグし、どの操作を実行したかを示します。ユーザーがドラッグ・テキストから階層ビューア・ノードかバックグラウンドにドラッグした場合、テキストは変化して、テキストがどこでドラッグされ、どの操作が実行されたかを示します。

図31-15 別のコンポーネントへのドラッグ・アンド・ドロップを可能とするように構成した階層ビューア

別のコンポーネントへのドラッグ・アンド・ドロップを可能とするように構成した階層ビューア

図31-16に、ユーザーがJames MarlowとNina Evansのデータを含むノードをドロップ・テキストにドラッグした後の、同じ階層ビューアを示します。

図31-16 複数ノードのドラッグの後の階層ビューア

ドラッグ後の階層ビューア

ユーザーがドラッグ・テキストから階層ビューア・ノードかバックグラウンドにドラッグした場合、テキストは変化して、テキストがどこでドラッグされ、どの操作が実行されたかを示します。図31-17に、ユーザーがテキストを階層ビューアのバックグラウンドへドラッグした後の、同じ階層ビューアを示します。

図31-17 階層ビューア・バックグラウンドへのテキスト・ドラッグ後の階層ビューア

バックグラウンドへのテキスト・ドラッグ後の階層ビューア

31.6.4.1 階層ビューアのドラッグ・アンド・ドロップの構成方法

階層ビューアにドラッグのサポートを追加するには(これによりコンポーネントや他の階層ビューアがそこからノードのドラッグが可能となりますが)、af:dragSourceタグを階層ビューアに付加し、af:dropTargetタグをドラッグを受け取るコンポーネントに追加します。ドラッグを受け取るコンポーネントはorg.apache.myfaces.trinidad.model.RowKeySetデータ・フレーバをaf:dropTargetの子として含み、かつドロップ・イベントへの応答のため、dropListenerメソッドを定義する必要があります。

階層ビューアにドロップのサポートを追加するには(これによりコンポーネントや他の階層ビューアがそこへのアイテムのドラッグが可能となりますが)、af:dropTargetタグを階層ビューアに追加し、その階層ビューアがサポートするデータ・フレーバを含めます。dropListenerメソッドを、ドロップ・イベントに応答するマネージドBeanに追加します。

次の手順は、図31-15に示すaf:outputFormattedコンポーネントの、単一のドラッグ・ソースあるいはドロップ・ターゲットとして、階層を設定する方法を示します。ADF FacesまたはADFデータ視覚化コンポーネントのドラッグ・アンド・ドロップの構成の詳細は、第35章「ドラッグ・アンド・ドロップ機能の追加」を参照してください。

始める前に:

階層ビューアの属性や階層ビューアの子タグが機能にどのような影響を与えるかについて理解しておくと役立ちます。詳細は、31.1.1項「階層ビューア・コンポーネントの理解」を参照してください。

次のタスクを完了する必要があります。

  • ページに階層ビューアを追加します。詳細は、31.3.1項「ページへの階層ビューアの追加方法」を参照してください。

  • ドラッグ・アンド・ドロップをサポートするのに必要な追加コンポーネントを作成します。

    たとえば、図31-15の中のページはaf:panelGroupLayoutコンポーネントを使用し、このコンポーネントはaf:outputFormattedaf:panelListコンポーネントを含み、ユーザーに手順を提供します。このページはまたaf:panelSplitterコンポーネントを使用して、ドラッグ・アンド・ドロップaf:outputFormattedコンポーネント・テキストを階層ビューアから分割します。

    例31-4に、追加コンポーネントの、完了したページ・セクションを示します。階層ビューアのノードの詳細は省略されています。

    例31-4 階層ビューアのドラッグ・アンド・ドロップ例のサンプル・コード

    <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ページ上のコンテンツの編集」を参照してください。

階層ビューアのドラッグ・アンド・ドロップを構成するには:

  1. 階層ビューアをドロップ・ターゲットとして構成するには、コンポーネント・パレットで、「操作」パネルから、「ドロップ・ターゲット」タグをドラッグし、階層ビューアの子としてドロップします。

  2. ドロップ・ターゲットを挿入ダイアログで、ドロップ・リスナーの名前を入力するか、ドロップダウン・メニューを使用して編集を選び、ドロップ・リスナー・メソッドを階層ビューアのマネージドBeanに追加してください。または、ドロップダウン・メニューを使用して式ビルダーを選び、ドロップ・リスナーのEL式を入力してください。

    たとえば、toDropListener()という名前のメソッドをhvBeanという名前のマネージドBeanに追加するには、編集を選び、ドロップダウン・メニューからhvBeanを選択し、新規「メソッド」フィールドの右でクリックして、toDropListener()メソッドを作成します。

    例31-5に、サンプルのドロップ・リスナーと図31-15で示される階層ビューアのサポート・メソッドを示します。

    例31-5 階層ビューアのサンプル・ドロップ・リスナー

    // 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;
    }
    

    注意:

    このメソッドは、階層ビューアの属性を定義するEmployeeクラスを参照しています。ユーザーの階層ビューアが異なるクラスを使用している場合、かわりにそのクラスの名前を置き換えてください。

    この例で使用されているEmployeeクラスのソース・コードを見る場合、そのソース・コードやADF Facesのデモ・アプリケーションのソース・コードを見つけることができます。デモ・アプリケーションの詳細は、1.4項「ADF Facesデモ・アプリケーション」を参照してください。


  3. 「OK」をクリックして、「データ・フレーバの挿入」ダイアログに入力します。

  4. データ・フレーバを挿入ダイアログで、ドロップ・ターゲットが受け入れるオブジェクトを入力します。または、ドロップダウン・メニューを使用してオブジェクトの階層をナビゲートし、希望するオブジェクトを選択します。

    たとえば、af:outputFormattedコンポーネントがテキストを階層ビューアにドラッグできるようにするには、java.lang.Objectデータ・フレーバの挿入ダイアログに入力します。

  5. 構造ウィンドウでaf:dropTargetコンポーネントを右クリックし、「プロパティに移動」を選択します。

  6. プロパティ・インスペクタにおいて、「アクション」フィールドに、ドロップ・ターゲットが受け入れる操作のリストを、空白で区切って入力します。許容値は、COPYMOVEまたはLINKです。値を指定しない場合、ドロップ・ターゲットはCOPYを使用します。

    たとえば、「アクション」フィールドに次を入力し、すべての操作を可能にします。

    COPY MOVE LINK
    
  7. 階層ビューアをドロップ・ターゲットとして使用するには、次を実行します。

    1. コンポーネント・パレットで、「Operations」パネルから、「ドラッグ元」タグをドラッグのソースとなるコンポーネントの子としてドラッグ・アンド・ドロップします。

      たとえば、「ドラッグ元」タグをaf:outputFormattedコンポーネントの子としてドラッグ・アンド・ドロップします。

    2. コンポーネントの値のフィールドでは、ステップ2でドロップ・リスナーで階層ビューアに作成したパブリック変数を参照します。

      たとえば、toDropListener()という名前のドロップ・リスナーとdropTextという名前の変数には、コンポーネントの値のフィールドに、次を入力します。

      #{hvBean.dropText}
      
  8. 階層ビューアをドラッグ・ソースとして構成するには、コンポーネント・パレットで、「操作」パネルから、「ドラッグ元」タグを、階層ビューアの子としてドラッグ・アンド・ドロップします。

  9. プロパティ・インスペクタにおいて、「アクション」フィールドに、ドロップ・ターゲットが受け入れる操作のリストを、空白で区切って入力します。許容値は、COPYMOVEまたはLINKです。

    たとえば、「アクション」フィールドに次を入力し、すべての操作を可能にします。

    COPY MOVE LINK
    
  10. ドラッグ・ソースがサポートするデフォルトのアクションを指定するには、DefaultAction属性のドロップダウン・メニューを使用して、「コピー」,、「移動」または「リンク」を選択します。

    図31-15におけるドラッグ・アンド・ドロップの例での階層ビューアは、移動をデフォルトのアクションとして使用しています。

  11. 他のコンポーネントを階層ビューアからのドラッグのドロップ・ターゲットとするには、以下を実行します。

    1. コンポーネント・パレットで、「Operations」パネルから、「ドロップ・ターゲット」を、ドロップを受け取るコンポーネント上にドラッグ・アンド・ドロップします。

      たとえば、図31-15におけるドラッグ・アンド・ドロップの例のページは、ドロップの結果を表示するaf:outputFormattedコンポーネントを含んでいます。

    2. ドロップ・ターゲットを挿入ダイアログで、ドロップ・リスナーの名前を入力するか、ドロップダウン・メニューを使用して編集を選び、ドロップ・リスナー・メソッドを適切なマネージドBeanに追加してください。または、ドロップダウン・メニューを使用して式ビルダーを選び、ドロップ・リスナーのEL式を入力してください。

      たとえば、fromDropListener()という名前のメソッドをhvBeanという名前のマネージドBeanに追加するには、編集を選び、ドロップダウン・メニューからhvBeanを選択し、新規「メソッド」フィールドの右でクリックして、fromDropListener()メソッドを作成します。

      例31-6に、図31-15に表示される階層ビューアのサンプル・ドロップ・リスナーを示します。この例は同じインポートとヘルパー・メソッドを使用しており、それらはここには含まれていません。

      例31-6 階層ビューアをドラッグ・ソースとして使用するコンポーネントのサンプル・ドロップ・リスナー

      // 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();
      }
      
    3. 「OK」をクリックして、「データ・フレーバの挿入」ダイアログに入力します。

    4. 「データ・フレーバの挿入」ダイアログで、org.apache.myfaces.trinidad.model.RowKeySetを入力します。

      たとえば、af:outputFormattedコンポーネントがテキストを階層ビューアにドラッグできるようにするには、org.apache.myfaces.trinidad.model.RowKeySetデータ・フレーバの挿入ダイアログに入力します。

    5. 構造ウィンドウでaf:dropTargetコンポーネントを右クリックし、「プロパティに移動」を選択します。

    6. プロパティ・インスペクタにおいて、「アクション」フィールドに、ドロップ・ターゲットが受け入れる操作のリストを、空白で区切って入力します。許容値は、COPYMOVEまたはLINKです。値を指定しない場合、ドロップ・ターゲットはCOPYを使用します。

      たとえば、「アクション」フィールドに次を入力し、すべての操作を可能にします。

      COPY MOVE LINK
      
    7. コンポーネントの値のフィールドでは、ステップ2でドロップ・リスナーでツリーマップあるいはサンバーストに作成したパブリック変数を参照します。

      たとえば、fromDropListener()という名前のドロップ・リスナーとdragTextという名前の変数には、コンポーネントのフィールドに、次を入力します。

      #{hvBean.dragText}
      

31.6.4.2 階層ビューアのドラッグ・アンド・ドロップに関する必知事項

ノードをドラッグする機能を、そのdraggable属性をnoと設定することで、無効化できます。

31.7 パネル・カードの使用

パネル・カード・コンポーネントを階層ビューア・コンポーネントとともに使用して、階層ビューア・コンポーネントが参照するノードに異なる情報のセットを保持できます。パネル・カード・コンポーネントには、ノード要素内の領域で、1つ以上のaf:showDetailItem要素を含めることができます。

af:showDetailItem要素がコンテンツの1セットを参照します。たとえば、組織図をレンダリングする階層ビューア・コンポーネントに組織内の従業員のノードを含めることができます。このノードには、1つのaf:showDetailItem要素、および給与情報を参照するもう1つのaf:showDetailItem要素を使用して連絡先情報を参照するパネル・カード・コンポーネントを含めることができます。

パネル・カード・コンポーネントには、実行時に1つのaf:showDetailItem要素によって参照されるコンテンツが表示されます。パネル・カード・コンポーネントによって、ナビゲーション・ボタン、およびユーザーがaf:showDetailItem要素によって参照されるデータのセット間の切替えを行えるようにする他のコントロールがレンダリングされます。ユーザーがデータの異なったセット間で切替えを行えるようにするコントロールは、オプションの遷移効果を使用して構成できます。たとえば、パネル・カードがaf:showDetailItem要素によって参照されるデータのセットと、別のaf:showDetailItem要素によって参照される別のデータのセットとの間を水平にスライドするように構成できます。

31.7.1 パネル・カードの作成方法

パネル・カード・コンポーネントは、JSFページの構造ウィンドウでFacet zoom要素を選択した場合に表示されるポップアップ・メニューを使用して、階層ビューア・コンポーネントをレンダリングするJSFページに挿入できます。

パネル・カードを作成する手順:

  1. 構造ウィンドウで、パネル・カードを作成するノード内のズーム・レベルを右クリックします。

    f:facet - zoom100などを選択します。

  2. 選択したファセットにpanelGroupLayoutコンポーネントが含まれない場合、「f:facet - zoomlevelの中に挿入」「パネル・グループ・レイアウト」を選択してパネル・カードのコンテナを作成します。

  3. プロパティ・インスペクタを使用してpanelGroupLayoutコンポーネントの属性を構成します。

    panelGroupLayoutコンポーネント構成に関するヘルプについては、第8.16.1項「panelGroupLayoutコンポーネントの使用方法」を参照してください。

  4. 構造ウィンドウで、「af:panelGroupLayout」ノードを右クリックし、「af:panelGroupLayoutの中に挿入」→「パネル・カード」を選び、パネル・カードを作成します。

  5. プロパティ・インスペクタを使用して、パネル・カードのプロパティを構成します。

    たとえば、パネル・カード・コンポーネントで「効果」プロパティの値を設定します。有効な値は次のとおりです。

    • slide_horz (デフォルト)

      一方から新しいコンテンツがスライドして表示され、古いコンテンツが反対側にスライドして消えていきます。

    • immediate

      コンテンツは遷移効果なしで直ちに表示されます。

    • node_flip_horz

      ノード全体がめくれて、新しいコンテンツが表示されます。

    • flip_horz

      showDetailItemがめくれて新しいコンテンツが表示されます。

  6. 構造ウィンドウでdvt:panelCardを右クリックし、dvt:panelCardの中に挿入「詳細アイテムの表示」を選択します。

  7. プロパティ・インスペクタを使用して、挿入するaf:showDetailItem要素のプロパティを構成します。

  8. パネル・カードに表示させたいコンテンツの各セットにつき、ステップ6とステップ7を繰り返します。

31.7.2 実行時にパネル・カード・コンポーネントをレンダリングする場合の処理

実行時に、ノードが表示され、パネル・カード・コンポーネントが1つ表示されます。ユーザーはパネル・カードの下部にあるナビゲーション・ボタンをクリックして、パネル・カードのaf:showDetailItem子要素のいずれかによって参照されるコンテンツの次のセットにナビゲートできます。

図31-18に、2つの異なるaf:showDetailItem子要素が異なる情報のセット(ContactとAddress)を参照するパネル・カード・コンポーネントのあるノードを示します。この例のコントロールには、パネル・カードの中をスライドするための矢印と、表示するパネル・カードを直接選択するためのボタンがあります。両方のコントロール・オプションにツールチップが表示されています。

図31-18 パネル・カードを使用した実行時のノードの表示

実行時のパネル・カード・ビュー。

31.8 階層ビューアの外観のカスタマイズ

階層ビューア・コンポーネントのサイズおよび外観(イメージの追加、コンロトール・パネルの表示の構成、リンクおよびラベルのカスタマイズなど)をカスタマイズできます。

階層ビューア・コンポーネントの外観は、第20章「スタイルおよびスキンを使用した外観のカスタマイズ」での説明のとおり、スキンおよびコンポーネント・スタイル属性を変更することによって変更できます。

31.8.1 階層ビューアのサイズの調整方法

階層ビューア・コンポーネントのサイズは、プロパティ・インスペクタを使用して、多数の階層ビューア・コンポーネントの属性に値を設定することによって調整できます。

デフォルトで、階層ビューアのサイズは、AFStretchWidthスタイル設定のstyleClass属性を使用し、利用可能なスペースの幅に合せて構成される。この設定は、プロパティ・インスペクタのスタイルの項目の値を構成することで、追加や修正が可能です。

階層ビューアのサイズを調整する手順:

  1. 階層ビューア・コンポーネントを含むJSFページの構造ウィンドウで、dvt:hierarchyViewerノードを選択し、プロパティに移動を選びます。

  2. プロパティ・インスペクタにおいて、事前定義されたスタイル・クラスを使用して幅や高さを指定するには、styleClass属性にスタイル名を入力するか、編集を属性のドロップダウン・メニューから選び、1つ以上の事前定義されたスタイルを選択します。

  3. 幅や高さに特定の値を入れるには、InlineStyle属性に値を入力します。:

    • width

      パーセント(%)かピクセル(px)で値を入力します。階層ビューアのスタイル属性は自動的にAFStretchWidthに設定されているので、幅を100%に設定するのに値を入力する必要はありません。

    • height

      パーセント(%)またはピクセル(px)で値を記述します。heightのデフォルト値は600pxです。

    InlineStyleプロパティに入力する最終値には、次の構文を使用する必要があります。

    width:75%;height:600px;

  4. JSFページへの変更を保存します。

スタイルおよびスキンの適用についての詳細は、第20章「スタイルおよびスキンを使用した外観のカスタマイズ」を参照してください。

31.8.2 階層ビューアにイメージを含める方法

実行時に階層ビューア・コンポーネントのノードがイメージに表示されるように階層ビューア・コンポーネントを構成できます。これは、組織図に画像を表示するような場合に便利です。ソース属性を希望するイメージのURLにバインドしたaf:imageコンポーネントを挿入します。次のコード例では、個人のIDの値を使用して名前が付けられ、イメージ・ディレクトリに保存されているファイルからイメージをレンダリングします。

<af:panelGroupLayout>
  <af:image source="images/#{node.PersonId}.png"
            inlineStyle="width:64px;height:90px;"/>                                
</af:panelGroupLayout>

af:panelGroupLayoutコンポーネントの詳細は、8.16.1項「panelGroupLayoutコンポーネントの使用方法」を参照してください。

31.8.3 コントロール・パネルの表示の構成方法

実行時に階層ビューア・コンポーネントによってレンダリングされる場合、コントロール・パネルが次のように機能するように、31.1.2項「階層ビューアの要素と用語」で説明されているとおり、階層ビューア・コンポーネントを構成できます。

  • 開いたまたは表示状態での表示

  • 閉じたまたは非表示状態での表示

  • ユーザーに対して非表示

コントロール・パネルの表示を構成する手順:

  1. 構造ウィンドウで「dvt:hierarchyViewer」を右クリックし、「プロパティに移動」を選択します。

  2. 「外観」セクションを開き、「ControlPanelBehavior」ドロップダウン・リストから次の値のいずれかを選択します。

    • hidden

      実行時にコントロール・パネルを表示しない場合は、この値を選択します。

    • initCollapsed

      これがデフォルト値です。コントロール・パネルは、実行時に閉じたまたは非表示状態で表示されます。

    • initExpanded

      実行時にコントロール・パネルを開いたまたは表示状態で表示する場合は、この値を選択します。

  3. JSFページへの変更を保存します。

31.8.4 リンクおよびラベルの表示を構成する方法

階層ビューアでは、ノード間の関係がノードを結ぶ線によって表されます。リンクは、ラベルが含まれるように構成できます。図31-19に、階層ビューアでのリンクとラベルを示します。

図31-19 階層ビューアのリンクとラベル

階層ビューアのリンクとラベル。

リンクとラベルの外観は、階層ビューアでdvt:link要素のプロパティを設定することでカスタマイズできます。図31-20に、linkStyle属性に設定されたdashDot値とのリンクを示します。

図31-20 破線と点線のリンク・スタイルのリンク

破線と点線スタイルのリンク

リンクおよびラベルの表示をカスタマイズする手順:

  1. 構造ウィンドウで「dvt:link」を右クリックし、「プロパティに移動」を選択します。

  2. プロパティ・インスペクタで、次の属性を設定して、階層ビューア内のノード間のリンクの外観を希望するようにカスタマイズします。

    • linkStyle - リンクのスタイル(点線または破線など)を設定します。

    • linkColor - リンクの色を設定します。

    • linkWidth - リンクの幅をピクセル単位で設定します。

    • linkType - リンクのタイプ(直線または1つの直角にぴったり合う滑らかな曲線など)を設定します。

    • endConnectorType - リンク接続エンドのスタイルをnone (デフォルト)またはarrowOpenに設定します。

  3. また、プロパティ・インスペクタで、リンクに関連付けられたラベルのテキストをlabelプロパティに入力します。

    または、子ノードに基づいてリンク・ラベルをスタンプ・アウトするEL式を指定します。たとえば、ノードのvar属性がリンクと関連付けられた子ノードを参照する次のようなEL式を記述します。

    label="{node.relationship}"
    
  4. また必要に応じて、プロパティ・インスペクタで、renderedプロパティを使用して、ノード間の特定の関係のリンクをスタンプします。このプロパティにはブール値を指定するため、リンクが関係を表すかどうかを決定するtrueまたはfalseに評価されるEL式を記述できます。たとえば、関係のレポートに基づいてリンクを表示するとします。リンク・コンポーネントのrenderedプロパティに対して、関係が指定した値(この例ではCONSULTANT)と一致する場合にtrueと評価する次のEL式のようなEL式を記述します。

    rendered="#{node.relationship == "CEO"}
    

31.8.5 ホバー・ディテール・ウィンドウの無効化の方法

デフォルトでは、ズーム・レベルが76%未満のとき、ホバー・ウィンドウが自動的に表示されます。ユーザーの階層ビューアがポップアップを使用している場合、ホバー・ウィンドウはそのポップアップ表示と干渉する可能性があります。階層ビューアのdetailWindow属性を使用して、ホバー・ウィンドウの表示を消すことができます。

階層ビューアのホバー・ウィンドウを無効化するには:

  1. 構造ウィンドウで「dvt:hierarchyViewer」を右クリックし、「プロパティに移動」を選択します。

  2. プロパティ・インスペクタで「動作」セクションを開き、DetailWindowドロップダウン・リストから次の値の1つを選択します。

    • auto

      これがデフォルト値です。ホバー・ウィンドウは、常時有効化されます。

    • none

      ホバー・ウィンドウを有効化しない場合はこの値を選択してください。

31.8.6 スキニングおよび階層ビューアの外観のカスタマイズに関する必知事項

階層ビューアは、コンポーネントのトップ・レベルのみでなく、ノード、ボタンおよびリンクについても、色やフォント・スタイルをカスタマイズするためのスキニングもサポートします。さらに、スキニングを使用して、ユーザーがマウスを置いた場合やナビゲーション・ボタンを押したときの階層ビューアのスタイルを定義できます。

例31-7に、ユーザーがパネル・カードのナビゲーション・ボタンを選択したときに枠の色を表示するように構成された階層ビューアのスキニング・キーを示します。

例31-7 選択されたときにパネル・カード・ナビゲーション・ボタンを変えるスキニング・キー

af|dvt-panelCard::navigation-button:active
  {
    -tr-border-color:#000000;
  }

階層ビューアのスキニング・キーの完全なリストについては、Oracle Fusion Middleware Oracle ADF Facesスキン・セレクタ・データ視覚化ツール・タグ・リファレンスを参照してください。スキンを使用したアプリケーションのカスタマイズの詳細は、第20章「スタイルおよびスキンを使用した外観のカスタマイズ」を参照してください。

31.9 階層ビューアへの検索の追加

階層ビューアの検索機能では、階層ビューアのデータ構造を調べ、スクロール可能なリストに一致を提示します。ユーザーは、検索結果をダブルクリックすると、一致するノードを階層ビューアのアンカー・ノードとして表示できます。有効な場合、階層ビューアの右上隅に検索パネルが表示され、結果は検索パネルの下に表示されます。図31-21に、検索パネルのサンプルを示します。

図31-21 階層ビューアの検索パネル

階層ビューアの検索パネル

図31-22に、検索結果のサンプルを示します。

図31-22 階層ビューアの検索結果のサンプル

階層ビューアの検索結果

31.9.1 階層ビューアでの検索の構成方法

検索を有効にするには、dvt:searchタグをdvt:hierarchyViewerタグの子として追加し、結果の処理方法を指定するには、dvt:searchResultsdvt:searchの子として追加します。

階層ビューアでの検索を構成する手段:

  1. 構造ウィンドウで「dvt:hierarchyViewer」ノードを右クリックし、「dvt:hierarchyViewerの中に挿入」「dvt:search」を選択します。

  2. プロパティ・インスペクタで、検索機能を構成するために次の属性を設定します。

    • value: 検索テキストを保持する変数を指定します。

    • actionListener: 検索を実行するためにコールされるリスナーを入力します。

    • initialBehavior: 検索パネルの初期表示を指定します。有効な値は、最初縮小された状態のinitCollapsed、最初開かれた状態のinitExpanded、またはビューから完全に隠すhiddenです。

  3. オプションで、name="end"の値の入ったf:facetを追加して、階層ビューア・コンポーネントの外で拡張検索を開始するコンポーネントを指定します。このファセットには、データ・セットの包括的な検索を開始するために、コンポーネント(af:commandLinkなど)は1つしか含まれません。詳細は、12.4項「queryコンポーネントの使用方法」を参照してください。

  4. 構造ウィンドウで「dvt:search」ノードを右クリックし、「dvt:searchの中に挿入」「dvt:searchResults」を選択します。

  5. プロパティ・インスペクタで、検索結果の表示を構成するために次の属性を設定します。

    • value: 検索結果のデータ・モデルを指定します。これは、oracle.adf.view.faces.bi.model.DataModelのインスタンスである必要があります。

    • var: 階層ビューア・コレクションの各要素の参照に使用されるEL変数の名前を入力します。このコンポーネントのレンダリングが完了すると、この変数は削除されるか、その前の値に戻ります。

    • varStatus: varStatus情報の参照に使用されるEL変数の名前を入力します。このコンポーネントのレンダリングが完了すると、この変数は削除されるか、その前の値に戻ります。

    • resultListener: 検索結果の1行が選択された後コールされるアクション・リスナーに対する参照を指定します。

    • emptyText: 結果が返されなかった場合に表示されるテキストを指定します。

    • fetchSize: 一度にフェッチされる結果の行数を指定します。

  6. 構造ウィンドウで「dvt:searchResults」ノードを右クリックし、「dvt:searchResultsの中に挿入」「ADF Faces」「af:setPropertyListener」と選択します。

  7. プロパティ・インスペクタで次の属性を設定し、検索結果ノードを結果モデルから対応する階層ビューア・モデルにマップします。

    • from: 値のソース(定数またはEL式)を指定します。

    • to: 値のターゲットを指定します。

    • type: actionを値として選択します。

  8. 構造ウィンドウで「dvt:searchResults」ノードを右クリックし、「dvt:searchResultsの中に挿入」「f:facet」(値はname="content")と選択します。

  9. 構造ウィンドウで「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 id="shv" styleClass="AFStretchWidth"
                     controlPanelBehavior="initExpanded"
                     var="node" detailWindow="none"
                     value="#{XMLParser.employees}"
                     contentDelivery="immediate"
                     navigateUpListener="#{XMLParser.doNavigateUp}">
  <dvt:search id="searchId" value="#{XMLParser.searchText}"
                            actionListener="#{XMLParser.doSearch}"
                            initialBehavior="initExpanded">
    <f:facet name="end">
      <af:commandLink text="Options" id="cl1">
        <af:showPopupBehavior popupId="::mypop"
                              triggerType="action"/>
      </af:commandLink>
    </f:facet>
    <dvt:searchResults id="searchResultId"
                       emptyText="Text not found" fetchSize="10"
                       value="#{XMLParser.results}"
                       resultListener="#{XMLParser.doResultAction}"
                       var="resultRow">
      <af:setPropertyListener from="#{resultRow.employee.personId}"
                              to="#{XMLParser.selectedId}"
                              type="action"/>
      <f:facet name="content">
        <af:panelGroupLayout layout="vertical" halign="start"
                             inlineStyle="width:200px" id="pgl15">
          <af:panelGroupLayout layout="horizontal" id="pgl16">
            <af:image source="/resources/images/hv/NoseCreature.png"
                      inlineStyle="width:16px;height:16px"
                      id="i7"/>
            <af:outputText value="#{resultRow.employee.lastName},"
                           id="ot0"/>
            <af:outputText value="#{resultRow.employee.firstName}"
                           id="ot1"/>
          </af:panelGroupLayout>
          <af:panelGroupLayout layout="horizontal"
                               id="pgl17"
                               styleClass="AFStretchWidth">
            <af:spacer width="20" id="s9"/>
            <af:outputText value="#{resultRow.matchingAttribute}:"
                           id="ot2"
                           inlineStyle="font-style:italic; font-size:10px;"/>
            <af:outputFormatted value="#{resultRow.matchingHtml}"
                                id="ot3"
                                inlineStyle="color:Gray;"/>
          </af:panelGroupLayout>
        </af:panelGroupLayout>
      </f:facet>
    </dvt:searchResults>
  </dvt:search>

31.9.2 階層ビューアでの検索の構成に関する必知事項

階層ビューアでの検索は、検索可能な属性、または階層ビューア・データ・モデルの基礎であるデータ・コレクションの列に基づいています。Oracle ADFのデータ・コントロールで定義されている問合せ結果コレクションを使用して、JDeveloperではこれが宣言的タスクになります。詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の階層ビューアでのデータバインドされた検索の作成方法に関する項を参照してください。