Oracle ADF
Oracle ADF
Oracle ADF
April 2010
Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development
Framework, 11g Release 1 (11.1.1)
B31973-05
Primary Authors: Robin Whitmore (lead), Peter Jew, Kathryn Munn, Walter Egan, Himanshu Marathe
Contributors: ADF Faces development team, Frank Nimphius, Laura Akel, Katia Obradovic-Sarkic
This software and related documentation are provided under a license agreement containing restrictions on
use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your
license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license,
transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse
engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is
prohibited.
The information contained herein is subject to change without notice and is not warranted to be error-free. If
you find any errors, please report them to us in writing.
If this software or related documentation is delivered to the U.S. Government or anyone licensing it on
behalf of the U.S. Government, the following notice is applicable:
U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data
delivered to U.S. Government customers are "commercial computer software" or "commercial technical data"
pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As
such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and
license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of
the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software
License (December 2007). Oracle USA, Inc., 500 Oracle Parkway, Redwood City, CA 94065.
This software is developed for general use in a variety of information management applications. It is not
developed or intended for use in any inherently dangerous applications, including applications which may
create a risk of personal injury. If you use this software in dangerous applications, then you shall be
responsible to take all appropriate fail-safe, backup, redundancy, and other measures to ensure the safe use
of this software. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of
this software in dangerous applications.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks
of their respective owners.
This software and documentation may provide access to or information on content, products, and services
from third parties. Oracle Corporation and its affiliates are not responsible for and expressly disclaim all
warranties of any kind with respect to third-party content, products, and services. Oracle Corporation and
its affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of
third-party content, products, or services.
Contents
iii
2.2.2 What Happens When You Create an Application Workspace ..................................... 2-3
2.3 Defining Page Flows................................................................................................................... 2-4
2.3.1 How to Define a Page Flow................................................................................................ 2-5
2.3.2 What Happens When You Use the Diagrammer to Create a Page Flow .................... 2-6
2.4 Creating a View Page ................................................................................................................. 2-7
2.4.1 How to Create JSF JSP Pages.............................................................................................. 2-9
2.4.2 What Happens When You Create a JSF JSP Page ........................................................ 2-10
2.4.3 What You May Need to Know About Automatic Component Binding .................. 2-14
2.4.4 How to Create a Facelets XHTML Page ........................................................................ 2-17
2.4.5 What Happens When You Create a JSF XHTML Page ............................................... 2-18
2.4.6 How to Add ADF Faces Components to JSF Pages..................................................... 2-21
2.4.7 What Happens When You Add Components to a Page ............................................. 2-23
2.4.8 How to Set Component Attributes................................................................................. 2-24
2.4.9 What Happens When You Use the Property Inspector .............................................. 2-26
2.5 Creating EL Expressions ......................................................................................................... 2-26
2.5.1 How to Create an EL Expression.................................................................................... 2-27
2.5.2 How to Use EL Expressions Within Managed Beans.................................................. 2-28
2.6 Creating and Using Managed Beans..................................................................................... 2-29
2.6.1 How to Create a Managed Bean in JDeveloper............................................................ 2-30
2.6.2 What Happens When You Use JDeveloper to Create a Managed Bean................... 2-31
2.7 Viewing ADF Faces Source Code and Javadoc ................................................................... 2-31
iv
4 Using the JSF Lifecycle with ADF Faces
4.1 Introduction to the JSF Lifecycle and ADF Faces ................................................................... 4-1
4.2 Using the Immediate Attribute ................................................................................................. 4-4
4.3 Using the Optimized Lifecycle.................................................................................................. 4-9
4.3.1 What You May Need to Know About Using the Immediate Attribute and the
Optimized Lifecycle 4-10
4.3.2 What You May Need to Know About Using an LOV Component and the Optimized
Lifecycle 4-11
4.4 Using the Client-Side Lifecycle .............................................................................................. 4-13
4.5 Using Subforms to Create Regions on a Page...................................................................... 4-14
4.6 Object Scope Lifecycles ........................................................................................................... 4-15
4.7 Passing Values Between Pages .............................................................................................. 4-16
4.7.1 How to Use the pageFlowScope Scope Within Java Code ......................................... 4-17
4.7.2 How to Use the pageFlowScope Scope Without Writing Java Code ........................ 4-18
4.7.3 What Happens at Runtime: Passing Values ................................................................. 4-18
5 Handling Events
5.1 Introduction to Events and Event Handling........................................................................... 5-1
5.1.1 Events and Partial Page Rendering................................................................................... 5-2
5.1.2 Client-Side Event Model..................................................................................................... 5-3
5.2 Using ADF Faces Server Events................................................................................................ 5-3
5.3 Using JavaScript for ADF Faces Client Events ....................................................................... 5-5
5.3.1 How to Return the Original Source of the Event ............................................................ 5-9
5.3.2 How to Use Client-Side Attributes for an Event............................................................. 5-9
5.3.3 How to Block UI Input During Event Execution ......................................................... 5-10
5.3.4 How to Prevent Events from Propagating to the Server ............................................ 5-11
5.3.5 How to Trigger Event Handler Execution .................................................................... 5-11
5.3.6 What Happens at Runtime: How Client-Side Events Work ...................................... 5-12
5.3.7 What You May Need to Know About Using Naming Containers............................ 5-13
5.4 Sending Custom Events from the Client to the Server....................................................... 5-14
5.4.1 How to Send Custom Events from the Client to the Server ....................................... 5-15
5.4.2 What Happens at Runtime: How Client and Server Listeners Work Together ...... 5-16
5.4.3 What You May Need to Know About Marshalling and Unmarshalling Data ........ 5-16
5.5 Executing a Script Within an Event Response..................................................................... 5-18
5.6 Using Client Behavior Tags .................................................................................................... 5-20
5.6.1 How to Use the scrollComponentIntoViewBehavior Tag .......................................... 5-20
v
6.4.2 What Happens When You Use a Custom Converter ..................................................... 6-9
6.5 Adding Validation ...................................................................................................................... 6-9
6.5.1 How to Add Validation ................................................................................................... 6-10
6.5.1.1 Adding ADF Faces Validation................................................................................. 6-10
6.5.1.2 Using Validation Attributes ..................................................................................... 6-10
6.5.1.3 Using ADF Faces Validators .................................................................................... 6-10
6.5.2 What Happens at Runtime .............................................................................................. 6-11
6.5.3 What You May Need to Know About Multiple Validators........................................ 6-12
6.6 Creating Custom JSF Validation............................................................................................ 6-12
6.6.1 How to Create a Backing Bean Validation Method ..................................................... 6-13
6.6.2 What Happens When You Create a Backing Bean Validation Method.................... 6-13
6.6.3 How to Create a Custom JSF Validator ......................................................................... 6-13
6.6.4 What Happens When You Use a Custom JSF Validator............................................. 6-15
vi
8.6.2 What You May Need to Know About Using the group Component with the
panelFormLayout Component 8-30
8.7 Arranging Contents in a Dashboard ..................................................................................... 8-34
8.7.1 How to Use the panelDashboard Component ............................................................. 8-36
8.7.2 What You May Need to Know About Geometry Management and the panelDashboard
Component 8-38
8.8 Displaying and Hiding Contents Dynamically ................................................................... 8-39
8.8.1 How to Use the showDetail Component ...................................................................... 8-43
8.8.2 How to Use the showDetailHeader Component ......................................................... 8-44
8.8.3 How to Use the panelBox Component .......................................................................... 8-46
8.8.4 What You May Need to Know About Disclosure Events........................................... 8-48
8.9 Displaying or Hiding Contents in Accordion Panels and Tabbed Panels....................... 8-48
8.9.1 How to Use the panelAccordion Component .............................................................. 8-52
8.9.2 How to Use the panelTabbed Component.................................................................... 8-53
8.9.3 How to Use the showDetailItem Component to Display Content in panelAccordion or
panelTabbed Components 8-54
8.9.4 What You May Need to Know About Geometry Management and the showDetailItem
Component 8-57
8.9.5 What You May Need to Know About showDetailItem Disclosure Events ............. 8-58
8.10 Displaying Items in a Static Box ............................................................................................ 8-59
8.10.1 How to Use the panelHeader Component.................................................................... 8-61
8.11 Displaying a Bulleted List in One or More Columns ......................................................... 8-62
8.11.1 How to Use the panelList Component .......................................................................... 8-63
8.11.2 What You May Need to Know About Creating a List Hierarchy ............................. 8-64
8.12 Grouping Related Items .......................................................................................................... 8-65
8.12.1 How to Use the panelGroupLayout Component......................................................... 8-67
8.12.2 What You May Need to Know About Geometry Management and the
panelGroupLayout Component 8-69
8.13 Separating Content Using Blank Space or Lines ................................................................. 8-69
8.13.1 How to Use the spacer Component ............................................................................... 8-70
8.13.2 How to Use the Separator Component.......................................................................... 8-70
vii
9.5.3 What You May Need to Know About Selecting Time Zones Without the inputDate
Component 9-15
9.6 Using Selection Components ................................................................................................. 9-16
9.6.1 How to Use Selection Components................................................................................ 9-19
9.7 Using Shuttle Components..................................................................................................... 9-21
9.7.1 How to Add a selectManyShuttle or selectOrderShuttle Component...................... 9-23
9.7.2 What You May Need to Know About Using a Client Listener for Selection Events ........
9-24
9.8 Using the richTextEditor Component................................................................................... 9-26
9.8.1 How to Add a richTextEditor Component ................................................................... 9-28
9.8.2 How to Add the Ability to Insert Text into a richTextEditor Component ............... 9-29
9.8.3 How to Customize the Toolbar....................................................................................... 9-30
9.9 Using File Upload .................................................................................................................... 9-31
9.9.1 How to Use the inputFile Component........................................................................... 9-34
9.9.2 What You May Need to Know About Temporary File Storage................................. 9-34
viii
10.5.5 What You May Need to Know About Programmatically Selecting Nodes ........... 10-37
10.6 Displaying Data in Tree Tables............................................................................................ 10-37
10.6.1 How to Display Data in a Tree Table........................................................................... 10-39
10.7 Passing a Row as a Value...................................................................................................... 10-39
10.8 Displaying Table Menus, Toolbars, and Status Bars ........................................................ 10-40
10.8.1 How to Add a panelCollection with a Table, Tree, or Tree Table ........................... 10-42
10.9 Exporting Data from Table, Tree, or Tree Table................................................................ 10-42
10.9.1 How to Export Table, Tree, or Tree Table Data to an External Format .................. 10-44
10.9.2 What Happens at Runtime: How Row Selection Affects the Exported Data ........ 10-45
10.10 Accessing Selected Values on the Client from Components That Use Stamping ........ 10-45
10.10.1 How to Access Values from a Selection in Stamped Components. ........................ 10-45
10.10.2 What You May Need to Know About Accessing Selected Values .......................... 10-48
ix
14 Using Menus, Toolbars, and Toolboxes
14.1 Introduction to Menus, Toolbars, and Toolboxes ............................................................... 14-1
14.2 Using Menus in a Menu Bar................................................................................................... 14-2
14.2.1 How to Create and Use Menus in a Menu Bar............................................................. 14-7
14.3 Using Toolbars ....................................................................................................................... 14-13
14.3.1 How to Create and Use Toolbars ................................................................................. 14-15
14.3.2 What Happens at Runtime: Determining the Size of Menu Bars and Toolbars ... 14-19
14.3.3 What You May Need to Know About Toolbars......................................................... 14-19
x
17.3 Displaying Hints and Error Messages for Validation and Conversion ........................... 17-5
17.3.1 How to Define Custom Validator and Converter Messages...................................... 17-7
17.3.2 What You May Need to Know About Overriding Default Messages Globally ...... 17-8
17.3.3 How to Display Component Messages Inline .............................................................. 17-8
17.3.4 How to Display Global Messages Inline ....................................................................... 17-9
17.4 Grouping Components with a Single Label and Message................................................. 17-9
17.5 Displaying Help for Components ....................................................................................... 17-11
17.5.1 How to Create Resource Bundle-Based Help............................................................. 17-14
17.5.2 How to Create XLIFF-Based Help................................................................................ 17-16
17.5.3 How to Create Managed Bean Help ............................................................................ 17-18
17.5.4 How to Use JavaScript to Launch an External Help Window ................................. 17-20
17.5.5 How to Create a Java Class Help Provider ................................................................. 17-21
17.5.6 How to Access Help Content from a UI Component................................................ 17-23
17.5.7 What You May Need to Know About Combining Different Message Types ....... 17-23
xi
19.2.1 How to Create a Page Fragment..................................................................................... 19-5
19.2.2 What Happens When You Create a Page Fragment.................................................... 19-6
19.2.3 How to Use a Page Fragment in a JSF Page.................................................................. 19-7
19.2.3.1 Adding a Page Fragment Using the Component Palette..................................... 19-7
19.2.3.2 Adding a Page Fragment Using the Application Navigator............................... 19-7
19.2.4 What Happens at Runtime: Resolving Page Fragments ............................................. 19-7
19.3 Using Page Templates ............................................................................................................. 19-7
19.3.1 How to Create a Page Template ................................................................................... 19-11
19.3.2 What Happens When You Create a Page Template .................................................. 19-15
19.3.3 How to Create JSF Pages Based on Page Templates.................................................. 19-15
19.3.4 What Happens When You Use a Template to Create a Page................................... 19-17
19.3.5 What Happens at Runtime: How Page Templates Are Resolved ........................... 19-18
19.3.6 What You May Need to Know About Page Templates and Naming Containers. 19-18
19.4 Using Declarative Components ........................................................................................... 19-18
19.4.1 How to Create a Declarative Component ................................................................... 19-21
19.4.2 What Happens When You Create a Declarative Component .................................. 19-25
19.4.3 How to Deploy Declarative Components ................................................................... 19-27
19.4.4 How to Use Declarative Components in JSF Pages ................................................... 19-28
19.4.5 What Happens When You Use a Declarative Component on a JSF Page .............. 19-29
19.4.6 What Happens at Runtime ............................................................................................ 19-30
19.5 Adding Resources to Pages .................................................................................................. 19-30
19.5.1 How to Add Resources to Page Templates and Declarative Components ............ 19-31
19.5.2 What Happens at Runtime: Adding Resources to the Document Header............. 19-31
xii
21 Internationalizing and Localizing Pages
21.1 Introduction to Internationalization and Localization of ADF Faces Pages ................... 21-1
21.2 Using Automatic Resource Bundle Integration in JDeveloper ......................................... 21-3
21.2.1 How to Set Resource Bundle Options............................................................................ 21-4
21.2.2 What Happens When You Set Resource Bundle Options .......................................... 21-5
21.2.3 How to Create an Entry in a JDeveloper-Generated Resource Bundle .................... 21-6
21.2.4 What Happens When You Create an Entry in a JDeveloper-Generated Resource
Bundle 21-6
21.3 Manually Defining Resource Bundles and Locales ............................................................ 21-7
21.3.1 How to Define the Base Resource Bundle..................................................................... 21-8
21.3.2 How to Edit a Resource Bundle File ............................................................................ 21-10
21.3.3 How to Register Locales and Resource Bundles in Your Application.................... 21-12
21.3.4 How to Use Resource Bundles in Your Application ................................................. 21-14
21.3.5 What You May Need to Know About Custom Skins and Control Hints............... 21-15
21.4 Configuring Pages for an End User to Specify Locale at Runtime ................................. 21-15
21.4.1 How to Configure a Page for an End User to Specify Locale................................... 21-15
21.4.2 What Happens When You Configure a Page to Specify Locale .............................. 21-16
21.4.3 What Happens at Runtime When an End User Specifies a Locale.......................... 21-17
21.5 Configuring Optional ADF Faces Localization Properties .............................................. 21-17
21.5.1 How to Configure Optional Localization Properties ................................................ 21-18
xiii
23.2.5 Gantt Chart ........................................................................................................................ 23-9
23.2.6 Hierarchy Viewer............................................................................................................ 23-10
23.3 Providing Data for ADF Data Visualization Components .............................................. 23-11
23.4 Downloading Custom Fonts for Flash Images .................................................................. 23-11
xiv
24.6.2.2 How to Format Numbers for the Marker Text of a Graph ............................... 24-22
24.6.3 Formatting Text in Graphs ............................................................................................ 24-22
24.6.3.1 How to Globally Set Graph Font Using a Skin ................................................... 24-23
24.6.4 Changing Graph Size and Style ................................................................................... 24-24
24.6.4.1 How to Specify the Size of a Graph at Initial Display........................................ 24-24
24.6.4.2 How to Provide for Dynamic Resizing of a Graph ............................................ 24-25
24.6.4.3 How to Use a Specific Style Sheet for a Graph.................................................... 24-25
24.6.5 Changing Graph Background, Plot Area, and Title .................................................. 24-25
24.6.5.1 How to Customize the Background and Plot Area of a Graph ........................ 24-26
24.6.5.2 How to Specify Titles and Footnotes in a Graph ................................................ 24-26
24.6.6 Customizing Graph Axes and Labels .......................................................................... 24-27
24.6.6.1 How to Specify the Title, Appearance, and Scaling of an Axis ........................ 24-28
24.6.6.2 How to Specify Scrolling on an Axis .................................................................... 24-28
24.6.6.3 How to Control the Appearance of Tick Marks and Labels on an Axis.......... 24-29
24.6.6.4 How to Format Numbers on an Axis ................................................................... 24-30
24.6.6.5 How to Set Minimum and Maximum Values on a Data Axis .......................... 24-30
24.6.7 Customizing Graph Legends ........................................................................................ 24-30
24.6.8 Customizing Tooltips in Graphs .................................................................................. 24-31
24.7 Customizing the Appearance of Specific Graph Types ................................................... 24-33
24.7.1 Changing the Appearance of Pie Graphs.................................................................... 24-33
24.7.1.1 How to Customize the Overall Appearance of Pie Graphs .............................. 24-33
24.7.1.2 How to Customize an Exploding Pie Slice .......................................................... 24-33
24.7.2 Changing the Appearance of Lines in Graphs ........................................................... 24-34
24.7.2.1 How to Display Either Data Lines or Markers in Graphs ................................. 24-34
24.7.2.2 How to Change the Appearance of Lines in a Graph Series............................. 24-34
24.7.3 Customizing Pareto Graphs .......................................................................................... 24-35
24.7.4 Customizing Scatter Graph Series Markers ................................................................ 24-35
24.8 Adding Specialized Features to Graphs ............................................................................. 24-36
24.8.1 Adding Reference Lines or Areas to Graphs .............................................................. 24-37
24.8.1.1 How to Create Reference Lines or Areas During Design .................................. 24-37
24.8.1.2 What Happens When You Create Reference Lines or Areas During Design. 24-38
24.8.1.3 How to Create Reference Lines or Areas Dynamically...................................... 24-39
24.8.2 Using Gradient Special Effects in Graphs ................................................................... 24-39
24.8.2.1 How to Add Gradient Special Effects to a Graph............................................... 24-40
24.8.2.2 What Happens When You Add a Gradient Special Effect to a Graph ............ 24-41
24.8.3 Specifying Transparent Colors for Parts of a Graph ................................................. 24-41
24.8.4 Providing Interactive Capability for Graphs .............................................................. 24-41
24.8.4.1 How to Provide Marker and Legend Dimming.................................................. 24-41
24.8.4.2 How to React to Changes in the Zoom and Scroll Levels ................................. 24-42
24.8.5 Providing an Interactive Time Axis for Graphs ......................................................... 24-42
24.8.5.1 How to Define a Relative Range of Time Data for Display............................... 24-42
24.8.5.2 How to Define an Explicit Range of Time Data for Display ............................. 24-43
24.8.6 Adding Alerts and Annotations to Graphs................................................................. 24-43
24.9 Animating Graphs with Active Data .................................................................................. 24-44
24.9.1 How to Configure Graph Components to Display Active Data.............................. 24-45
24.9.2 How to Add Animation Effects that Use Active Data .............................................. 24-45
xv
25 Using ADF Gauge Components
25.1 Introduction to the Gauge Component ................................................................................ 25-1
25.1.1 Types of Gauges................................................................................................................ 25-3
25.1.2 Gauge Terminology.......................................................................................................... 25-5
25.2 Understanding Data Requirements for Gauges .................................................................. 25-6
25.3 Creating a Gauge...................................................................................................................... 25-6
25.3.1 Creating a Gauge Using Tabular Data........................................................................... 25-7
25.3.1.1 Storing Tabular Data for a Gauge in a Managed Bean ........................................ 25-7
25.3.1.2 Structure of the List of Tabular Data ...................................................................... 25-7
25.3.2 How to Create a Gauge Using Tabular Data ................................................................ 25-8
25.3.3 What Happens When You Create a Gauge Using Tabular Data............................... 25-9
25.4 Customizing Gauge Type, Layout, and Appearance ......................................................... 25-9
25.4.1 How to Change the Type of the Gauge ......................................................................... 25-9
25.4.2 How to Determine the Layout of Gauges in a Gauge Set......................................... 25-10
25.4.3 Changing Gauge Size and Style.................................................................................... 25-10
25.4.3.1 Specifying the Size of a Gauge at Initial Display ................................................ 25-10
25.4.3.2 Providing Dynamic Resizing of a Gauge............................................................. 25-11
25.4.3.3 Using a Custom Style Class for a Gauge.............................................................. 25-11
25.4.4 How to Add Thresholds to Gauges ............................................................................. 25-11
25.4.4.1 Adding Static Thresholds to Gauges .................................................................... 25-11
25.4.5 How to Format Numbers in Gauges............................................................................ 25-12
25.4.5.1 Formatting the Number in a Gauge Metric Label .............................................. 25-12
25.4.6 What Happens When You Format the Number in a Gauge Metric Label ............. 25-13
25.4.7 How to Format Text in Gauges..................................................................................... 25-13
25.4.8 How to Specify an N-Degree Dial ................................................................................ 25-14
25.4.9 How to Customize Gauge Labels................................................................................. 25-14
25.4.9.1 Controlling the Position of Gauge Labels ............................................................ 25-14
25.4.9.2 Customizing the Colors and Borders of Gauge Labels...................................... 25-14
25.4.10 How to Customize Indicators and Tick Marks .......................................................... 25-15
25.4.10.1 Controlling the Appearance of Gauge Indicators............................................... 25-15
25.4.10.2 Specifying Tick Marks and Labels ....................................................................... 25-15
25.4.10.3 Creating Exterior Tick Labels ................................................................................ 25-16
25.4.11 Specifying Transparency for Parts of a Gauge ........................................................... 25-16
25.5 Adding Gauge Special Effects and Animation .................................................................. 25-17
25.5.1 How to Use Gradient Special Effects in a Gauge ....................................................... 25-17
25.5.1.1 Adding Gradient Special Effects to a Gauge ....................................................... 25-17
25.5.2 What Happens When You Add a Gradient Special Effect to a Gauge ................... 25-18
25.5.3 How to Add Interactivity to Gauges ........................................................................... 25-18
25.5.4 How to Animate Gauges ............................................................................................... 25-19
25.5.5 How to Animate Gauges with Active Data ................................................................ 25-20
25.5.5.1 Configuring Gauge Components to Display Active Data................................. 25-20
25.5.5.2 Adding Animation to Gauges ............................................................................... 25-21
25.6 Using Custom Shapes in Gauges......................................................................................... 25-21
25.6.1 How to Create a Custom Shapes Graphic File ........................................................... 25-21
25.6.2 How to Use a Custom Shapes File ............................................................................... 25-24
25.6.3 What You May Need to Know About Supported SVG Features ............................ 25-24
25.6.4 How to Set Custom Shapes Styles................................................................................ 25-25
xvi
26 Using ADF Pivot Table Components
26.1 Introduction tithe ADF Pivot Table Component................................................................. 26-1
26.1.1 Pivot Table Elements and Terminology ........................................................................ 26-2
26.2 Understanding Data Requirements for a Pivot Table ........................................................ 26-3
26.3 Pivoting Layers......................................................................................................................... 26-3
26.4 Using Selection in Pivot Tables.............................................................................................. 26-5
26.5 Sorting in a Pivot Table ........................................................................................................... 26-6
26.6 Sizing in a Pivot Table ............................................................................................................. 26-6
26.6.1 How to Set the Overall Size of a Pivot Table ................................................................ 26-6
26.6.2 How to Resize Rows, Columns, and Layers ................................................................. 26-7
26.6.3 What You May Need to Know About Resizing Rows, Columns, and Layers ........ 26-7
26.7 Updating Pivot Tables with Partial Page Rendering.......................................................... 26-7
26.8 Exporting from a Pivot Table ................................................................................................. 26-8
26.9 Customizing the Cell Content of a Pivot Table ................................................................... 26-9
26.9.1 How to Create a CellFormat Object for a Data Cell..................................................... 26-9
26.9.2 How to Construct a CellFormat Object ....................................................................... 26-10
26.9.3 How to Change Format and Text Styles...................................................................... 26-10
26.9.4 How to Create Stoplight and Conditional Formatting in a Pivot Table ................ 26-12
26.10 Pivot Table Data Cell Stamping and Editing ..................................................................... 26-13
26.10.1 How to Specify Custom Images for Data Cells .......................................................... 26-14
26.10.2 How to Specify Images, Icons, Links, and Read-Only Content in Header Cells .. 26-14
26.11 Using a Pivot Filter Bar with a Pivot Table ........................................................................ 26-15
26.11.1 How to Associate a Pivot Filter Bar with a Pivot Table ............................................ 26-16
xvii
27.4.9 What Happens When You Customize the Slices in a Map Pie Graph Theme....... 27-13
27.5 Adding a Toolbar to a Map .................................................................................................. 27-14
27.5.1 How to Add a Toolbar to a Map .................................................................................. 27-14
27.5.2 What Happens When You Add a Toolbar to a Map ................................................. 27-14
xviii
29.1.3 Available Hierarchy Viewer Layout Options............................................................... 29-6
29.2 Data Requirements for Hierarchy Viewers .......................................................................... 29-8
29.3 Managing Nodes in a Hierarchy Viewer.............................................................................. 29-8
29.3.1 How to Specify Node Content ...................................................................................... 29-10
29.3.2 How to Configure the Controls on a Node................................................................. 29-12
29.3.3 How to Specify a Node Definition for an Accessor ................................................... 29-13
29.3.4 How to Associate a Node Definition with a Particular Set of Data Rows.............. 29-13
29.3.5 How to Specify Ancestor Levels for an Anchor Node .............................................. 29-14
29.4 Navigating in a Hierarchy Viewer ...................................................................................... 29-14
29.4.1 How to Configure Upward Navigation in a Hierarchy Viewer .............................. 29-14
29.4.2 How to Configure Same-Level Navigation in a Hierarchy Viewer ........................ 29-15
29.4.3 What Happens When You Configure Same-Level Navigation in a Hierarchy Viewer ....
29-15
29.5 Adding Interactivity to a Hierarchy Viewer Component................................................ 29-16
29.5.1 How to Configure Node Selection Action .................................................................. 29-16
29.5.2 How to Configure a Hierarchy Viewer to Invoke a Popup Window ..................... 29-16
29.5.3 How to Configure a Hierarchy View Node to Invoke a Menu................................ 29-18
29.6 Using Panel Cards.................................................................................................................. 29-18
29.6.1 How to Create a Panel Card.......................................................................................... 29-19
29.6.2 What Happens at Runtime When a Panel Card Component Is Rendered ............ 29-19
29.7 Customizing the Appearance of a Hierarchy Viewer ...................................................... 29-20
29.7.1 How to Adjust the Size of a Hierarchy Viewer .......................................................... 29-20
29.7.2 How to Include Images in a Hierarchy Viewer.......................................................... 29-20
29.7.3 How to Configure the Display of the Control Panel ................................................. 29-21
29.7.4 How to Configure the Display of Links and Labels .................................................. 29-21
29.8 Adding Search to a Hierarchy Viewer................................................................................ 29-23
29.8.1 How to Configure Searching in a Hierarchy Viewer ................................................ 29-23
29.8.2 What You May Need to Know About Configuring Search in a Hierarchy Viewer...........
29-25
xix
30.3.2 How to Create a Javascript File for an Event.............................................................. 30-17
30.3.3 How to Create a JavaScript File for a Peer .................................................................. 30-19
30.3.4 How to Add a Custom Component to a JavaScript Library Feature Configuration File .
30-20
30.4 Server-Side Development ..................................................................................................... 30-20
30.4.1 How to Create a Class for an Event Listener .............................................................. 30-21
30.4.2 How to Create a Class for an Event ............................................................................. 30-22
30.4.3 Creating the Component ............................................................................................... 30-23
30.4.4 How to Create a Class for a Component..................................................................... 30-25
30.4.5 How to Add the Component to the faces-config.xml File ........................................ 30-27
30.4.6 How to Create a Class for a Resource Bundle ............................................................ 30-28
30.4.7 How to Create a Class for a Renderer.......................................................................... 30-30
30.4.8 How to Add the Renderer to the faces-config.xml File............................................. 30-31
30.4.9 How to Create JSP Tag Properties................................................................................ 30-31
30.4.10 How to Configure the Tag Library Descriptor........................................................... 30-34
30.4.11 How to Create a Resource Loader................................................................................ 30-36
30.4.12 How to Create a MyFaces Trinidad Cascading Style Sheet ..................................... 30-37
30.5 Deploying a Component Library......................................................................................... 30-39
30.6 Adding the Custom Component to an Application ......................................................... 30-39
30.6.1 How to Configure the Web Deployment Descriptor................................................. 30-40
30.6.2 How to Enable JavaScript Logging and Assertions................................................... 30-40
30.6.3 How to Add a Custom Component to JSF Pages....................................................... 30-41
30.6.4 What You May Need to Know About Using the tagPane Custom Component ... 30-41
xx
32.6 Adding Drag and Drop Functionality Into and Out of a panelDashboard Component..........
32-14
32.6.1 How to Add Drag and Drop Functionality Into a panelDashboard Component . 32-14
32.6.2 How to Add Drag and Drop Functionality Out of a panelDashboard Component..........
32-17
32.7 Adding Drag and Drop Functionality to a Calendar ....................................................... 32-19
32.7.1 How to Add Drag and Drop Functionality to a Calendar........................................ 32-19
32.7.2 What You May Need to Know About Dragging and Dropping in a Calendar..... 32-20
32.8 Adding Drag and Drop Functionality for DVT Graphs................................................... 32-20
32.8.1 How to Add Drag and Drop Functionality for a DVT Graph.................................. 32-21
32.9 Adding Drag and Drop Functionality for DVT Gantt Charts ......................................... 32-21
32.9.1 How to Add Drag and Drop Functionality for a DVT Component........................ 32-23
Part VI Appendixes
xxi
A.2.3.16 Framebusting ............................................................................................................... A-9
A.2.3.17 Suppressing Auto-Generated Component IDs ..................................................... A-10
A.2.3.18 ADF Faces Caching Filter ......................................................................................... A-11
A.2.3.19 Configuring Native Browser Context Menus for Command Links................... A-12
A.2.4 What You May Need to Know About Other Context Parameters in web.xml ....... A-12
A.3 Configuration in faces-config.xml ......................................................................................... A-13
A.3.1 How to Configure for ADF Faces in faces-config.xml................................................. A-13
A.4 Configuration in adf-config.xml ............................................................................................ A-14
A.4.1 How to Configure ADF Faces in adf-config.xml.......................................................... A-14
A.4.2 Defining Caching Rules for ADF Faces Caching Filter ............................................... A-15
A.5 Configuration in adf-settings.xml ......................................................................................... A-16
A.5.1 How to Configure for ADF Faces in adf-settings.xml................................................. A-16
A.5.2 What You May Need to Know About Elements in adf-settings.xml ........................ A-17
A.5.2.1 Help System ............................................................................................................... A-17
A.5.2.2 Caching Rules............................................................................................................. A-18
A.6 Configuration in trinidad-config.xml ................................................................................... A-19
A.6.1 How to Configure ADF Faces Features in trinidad-config.xml................................. A-19
A.6.2 What You May Need to Know About Elements in trinidad-config.xml .................. A-20
A.6.2.1 Animation Enabled ................................................................................................... A-20
A.6.2.2 Skin Family ................................................................................................................. A-21
A.6.2.3 Time Zone and Year .................................................................................................. A-21
A.6.2.4 Enhanced Debugging Output.................................................................................. A-21
A.6.2.5 Page Accessibility Level ........................................................................................... A-21
A.6.2.6 Language Reading Direction ................................................................................... A-22
A.6.2.7 Currency Code and Separators for Number Groups and Decimal Points........ A-22
A.6.2.8 Formatting Dates and Numbers Locale ................................................................. A-23
A.6.2.9 Output Mode.............................................................................................................. A-23
A.6.2.10 Number of Active PageFlowScope Instances........................................................ A-23
A.6.2.11 Custom File Uploaded Processor ............................................................................ A-23
A.6.2.12 Client-Side Validation and Conversion.................................................................. A-24
A.7 Configuration in trinidad-skins.xml ..................................................................................... A-24
A.8 Using the RequestContext EL Implicit Object ..................................................................... A-24
A.9 Using JavaScript Library Partitioning................................................................................... A-26
A.9.1 How to Create a JavaScript Feature ............................................................................... A-27
A.9.2 How to Create JavaScript Partitions .............................................................................. A-28
A.9.3 What You May Need to Know About the adf-js-partitions.xml File ........................ A-29
A.9.4 What Happens at Runtime: JavaScript Partitioning.................................................... A-36
xxii
B.3.6 af:validateDateTimeRange ................................................................................................ B-5
B.3.7 af:validateDoubleRange..................................................................................................... B-6
B.3.8 af:validateLength ................................................................................................................ B-7
B.3.9 af:validateRegExp ............................................................................................................... B-8
C Keyboard Shortcuts
C.1 About Keyboard Shortcuts ....................................................................................................... C-1
C.2 Tab Traversal .............................................................................................................................. C-1
C.2.1 Tab Traversal Sequence on a Page ................................................................................... C-2
C.2.2 Tab Traversal Sequence in a Table ................................................................................... C-2
C.3 Accelerator Keys ........................................................................................................................ C-4
C.4 Access Keys................................................................................................................................. C-7
C.5 Default Cursor or Focus Placement......................................................................................... C-8
C.6 The Enter Key ............................................................................................................................. C-9
Index
xxiii
xxiv
Preface
Welcome to Web User Interface Developer's Guide for Oracle Application Development
Framework!
Audience
This document is intended for developers who need to create the view layer of a web
application using the rich functionality of ADF Faces Rich Client components.
Documentation Accessibility
Our goal is to make Oracle products, services, and supporting documentation
accessible to all users, including users that are disabled. To that end, our
documentation includes features that make information available to users of assistive
technology. This documentation is available in HTML format, and contains markup to
facilitate access by the disabled community. Accessibility standards will continue to
evolve over time, and Oracle is actively engaged with other market-leading
technology vendors to address technical obstacles so that our documentation can be
accessible to all of our customers. For more information, visit the Oracle Accessibility
Program Web site at http://www.oracle.com/accessibility/.
xxv
Related Documents
For more information, see the following related documents:
■ Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development
Framework
■ Oracle JDeveloper 11g Online Help
■ Oracle JDeveloper 11g Release Notes, included with your JDeveloper 11g installation,
and on Oracle Technology Network
■ Oracle Fusion Middleware Java API Reference for Oracle ADF Faces
■ Oracle Fusion Middleware Java API Reference for Oracle ADF Faces Client JavaScript
■ Oracle Fusion Middleware Java API Reference for Oracle ADF Data Visualization
Components
■ Oracle Fusion Middleware Tag Reference for Oracle ADF Faces
■ Oracle Fusion Middleware Data Visualization Tools Tag Reference for Oracle ADF Faces
■ Oracle Fusion Middleware Tag Reference for Oracle ADF Faces Skin Selectors
■ Oracle Fusion Middleware Data Visualization Tools Tag Reference for Oracle ADF Skin
Selectors
■ Oracle Fusion Middleware Desktop Integration Developer's Guide for Oracle Application
Development Framework
■ Oracle Fusion Middleware Mobile Browser Developer's Guide for Oracle Application
Development Framework
Conventions
The following text conventions are used in this document:
Convention Meaning
boldface Boldface type indicates graphical user interface elements (for example,
menus and menu items, buttons, tabs, dialog controls), including
options that you select.
italic Italic type indicates book titles, emphasis, or placeholder variables for
which you supply particular values.
monospace Monospace type indicates language and syntax elements, directory and
file names, URLs, text that appears on the screen, or text that you enter.
xxvi
What's New
This section identifies the changes made to this guide for this release.
xxvii
xxviii
Part I
Part I Getting Started with ADF Faces
This chapter introduces ADF Faces rich client, providing a history, an overview of the
framework functionality, and an overview of each of the different component types
found in the library. It also introduces the ADF Faces demonstration application that
can be used in conjunction with this guide.
This chapter includes the following sections:
■ Section 1.1, "Introduction to Oracle ADF Faces Rich Client"
■ Section 1.2, "Architecture of ADF Faces Components"
■ Section 1.3, "ADF Faces Components"
■ Section 1.4, "ADF Faces Demonstration Application"
1-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Architecture of ADF Faces Components
built-in support enables you to build RIAs without needing extensive knowledge of
the individual technologies.
ADF Faces can also be used in an application that uses the Facelets library. Facelets is a
JSF-centric declarative XML view definition technology that provides an alternative to
using the JSP engine technology for the view. For more details about the architecture of
ADF Faces, see Section 1.2, "Architecture of ADF Faces Components."
Tip: You can use ADF Faces in conjunction with Oracle ADF Model
data binding, allowing you to declaratively bind ADF Faces
components to the business layer. Using ADF Model data binding,
most developer tasks that would otherwise require writing code are
declarative. However, this guide covers only using ADF Faces
components in a standard JSF application. For more information about
using ADF Faces with the ADF Model, see the Oracle Fusion
Middleware Fusion Developer's Guide for Oracle Application Development
Framework.
1-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Architecture of ADF Faces Components
intended to provide a balance between total download size and total number of
roundtrips.
One benefit of ADF Faces's library partitioning strategy is that it is configurable.
Because different applications make use of different components and features, the
default partitioning provided by ADF Faces may not be ideal for all applications. As
such, ADF Faces allows the JavaScript library partitioning to be customized on a
per-application basis. This partitioning allows application developers to tune the
JavaScript library footprint to meet the needs of their application. For more
information about configuring JavaScript partitioning, see Section A.9, "Using
JavaScript Library Partitioning."
■ Reuse: You can create page templates, as well as page fragments and composite
components made up of multiple components, which can be used throughout
your application. For more information, see Chapter 19, "Creating and Reusing
Fragments, Page Templates, and Components."
■ Skinning: You can globally change the appearance of components. For more
information, see Chapter 20, "Customizing the Appearance Using Styles and
Skins."
■ Internationalization: You can change text and other display attributes based on the
user’s locale. For more information, see Chapter 21, "Internationalizing and
Localizing Pages."
■ Accessibility: You can implement accessibility support, including keyboard
shortcuts and text descriptions. For more information, see Chapter 22,
"Developing Accessible ADF Faces Pages."
■ Custom component creation: You can create your own components that use the
RCF. For more information, see Chapter 30, "Creating Custom ADF Faces
Components."
■ User customizations: You can create your pages so that they allow users to change
certain display attributes for components at runtime. For more information, see
Chapter 31, "Allowing User Customization on JSF Pages."
■ Drag and drop: You can allow attribute values, collection values, or complete
components to be dragged from one component to another. For more information,
see Chapter 32, "Adding Drag and Drop Functionality."
1-6 Web User Interface Developer's Guide for Oracle Application Development Framework
ADF Faces Components
■ List-of-Values (LOV) components: Allow users to make selections from lists driven
by a model that contains functionality like searching for a specific value or
showing values marked as favorites. These LOV components are useful when a
field used to populate an attribute for one object might actually be contained in a
list of other objects, as with a foreign key relationship in a database. For more
information, see Chapter 11, "Using List-of-Values Components."
■ Query components: Allow users to query data. ADF Faces provides two query
components. The Query component can support multiple search criteria,
dynamically adding and deleting criteria, selectable search operators, match
all/any selections, seeded or saved searches, a basic or advanced mode, and
personalization of searches. The QuickQuery component is a simplified version
of the Query component that allows a search on a single item (criterion). For more
information, see Chapter 12, "Using Query Components."
■ Popup components: Display data in popup windows or dialogs. The dialog
framework in ADF Faces provides an infrastructure to support building pages for
a process displayed in a new popup browser window separate from the parent
page. Multiple dialogs can have a control flow of their own. For more information,
see Chapter 13, "Using Popup Dialogs, Menus, and Windows."
■ Explorer-type menus and toolbars: Allow you to create menu bars and toolbars.
Menus and toolbars allow users to select from a specified list of options (in the
case of a menu) or buttons (in the case of a toolbar) to cause some change to the
application. For more information, see Chapter 14, "Using Menus, Toolbars, and
Toolboxes."
■ Calendar component: Displays activities in day, week, month, or list view. You can
implement popup components that allow users to create, edit, or delete activities.
For more information, see Chapter 15, "Creating a Calendar Application."
■ Output components: Display text and graphics, and can also play video and music
clips. ADF Faces also includes a carousel output component that can display
graphics in a revolving carousel. For more information, see Chapter 16, "Using
Output Components."
■ Labels, tips, and messages: Display labels for other components, along with
mouseover tips and error messages. Unlike standard JSF input components, ADF
Faces components that support messages automatically display their own
messages. You can also have components display informational content, for
example contextual help. For more information, see Chapter 17, "Displaying Tips,
Messages, and Help."
■ Navigation components: Allow users to go from one page to the next. ADF Faces
navigation components include buttons and links, as well as the capability to
create more complex hierarchical page flows accessed through different levels of
menus. For more information, see Chapter 18, "Working with Navigation
Components."
■ Data visualization components: Allow users to view and analyze complex data in
real time. ADF data visualization components include graphs, gauges, pivot
tables, geographic maps, Gantt charts, and hierarchy viewers that display
hierarchical data as a set of linked nodes, for example an organization chart. For
more information, see Chapter 23, "Introduction to ADF Data Visualization
Components."
1.4.1 How to Download and Install the ADF Faces Demo Application
In order to view the demo application (both the code and at runtime), install
JDeveloper, and then download and open the application within JDeveloper.
You can download the ADF Faces demo application from the Oracle Technology
Network (OTN) web site. Navigate to
http://www.oracle.com/technology/products/adf/adffaces/index.htm
l and click the link for installing the ADF Faces Rich Client demo. The resulting page
provides detailed instructions for downloading the WAR file that contains the
application, along with instructions for deploying the application to a standalone
server, or for running the application using the Integrated WebLogic Server included
with JDeveloper.
If you do not want to install the application, you can run the application directly from
OTN by clicking the ADF Faces Rich Client Components Hosted Demo link.
1-8 Web User Interface Developer's Guide for Oracle Application Development Framework
ADF Faces Demonstration Application
■ Skinning: Demonstrations of skinning on the various components. You can see, for
example, how changing style selectors affects how a component is displayed.
Figure 1–2 shows how setting certain style selectors affects the
inputNumberSpinbox component.
■ Feature demos: Various pages that demonstrate different ways you can use ADF
components. For example, the File Explorer is an application with a live data
model that displays a directory structure and allows you to create, save, and move
directories and files. This application is meant to showcase the components and
features of ADF Faces in a working application, as shown in Figure 1–3. For more
information about the File Explorer application, see Section 1.4.3, "Overview of the
File Explorer Application."
1-10 Web User Interface Developer's Guide for Oracle Application Development Framework
ADF Faces Demonstration Application
Other pages demonstrate the main architectural features of ADF Faces, such as
layout components, AJAX postback functionality, and drag and drop. Figure 1–4
shows the demonstration on using the AutoSubmit attribute and partial page
rendering.
1-12 Web User Interface Developer's Guide for Oracle Application Development Framework
ADF Faces Demonstration Application
■ Styles: Demonstration of how setting inline styles and content styles affects
components. Figure 1–6 shows different styles applied to the panelBox
component.
1-14 Web User Interface Developer's Guide for Oracle Application Development Framework
ADF Faces Demonstration Application
You can expand and collapse both these areas. The directory structure is created using
a tree component. The search area is created using input components, a command
button, and a table component. For more information about using
panelAccordion components, see Section 8.9, "Displaying or Hiding Contents in
Accordion Panels and Tabbed Panels." For more information about using input
components, see Chapter 9, "Using Input Components and Defining Forms." For more
information about using command buttons, see Chapter 18, "Working with Navigation
Components." For more information about using tables and trees, see Chapter 10,
"Using Tables and Trees."
The right-hand side of the File Explorer application uses tabbed panes to display the
contents of a directory in either a table, a tree table or a list, as shown in Figure 1–9.
The table and tree table have built-in toolbars that allow you to manipulate how the
contents are displayed. In the table an list, you can drag a file or subdirectory from one
directory and drop it into another. In all tabs, you can right-click a file, and from the
context menu, you can view the properties of the file in a popup window. For more
information about using tabbed panes, see Section 8.9, "Displaying or Hiding Contents
in Accordion Panels and Tabbed Panels." For more information about table and tree
table toolbars, see Section 10.8, "Displaying Table Menus, Toolbars, and Status Bars."
For more information about enabling drag and drop, see Chapter 32, "Adding Drag
and Drop Functionality." For more information about using context menus and popup
windows, see Chapter 13, "Using Popup Dialogs, Menus, and Windows."
The top of the File Explorer application contains a menu and a toolbar, as shown in
Figure 1–10.
The menu options allow you to create and delete files and directories and change how
the contents are displayed. The Help menu opens a help system that allows users to
provide feedback in dialogs, as shown in Figure 1–11.
1-16 Web User Interface Developer's Guide for Oracle Application Development Framework
ADF Faces Demonstration Application
The help system consists of a number of forms created with various input components,
including a rich text editor. For more information about menus, see Section 14.2,
"Using Menus in a Menu Bar." For more information about creating help systems, see
Section 17.5, "Displaying Help for Components." For more information about input
components, see Chapter 9, "Using Input Components and Defining Forms."
Within the toolbar of the File Explorer are controls that allow you navigate within the
directory structure, as well as controls that allow you to change the look and feel of the
application by changing its skin. Figure 1–12 shows the File Explorer application using
the simple skin.
For more information about toolbars, see Section 14.3, "Using Toolbars." For more
information about using skins, see Chapter 20, "Customizing the Appearance Using
Styles and Skins."
packages that hold managed beans that provide functionality throughout the
application.
Tip: The managed beans for the component demos are in the
component package and the managed beans for the File Explorer
application are in the explorer package.
The Web Content directory contains all the web resources used by the application,
including JSPX files, JavaScript libraries, images, configuration files, and so on.
1-18 Web User Interface Developer's Guide for Oracle Application Development Framework
2
2 Getting Started with ADF Faces
This chapter describes how to use JDeveloper to declaratively create ADF Faces
applications.
This chapter includes the following sections:
■ Section 2.1, "Developing Declaratively in JDeveloper"
■ Section 2.2, "Creating an Application Workspace"
■ Section 2.3, "Defining Page Flows"
■ Section 2.4, "Creating a View Page"
■ Section 2.5, "Creating EL Expressions"
■ Section 2.6, "Creating and Using Managed Beans"
■ Section 2.7, "Viewing ADF Faces Source Code and Javadoc"
To create an application:
1. In the JDeveloper main menu, choose File > New.
The New Gallery opens, where you can select different application components to
create.
2. In the New Gallery, expand the General node, select Applications and then Java
EE Web Application, and click OK.
This template provides the building blocks you need to create a web application
that uses JSF for the view and Enterprise JavaBean (EJB) session beans and Java
Persistence API (JPA) entities for business services. All the files and directories for
the business layer of your application will be stored in a project that by default is
named Model. All the files and directories for your view layer will be stored in a
project that by default is named ViewController.
Note: This document covers only how to create the ADF Faces
project in an application, without regard to the business services used
or the binding to those services. For information about how to use
ADF Faces with the ADF Model layer, the ADF Controller, and ADF
Business Components, see the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
3. In the Create Java EE Web Application dialog, set a name, directory location, and
package prefix of your choice and click Next.
4. In the Name Your Project page, you can optionally change the name and location
for your web project. On the Project Technologies tab, double-click ADF Faces to
move that technology to the Selected pane. This automatically adds the necessary
libraries and metadata files to your web project. Click Next.
5. In the Configure Java Settings page, optionally change the package name, Java
source path, and output directory for your view layer. Click Next.
6. In the Name Your Project page, you can optionally change the name and location
for your Java project. By default, the necessary libraries and metadata files for Java
EE are already added to your data model project. Click Next.
7. In the Configure Java Settings page, optionally change the package name, Java
source path, and output directory for your model layer. Click Next.
8. Configure the EJB settings as needed. For help on this page, click Help or press F1.
Click Finish.
2-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating an Application Workspace
JDeveloper also sets configuration parameters in the configuration files based on the
options chosen when you created the application. In the web.xml file, these are
configurations needed to run a JSF application (settings specific to ADF Faces are
added when you create a JSF page with ADF Faces components). Example 2–1 shows
the web.xml file generated by JDeveloper when you create a new Java EE application.
Configurations required for specific ADF Faces features are covered in the respective
chapters of this guide. For example, any configuration needed in order to use the
Change Persistence framework is covered in Chapter 31, "Allowing User
Customization on JSF Pages." For comprehensive information about configuring an
ADF Faces application, see Appendix A, "ADF Faces Configuration."
2-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Page Flows
Note: If you plan on using Oracle ADF Model data binding and the
ADF Controller, then instead of using standard JSF navigation rules,
you use task flows. For more information, see the "Getting Started
With ADF Task Flows" chapter of the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
Best Practice: The ADF Controller extends the JSF default controller.
While you can technically use the JSF controller and ADF Controller in
your application, you should use only one or the other.
For more information on how navigation works in a JSF application, see the Java EE 5
tutorial on Sun’s web site (http://java.sun.com).
Note: The diagrammer supports only pages created as JSP and JSPX
files. If you need to create navigation for XHTML pages, you must
code the XML manually.
5. Select the component you wish to use and drag it onto the diagram.
JDeveloper redraws the diagram with the newly added component.
Tip: You can also use the overview editor to create navigation rules
and navigation cases by clicking the Overview tab. Press F1 for details
on using the overview editor to create navigation.
Additionally, you can manually add elements to the
faces-config.xml file by directly editing the page in the source
editor. To view the file in the source editor, click the Source tab.
Once the navigation for your application is defined, you can create the pages and add
the components that will execute the navigation. For more information about using
navigation components on a page, see Chapter 18, "Working with Navigation
Components."
2.3.2 What Happens When You Use the Diagrammer to Create a Page Flow
When you use the diagrammer to create a page flow, JDeveloper creates the associated
XML entries in the faces-config.xml file. Example 2–2 shows the XML generated
for the navigation rules displayed in Figure 2–2.
2-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
If you want to use Facelets instead of JSP in your application, you can instead create
XHTML files. Facelets is a JSF-centric declarative XML view definition technology that
provides an alternative to using the JSP engine.
ADF Faces provides a number of components that you can use to define the overall
layout of a page. JDeveloper contains predefined quick start layouts that use these
components to provide you with a quick and easy way to correctly build the layout.
You can choose from one, two, or three column layouts, and then determine how you
want the columns to behave. For example, you may want one column’s width to be
locked, while another column stretches to fill available browser space. Figure 2–4
shows the quick start layouts available for a two-column layout with the second
column split between two panes. For more information about the layout components,
see Chapter 8, "Organizing Content on Web Pages."
Along with adding layout components, you can also choose to apply a theme to the
chosen quick layout. These themes add color styling to some of the components used
in the quick start layout. To see the color and where it is added, see Appendix D,
"Quick Start Layout Themes." For more information about themes, see Section 20.3.4,
"How to Apply Themes to Components."
When you know you want to use the same layout on many pages in your application,
ADF Faces allows you to create and use predefined page templates. When creating
templates, the template developer can not only determine the layout of any page that
will use the template (either by selecting a quick layout design, as shown in
Figure 2–4, or by building it manually) but can also provide static content that must
appear on all pages, as well as create placeholder attributes that can be replaced with
valid values for each individual page. For example, ADF Faces ships with the Oracle
Three-Column-Layout template. This template provides areas for specific content,
such as branding, a header, and copyright information, and also displays a static logo
and busy icon, as shown in Figure 2–5.
2-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
Whenever a template is changed, for example if the layout changes, any page that uses
the template will also be automatically updated. For more information about creating
and using templates, see Section 19.3, "Using Page Templates."
At the time you create a JSF page, you can also choose to create an associated backing
bean for the page. Backing beans allow you to access the components on the page
programmatically. For more information about using backing beans with JSF JSP
pages, see Section 2.4.3, "What You May Need to Know About Automatic Component
Binding."
Best Practice: Create backing beans only for pages that contain com-
ponents that must be accessed and manipulated programmatically.
Use managed beans instead if you need only to provide additional
functionality accessed through EL expressions on component
attributes (such as listeners). :
You can also choose to have your page available for display in mobile devices. Once
your page files are created, you can add UI components and work with the page
source.
2. Complete the Create JSF Page dialog. For help, click Help in the dialog. For more
information about the Page Implementation option, which can be used to
automatically create a backing bean and associated bindings, see Section 2.4.3,
"What You May Need to Know About Automatic Component Binding."
If you chose to use one of the quick layouts, then JDeveloper also adds the components
necessary to display the layout. Example 2–4 shows the generated code when you
choose a two-column layout, where the first column is locked and the second column
stretches to fill up available browser space, and you also choose to apply themes.
2-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
</af:document>
</f:view>
</jsp:root>
If you chose to automatically create a backing bean using the Page Implementation
section of the dialog, JDeveloper also creates and registers a backing bean for the page,
and binds any existing components to the bean. Example 2–5 shows the code created
for a backing bean for a page.
import oracle.adf.view.rich.component.rich.RichDocument;
import oracle.adf.view.rich.component.rich.RichForm;
Tip: You can access the backing bean source from the JSF page by
right-clicking the page in the editor, and choosing Go to and then
selecting the bean from the list.
Example 2–6 Code in the web.xml File After a JSF JSP Page is Created
<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>oracle.adf.view.rich.versionString.HIDDEN</param-name>
<param-value>false</param-value>
</context-param>
<filter>
<filter-name>trinidad</filter-name>
<filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>trinidad</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>resources</servlet-name>
<servlet-class>
org.apache.myfaces.trinidad.webapp.ResourceServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>BIGRAPHSERVLET</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.graph.GraphServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>BIGAUGESERVLET</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.gauge.GaugeServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>MapProxyServlet</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.geoMap.servlet.MapProxyServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>GatewayServlet</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.graph.FlashBridgeServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
2-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/adf/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/afr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BIGRAPHSERVLET</servlet-name>
<url-pattern>/servlet/GraphServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BIGAUGESERVLET</servlet-name>
<url-pattern>/servlet/GaugeServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MapProxyServlet</servlet-name>
<url-pattern>/mapproxy/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/bi/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GatewayServlet</servlet-name>
<url-pattern>/flashbridge/*</url-pattern>
</servlet-mapping>
</web-app>
In the faces-config.xml file, when you create a JSF JSP page, JDeveloper creates an
entry that defines the default render kit (used to display the components in an HTML
client) for ADF Faces, as shown in Example 2–7.
An entry in the trinidad-config.xml file defines the default skin used by the user
interface (UI) components in the application, as shown in Example 2–8.
When the page is first displayed in JDeveloper, it is displayed in the visual editor
(accessed by clicking the Design tab), which allows you to view the page in a
WYSIWYG environment. You can also view the source for the page in the source editor
by clicking the Source tab. The Structure window located in the lower left-hand corner
of JDeveloper, provides a hierarchical view of the page.
2.4.3 What You May Need to Know About Automatic Component Binding
Backing beans are managed beans that contain logic and properties for UI components
on a JSF page (for more information about managed beans, see Section 2.6, "Creating
and Using Managed Beans"). If when you create your JSF JSP page you choose to
automatically expose UI components by selecting one of the choices in the Page
Implementation option of the Create JSF Page dialog, JDeveloper automatically creates
a backing bean (or uses a managed bean of your choice) for the page. For each
component you add to the page, JDeveloper then inserts a bean property for that
component, and uses the binding attribute to bind component instances to those
properties, allowing the bean to accept and return component instances.
Specifically, JDeveloper does the following when you use automatic component
binding:
■ Creates a JavaBean using the same name as the JSP or JSPX file, and places it in the
view.backing package (if you elect to have JDeveloper create a backing bean).
■ Creates a managed bean entry in the faces-config.xml file for the backing
bean. By default, the managed bean name is backing_<page_name> and the
bean uses the request scope (for more information about scopes, see Section 4.6,
"Object Scope Lifecycles").
■ On the newly created or selected bean, adds a property and accessor methods for
each component tag you place on the JSP. JDeveloper binds the component tag to
that property using an EL expression as the value for its binding attribute.
■ Deletes properties and methods for any components deleted from the page.
Once the JSP is created and components added, you can then declaratively add
method binding expressions to components that use them by double-clicking the
component in the visual editor, which launches an editor that allows you to select the
managed bean and method to which you want to bind the attribute. When automatic
component binding is used on a JSP and you double-click the component, skeleton
methods to which the component may be bound are automatically created for you in
the page’s backing bean. For example, if you add a command button component and
then double-click it in the visual editor, the Bind Action Property dialog displays the
page’s backing bean along with a new skeleton action method, as shown in Figure 2–6.
2-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
You can select from one these methods, or if you enter a new method name,
JDeveloper automatically creates the new skeleton method in the page's backing bean.
You must then add the logic to the method.
For example, suppose you created a JSP with the file name myfile.jspx. If you
chose to let JDeveloper automatically create a default backing bean, then JDeveloper
creates the backing bean as view.backing.MyFile.java, and places it in the \src
directory of the ViewController project. The backing bean is configured as a
managed bean in the faces-config.xml file, and the default managed bean name is
backing_myfile.
Example 2–9 shows the code on a JSP that uses automatic component binding, and
contains form, inputText, and commandButton components.
import oracle.adf.view.rich.component.rich.RichDocument;
import oracle.adf.view.rich.component.rich.RichForm;
import oracle.adf.view.rich.component.rich.input.RichInputText;
import oracle.adf.view.rich.component.rich.nav.RichCommandButton;
this.d1 = d1;
}
Example 2–11 shows the code added to the faces-config.xml file to register the
page’s backing bean as a managed bean.
In addition, when you edit a Java file that is a backing bean for a JSP, a method binding
toolbar appears in the source editor for you to bind appropriate methods quickly and
easily to selected components in the page. When you select an event, JDeveloper
creates the skeleton method for the event, as shown in Figure 2–7.
2-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
Figure 2–7 You Can Declaratively Create Skeleton Methods in the Source Editor
Once you create a page, you can turn automatic component binding off or on, and you
can also change the backing bean to a different Java class. Open the JSP in the visual
Editor and from the JDeveloper menu, choose Design > Page Properties. Here you can
select or deselect the Auto Bind option, and change the managed bean class. Click
Help for more information about using the dialog.
You can always access the backing bean for a JSP from the page editor by right-clicking
the page, choosing Go to, and then choosing the bean from the list of beans associated
with the JSP.
Tip: Click the All Technologies tab in the New Gallery if Facelets is
not a listed technology.
2. Complete the Create Facelets Page dialog. For help, click Help in the dialog.
Example 2–13 Code in the web.xml File After a JSF XHTML Page is Created
<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>oracle.adf.view.rich.versionString.HIDDEN</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.trinidad.FACELETS_VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
<context-param>
2-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
<param-name>facelets.SKIP_XML_INSTRUCTIONS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.trinidad.ALTERNATE_VIEW_HANDLER</param-name>
<param-value>
org.apache.myfaces.trinidadinternal.facelets.TrinidadFaceletViewHandler
</param-value>
</context-param>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>facelets.SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>facelets.DECORATORS</param-name>
<param-value>
oracle.adfinternal.view.faces.facelets.rich.AdfTagDecorator
</param-value>
</context-param>
<context-param>
<param-name>facelets.RESOURCE_RESOLVER</param-name>
<param-value>
oracle.adfinternal.view.faces.facelets.rich.AdfFaceletsResourceResolver
</param-value>
</context-param>
<filter>
<filter-name>trinidad</filter-name>
<filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>trinidad</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>resources</servlet-name>
<servlet-class>
org.apache.myfaces.trinidad.webapp.ResourceServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>BIGRAPHSERVLET</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.graph.GraphServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>BIGAUGESERVLET</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.gauge.GaugeServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>MapProxyServlet</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.geoMap.servlet.MapProxyServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>GatewayServlet</servlet-name>
<servlet-class>
oracle.adfinternal.view.faces.bi.renderkit.graph.FlashBridgeServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/adf/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/afr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BIGRAPHSERVLET</servlet-name>
<url-pattern>/servlet/GraphServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BIGAUGESERVLET</servlet-name>
<url-pattern>/servlet/GaugeServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MapProxyServlet</servlet-name>
<url-pattern>/mapproxy/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/bi/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GatewayServlet</servlet-name>
<url-pattern>/flashbridge/*</url-pattern>
</servlet-mapping>
</web-app>
An entry is also created in the faces-config.xml file for the view handler, as
shown in Example 2–14.
2-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
An entry in the trinidad-config.xml file defines the default skin used by the user
interface (UI) components in the application, as shown in Example 2–15.
When the page is first displayed in JDeveloper, it is displayed in the visual editor
(accessed by clicking the Design tab), which allows you to view the page in a
WYSIWYG environment. You can also view the source for the page in the source editor
by clicking the Source tab. The Structure window located in the lower left-hand corner
of JDeveloper, provides a hierarchical view of the page.
Note: You cannot use ADF Faces components on the same page as
MyFaces Trinidad components (tr: tags) or other AJAX-enabled
library components. You can use Trinidad HTML tags (trh:) on the
same page as ADF Faces components, however you may experience
some browser layout issues. You should always attempt to use only
ADF Faces components to achieve your layout.
Note that your application may contain a mix of pages built using
either ADF Faces or other components.
2. If the Component Palette is not displayed, from the menu choose View >
Component Palette. By default, the Component Palette is displayed in the upper
right-hand corner of JDeveloper.
3. In the Component Palette, use the dropdown menu to choose ADF Faces.
The components are contained in three accordion panels: Common Components,
Layout, and Operations. Figure 2–8 shows the Component Palette displaying the
Common Components for ADF Faces.
4. Select the component you wish to use and drag it onto the page.
JDeveloper redraws the page in the visual editor with the newly added
component. In the visual editor, you can directly select components on the page
and use the resulting context menu to add more components. Figure 2–9 shows a
page in the visual editor.
2-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
Tip: You can also drag and drop components from the palette into
the Structure window or directly into the code in the source editor.
You can always add components by directly editing the page in the
source editor. To view the page in the source editor, click the Source
tab at the bottom of the window.
When you drop a component that contains mandatory child components (for example
a table or a list), JDeveloper launches a wizard where you define the parent and also
each of the child components. Figure 2–10 shows the Table wizard used to create a
table component and the table’s child column components.
Example 2–17 shows the code created when you use the wizard to create a table with
three columns, each of which uses an outputText component to display data.
Figure 2–11 shows the Property Inspector displaying the attributes for an inputText
component.
2-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a View Page
The Property Inspector has sections that group similar properties together. For
example, the Property Inspector groups commonly used attributes for the inputText
component in the Common section, while properties that affect how the component
behaves are grouped together in the Behavior section. Figure 2–12 shows the Behavior
section of the Property Inspector for an inputText component.
3. Either enter values directly into the fields, or if the field contains a dropdown list,
use that list to select a value. You can also use the dropdown to the right of the
field, which launches a popup containing tools you can use to set the value. These
tools are either specific property editors (opened by choosing Edit) or the
Expression Builder, which you can use to create EL expressions for the value
(opened by choosing Expression Builder). For more information about using the
Expression Builder, see Section 2.5, "Creating EL Expressions." This popup also
displays a description of the property, as shown in Figure 2–13.
Tip: You can always change attribute values by directly editing the
page in the source editor. To view the page in the source editor, click
the Source tab at the bottom of the window.
2-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating EL Expressions
expression references them for the first time. When displaying a value, the runtime
evaluates the EL expression and pulls the value from the managed bean to populate
the component with data when the page is displayed. If the user updates data in the
UI component, the JSF runtime pushes the value back into the corresponding managed
bean based on the same EL expression. For more information about creating and using
managed beans, see Section 2.6, "Creating and Using Managed Beans." For more
information about EL expressions, see the Java EE 5 tutorial at
http://java.sun.com.
Tip: For more information about these objects, see the ADF Faces
Javadoc.
2-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating and Using Managed Beans
elFactory.createValueExpression(elContext, expression,
Object.class);
return valueExp.getValue(elContext);
}
Example 2–20 shows how you can set a new object on a managed bean.
//Check that the input newValue can be cast to the property type
//expected by the managed bean.
//Rely on Auto-Unboxing if the managed Bean expects a primitive
Class bindClass = valueExp.getType(elContext);
if (bindClass.isPrimitive() || bindClass.isInstance(newValue)) {
valueExp.setValue(elContext, newValue);
}
}
Note: If you plan on using Oracle ADF Model data binding and ADF
Controller, then instead of registering managed beans in the
faces-config.xml file, you may need to register them within ADF
task flows. For more information, refer to the "Using a Managed Bean
in a Fusion Web Application" section of the Oracle Fusion Middleware
Fusion Developer's Guide for Oracle Application Development Framework.
4. Click the Add icon to add a row to the Managed Bean table.
5. In the Create Managed Bean dialog, enter values. Click Help for more information
about using the dialog. Select the Generate Class If It Does Not Exist option if
you want JDeveloper to create the class file for you.
2-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Viewing ADF Faces Source Code and Javadoc
6. You can optionally add managed properties for the bean. When the bean is
instantiated, any managed properties will be set with the provided value. With the
bean selected in the Managed Bean table, click the New icon to add a row to the
Managed Properties table. In the Property Inspector, enter a property name (other
fields are optional).
Note: While you can declare managed properties using this editor,
the corresponding code is not generated on the Java class. You must
add that code by creating private member fields of the appropriate
type, and then by choosing the Generate Accessors menu item on the
context menu of the code editor to generate the corresponding get
and set methods for these bean properties.
2.6.2 What Happens When You Use JDeveloper to Create a Managed Bean
When you create a managed bean and elect to generate the Java file, JDeveloper
creates a stub class with the given name and a default constructor. Example 2–21
shows the code added to the MyBean class stored in the view package.
You now must add the logic required by your page. You can then refer to that logic
using an EL expression that refers to the managed-bean-name given to the managed
bean. For example, to access the myInfo property on the my_bean managed bean, the
EL expression would be:
#{my_bean.myInfo}
2. In the Go to Javadoc dialog, enter the class name you want to view. If you don’t
know the exact name, you can either begin to type the name and JDeveloper will
provide a list of classes that match the name. ADF Faces components are in the
oracle.adf.view.rich package.
Tip: When in a Java class file, you can go directly to the Javadoc for a
class name reference or for a JavaScript function call by placing your
cursor on the name or function and pressing Ctrl+D.
2-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Part II
Part II Understanding ADF Faces Architecture
This chapter outlines the major ADF Faces architecture features and also provides
information for using different features of the client-side architecture.
This chapter includes the following sections:
■ Section 3.1, "Introduction to Using ADF Faces Architecture"
■ Section 3.2, "Listening for Client Events"
■ Section 3.3, "Adding JavaScript to a Page"
■ Section 3.4, "Instantiating Client-Side Components"
■ Section 3.5, "Locating a Client Component on a Page"
■ Section 3.6, "Accessing Component Properties on the Client"
■ Section 3.7, "Using Bonus Attributes for Client-Side Components"
■ Section 3.8, "Understanding Rendering and Visibility"
Other functionality may require you to use the ADF Faces JavaScript API. For
example, Section 3.5, "Locating a Client Component on a Page," explains how to use
the API to locate a specific client-side component, and Section 3.6, "Accessing
Component Properties on the Client," documents how to access specific properties.
The following RCF features are more complex, and therefore have full chapters
devoted to them:
■ ADF Faces additions to the lifecycle: The ADF Faces framework extends the JSF
lifecycle, providing additional functionality, including a client-side value lifecycle.
For more information, see Chapter 4, "Using the JSF Lifecycle with ADF Faces."
■ Event handling: ADF Faces adheres to standard JSF event handling techniques. In
addition, the RCF provides AJAX-based rich postbacks (called partial page
rendering), as well as a client-side event model. For more information, see
Chapter 5, "Handling Events."
■ Conversion and validation: ADF Faces input components have built-in capabilities
to both convert and validate user entries. You can also create your own custom
converters and validators. For more information, see Chapter 6, "Validating and
Converting Input."
■ Partial page rendering: Partial page rendering (PPR) allows small areas of a page
to be refreshed without the need to redraw the entire page. Many ADF Faces
components have built-in PPR functionality. In addition, you can declaratively
configure PPR so that an action on one component causes a rerender of another.
For more information, see Chapter 7, "Rerendering Partial Page Content."
■ Geometry management: ADF Faces provides a number of layout components,
many of which support geometry management by automatically stretching their
contents to take up available space. For more information, see Chapter 8,
"Organizing Content on Web Pages."
■ Messaging and help: The RCF provides the ability to display tooltips, messages,
and help for input components, as well as the ability to display global messages
for the application. The help framework allows you to create messages that can be
reused throughout the application.You create a help provider using a Java class, a
managed bean, an XLIFF file, or a standard properties file, or you can link to an
external HTML-based help system. For more information, see Chapter 17,
"Displaying Tips, Messages, and Help."
■ Hierarchical menu model: ADF Faces provides navigation components that render
items such as tabs and breadcrumbs for navigating hierarchical pages. The RCF
provides an XML-based menu model that, in conjunction with a metadata file,
contains all the information for generating the appropriate number of hierarchical
levels on each page, and the navigation items that belong to each level. For more
information, see Chapter 18, "Working with Navigation Components."
■ Reusable components: The RCF provides three reusable building blocks that can
be used by multiple pages in your application: page fragments that allow you to
create a part of a page (for example an address input form); page templates that
can provide a consistent look and feel throughout your application that can be
updated with changes automatically propagating to all pages using the template;
and declarative components that are composite components that developers can
reuse, ensuring consistent behavior throughout the application. For more
information, see Chapter 19, "Creating and Reusing Fragments, Page Templates,
and Components."
■ Applying skins: The RCF allows you to create your own look and feel by creating
skins used by the ADF Faces components to change their appearance. For more
3-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Listening for Client Events
information, see Chapter 20, "Customizing the Appearance Using Styles and
Skins."
■ Internationalization and localization: You can configure your JSF page or
application to use different locales so that it displays the correct language based on
the language setting of a user’s browser. For more information, see Chapter 21,
"Internationalizing and Localizing Pages."
■ Accessibility: ADF Faces components have built-in accessibility support for user
agents, for example a web browser rendering to nonvisual media such as a screen
reader or magnifier. Accessibility support also includes access keys that allow
users to access components and links using only the keyboard, and audit rules that
provide directions to create accessible images, tables, frames, forms, error
messages, and popup dialogs using accessible HTML markup. For more
information, see Chapter 22, "Developing Accessible ADF Faces Pages."
■ User-driven personalization: Many ADF Faces components, such as the
panelSplitter, allow users to change the display of the component at runtime.
By default, these changes live only as long as the page request. However, you can
configure your application so that the changes can be persisted through the length
of the user’s session. For more information, see Chapter 31, "Allowing User
Customization on JSF Pages."
■ Drag and drop capabilities: The RCF allows the user to move (cut and paste), copy
(copy and paste), or link (copy and paste as a link) data from one location to
another. When the drop is completed, the component accepting the drop rerenders
using partial page rendering. For more information, see Chapter 32, "Adding Drag
and Drop Functionality."
The remainder of this chapter focuses on working with the client-side framework.
When the button is clicked, because there is a client version of the component, the
AdfAction client event is invoked. Because a clientListener tag is configured to
listen for the AdfAction event, it causes the sayHello function to execute. For more
information about client-side events, see Section 5.3, "Using JavaScript for ADF Faces
Client Events."
3-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding JavaScript to a Page
3. In the Structure window, right-click the component that will invoke the JavaScript,
and choose Insert inside component > ADF Faces > Client Listener.
4. In the Insert Client Listener dialog, in the Method field, enter the JavaScript
function name. In the Type field, select the event type that should invoke the
function.
2. In the Structure window, right-click the component that will invoke the JavaScript,
and choose Insert inside component > ADF Faces > Client Listener.
3. In the Insert Client Listener dialog, in the Method field, enter the fully qualified
name of the function. For example, if the sayHello function was in the
MyScripts library, you would enter MyScripts.sayHello. In the Type field,
select the event type that should invoke the function.
3.3.3 What You May Need to Know About Accessing Client Event Sources
Often when your JavaScript needs to access a client, it is within the context of a listener
and must access the event’s source component. Use the getSource() method to get
the client component. Example 3–6 shows the sayHello function accessing the source
client component in order to display its name.
For more information about accessing client event sources, see Section 5.3, "Using
JavaScript for ADF Faces Client Events." For more information about accessing
client-side properties, see Section 3.6, "Accessing Component Properties on the Client."
For a complete description of how client events are handled at runtime, see
Section 5.3.6, "What Happens at Runtime: How Client-Side Events Work."
When you set the clientComponent attribute to true, the framework creates an
instance of an AdfUIComponent class for the component. This class provides the API
that you can work with on the client side and also provides basic property accessor
methods (for example, getProperty() and setProperty()), event listener
registration, and event delivery-related APIs. The framework also provides
renderer-specific subclasses (for example, AdfRichOutputText) which expose
property-specific accessor methods (for example, getText() and setText()). These
accessor methods are simply wrappers around the AdfUIComponent class’s
getProperty() and setProperty() methods and are provided for coding
convenience.
For example, suppose you have an outputText component on the page that will get
its value (and therefore the text to display) from the sayHello function. That function
must be able to access the outputText component in order to set its value. For this to
work, there must be a client-side version of the outputText component. Example 3–7
shows the JSF page code. Note that the outputText component has an id value and
the clientComponent attribute is set to true. Also, note there is no value in the
example, because that value will be set by the JavaScript.
3-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Locating a Client Component on a Page
</af:commandButton>
Because the outputText component will now have client-side representation, the
JavaScript will be able to locate and work with it.
3.5.1 What You May Need to Know About Finding Components in Naming Containers
If the component you need to find is within a component that is a naming container
(such as pageTemplate, subform, table, and tree), then instead of using the
AdfPage.PAGE.findComponentByAbsoluteId(absolute expr) method, use
the AdfUIComponent.findComponent(expr) method. The expression can be
either absolute or relative.
Absolute expressions use the fully qualified JSF client ID (meaning, prefixed with the
IDs of all NamingContainer components that contain the component) with a leading
NamingContainer.SEPARATOR_CHAR character, for example:
":" + (namingContainersToJumpUp * ":") + some ending portion of the
clientIdOfComponentToFind
For example, to find a table whose ID is t1 that is within a panel collection component
whose ID is pc1 contained in a region whose ID is r1 on page that uses the
myTemplate template, you might use the following:
:myTemplate:r1:pc1:t1
Alternatively, if both the components (the one doing the search and the one being
searched for) share the same NamingContainer component somewhere in the
hierarchy, you can use a relative path to perform a search relative to the component
doing the search. A relative path has multiple leading
NamingContainer.SEPARATOR_CHAR characters, for example:
":" + clientIdOfComponentToFind
In the preceding example, if the component doing the searching is also in the same
region as the table, you might use the following:
::somePanelCollection:someTable
When deciding whether to use an absolute or relative path, keep the following in
mind:
■ If you know that the component you are trying to find will always be in the same
naming container, then use an absolute path.
■ If you know that the component performing the search and the component you
are trying to find will always be in the same relative location, then use a relative
path.
There are no getChildren() or getFacet() functions on the client. Instead, the
AdfUIComponent.visitChildren() function is provided to visit all children
components or facets (that is all descendents). See the ADF Faces JavaScript
documentation for more information.
3-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Accessing Component Properties on the Client
Note: All client properties in ADF Faces use the getXyz function
naming convention including boolean properties. The isXyz naming
convention for boolean properties is not used.
Constants are also available for the property names on the class object. For instance,
you can use AdfRichDialog.STYLE_CLASS constant instead of using
"styleClass".
When a component’s property changes, the end result should be that the component’s
DOM is updated to reflect its new state, in some cases without a roundtrip to the
server. The component's role in this process is fairly limited: it simply stores away the
new property value and then notifies the peer of the change. The peer contains the
logic for updating the DOM to reflect the new component state.
Note: Not all property changes are handled through the peer on the
client side. Some property changes are propagated back to the server
and the component is rerendered using PPR.
As noted in Section 1.2.2, "ADF Faces Architectural Features," most property values
that are set on the client result in automatic synchronization with the server (although
some complex Java objects are not sent to the client at all). There are however, two
types of properties that act differently: secured properties and disconnected properties.
Secured properties are those that cannot be set on the client at all. For example, say a
malicious client used JavaScript to set the immediate flag on a commandLink
component to true. That change would then be propagated to the server, resulting in
server-side validation being skipped, causing a possible security hole (for more
information about using the immediate property, see Section 4.2, "Using the
Immediate Attribute"). Consequently, the immediate property is a secured property.
Attempts to set any other secured property from JavaScript will fail. For more
information, see Section 3.6.2, "How to Unsecure the disabled Property." Table 3–1
shows the secure properties on the client components.
3-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Accessing Component Properties on the Client
3-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Accessing Component Properties on the Client
ADF Faces does allow you to configure the disabled property so that it can be made
unsecure. This can be useful when you need to use JavaScript to enable and disable
buttons. When you set the unsecure property to true, the disabled property (and
only the disabled property) will be made unsecure.
Disconnected properties are those that can be set on the client, but that do not propagate
back to the server. These properties have a lifecycle on the client that is independent of
the lifecycle on the server. For example, client form input components (like
AdfRichInputText) have a submittedValue property, just as the Java
EditableValueHolder components do. However, setting this property does not
directly affect the server. In this case, standard form submission techniques handle
updating the submitted value on the server.
A property can be both disconnected and secured. In practice, such properties act like
disconnected properties on the client: they can be set on the client, but will not be sent
to the server. But they act like secured properties on the server, in that they will refuse
any client attempts to set them.
Once you set the unsecure attribute to disabled, a malicious JavaScript could
change the disabled attribute unwittingly. For example, say you have an expense
approval page, and on that page, you want certain managers to be able to only
approve invoices that are under $200. For this reason, you want the approval button to
be disabled unless the current user is allowed to approve the invoice.
If you did not set the unsecured attribute to disabled, the approval button would
remain disabled until a round-trip to the server occurs, where logic determines if the
current user can approve the expense. But because you want the button to display
correctly as the page loads the expense, say you set the unsecure attribute to
disabled. Now you can use JavaScript on the client to determine if the button should
be disabled. But now, any JavaScript (including malicious JavaScript that you have no
control over) can do the same thing.
To avoid this issue, you must ensure that your application still performs the same logic
as if the round-trip to the server had happened. In the expense report approval screen,
you might have JavaScript that checks that the amount is under $200, but you still
need to have the action for the approval button perform the logic on the server.
Adding the logic to the server ensures that the disabled attribute does not get changed
when it should not.
Similarly, if you allow your application to be modified at runtime, and you allow users
to potentially edit the unsecure and/or the disabled attributes, you must ensure
that your application still performs the same logic as if the round-trip to the server had
occurred.
3.6.3 What Happens at Runtime: How Client Properties Are Set on the Client
Calling the setProperty() function on the client sets the property to the new value,
and synchronously fires a PropertyChangeEvent event with the new values (as
long as the value is different). Also, setting a property may cause the component to
rerender itself.
3-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Rendering and Visibility
3.7.2 What You May Need to Know About Marshalling Bonus Attributes
Although client-side bonus attributes are automatically delivered from the server to
the client, the reverse is not true. That is, changing or setting a bonus attribute on the
client will have no effect on the server. Only known (nonbonus) attributes are
synchronized from the client to the server. If you want to send application-defined
data back to the server, you should create a custom event. For more information, see
Section 5.4, "Sending Custom Events from the Client to the Server."
Example 3–9 shows two outputText components, only one of which is rendered at a
time. The first outputText component is rendered when no value has been entered
into the inputText component. The second outputText component is rendered
when a value is entered.
Provided a component is rendered in the client, you can either display or hide the
component on the page using the visible property.
Example 3–10 shows how you might achieve the same functionality as shown in
Example 3–9, but in this example, the visible attribute is used to determine which
component is displayed (the rendered attribute is true by default, it does not need
to be explicitly set).
However, because using the rendered attribute instead of the visible attribute
improves performance on the server side, you may instead decide to have JavaScript
handle the visibility.
Example 3–11 shows the page code for JavaScript that handles the visiblity of the
components.
if (input.getValue() == "")
{
output1.setVisible(true);
}
else
{
output2.setVisible(true)
}
To set visibility:
1. Create the JavaScript that can toggle the visibility. Example 3–11 shows a script
that turns visibility on for one outputText component if there is no value;
otherwise, the script turns visibility on for the other outputText component.
2. For each component that will be needed in the JavaScript function, expand the
Advanced section of the Property Inspector and set the ClientComponent
3-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Rendering and Visibility
attribute to true. This creates a client component that will be used by the
JavaScript.
3. For the components whose visibility will be toggled, set the visible attribute to
false.
Example 3–12 shows the full page code used to toggle visibility with JavaScript.
if (input.value == "")
{
output1.setVisible(true);
}
else
{
output2.setVisible(true)
}
}
</af:resource>
<af:document>
<af:form>
<af:panelGroupLayout layout="horizontal">
<af:inputText label="Input some text" id="input"
value="#{myBean.inputValue}" clientComponent="true"
immediate="true"/>
<af:commandButton text="Enter" clientComponent="true">
<af:clientListener method="showText" type="action"/>
</af:commandButton>
</af:panelGroupLayout>
<af:panelGroupLayout layout="horizontal">
<af:outputLabel value="You entered:" clientComponent="false"/>
<af:outputText value="No text entered" id="output1"
visible="false" clientComponent="true"/>
<af:outputText value="#{myBean.inputValue}" id="output2"
visible="false" clientComponent="true"/>
</af:panelGroupLayout>
</af:form>
</af:document>
</f:view>
3.8.2 What You May Need to Know About Visible and the isShowing Function
If the parent of a component has its visible attribute set to false, when the
isVisible function is run against a child component whose visible attribute is set
to true, it will return true, even though that child is not displayed. For example, say
you have a panelGroupLayout component that contains an outputText
component as a child, and the panelGroupLayout component’s visible attribute
is set to false, while the outputText component’s visible attribute is left as the
default (true). On the client, neither the panelGroupLayout nor the outputText
component will be displayed, but if the isVisible function is run against the
outputText component, it will return true.
For this reason, the RCF provides the isShowing() function. This function will
return false if the component’s visible attribute is set to false, or if any parent of
that component has visible set to false.
3-18 Web User Interface Developer's Guide for Oracle Application Development Framework
4
Using the JSF Lifecycle with ADF Faces
4
This chapter describes the JSF page request lifecycle and the additions to the lifecycle
from ADF Faces, and how to use the lifecycle properly in your application.
This chapter includes the following sections:
■ Section 4.1, "Introduction to the JSF Lifecycle and ADF Faces"
■ Section 4.2, "Using the Immediate Attribute"
■ Section 4.3, "Using the Optimized Lifecycle"
■ Section 4.4, "Using the Client-Side Lifecycle"
■ Section 4.5, "Using Subforms to Create Regions on a Page"
■ Section 4.6, "Object Scope Lifecycles"
■ Section 4.7, "Passing Values Between Pages"
4-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to the JSF Lifecycle and ADF Faces
value is entered, in which case no validation is run. For more information about
conversion and validation, see Chapter 6, "Validating and Converting Input."
At the end of this phase, converted versions of the local values are set, any
validation or conversion error messages and events are queued on the
FacesContext object, and any value change events are delivered.
Tip: In short, for an input component that can be edited, the steps for
the Process Validations phase is as follows:
1. If a converter fails, the required check and validators are not run.
2. If the converter succeeds but the required check fails, the validators are
not run.
3. If the converter and required check succeed, all validators are run. Even if
one validator fails, the rest of the validators are run. This is because when
the user fixes the error, you want to give them as much feedback as
possible about what is wrong with the data entered.
For example suppose you have a dateTimeRange validator that
accepted dates only in the year 2010, and you had a
dateRestrictionValidator validator that did not allow the user to
pick Sundays. If the user entered July 5, 2009 (a Sunday), you want
to give the feedback that this fails both validators to maximize the chance
the user will enter valid data.
■ Update Model Values: The component’s validated local values are moved to the
model, and the local copies are discarded.
■ Invoke Application: Application-level logic (such as event handlers) is executed.
■ Render Response: The components in the tree are rendered. State information is
saved for subsequent requests and for the Restore View phase.
To help illustrate the lifecycle, consider a page that has a simple input text component
where a user can enter a date and then click a command button to submit the entered
value. A valueChangeListener method is also registered on the component.
Example 4–1 shows the code for the example.
Suppose a user enters the string "June 25, 2005" and clicks the submit button.
Figure 4–2 shows how the values pass through the lifecycle and where the different
events are processed.
4-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the Immediate Attribute
Note: A command button that does not provide any navigation and
is set to immediate will also go directly to the Render Response
phase: the Validation, Update Model, and Invoke Application phases
are skipped, so any new values will not be pushed to the server.
As with command components, for components that invoke disclosure events, (such
as a showDetail component), and for editableValueHolder components
(components that hold values that can change, such as an inputText component) the
events are delivered to the Apply Request Values phase. However, for
editableValueHolder components, instead of skipping phases, conversion,
validation, and delivery of valueChangeEvents events are done earlier in the
lifecycle, during the Apply Request Values phase, instead of after the Process
Validations phase. No lifecycle phases are skipped.
Figure 4–4 shows the lifecycle for an input component whose immediate attribute is
set to true. The input component takes a date entered as a string and stores it as a
date object when the command button is clicked.
Setting immediate to true for an input component can be useful when one or more
input components must be validated before other components. Then, if one of those
components is found to have invalid data, validation is skipped for the other input
components in the same page, thereby reducing the number of error messages shown
for the page.
4-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the Immediate Attribute
As another example, suppose you have a form with an input component used to
search for a string with a command button configured to invoke the search execution,
and another input text component used to input a date with an associated command
button used to submit the date. In this example, we want to set the search input
component and its button both to be immediate. This will allow the user to execute a
search, even if an invalid string is entered into the date field, because the date input
component’s converter is never fired. Also, because the search input text is set to
immediate and the date input field is not, only the search input text will be
processed. And because both fields are within the same form, if the user enters a valid
date in the date field, but then performs a search and does not click the Save button,
the entered value will still be displayed when the search results are displayed.
Example 4–2 shows the code used for the two fields and two buttons.
Figure 4–5 shows the lifecycle for this page when a user does the following:
■ Enters binky into the Date input field (which is not a valid entry)
■ Enters dress into the Search field
■ Clicks the Search button to execute the search on dress
■ Clicks the Save button to save the value binky as the date
Figure 4–5 Immediate Attribute on Both Command Component and Input Component
4-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the Optimized Lifecycle
2. In the Property Inspector, expand the Behavior section and set the immediate
attribute to true.
Also assume that you want the user to be able to select a radio button before entering
the required text into the field. While you could set the radio button components to
automatically trigger a submit action and also set their immediate attribute to true
so that they are processed before the inputText component, you would also have to
add a valueChangeEvent listener, and in it call the Render Response phase so that
validation is not run on the input text component.
Instead of having to write this code in a listener, ADF Faces allows you to set
boundaries on the page that allow the lifecycle to run just on components within the
boundary. In order to determine the boundary, the framework must be notified of the
root component to process. This component can be determined in two ways:
■ Components: A region is an example of a component which the framework knows
is a boundary. No matter what event is triggered inside a region, the lifecycle does
not run on components outside the region.
■ Events: Certain events indicate a component as a root. For example, the disclosure
event sent when expanding or collapsing a showDetail component (see
Section 8.8, "Displaying and Hiding Contents Dynamically") indicates that the
showDetail component is a root, and so the lifecycle is run only on the
showDetail component and any child components. The lifecycle may also be run
on any components configured to listen for that disclosure event. Configuring a
component to listen for events on root components in order to be processed is
called cross-component refresh.
Cross-component refresh allows you to set up dependencies so that the events from
one component act as triggers for another component, known as the target. When any
event occurs on the trigger component, the lifecycle is run on any target components,
as well as on any child components of both the trigger and the target, causing only
those components to be rerendered. This is considered a partial page rendering (PPR).
In the radio button example, you would set the radio buttons to be triggers and the
panelGroupLayout component that contains the output text to be the target, as
shown in Example 4–3.
Because the autoSubmit attribute is set to true on the radio buttons, when they are
selected, a SelectionEvent is fired, for which the radio button is considered the
root. Because the panelGroupLayout component is set to be a target to both radio
components, when that event is fired, only the selectOneRadio (the root), the
panelGroupLayout component (the root’s target), and its child component (the
outputText component) are processed through the lifecycle. Because the
outputText component is configured to render only when the Show radio button is
selected, the user is able to select that radio button and see the output text, without
having to enter text into the required input field above the radio buttons.
For more information about how the ADF Faces framework uses PPR, and how you
can use PPR throughout your application, see Chapter 7, "Rerendering Partial Page
Content."
4.3.1 What You May Need to Know About Using the Immediate Attribute and the
Optimized Lifecycle
There may be cases where PPR will not be able to keep certain components from being
validated. For example, suppose instead of using an outputText component, you
want to use an inputText component whose required attribute is set to true,
inside the panelGroupLayout component, as shown in Example 4–4.
In this example, the inputText component will be validated because the lifecycle
runs on the root (the selectOneRadio component), the target (the
panelGroupLayout component), and the target’s child (the inputText
component). Validation will fail because the inputText component is marked as
required and there is no value, so an error will be thrown. Because of the error, the
lifecycle will skip to the Render Response phase and the model will not be updated.
Therefore, the panelGroupLayout component will not be able to show or hide
because the value of the radio button will not be updated.
For cases like these, you can skip validation using the immediate attribute on the
radio buttons. Doing so causes the valueChangeEvent on the buttons to run before
the Process Validation phase of the inputText component. Then you need to add a
valueChangeListener handler method that would call the Render Response phase
4-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the Optimized Lifecycle
(thereby skipping validation of the input component), and set the values on the radio
buttons and input component. Example 4–5 shows the JSF code to do this.
Example 4–6 valueChangeListener Sets the Value and Calls Render Response
public void toggle(ValueChangeEvent vce)
{
setShow2(Boolean.TRUE.equals(vce.getNewValue()));
FacesContext.getCurrentInstance().renderResponse();
}
4.3.2 What You May Need to Know About Using an LOV Component and the Optimized
Lifecycle
For the inputListOfValues and inputComboBoxListOfValues components, the
procedures described in Section 4.3.1, "What You May Need to Know About Using the
Immediate Attribute and the Optimized Lifecycle," will not work. Consider the
following example.
Suppose you have an inputListOfValues component from which a user selects an
employee name, and an inputText component whose required attribute is set to
true, which is updated with the employee’s ID number once the employee is selected,
as shown in Figure 4–7.
To achieve this, you might set the Empno field to have the Ename field as a partial
trigger, as shown in Example 4–7.
Example 4–7
<af:inputListOfValues label="Ename" id="lov0"
value="#{validateLOV.ename}" autoSubmit="true"
immediate="true"
popupTitle="Search and Select: Ename"
searchDesc="Choose a name"
model="#{validateLOV.listOfValuesModel}"
valueChangeListener="#{validateLOV.immediateValueChange}"
validator="#{validateLOV.validate}"/>
<af:inputText label="Empno" value="#{validateLOV.empno}" required="true"
id="lovDependent01" partialTriggers="lov0"/>
As with the radio button and input component example in Section 4.3.1, "What You
May Need to Know About Using the Immediate Attribute and the Optimized
Lifecycle," once the user clicks the search icon, the inputText component will be
validated because the lifecycle runs on both the root (the inputListOfValues
component) and the target (the inputText component). Validation will fail because
the inputText component is marked as required and there is no value, so an error
will be thrown, as shown in Figure 4–8.
However, the solution recommended in Section 4.3.1, "What You May Need to Know
About Using the Immediate Attribute and the Optimized Lifecycle," of setting the
LOV component’s immediate attribute to true and using a ValueChangeListener on
the LOV will not fix the validation error. For LOV components, the
ValueChangeEvent is queued only when the value of the LOV component changes.
For this reason, setting the immediate attribute to true has no effect when the user
clicks the search icon, because at that point the ADF LaunchPopupEvent is queued
for the Invoke Application phase always, regardless of the value of the immediate
attribute. In other words, the optimized lifecycle is run as normal on both the root and
target components and therefore the input component throws a validation error.
When the user selects a new value from the LOV popup, the LOV component queues
two events. One is a ValueChangeEvent to signal a change in value for the
component. The second is a ReturnPopupEvent queued for the Invoke Application
phase, which gives application methods a chance to handle the selection. Both these
events need to occur in order for the LOV to behave as expected.
As mentioned, the LOV component queues a ValueChangeEvent only when the
user selects a new value. If you were to set the immediate attribute to true on the
LOV component, this event would be queued for the Apply Request Values phase and
the new value would be validated. In addition if you were to create a
ValueChangeListener method for the LOV component, and in its implementation
jump to the Render Response phase to avoid validation of the input component, the
selected value would never get pushed to the model, the ReturnPopupListener
would never get called during the Invoke Application phase, and the target input
component would not get updated with new value, as shown in Figure 4–9.
4-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the Client-Side Lifecycle
component as a partial trigger for the input component and creating a method for the
ValueChangeListener, you need to create a listener for the ReturnPopupEvent.
This listener must programmatically set the input components as partial targets for the
LOV. You do not need to set the LOV’s immediate attribute to true because the
input component is no longer a target for the LOV until the ReturnPopupListener
method is executed, and so it will not fail validation because the lifecycle will not be
run on it. And because a listener method is used for the ReturnPopupEvent instead
of for the ValueChangeEvent, both events can be queued and the model updated
appropriately.
Example 4–8 shows the needed page code for the LOV and input components.
Example 4–8
<af:inputListOfValues label="Ename" id="lov1"
value="#{validateLOV.ename}" autoSubmit="true"
returnPopupListener="#{validate.processReturnPopup}"
Title="Search and Select: Ename" searchDesc="Choose a name"
model="#{validateLOV.listOfValuesModel}"
validator="#{validateLOV.validate}"/>
<af:inputText label="Empno" value="#{validateLOV.empno}" required="true"
id="lovDependent1" binding="#{validate.lovDependent1}"/>
The input component uses its binding attribute to store the instance on a backing
bean, allowing the instance to be accessed by the listener method. The listener method
then accesses the input component and sets it as a partial target for the LOV, as shown
in Example 4–9.
Example 4–9
AdfFacesContext.getCurrentInstance().addPartialTarget(_lovDependent1)
For more information about programmatically setting partial page rendering, see
Section 7.3, "Enabling Partial Page Rendering Programmatically."
When this page is run, if you clear the field of the value of the inputText component
and tab out of the field, the field will redisplay with a red outline. If you then click into
the field, an error message will state that a value is required, as shown in Figure 4–10.
There will be no trip to the server; this error detection and message generation is all
done on the client.
Figure 4–10 Client-Side Validation Displays an Error Without a Trip to the Server
In this same example, if you were to clear the field of the value and click the Search
button, the page would not be submitted because the required field is empty and
therefore an error occurs; the action event would not be delivered, and the method
bound to the action listener would not be executed. This process is what you want,
because there is no reason to submit the page if the client can tell that validation will
fail on the server.
For more information about using client-side validation and conversion, see Chapter 6,
"Validating and Converting Input."
Best Practice: Always use only a single form tag per page. Use the
subform tag where you might otherwise be tempted to use multiple
form tags.
A subform will always allow the Apply Request Values phase to execute for its child
components, even when the page was submitted by a component outside of the
subform. However, the Process Validations and Update Model Values phases will be
skipped (this differs from an ordinary form component, which, when not submitted,
cannot run the Apply Request Values phase). To allow components in subforms to be
processed through the Process Validations and Update Model Value phases when a
component outside the subform causes a submit action, use the default attribute.
When a subform’s default attribute is set to true, it acts like any other subform in
4-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Object Scope Lifecycles
most respects, but if no subform on the page has an appropriate event come from its
child components, then any subform with default set to true will behave as if one
of its child components caused the submit. For more information about subforms, see
Section 9.2, "Defining Forms."
Object scopes are analogous to global and local variable scopes in programming
languages. The wider the scope, the higher the availability of an object. During their
lifespan, these objects may expose certain interfaces, hold information, or pass
variables and parameters to other objects. For example, a managed bean defined in
sessionScope scope will be available for use during multiple page requests.
However, a managed bean defined in requestScope scope will be available only for
the duration of one page request.
Figure 4–11 shows the time period in which each type of scope is valid, and its
relationship with the page flow.
When determining what scope to register a managed bean with or to store a value in,
always try to use the narrowest scope possible. Use the sessionScope scope only for
information that is relevant to the whole session, such as user or context information.
Avoid using the sessionScope scope to pass values from one page to another.
Note: If you are using the full Fusion technology stack, then you
have the option to register your managed beans in various
configuration files. For more information, see the "Using a Managed
Bean in a Fusion Web Application" section of the Oracle Fusion
Middleware Fusion Developer's Guide for Oracle Application Development
Framework.
The ADF Faces pageFlowScope scope makes it easier to pass values from one page
to another, thus enabling you to develop master-detail pages more easily. Values
added to the pageFlowScope scope automatically continue to be available as the user
4-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Passing Values Between Pages
navigates from one page to another, even if you use a redirect directive. But unlike
session scope, these values are visible only in the current page flow or process. If the
user opens a new window and starts navigating, that series of windows will have its
own process. Values stored in each window remain independent.
Like objects stored in any standard JSF scope, objects stored in the pageFlow scope
can be accessed through EL expressions. The only difference with the pageFlow scope
is that the object names must use the pageFlowScope prefix. For example, to have a
button's label provided by a managed bean stored in the pageFlow scope, and to have
a method on the bean called when the button is selected, you might use the following
code on your page:
<af:commandButton text="#{pageFlowScope.buttonBean.label}"
action="#{pageFlowScope.buttonBean.action}"/>
2. To clear the pageFlowScope scope, access it and then manually clear it.
For example, you might use the following Java code to clear the scope:
4.7.2 How to Use the pageFlowScope Scope Without Writing Java Code
To use the pageFlowScope scope without writing Java code, use a
setPropertyListener tag in conjunction with a command component to set a
value in the scope. The setPropertyListener tag uses the type attribute that
defines the event type it should listen for. It ignores all events that do not match its
type. Once set, you then can access that value from another page within the page flow.
4-18 Web User Interface Developer's Guide for Oracle Application Development Framework
5
5 Handling Events
This chapter describes how to handle events on the server as well as on the client.
This chapter includes the following sections:
■ Section 5.1, "Introduction to Events and Event Handling"
■ Section 5.2, "Using ADF Faces Server Events"
■ Section 5.3, "Using JavaScript for ADF Faces Client Events"
■ Section 5.4, "Sending Custom Events from the Client to the Server"
■ Section 5.5, "Executing a Script Within an Event Response"
■ Section 5.6, "Using Client Behavior Tags"
While ADF Faces adheres to standard JSF event handling techniques, it also enhances
event handling in two key ways by providing:
■ AJAX-based functionality (partial page rendering)
■ A client-side event model
5-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Using ADF Faces Server Events
* This focus event is generated when focusing in on a specific subtree, which is not the
same as a client-side keyboard focus event.
** The LoadEvent event is fired after the initial page is displayed (data streaming
results may arrive later).
All server events have event listeners on the associated component(s). You need to
create a handler that processes the event and then associate that handler code with the
listener on the component.
For example, in the File Explorer application, a selection event is fired when a user
selects a row in the table. Because the table’s selectionListener attribute is bound
to the tableSelectFileItem handler method on the TableContentView.java
managed bean, that method is invoked in response to the event.
5-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript for ADF Faces Client Events
setSelectedFileItem(data);
}
Tip: If the event listener code is likely to be used by more than one
page in your application, consider creating an event listener
implementation class that all pages can access. All server event
listener class implementations must override a processEvent()
method, where Event is the event type.
For example, the LaunchListener event listener accepts an instance
of LaunchEvent as the single argument. In an implementation, you
must override the event processing method, as shown in the following
method signature:
public void processLaunch (LaunchEvent evt)
{
// your code here
}
Table 5–3 lists the events generated by ADF Faces client components, whether or not
events are sent to the sever, whether or not the events are cancelable, and the
components that trigger the events.
5-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript for ADF Faces Client Events
The type attribute of the clientListener tag specifies the client event type that the
tag will listen for, such as action or valueChange. The method attribute of the
clientListener tag specifies the JavaScript function to call when the corresponding
event is fired. The JavaScript function must take a single parameter, which is the event
object.
The type attribute of the clientListener tag also supports client event types
related to keyboard and mouse events. Table 5–4 lists the keyboard and mouse event
types.
To use client-side events, you need to first create the JavaScript that will handle the
event. For information about creating JavaScript, see Section 3.3, "Adding JavaScript to
a Page." Within that functionality, you can add the following:
■ Locate a client component on a page
If you want your event handler to operate on another component, you must locate
that component on the page. For example, in the File Explorer application, when
users choose the Give Feedback menu item in the Help menu, the associated
JavaScript function has to locate the help popup dialog in order to open it. For
more information about locating client components, see Section 3.5, "Locating a
Client Component on a Page."
■ Return the original source of the event
If you have more than one of the same component on the page, your JavaScript
function may need to determine which component issued the event. For example,
say more than one component can open the same popup dialog, and you want
that dialog aligned with the component that called it. You must know the source of
the AdfLaunchPopupEvent in order to determine where to align the popup
dialog. For more information, see Section 5.3.1, "How to Return the Original
Source of the Event."
■ Add client attributes
It may be that your client event handler will need to work with certain attributes
of a component. For example, in the File Explorer application, when users choose
the About menu item in the Help menu, a dialog launches that allows users to
provide feedback. The function used to open and display this dialog is also used
by other dialogs, which may need to be displayed differently. Therefore, the
function needs to know which dialog to display along with information about how
to align the dialog. This information is carried in client attributes. Client attributes
5-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript for ADF Faces Client Events
can also be used to marshall custom server-side attributes to the client. For more
information, see Section 5.3.2, "How to Use Client-Side Attributes for an Event."
■ Cancel propagation to the server
Some of the components propagate client-side events to the server, as shown in
Table 5–3. If you do not need this extra processing, then you can cancel that
propagation. For more information, see Section 5.3.4, "How to Prevent Events from
Propagating to the Server."
Once you create the JavaScript function, you must add an event listener that will call
the event method. For more information, see Section 5.3.5, "How to Trigger Event
Handler Execution."
source.show({align:alignType, alignId:alignCompId});
event.cancel();
}
The getSource() method is called to determine the client component that fired the
current focus event, which in this case is the popup component.
event.cancel();
}
The values are set on the source component, as shown in Example 5–6. For more
information about setting components on the JSF page, see Section 5.3.5, "How to
Trigger Event Handler Execution."
Using attributes in this way allows you to reuse the script across different components,
as long as they all trigger the same event.
5-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript for ADF Faces Client Events
event.cancel();
}
Canceling an event may also block some default processing. For example, canceling an
AdfUIInputEvent event for a context menu will block the browser from showing a
context menu in response to that event.
The cancel() function call will be ignored if the event cannot be canceled, which an
event indicates by returning false from the isCancelable() function (events that
cannot be canceled show "no" in the Is Cancelable column in Table 5–3). This generally
means that the event is a notification that an outcome has already completed, and
cannot be blocked. There is also no way to uncancel an event once it has been
canceled.
4. Add any attributes required by the function by dragging a Client Attribute from
the Operations panel of the Component Palette, and dropping it as a child to the
selected component. Enter the name and value for the attribute in the Property
Inspector. Example 5–10 shows the code used to set attribute values for the
showAboutFileExplorerPopup function.
5-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript for ADF Faces Client Events
The event queue is a First-In-First-Out queue. For the event queue to empty, the page
takes each event object and delivers it to a broadcast() function on the event source.
This loop continues until the queue is empty. It is completely legitimate (and common)
for broadcasting an event to indirectly lead to queueing a new, derived event. That
derived event will be broadcast in the same loop.
When an event is broadcast to a component, the component does the following:
1. Delivers the event to the peer's DispatchComponentEvent method.
2. Delivers the event to any listeners registered for that event type.
3. Checks if the event should be bubbled, and if so initiates bubbling. Most events do
bubble. Exceptions include property change events (which are not queued, and do
not participate in this process at all) and, for efficiency, mouse move events.
While an event is bubbling, it is delivered to the AdfUIComponent
HandleBubbledEvent function, which offers up the event to the peer's
DispatchComponentEvent function. Note that client event listeners do not
receive the event, only the peers do.
Event bubbling can be blocked by calling an event's stopBubbling() function,
after which the isBubblingStopped() function will return true, and bubbling
will not continue. As with cancelling, you cannot undo this call.
Note: Canceling an event does not stop bubbling. If you want to both
cancel an event and stop it from bubbling, you must call both
functions.
4. If none of the prior work has canceled the event, calls the
AdfUIComponent.HandleEvent method, which adds the event to the server
event queue, if the event requests it.
5.3.7 What You May Need to Know About Using Naming Containers
Several components in ADF Faces are NamingContainer components, such as
pageTemplate, subform, table, and tree. When working with client-side API and
events in pages that contain NamingContainer components, you should use the
findComponent() method on the source component.
For example, because all components in any page within the File Explorer application
eventually reside inside a pageTemplate component, any JavaScript function must
use the getSource() and findComponent() methods, as shown in Example 5–11.
The getSource() method accesses the AdfUIComponent class, which can then be
used to find the component.
When you use the findComponent() method, the search starts locally at the
component where the method is invoked. For more information about working with
naming containers, see Section 3.5, "Locating a Client Component on a Page."
The JavaScript contains the AdfCustomEvent.queue method that takes the event
source, the string enterPressedOnSearch as the custom event type, a null
parameter map, and False for the immediate parameter.
The inputText component on the page also contains the following
serverListener tag:
<af:serverListener type="enterPressedOnSearch"
method="#{explorer.navigatorManager.
searchNavigator.searchOnEnter}"/>
Because the type value enterPressedOnSearch is the same as the value of the
parameter in the AdfCustomEvent.queue method in the JavaScript, the method that
5-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Sending Custom Events from the Client to the Server
5.4.1 How to Send Custom Events from the Client to the Server
To send a custom event from the client to the server, fire the client event using a
custom event type, write the server listener method on a backing bean, and have this
method process the custom event. Next, register the server listener with the
component.
2. Create the server listener method on a managed bean. This method must be public
and take an oracle.adf.view.rich.render.ClientEvent object and return
a void type. Example 5–14 shows the code used in the SearchNavigatorView
managed bean that simply calls another method to execute the search and then
refreshes the navigator.
Note: On the component that will fire the custom client event, the
clientComponent attribute must be set to true to ensure that a
client-side generated component is available.
4. In the Insert Client Listener dialog, enter the method and type for the JavaScript
function. Be sure to include a library name if the script is not included on the page.
The type can be any string used to identify the custom event, for example,
enterPressedOnSearch was used in the File Explorer.
5. Register the server listener by dragging a Server Listener from the Operations
panel of the Component Palette, and dropping it as a sibling to the
clientListener tag.
6. In the Insert Server Listener dialog, enter the string used as the Type value for the
client listener, as the value for this server listener, for example
enterPressedOnSearch.
In the Property Inspector, for the method attribute, enter an expression that
resolves to the method created in Step 2.
5.4.2 What Happens at Runtime: How Client and Server Listeners Work Together
At runtime, when the user initiates the event, for example, pressing the Enter key, the
client listener script executes. This script calls the AdfCustomEvent.queue()
method, and a custom event of the specified event type is queued on the input
component. The server listener registered on the input component receives the custom
event, and the associated bean method executes.
5.4.3 What You May Need to Know About Marshalling and Unmarshalling Data
Marshalling and unmarshalling is the process of converting data objects of a
programming language into a byte stream and back into data objects that are native to
the same or a different programming language. In ADF Faces, marshalling and
unmarshalling refer to transformation of data into a suitable format so that it can be
optimally exchanged between JavaScript on the client end and Java on the server end.
When the client is browser-based, the two common strategies for marshalling are
JavaScript Object Notation (JSON) and XML. ADF Faces uses a mix of both of these
strategies, with the information sent from the server to the client mostly as JSON and
information sent from the client to the server as XML (for more information about
JSON, see http://www.json.org).
When you send information from JavaScript to Java, the JavaScript data objects are
converted (marshalled) into XML, which is then parsed back or unmarshalled into
5-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Sending Custom Events from the Client to the Server
Java objects at the server-side. For example, consider a JSF page that has a
commandButton component whose ID is cmd. When a user clicks the
commandButton component, the client must communicate to the server that an
actionEvent has been fired by this specific commandButton. In the
requestParameter map, the information is mapped with the key using the format
event + . + id where id is the ID of the component. So the requestParameter
map key for the commandComponent would be the XML string stored as the value of
the key event.cmd.
The XML fragment after marshalling in this example would be:
<m xmlns="http:/oracle.com/richClient/comm"><k v="type"><s>action</s></k></m>
The m in the example means that this should be unmarshalled into a map. The k
denotes the key and the value is of type String. On the server side, this XML
fragment is parsed into a java.util.Map of one entry having type
(java.lang.String) as the key and action (java.lang.String) as the value.
The unmarshalled information is grouped per client ID, stored in the request map, and
used when the components are being decoded. So in this example, when the
commandButton is decoded, it will check for the presence of any client events using
its client ID (event.cmd) and then queue an action event if one is found (the decode
behavior is implemented in the renderer hierarchy for commandButton component).
Table 5–5 shows the mapping between corresponding JavaScript and Java types.
Marshalling from Java to JavaScript happens mostly through JSON. This type of
marshalling is straightforward as JSON is the object literal notation in JavaScript. The
client-components usually have their properties encoded in JSON. Consider the
following example:
new AdfRichCommandButton(’demoTemplate:richComand’
{’partialSubmit’:true,’useWindow’:false})
The envelope is a JavaScript Array with only one object, which describes the message.
This message contains information about the type of change, the actual value of the
data, and so on, that is then used by the client-side table peer to update the table itself.
Table 5–6 shows the mapping between corresponding Java and JavaScript types.
Note that there could be some loss of information during the conversion process. For
example, say you are using the following custom event to send the number 1 and the
String test, as shown in the following example:
AdfCustomEvent.queue(event.getSource(), "something", {first:1, second:"test"});
In the server-side listener, the type of the first parameter would become a
java.lang.Double because numbers are converted to Doubles when going from
JavaScript to Java. However, it might be that the parameter started on the server side
as an int, and was converted to a number when conversion from Java to JavaScript
took place. Now on its return trip to the server, it will be converted to a Double.
5-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Executing a Script Within an Event Response
if (selectedPath != null)
{
TreeModel model =
_feBean.getNavigatorManager().getFoldersNavigator().getFoldersTreeModel();
Object oldRowKey = model.getRowKey();
try
{
model.setRowKey(selectedPath);
Object parentRowKey = model.getContainerRowKey();
if (parentRowKey != null)
{
folderTree.getSelectedRowKeys().clear();
folderTree.getSelectedRowKeys().add(parentRowKey);
// This is an example of how to force a single attribute
// to rerender. The method assumes that the client has an optimized
// setter for "selectedRowKeys" of tree.
FacesContext context = FacesContext.getCurrentInstance();
ExtendedRenderKitService erks =
Service.getRenderKitService(context,
ExtendedRenderKitService.class);
String clientRowKey = folderTree.getClientRowKeyManager().
getClientRowKey(context, folderTree, parentRowKey);
String clientId = folderTree.getClientId(context);
StringBuilder builder = new StringBuilder();
builder.append("AdfPage.PAGE.findComponent('");
builder.append(clientId);
builder.append("').setSelectedRowKeys({'");
builder.append(clientRowKey);
builder.append("':true});");
erks.addScript(context, builder.toString());
}
}
finally
{
model.setRowKey(oldRowKey);
}
// Only really needed if using server-side rerendering
// of the tree selection, but performing it here saves
// a roundtrip (just one, to fetch the table data, instead
// of one to process the selection event only after which
// the table data gets fetched!)
_feBean.getNavigatorManager().getFoldersNavigator().openSelectedFolder();
}
5-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Client Behavior Tags
You can also configure the tag to have focus switched to the component to which the
user has scrolled.
5-22 Web User Interface Developer's Guide for Oracle Application Development Framework
6
Validating and Converting Input
6
This chapter describes how to add conversion and validation capabilities to ADF Faces
input components in your application. It also describes how to handle and display any
errors, including those not caused by validation.
This chapter includes the following sections:
■ Section 6.1, "Introduction to ADF Faces Converters and Validators"
■ Section 6.2, "Conversion, Validation, and the JSF Lifecycle"
■ Section 6.3, "Adding Conversion"
■ Section 6.4, "Creating Custom JSF Converters"
■ Section 6.5, "Adding Validation"
■ Section 6.6, "Creating Custom JSF Validation"
6-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Conversion
■ LongConverter
■ NumberConverter
■ ShortConverter
Table 6–1 shows the converters provided by ADF Faces.
As with validators, the ADF Faces converters are also run on the client side.
if no converter is explicitly added, ADF Faces will attempt to create a converter based
on the data type. Therefore, if the value is bound to any of the following types, you do
not need to explicitly add a converter:
■ java.util.Date
■ java.util.Color
■ java.awt.Color
■ java.lang.Number
■ java.lang.Integer
■ java.lang.Long
■ java.lang.Short
■ java.lang.Byte
■ java.lang.Float
■ java.lang.Double
Unlike the converters listed in Table 6–1, the JavaScript-enabled converters are applied
by type and used instead of the standard ones, overriding the class and id
attributes. They do not have associated tags that can be nested in the component.
2. In the context menu, choose Insert inside <UI component>, then ADF Faces to
insert an ADF Faces converter, or JSF Core to insert a JSF converter.
3. Choose a converter tag (for example, ConvertDateTime).
4. In the Property Inspector, set values for the attributes, including any messages for
conversion errors. For additional help, right-click any of the attributes and choose
Help.
You can set multiple patterns for some ADF Faces converters. For more
information, see Section 6.3.2, "How to Set Attributes on a Converter".
ADF Faces lets you customize the detail portion of a conversion error message. By
setting a value for a MessageDetailxyz attribute, where xyz is the conversion error
type (for example, MessageDetailconvertDate), ADF Faces displays the
custom message instead of a default message, if conversion fails. For more
information about creating messages, see Chapter 17, "Displaying Tips, Messages,
and Help."
Example 6–3 illustrates an af:convertNumber tag with the type attribute set to
currency to accepts "$78.57" and "$078.57" as values for conversion.
6-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Custom JSF Converters
the required object type. When there is not an attached converter and if the component
is bound to a bean property in the model, then ADF checks the model's data type and
attempts to find the appropriate converter. If conversion fails, the component’s value
attribute is set to false and JSF adds an error message to a queue that is maintained
by FacesContext. If conversion is successful and there are validators attached to the
component, the converted value is passed to the validators. If no validators are
attached to the component, the converted value is stored as a local value that is later
used to update the model.
For more information about these classes, refer to the Javadoc or visit
http://java.sun.com/.
2. Add the needed conversion logic. This logic should use
javax.faces.convert.ConverterException to throw the appropriate
exceptions and javax.faces.application.FacesMessage to generate the
corresponding error messages. For more information about the Converter
interface and the FacesMessage error handlers, see the Javadoc for
javax.faces.convert.ConverterException and
javax.faces.application.FacesMessage, or visit
http://java.sun.com/.
3. If your application saves state on the client, your custom converter must
implement the Serializable interface or the StateHolder interface, and the
saveState(FacesContext) and restoreState(FacesContext, Object)
methods of the StateHolder interface. For more information, see the Javadoc for
the StateHolder interface of javax.faces.component package.
4. Register the converter in the faces-config.xml file.
■ Open the faces-config.xml file and select the Overview tab in the editor
window. The faces-config.xml file is located in the <View_
Project>/WEB-INF directory in the JDeveloper Application Navigator.
■ In the window, select Converters and click New. Click Help or press F1 for
additional help in registering the converter.
/**
* Convert the specified string value into a model data object
* which can be passed to validators
* @param value String value to be converted
* @param label label to identify the editableValueHolder to the user
* @return the converted value or undefined in case of no converter mechanism is
* available (see TrNumberConverter).
*/
TrConverter.prototype.getAsObject = function(value, label){}
6-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Custom JSF Converters
// CONVERTER INTERFACE
public Object getAsObject(FacesContext context, UIComponent component,
String value)
{
// convert to object
You must also create a JavaScript implementation of the custom converter for the
client, as shown in Example 6–8.
/**
* constructor of client side SimpleNumberConverter class
*/
function SimpleNumberConverter(isInteger)
{
this._isInteger = isInteger;
}
SimpleNumberConverter.prototype.getAsString = function(number,label)
{
// convert to string
}
SimpleNumberConverter.prototype.getAsObject = function(numberString,label)
{
6-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Validation
// convert to object
}
On the view layer use ADF Faces validation when you want client-side validation. All
validators provided by ADF Faces have a client-side peer. Many components have
attributes that provide validation. For information, see Section 6.5.1.2, "Using
Validation Attributes." In addition, ADF Faces provides separate validation classes
that can be run on both the client and the server. For details, see Section 6.5.1.3, "Using
ADF Faces Validators." You can also create your own validators. For information about
custom validators, see Section 6.6.3, "How to Create a Custom JSF Validator."
6-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Validation
validate() method. If the value is empty, the required attribute of the component
is checked and an error message is generated if indicated. If the submitted value is
non-null, the validation process continues and all validators on the component are
called in order of their declaration.
ADF Faces validation is performed during the Process Validations phase. If any errors
are encountered, the components are invalidated and the associated messages are
added to the queue in the FacesContext instance. Once all validation is run on the
components, control passes to the model layer, which runs the Validate Model
Updates phase. As with the Process Validations phase, if any errors are encountered,
the components are invalidated and the associated messages are added to the queue in
the FacesContext instance.
The lifecycle then goes to the Render Response phase and redisplays the current page.
ADF Faces automatically displays an error icon next to the label of any input
component that generated an error, and displays the associated messages in a popup
window unless the af:message component inline attribute is set to true.
Figure 6–2 shows a server-side validation error.
6-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Custom JSF Validation
If you want to create logic that will be reused by various pages within the application,
or if you want the validation to be able to run on the client side, you should create a
JSF validator class. You can then create an ADF Faces version, which will allow the
validator to run on the client.
2. In the visual editor, double-click the component to open the Bind Validator
Property dialog.
3. In the Bind Validator Property dialog, enter or select the managed bean that will
hold the validation method, or click New to create a new managed bean. Use the
default method signature provided or select an existing method if the logic already
exists.
When you click OK in the dialog, JDeveloper adds a skeleton method to the code
and opens the bean in the source editor.
4. Add the required validation logic. This logic should use the
javax.faces.validator.ValidatorException exception to throw the
appropriate exceptions and the javax.faces.application.FacesMessage
error message to generate the corresponding error messages. For more information
about the Validator interface and FacesMessage, see the Javadoc for
javax.faces.validator.ValidatorException and
javax.faces.application.FacesMessage, or visit
http://java.sun.com/.
6.6.2 What Happens When You Create a Backing Bean Validation Method
When you create a validation method, JDeveloper adds a skeleton method to the
managed bean you selected. Example 6–9 shows the code JDeveloper generates.
When the form containing the input component is submitted, the method to which the
validator attribute is bound is executed.
that JavaScript is used on the client. JavaScript validator objects can throw
ValidatorExceptions exceptions and they support the validate() method.
6-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Custom JSF Validation
{
return ("new SSNValidator('Invalid social security number.','Value \"{1}\"
must start with \"123\".')");
}
The Java validator calls the JavaScript validator shown in Example 6–11.
6-16 Web User Interface Developer's Guide for Oracle Application Development Framework
7
7 Rerendering Partial Page Content
This chapter describes how to use the partial page render features provided with
ADF Faces components to rerender areas of a page without rerendering the whole
page.
This chapter includes the following sections:
■ Section 7.1, "Introduction to Partial Page Rendering"
■ Section 7.2, "Enabling Partial Page Rendering Declaratively"
■ Section 7.3, "Enabling Partial Page Rendering Programmatically"
■ Section 7.4, "Using Partial Page Navigation"
Tip: If your application uses the Fusion technology stack, you can
enable the automatic partial page rendering feature on any page. This
causes any components whose values change as a result of backend
business logic to be automatically rerendered. For more information,
see the "What You May Need to Know About Automatic Partial Page
Rendering" section of the Oracle Fusion Middleware Fusion Developer's
Guide for Oracle Application Development Framework.
Additionally, ADF Faces applications can use PPR for navigation. In standard JSF
applications, the navigation from one page to the next requires the new page to be
rendered. When using AJAX-like components, this can cause overhead because of the
time needed to download the different JavaScript libraries and style sheets. To avoid
this costly overhead, the ADF Faces architecture can optionally simulate full-page
transitions while actually remaining on a single page, thereby avoiding the need to
reload JavaScript code and skin styles.
Note: The browser must have JavaScript enabled for PPR to work.
7-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Enabling Partial Page Rendering Declaratively
Trigger components must inform the framework that a PPR request has occurred. On
command components, this is achieved by setting the partialSubmit attribute to
true. Doing this causes the command component to fire a partial page request each
time it is clicked.
For example, say a page includes an inputText component, a commandButton
component, and an outputText component. When the user enters a value for the
inputText component, and then clicks the commandButton component, the input
value is reflected in the outputText component. You would set the partialSubmit
attribute to true on the commandButton component.
However, components other than command components can trigger PPR. ADF Faces
input and select components have the ability to trigger partial page requests
automatically whenever their values change. To make use of this functionality, use the
autoSubmit attribute of the input or select component so that as soon as a value is
entered, a submit occurs, which in turn causes a valueChangeEvent event to occur.
It is this event that notifies the framework to execute a PPR, as long as a target
component is set. In the previous example, you could delete the commandButton
component and instead set the inputText component’s autoSubmit attribute to
true. Each time the value changes, a PPR request will be fired.
7-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Enabling Partial Page Rendering Declaratively
Note: Set the autoSubmit attribute to true only if you want the
component to submit its value. If you do not want to submit the value,
then some other logic must cause the component to issue a
ValueChangeEvent event. That event will cause PPR by default and
any component that has the trigger component as its value for the
partialTriggers attribute will be rerendered.
2. In the Structure window, select the target component that you want to rerender
when a PPR-triggering event takes place.
3. Expand the Behavior section of the Property Inspector, click the dropdown menu
for the partialTriggers attribute and choose Edit.
4. In the Edit Property dialog, shuttle the trigger component to the Selected panel
and click OK. If the trigger component is within a naming container, JDeveloper
automatically creates the relative path for you.
Example 7–1 Code for Enabling Partial Page Rendering Through a Partial Submit
<af:commandLink id="deleteFromCart" partialSubmit="true"
actionListener="#{homeBean...}">
Example 7–2 shows an outputText component that will be rerendered when the
command link with ID deleteFromCart in Example 7–1 is clicked.
Example 7–2 Code for Partial Page Rendering Triggered by Another Component
<af:outputText id="estimatedTotalInPopup"
partialTriggers="deleteFromCart"
value="#{shoppingCartBean...}"/>
Tip: You can use PPR to prevent components from being validated
on a page. For more information, see Section 4.3, "Using the
Optimized Lifecycle."
7.2.2 What You May Need to Know About Using the Browser Back Button
In an ADF Faces application, because some components use PPR (either implicitly or
because they have been configured to listen for a partial trigger), what happens when
a user clicks the browser’s back button is slightly different than in an application that
uses simple JSF components.
In an application that uses simple JSF components, when the user clicks the browser’s
back button, the browser returns the page to the state of the DOM (document object
model) as it was when last rendered, but the state of the JavaScript is as it was when
the user first entered the page.
For example, suppose a user visited PageA. After the user interacts with components
on the page, say a PPR event took place using JavaScript. Let’s call this new version of
the page PageA1. Next, say the user navigates to PageB, then clicks the browser back
button to return to PageA. The user will be shown the DOM as it was on PageA1, but
the JavaScript will not have run, and therefore parts of the page will be as they were
for PageA. This might mean that changes to the page will be lost. Refreshing the page
will run the JavaScript and so return the user to the state it was in PageA1. In an
application that uses ADF Faces, the refresh is not needed; the framework provides
built-in support so that the JavaScript is run when the back button is clicked.
7.2.3 What You May Need to Know About PPR and Screen Readers
Screen readers do not reread the full page in a partial page request. PPR causes the
screen reader to read the page starting from the component that fired the partial page
request. You should place the target components after the component that triggers the
partial request; otherwise, the screen reader would not read the updated target
components.
7-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Partial Page Navigation
2. In the JSF page, select the target component. In the Property Inspector, enter a
component ID and set ClientComponent to true.
3. In the Property Inspector, find the listener for the event that will cause the refresh
and bind it to the listener method created in Step 1.
Note: If you set the parameter to on, then you need to set the
partialSubmit attribute to true for any command components
involved in navigation.
event be sent over PPR channel, use this option to easily enable partial page
navigation.
When partial page navigation is used, normally only the visual contents of the
page are rerendered (the header content remains constant for all pages).
However, the entire document will be rerendered when an action on the page
is defined to use full page submit and also when an action does not result in
navigation.
7-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Part III
Part III Using ADF Faces Components
This chapter describes how to use several of the ADF Faces layout components to
organize content on web pages.
This chapter includes the following sections:
■ Section 8.1, "Introduction to Organizing Content on Web Pages"
■ Section 8.2, "Starting to Lay Out a Page"
■ Section 8.3, "Arranging Contents to Stretch Across a Page"
■ Section 8.4, "Using Splitters to Create Resizable Panes"
■ Section 8.5, "Arranging Page Contents in Predefined Fixed Areas"
■ Section 8.6, "Arranging Content in Forms"
■ Section 8.7, "Arranging Contents in a Dashboard"
■ Section 8.8, "Displaying and Hiding Contents Dynamically"
■ Section 8.9, "Displaying or Hiding Contents in Accordion Panels and Tabbed
Panels"
■ Section 8.10, "Displaying Items in a Static Box"
■ Section 8.11, "Displaying a Bulleted List in One or More Columns"
■ Section 8.12, "Grouping Related Items"
■ Section 8.13, "Separating Content Using Blank Space or Lines"
Tip: You can create page templates that allow you to design the
layout of all pages in your application just once. The templates can
then be reused by the pages in your application. For more
information, see Chapter 19, "Creating and Reusing Fragments, Page
Templates, and Components."
In addition to layout components that simply act as containers, ADF Faces also
provides interactive layout components that can display or hide their content, or that
provide sections, lists, or empty space. Some layout components also provide
geometry management functionality, such as stretching their contents to fit the
browser windows as the window is resized, or the capability to be stretched when
placed inside a component that stretches. For more information about stretching and
other geometry management functionality of layout components, see Section 8.2.1,
"Geometry Management and Component Stretching." Table 8–1 briefly describes each
of the ADF Faces layout components.
8-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Organizing Content on Web Pages
8-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Starting to Lay Out a Page
All JSF pages that use ADF Faces components must have the document tag enclosed
within a view tag, as shown in the following example:
<f:view>
<af:document/>
</f:view>
All other components that make up the page then go in between <af:document> and
</af:document>. The document tag is responsible for rendering the browser title
text, as well as the invisible page infrastructure that allows other components in the
page to be displayed. At runtime, the document tag creates the root elements for the
client page. For example in HTML output, the standard root elements of an HTML
page, namely, <html>, <head>, and <body>, are generated.
By default, the document tag is configured to allow capable components to stretch to
fill available browser space. You can further configure the tag to allow a specific
component to have focus when the page is rendered, or to provide messages for failed
connections or warnings about navigating before data is submitted. For more
information, see Section 8.2.5, "How to Configure the document Tag."
Typically, the next component used is the ADF Faces form component. This
component creates an HTML form element that can contain controls that allow a user
to interact with the data on the page.
Note: Even though you can have multiple HTML forms on a page,
you should have only a single ADF Faces form tag per page.
JDeveloper automatically inserts the view, document, and form tags for you, as
shown in Example 8–1. For more information, see Section 2.4, "Creating a View Page."
8-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Starting to Lay Out a Page
By default, if there is only a single effective visual root component, that root
component will stretch automatically to consume the browser's viewable area,
provided that component supports geometry management and therefore can stretch its
child components. Examples of geometry management components are
panelStretchLayout and panelSplitter.
When the user resizes the browser window, and when there is a single maximized root
visual component inside of the document component, that visual root component will
also resize along with the browser window. If the root component supports stretching
its child components (and they in turn support being stretched), the size of the child
components will also recompute, and so on down the component hierarchy until a
flowing layout area is reached; that is, an area that does not support stretching of its
child components. You do not have to write any code to enable the stretching.
As shown in Table 8–1, the panelStretchLayout, panelSplitter, and
panelDashboard components are the only components that can be stretched and can
also stretch their child components. Additionally, when the showDetailItem
component is used as a direct child of the panelAccordion or panelTabbed
component, the contents in the showDetailItem component can be stretched.
Therefore, the panelStretchLayout, panelSplitter, panelDashboard,
panelAccordion with a showDetailItem component, and a panelTabbed with a
showDetailItem component, are the components you should use as root
components when you want to make the contents of the page fill the browser window.
For example, Figure 8–1 shows a table placed in the center facet of the
panelStretchLayout component. The table displays all its rows and columns.
When the entire table does not fit in the browser window, scrollbars are added in the
data body section of the table.
Figure 8–2 shows the same table, but nested inside a panelGroupLayout component,
which cannot stretch its child components (for clarity, a dotted red outline has been
placed around the panelGroupLayout component). The table component displays
only a certain number of columns and rows, determined by properties on the table.
Figure 8–2 Table Inside a Component That Does Not Stretch Its Child Components
8-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Starting to Lay Out a Page
As shown in Figure 8–4, when the page is run, the panelCollection and table
components in the panelGroupLayout do not stretch, while the ones directly in the
panelSplitter component do stretch.
8-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Starting to Lay Out a Page
Because the panelStretchLayout component can stretch its child components, and
because the panelSplitter component can be stretched, both stretch to fill up
available browser space. Because panelSplitter component can stretch its child
components and because on the left, panelGroupLayout component with its
layout attribute set to scroll can be stretched, and on the right, the
panelCollection component can be stretched, both of those stretch to fill up
available browser space. However, the panelGroupLayout component cannot
stretch its child components, while the panelCollection component can stretch a
single table. Therefore, the panelCollection component on the left does not stretch,
even though its parent does.
Now suppose on the left, instead of a table component, you want to add a
panelList component. You would not need the panelCollection component, so
you might also think you would not need to use the panelGroupLayout component
to group the panelList component with another component. However, because the
panelList component would then be a direct child of the panelSplitter
component, and because the panelSplitter component stretches its child
components and the panelList component cannot be stretched, you would need to
keep the panelGroupLayout (set to scroll) and place the panelList component
as a child to the panelGroupLayout component.
This way, the panelSplitter component can stretch the panelGroupLayout
component, but the panelGroupLayout component will not try to stretch the
panelList component. Because the panelGroupLayout component can be
stretched, but does not stretch its child components, it allows the transition between a
layout that stretches and one that flows.
Along with adding layout components, you can also choose to apply a theme to the
chosen quick layout. These themes add color styling to some of the components used
in the quick start layout. To see the color and where it is added, see Appendix D,
"Quick Start Layout Themes." For more information about themes, see Section 20.3.4,
"How to Apply Themes to Components."
In addition to saving time, when you use the quick layouts, you can be sure that
layout components are used together correctly to achieve the desired outcome. For
more information about creating pages using the quick layouts, see Section 2.4,
"Creating a View Page."
However, if you wish to create your layout yourself, follow these tips for creating a
layout that includes both stretched and flowing components:
■ Place the page contents inside a root component that performs geometry
management, either panelStretchLayout, panelSplitter,
panelAccordion with a showDetailItem, or panelTabbed with a
showDetailItem.
8-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Starting to Lay Out a Page
■ Never specify a height value with percent units. Instead, build a component
structure out of components that support being stretched and that stretch their
child components.
■ Inside this stretchable structure, create islands of nonstretched or flowing
components, for example by using the panelGroupLayout component with the
layout attribute set to scroll. This component will provide the transition
between stretched and flowing components because it supports being stretched
but will not stretch its child components.
■ Never try to stretch something vertically inside a nonstretched or flowing
container because it will not act consistently across web browsers.
■ For components contained in a parent flowing component (that is, a component
that does not stretch its children), do not set widths greater than 95%. If you do,
you may get unexpected results.
■ If the parent component is 768 pixels or greater, set the styleClass attribute
on the component to be stretched to AFStretchWidth. This style will stretch
the component to what appears to be 100% of the parent container, taking into
account different browsers and any padding or borders on the parent.
■ If the parent component is 768 pixels or less, set the styleClass attribute on
the component to be stretched to AFAuxiliaryStretchWidth. This style
will stretch the component to what appears to be 100% of the parent container,
taking into account different browsers and any padding or borders on the
parent.
Note: The two different styles are needed due to how Microsoft
Internet Explorer 7 computes widths inside scrolling containers (this
has been resolved in Internet Explorer 8). Unless you can control the
version of browser used to access your application, you should use
these styles as described.
2. In the Property Inspector, expand the Common section and set the following:
■ InitialFocusId: Use the dropdown menu to choose Edit. In the Edit Property
dialog, select the component that should have focus when the page first
renders.
Because this focus happens on the client, the component you select must have
a corresponding client component. For more information, see Section 3.4,
"Instantiating Client-Side Components."
■ Maximized: Set to true if you want the root component to expand to fit all
available browser space. When the document tag’s maximized attribute is
set to true, the framework searches for a single visual root component, and
stretches that component to consume the browser's viewable area, provided
that the component can be stretched. Examples of components that support
this are panelStretchLayout and panelSplitter. The document tag’s
maximized attribute is set to true by default. For more information, see
Section 8.2.1, "Geometry Management and Component Stretching."
■ Title: Enter the text that should be displayed in the title bar of the browser.
3. Expand the Appearance section and for the FailedConnectionText attribute, enter
the text you want to be displayed if a connection cannot be made to the server.
4. Expand the Other section and for the UncommitedDataWarning attribute, select
one of the following:
■ on: When the application detects that data has not been committed, a warning
message will be displayed to the user. This can happen because either the user
attempts to leave the page without committing data or there is uncommitted
data on the server.
■ off: No message will be displayed. This is the default.
8-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Contents to Stretch Across a Page
Note: Figure 8–6 shows the facets when the language reading
direction of the application is configured to be left-to-right. If instead
the language direction is right-to-left, the start and end facets are
switched.
When you set the height of the top and bottom facets, any contained components are
stretched up to fit the height. Similarly, when you set the width of the start and end
facets, any components contained in those facets are stretched to that width. If no
components are placed in the facets, then that facet does not render. That is, that facet
will not take up any space. If you want that facet to take up the set space but remain
blank, insert a spacer component. See Section 8.13, "Separating Content Using Blank
Space or Lines." Child Components components in the center facet are then stretched
to fill up any remaining space. For more information about component stretching, see
Section 8.2.1, "Geometry Management and Component Stretching."
Instead of setting the height of the top or bottom facet, or width of the start or end
facet to a dimension, you can set the height or width to auto. This allows the facet to
size itself to use exactly the space required by the child components of the facet. Space
will be allocated based on what the web browser determines is the required amount of
space to display the facet content.
the value to 30. Therefore, when the File Explorer application renders, the contents in
the panelStretchLayout component begin 30 pixels from the bottom of the page.
Note: If you set a facet to use auto as a value for the width or height
of that facet, the child component must use a stable, standalone width
that is not dependent upon the width of the facet.
For example, you should not use auto on a facet whose child
component can stretch their children automatically. These components
have their own built-in stretched widths by default which will then
cause them to report an unstable offsetWidth, which is used by the
browser to determine the amount of space.
Additionally, you should not use auto in conjunction with a child
component that uses a percentage length for its width. The facet
content cannot rely on percentage widths or be any component that
would naturally consume the entire width of its surrounding
container.
When there are child components in the top, bottom, start, and end facets,
these components occupy space that is defined by the topHeight,
bottomHeight, startWidth, and endWidth attributes. For example,
topHeight attribute specifies the height of the top facet, and startWidth
attribute specifies the width of the start facet. Child components in top and
bottom facets are stretched up to the height set by topHeight and
bottomHeight attributes, respectively, and child components in start and end
facets are stretched up to the width set by startWidth and endWidth attributes,
respectively. Instead of setting a numeric dimension, you can set the topHeight,
bottomHeight, startWidth and endWidth attributes to auto and the browser
will determine the amount of space required to display the content in the facets.
If you do not explicitly specify a value, by default, the value for the topHeight,
bottomHeight, startWidth, and endWidth attributes is 50 pixels each. The
widths of the top and bottom facets, and the heights of the start and end facets
are derived from the width and height of the parent component of
panelStretchLayout.
8-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Contents to Stretch Across a Page
3. To place content in the component, drag and drop the desired component into any
of the facets. If you want the child component to stretch, it must be a component
that supports being stretched. See Section 8.3.2, "What You May Need to Know
About Geometry Management and the panelStretchLayout Component," for more
details.
Because facets accept one child only, if you want to add more than one child
component, wrap the child components inside a container component, for
example, a panelGroupLayout component. This component must also be able to
be stretched in order for all contained components to stretch.
8.3.2 What You May Need to Know About Geometry Management and the
panelStretchLayout Component
The panelStretchLayout component can stretch its child components and it can
also be stretched. The following components can be stretched inside the facets of the
panelStretchLayout component:
■ decorativeBox
■ panelAccordion
■ panelBox
■ panelCollection
■ panelDashboard
■ panelGroupLayout (only with the layout attribute set to scroll or
vertical)
■ panelSplitter
■ panelStretchLayout
■ panelTabbed
■ region
■ table
■ tree
■ treeTable
The following components cannot be stretched when placed inside a facet of the
panelStretchLayout component:
■ panelBorderLayout
■ panelFormLayout
■ panelGroupLayout (only with the layout attribute set to default or
horizontal)
■ panelHeader
■ panelLabelAndMessage
■ panelList
■ showDetail
■ showDetailHeader
■ tableLayout (MyFaces Trinidad component)
You cannot place components that cannot stretch into facets of a component that
stretches its child components. Therefore, if you need to place a component that cannot
be stretched into a facet of the panelStretchLayout component, wrap that
component in a transition component that can stretch.
For example, if you want to place content in a panelBox component (which does not
stretch) within a facet of the panelStretchLayout component, you could place a
panelGroupLayout component with its layout attribute set to scroll in a facet of
the panelStretchLayout component, and then place the panelBox component in
that panelGroupLayout component. For more information, see Section 8.2.2,
"Nesting Components Inside Components That Allow Stretching."
The panelSplitter component lets you organize contents into two panes separated
by an adjustable splitter. The panes can either line up on a horizontal line (as does the
splitter shown in Figure 8–7) or on a vertical line. The File Explorer application uses
8-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Splitters to Create Resizable Panes
Clicking the arrow button on a splitter collapses the panel that holds the header
contents, and the logo and name are no longer shown, as shown in Figure 8–9.
You place components inside the facets of the panelSplitter component. The
panelSplitter component uses geometry management to stretch its child
components at runtime. This means when the user collapses one panel, the contents in
the other panel are explicitly resized to fill up available space.
If the positionedFromEnd attribute is set to true, then ADF Faces measures the
initial position of the splitter from the end (or bottom panel, depending on the
8-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Splitters to Create Resizable Panes
orientation value). Figure 8–11 shows the position of the splitter measured 200
pixels from the end panel.
7. To create more than two panes, insert another Panel Splitter component into a
facet to create nested splitter panes (as shown in Figure 8–12).
Example 8–3 shows the code generated by JDeveloper when you nest splitter
components.
8. If you want to perform some operation when users collapse or expand a panel,
attach a client-side JavaScript using the clientListener tag for the collapsed
attribute and a propertyChange event type. For more information about
client-side events, see Chapter 5, "Handling Events."
8.4.2 What You May Need to Know About Geometry Management and the panelSplitter
Component
The panelSplitter component can stretch its child components and it can also be
stretched. The following components can be stretched inside the first or second
facet of the panelSplitter component:
■ decorativeBox
■ panelAccordion
■ panelBox
■ panelCollection
■ panelDashboard
8-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Page Contents in Predefined Fixed Areas
8-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Content in Forms
■ innerBottom: Renders child components below the center area but above the
bottom facet child components.
■ innerLeft: Renders child components similar to the left facet, but renders
between the innerTop and innerBottom facets, and between the left facet
and the center area.
■ innerRight: Renders child components similar to the right facet, but renders
between the innerTop facet and the innerBottom facet, and between the right
facet and the center area.
■ innerStart: Renders child components similar to the innerLeft facet, if the
reading direction is left-to-right. Renders child components similar to the
innerRight facet, if the reading direction is right-to-left.
■ innerEnd: Renders child components similar to the innerRight facet, if the
reading direction is left-to-right. Renders child components similar to the
innerLeft facet, if the reading direction is right-to-left.
The panelBorderLayout component does not support stretching its child
components, nor does it stretch when placed in a component that stretches its child
components. Therefore, the size of each facet is determined by the size of the
component it contains. If instead you want the contents to stretch to fill the browser
window, consider using the panelStretchLayout component instead. For more
information, see Section 8.3, "Arranging Contents to Stretch Across a Page."
There is no restriction to the number of panelBorderLayout components you can
have on a JSF page.
Figure 8–15 shows the same page with the component configured to display the labels
above the fields.
You can configure the panelFormLayout component to display the fields with their
labels in one or more columns. Each field in the form is a child component of the
panelFormLayout component. You set the desired number of rows, and if there are
more child components than rows, the remaining child components are placed in a
new column. For example, if there are 25 child components, and you set the
component to display 15 rows, the last 10 components will be displayed in a second
column.
However, the number of rows displayed in each is not solely determined by the
configured number of rows. By default, the panelFormLayout component is set to
render no more than three columns (two for PDA applications). This value is what
actually determines the number of rows. For example, if you have 25 child
components and you set the component to display 5 rows and you leave the default
maximum number of columns set to 3, then the component will actually display 9
rows, even though you have it set to display 5. This is because the maximum number
of columns can override the set number of rows. Because it is set to allow only up to 3
columns, it must use 9 rows in order to display all child components. You would need
to set the maximum number of columns to 5 in order to have the component display
just 5 rows.
ADF Faces uses default label and field widths, as determined by the standard HTML
flow in the browser. You can also specify explicit widths to use for the labels and
fields. Regardless of the number of columns in the form layout, the widths you specify
apply to all labels and fields. You specify the widths using either absolute numbers in
pixels or percentage values. If the length of a label does not fit, the text is wrapped.
8-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Content in Forms
3. Set rows and maxColumns to determine the number of rows and columns in the
form.
The rows attribute value is the number that ADF Faces uses as the number of
rows after which a new column will start. By default, it is set to 2147483647
(Integer.MAX_VALUE). This means all the child components that are set to
rendered="true" and visible="true" will render in one, single column.
If you want the form to contain more than one column, set the rows attribute to a
multiple of the number of rendered child components, and then set the
maxColumns attribute to the maximum amount of columns that the form should
display. The default value of maxColumns is 3. (On PDAs, the default is 2).
For example, if the rows attribute is set to 6 and there are 1 to 6 rendered child
components, the list will be displayed in 1 column. If there are 7 to 12 rendered
child components, the list will be displayed in 2 columns. If there are 13 or more
child components, the list will be displayed in 3 columns. To display all rendered
child components in 1 column, set the rows attribute back to the default value.
If the number of rendered child components would require more columns than
allowed by the maxColumn attribute, then the value of the rows attribute is
overridden. For example, if there are 100 rendered child components, and the
rows attribute is set to 30 and the maxColumns attribute is 3 (default), the list
will be displayed in 3 columns and 34 rows. If the maxColumns attribute is set to
2, the list will be displayed in 2 columns and 51 rows.
Regardless of the number of columns in the form layout, the widths you specify
apply to all labels and fields, that is, you cannot set different widths for different
columns. You specify the widths using any CSS unit such as em, px, or %. The unit
used must be the same for both the labelWidth and fieldWidth attribute.
When using percentage values:
■ The percentage width you specify is a percent of the entire width taken up by
the panelFormLayout component, regardless of the number of columns to
be displayed.
■ The sum of the labelWidth and fieldWidth percentages must add up to
100%. If the sum is less than 100%, the widths will be normalized to equal
100%. For example, if you set the labelWidth to 10% and the fieldWidth
to 30%, at runtime the labelWidth would be 33% and the fieldWidth
would be 67%.
■ If you explicitly set the width of one but not the other (for example, you
specify a percentage for labelWidth but not fieldWidth), ADF Faces
automatically calculates the percentage width that is not specified.
Note: If your form contains multiple columns and a footer, you may
see a slight offset between the positioning of the main form items and
the footer items in web browsers that do not honor fractional divisions
of percentages. To minimize this effect, ensure that the percentage
labelWidth is evenly divisible by the number of columns.
8-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Content in Forms
Note: If the field is wider than the space allocated, the browser will
not truncate the field but instead will take space from the label
columns. This potentially could cause the labels to wrap more than
you would like. In this case, you may want to consider reducing the
width of the field contents (for example, use a smaller contentStyle
width on an inputText component).
6. To group semantically related input components in a form layout, use the group
component to wrap those components that belong in a group. Components placed
within a group will cause the panelFormLayout component to draw a separator
line above and below the group.
For more information about using the group component, see Section 8.6.2, "What
You May Need to Know About Using the group Component with the
panelFormLayout Component."
7. To add content below the child input components, insert the desired component
into the footer facet.
Facets accept only one child component. If you have to insert more than one
component in the footer facet, use the panelGroupLayout component or the
group component to wrap the footer child components. Example 8–5 shows
sample code that uses the panelGroupLayout component to arrange footer
child components in a panelFormLayout component.
8.6.2 What You May Need to Know About Using the group Component with the
panelFormLayout Component
While the group component itself does not render anything, when it used as a child in
the panelFormLayout component, visible separators are displayed around the child
components of each group component. For example, you might want to group some
of the input fields in a form layout created by the panelFormLayout component.
Example 8–15 shows sample code that groups two sets of child components inside a
panelFormLayout component.
8-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Content in Forms
Following along with the sample code in Example 8–15, at runtime the
panelFormLayout component renders dotted, separator lines before and after the
first group of child components, as shown in Figure 8–16.
<af:panelGroupLayout layout="horizontal">
<af:commandButton text="Save" ../>
<af:commandButton text="Cancel" ../>
<f:facet name="separator">
<af:spacer width="3"/>
</f:facet>
</af:panelGroupLayout>
</af:group>
When you use the group component to group child components in the footer facet
of the panelFormLayout component, you must place all the group components and
other ungrouped child components in one root group component, as shown in
Example 8–8.
Example 8–8 footer Facet in panelFormLayout with One Root group Component
<af:panelFormLayout ...>
<f:facet name="footer">
<!-- One root group component needed -->
<af:group>
<af:outputText value="Footer item 1"/>
<!-- One group -->
<af:group>
<af:outputText value="Group 1 item 1"/>
<af:outputText value="Group 1 item 2"/>
</af:group>
<af:panelGroupLayout layout="horizontal">
<af:commandButton text="Save"/>
<af:commandButton text="Cancel"/>
<f:facet name="separator">
<af:spacer width="3"/>
</f:facet>
</af:panelGroupLayout>
</af:group>
</f:facet>
.
.
.
</af:panelFormLayout>
8-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Content in Forms
Whether you are grouping components in the footer facet or in the main body of the
panelFormLayout component, if the first or last child inside the panelFormLayout
component or inside the footer facet is a group component, no separator lines will
be displayed around the child components in that group. For example, both sets of
code examples in Example 8–9 would produce the same visual effect at runtime.
</af:group>
<af:group>
<af:panelGroupLayout layout="horizontal">
<af:commandButton text="Cancel"/>
<af:commandButton text="Save"/>
</af:panelGroupLayout>
</af:group>
</af:group>
</f:facet>
The panelDashboard component also supports declarative drag and drop behavior,
so that the user can rearrange the child components. As shown in Figure 8–19, the user
8-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Contents in a Dashboard
Note: You can also configure drag and drop functionality that allows
users to drag components into and out of the panelDashboard
component. For more information, see Section 32.6, "Adding Drag and
Drop Functionality Into and Out of a panelDashboard Component."
When you add a panelDashboard component, you configure the number of columns
it will contain, along with the height of each row. The dashboard stretches its children
to fill up the configured space. If all the child components do not fit within the
specified number of columns and row height, then the panelDashboard component
displays a scroll bar.
Along with the ability to move child components, the panelDashboard component
also provides an API that you can access to allow users to switch child components
from being rendered to not rendered, giving the appearance of panelBoxes being
inserted or deleted. The dashboard uses partial page rendering to redraw the new set
of child components without needing to redraw the entire page.
You can use the panelDashboardBehavior tag to make the rendering of
components appear more responsive. This tag allows the activation of a command
component to apply visual changes to the dashboard before the application code
modifies the component tree on the server. Because this opening up of space happens
before the action event is sent to the server, the user will see immediate feedback while
the action listener for the command component modifies the component tree and
prepares the dashboard for the optimized encoding of the insert.
For example, Figure 8–20 shows a panelDashboard component used in the right
panel of a panelSplitter component. In the left panel, list items displayed as links
represent each panelBox component in the panelDashboard. When all panelBox
components are displayed, the links are all inactive. However, if a user deletes one of
the panelBox components, the corresponding link becomes active. The user can click
the link to reinsert the panelBox. By using the panelDashboardBehavior tag with
the commandLink component, the user sees the inserted box drawing.
If you decide not to use this tag, there will be a slight delay while your action listener
is processing before the user sees any change to the dashboard structure.
Figure 8–21 shows a practical example using a panelDashboard component.
Selecting one of the links at the top of the page changes the panelBoxes displayed in
the dashboard. The user can also add panelBoxes by clicking the associated link on
the left-hand side of the page.
8-36 Web User Interface Developer's Guide for Oracle Application Development Framework
Arranging Contents in a Dashboard
6. If you want users to be able to reorder the child components, in the Component
Palette, from the Operations panel, drag and drop a Component Drag Source as a
child to each of the child components.
7. If you want to be able to add and delete components, create a managed bean and
implement a handler method that will handle reordering children when a child is
added or dropped. This event is considered a drop event, so you must use the
Drag and Drop framework. For more information about creating a handler for a
drop event, see Chapter 32, "Adding Drag and Drop Functionality."
To use the optimized lifecycle, have the handler call the panelDashboard
component’s prepareOptimizedEncodingOfInsertedChild() method,
which causes the dashboard to send just the inserted child component to be
rendered.
8. If you have added a componentDragSource tag in Step 6, then you must also
implement a DropEvent handler for the panelDashboard. With the
panelDashboard component selected, expand the Behavior section and bind the
DropListener attribute to that handler method.
9. If you wish to use a panelDashboardBehavior tag, drag and drop a command
component that will be used to initiate the insertion.
10. In the Property Inspector, bind the ActionListener for the command component to
a handler on a managed bean that will handle the changes to the component tree.
Have the handler call the panelDashboard component’s
prepareOptimizedEncodingOfInsertedChild() method, which causes the
dashboard to send just the inserted child component to be rendered. Example 8–10
shows code on a managed bean that handles the insertion of child components.
if (child.isRendered())
{
// Count only rendered children because that is all that the
// panelDashboard can see:
insertIndex++;
}
}
// Add the side bar as a partial target because we need to
// redraw the state of the side bar item that corresponds to the inserted item:
RequestContext rc = RequestContext.getCurrentInstance();
rc.addPartialTarget(_sideBar);
}
11. In the Component Palette, from the Operations panel, drag a Panel Dashboard
Behavior tag and drop it as a child to the command component.
12. In the Property Inspector, enter the following:
8.7.2 What You May Need to Know About Geometry Management and the
panelDashboard Component
This component organizes its children into a grid based on the number of columns and
the rowHeight attribute. The child components that can be stretched inside of the
panelDashboard include:
■ panelBox
■ region
■ table
8-38 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying and Hiding Contents Dynamically
If you try to put any other component as a child component to the panelDashboard
component, then the component hierarchy is not valid.
When the user clicks the toggle icon, the properties are displayed, as shown in
Figure 8–23.
If you want to use something more complex than an outputText component to display
the disclosed and undisclosed text, you can add components to the showDetail
component’s prompt facet. When set to be visible, any contents in the prompt facet
will replace the disclosed and undisclosed text values. To use the showDetail
component, see Section 8.8.1, "How to Use the showDetail Component."
Like the showDetail component, the showDetailHeader component also toggles
the display of contents, but the showDetailHeader component provides the label
and toggle icon in a header, and also provides facets for a menu bar, toolbar, and text.
When there is not enough space to display everything in all the facets of the title line,
the showDetailHeader text is truncated and displays an ellipsis. When the user
hovers over the truncated text, the full text is displayed in a tooltip, as shown in
Figure 8–24.
When there is more than enough room to display the contents, the extra space is
placed between the context facet and the toolbar, as shown in Figure 8–25.
8-40 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying and Hiding Contents Dynamically
You can also use the showDetailHeader component in conjunction with the
panelHeader component to divide a page into sections and subsections, where some
contents can be hidden. The showDetailHeader component contains a number of
facets, such as a toolbar and menu bar facet. These facets are the same as for the
panelHeader component. For more information about the panelHeader
component, see Section 8.10, "Displaying Items in a Static Box."
You can nest showDetailHeader components to create a hierarchy of content. Each
nested component takes on a different heading style to denote the hierarchy.
Figure 8–27 shows three nested showDetailHeader components, and their different
styles.
You can change the styles used by each header level by applying a skin to the
showDetailHeader component. For details about skinning ADF Faces components,
see Chapter 20, "Customizing the Appearance Using Styles and Skins."
Note: While you can force the style of the text using the size
attribute, (where 0 is the largest text), the value of the size attribute
will not affect the hierarchy. It only affects the style of the text.
Use the panelBox component when you want information to be able to be displayed
or hidden below the header, and you want the box to be offset from other information
on the page. The File Explorer application uses two panelBox components on the
properties.jspx page to display the attributes and history of a file, as shown in
Figure 8–28.
Figure 8–29 shows the same page, but with the History panelBox component in an
undisclosed state.
You can set the background color on a panelBox component so that the contents are
further delineated from the rest of the page. Two color combinations (called ramps) are
offered, and each combination contains four levels of color: none, light, medium, and
dark. Figure 8–30 shows the same panel boxes as in Figure 8–28, but with the bottom
panelBox component configured to show the medium tone of the core ramp.
8-42 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying and Hiding Contents Dynamically
You can set the size of a panelBox component either explicitly by assigning a pixel
size, or as a percentage of its parent. You can also set the alignment of the title, and
add an icon. In addition, the panelBox component includes the toolbar facet that
allows you to add a toolbar and toolbar buttons to the box.
If you want to show and hide multiple large areas of content, consider using the
panelAccordion and panelTabbed components. For more information, see
Section 8.9, "Displaying or Hiding Contents in Accordion Panels and Tabbed Panels."
2. In the Property Inspector, expand the Common section and set the attributes as
needed.
Set Disclosed to true if you want the component to show its child components.
Note: While the user can change the value of the disclosed
attribute by displaying and hiding the contents, the value will not be
retained once the user leaves the page unless you configure your
application to allow user customizations. For information, see
Chapter 31, "Allowing User Customization on JSF Pages."
Set DisclosedText to the label you want to display next to the toggle icon when the
contents are disclosed (shown). By default, the label is Hide if no value is
specified.
Set UndisclosedText to the label you want to display next to the toggle icon when
the contents are undisclosed (hidden). By default, the label is Show if no value is
specified.
4. If you are using the header to provide specific messaging information, set
MessageType to one of the following values:
■ confirmation: The confirmation icon (represented by a note page overlaid
with a green checkmark) replaces any specified icon image.
■ error: The error icon (represented by a red circle with an x inside) replaces
any specified icon image. The header label also changes to red.
■ info: The info icon (represented by a blue circle with an I inside) replaces any
specified icon image.
8-44 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying and Hiding Contents Dynamically
5. Set Disclosed to true if you want the component to show its child components.
Note: While the user can change the value of the disclosed
attribute by displaying and hiding the contents, the value will not be
retained once the user leaves the page unless you configure your
application to allow user customization. For information, see
Chapter 31, "Allowing User Customization on JSF Pages."
9. To add menus to the header, insert menu components into the menuBar facet. For
more information about creating menus, see Section 14.2, "Using Menus in a Menu
Bar."
Tip: You can place menus in the toolbar facet and toolbars (and
toolboxes) in the menu facet. The main difference between these facets
is location. The toolbar facet is before the menu facet.
Note: While you can force the style of the text using the size
attribute, (where 0 is the largest text), the value of the size attribute
will not affect the hierarchy. It only affects the style of the text.
In the default skin used by ADF Faces, the style used for sizes above 2 will be
displayed the same as size 2. That is, there is no difference in styles for sizes 3, 4, or
5–they all show the same style as size 2. You can change this by creating a custom
skin. For more information, see Chapter 20, "Customizing the Appearance Using
Styles and Skins."
11. To add content to a section or subsection, insert the desired child components
inside the showDetailHeader component.
8-46 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying and Hiding Contents Dynamically
5. Set Icon to the URI of the icon image you want to display before the header text.
Note: If both the text and icon attributes are not set, ADF Faces
does not display the header portion of the panelBox component.
6. Set TitleHalign to one of the following values: center, start, end, left, or
right. The value determines the horizontal alignment of the title (including any
icon image) in the header portion of the container.
7. Expand the Behavior section and set DisclosureListener to a
disclosureListener method in a backing bean that you want to execute when
the user shows or hides the component’s contents.
For information about disclosure events and listeners, see Section 8.8.4, "What You
May Need to Know About Disclosure Events."
8. To add toolbar buttons, in the Component Palette, from the Common Components
Panel, drag and drop a Toolbar into the toolbar facet. Then insert the desired
number of commandToolbarButton components into the toolbar component.
For information about using toolbar and commandToolbarButton
components, see Section 14.3, "Using Toolbars."
9. To add contents to the container for display, insert the desired components as child
components to the panelBox component.
Typically, you would insert one child component into the panelBox component,
and then insert the contents for display into the child component. The child
component controls how the contents will be displayed, not the parent panelBox
component.
10. To change the width of the panelBox component, set the inlineStyle attribute
to the exact pixel size you want. Alternatively, you can set the inlineStyle
attribute to a percentage of the outer element that contains the panelBox
component. Example 8–11 shows the code you might use for changing the width.
8-48 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying or Hiding Contents in Accordion Panels and Tabbed Panels
The panelAccordion component creates a series of expandable panes. You can allow
users to expand more than one panel at any time, or to expand only one panel at a
time. When more than one panel is expanded, the user can adjust the height of the
panel by dragging the header of the showDetailItem component.
When a panel is collapsed, only the panel header is displayed; when a panel is
expanded, the panel contents are displayed beneath the panel header (users can
expand the panes by clicking either the panelAccordion component’s header or the
expand icon). The File Explorer application uses the panelAccordion component to
display the Folders and Search panes, as shown in Figure 8–32.
At runtime, when available browser space is less than the space needed to display
expanded panel contents, ADF Faces automatically displays overflow icons that
enable users to select and navigate to those panes that are out of view. Figure 8–33
shows the overflow icon (circled in the lower right-hand corner) displayed in the
Folders panel of the File Explorer application when there is not enough room to
display the Search panel.
When the user clicks the overflow icon, ADF Faces displays the overflow popup menu
(as shown in Figure 8–34) for the user to select and navigate to.
You can also configure the panelAccordion so that the panes can be rearranged by
dragging and dropping, as shown in Figure 8–35.
8-50 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying or Hiding Contents in Accordion Panels and Tabbed Panels
To use the panelAccordion component, see Section 8.9.1, "How to Use the
panelAccordion Component."
The panelTabbed component creates a series of tabbed panes. Unlike the
panelAccordion panes, the panelTabbed panes are not collapsible or expandable.
Instead, when users select a tab, the contents of the selected tab take up the entire
display area. The tabs may be positioned above the display area, below the display
area, or both. You can configure a panelTabbed component so that the individual
tabs can be closed. You can have it so that all tabs can be closed, all but the last tab can
be closed, or no tabs can be closed. When tabs are configured to be removed, an X is
displayed at the end of the tab.
The File Explorer application uses the panelTabbed component to display the
contents in the main panel, as shown in Figure 8–36.
To use the panelTabbed component, see Section 8.9.2, "How to Use the panelTabbed
Component."
8-52 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying or Hiding Contents in Accordion Panels and Tabbed Panels
To add contents for display in a panel, insert the desired child components into
each showDetailItem component. For procedures, see Section 8.9.3, "How to
Use the showDetailItem Component to Display Content in panelAccordion or
panelTabbed Components."
To add contents for display in a panel, insert the desired child components into
each showDetailItem component. For information about using
showDetailItem, see Section 8.9.3, "How to Use the showDetailItem Component
to Display Content in panelAccordion or panelTabbed Components."
8-54 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying or Hiding Contents in Accordion Panels and Tabbed Panels
Note: Instead of directly setting the value for the flex attribute, the
File Explorer application uses an EL expression that resolves to a
method used to determine the value. Using an EL expression allows
you to programmatically change the value if you decide at a later
point to use metadata to provide model information.
The user can change the panel heights at runtime, thereby changing the value of
the flex and inflexibleHeight attributes. Those values can be persisted so
that they remain for the duration of the user’s session. For information, see
Chapter 31, "Allowing User Customization on JSF Pages."
Note the following additional information about flexible accordion panel contents:
■ There must be two or more panes (showDetailItem components) with flex
values larger than 0 before ADF Faces can enable flexible contents. This is
because ADF Faces uses the flex ratio between two components to determine
how much space to allocate among the panel contents. At runtime, two or
more panes must be expanded before the effect of flexible contents can be
seen.
■ If the showDetailItem component has only one child component and the
flex value is nonzero, and the stretchChildren attribute is set to first,
ADF Faces will stretch that child component regardless of the discloseMany
attribute value on the panelAccordion component.
■ When all showDetailItem components have flex values of 0 (zero) and
their panel contents are disclosed, even though the disclosed contents are set
to be inflexible, ADF Faces will stretch the contents of the last disclosed
showDetailItem component as if the component had a flex value of 1, but
only when that showDetailItem component has one child only, and the
stretchChildren attribute is set to first. If the last disclosed panel has
more than one child component or the stretchChildren attribute is set to
none, the contents will not be stretched.
Even with the flex attribute set, there are some limitations regarding geometry
management. For more information, see Section 8.9.4, "What You May Need to
Know About Geometry Management and the showDetailItem Component."
6. Expand the Behavior section. Set DisclosureListener to the
disclosureListener method in a backing bean you want to execute when this
panel or tab is selected by the user.
For information about server disclosure events and event listeners, see
Section 8.8.4, "What You May Need to Know About Disclosure Events."
7. Set Disabled to true if you want to disable this panel or tab (that is, the user will
not be able to select the panel or tab).
8. Set Disclosed to true if you want this panel or tab to show its child components.
By default, the disclosed attribute is set to false. This means the contents for
this panel or tab are hidden.
Note: While the user can change the value of the disclosed
attribute by displaying or hiding the contents, the value will not be
retained once the user leaves the page unless you configure your
application to allow user customization. For information, see
Chapter 31, "Allowing User Customization on JSF Pages."
8-56 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying or Hiding Contents in Accordion Panels and Tabbed Panels
10. If you chose to allow tab removal for a panelTabbed component, expand the
Other section and set ItemListener to an EL expression that resolves to a handler
method that will handle the actual removal of a component.
11. To add toolbar buttons to a panel (supported in the panelAccordion component
only), in the Component Palette, from the Common Components panel, insert a
Toolbar into the toolbar facet of the showDetailItem component that defines
that panel. Then, insert the desired number of commandToolbarButton
components into the toolbar component. Although the toolbar facet is on the
showDetailItem component, it is the panelAccordion component that
renders the toolbar and its buttons. For information about using toolbar and
commandToolbarButton, see Section 14.3, "Using Toolbars."
12. To add contents to the panel, insert the desired child components into each
showDetailItem component.
8.9.4 What You May Need to Know About Geometry Management and the
showDetailItem Component
Both the panelAccordion or panelTabbed components can stretch when they are
placed inside a component that uses geometry management to stretch its child
components. However, for the panelAccordion component, the showDetailItem
component will stretch only if the discloseMany attribute on the panelAccordion
component is set to true (that is, when multiple panes may be expanded to show
their inflexible or flexible contents), the showDetailItem component contains only
one child component, and the showDetailItem component’s stretchChildren
attribute is set to first. By default, panel contents will not stretch. The
showDetailItem component will allow stretching if:
■ It contains only a single child
■ Its stretchChildren attribute is set to first
■ The child has no width, height, border, and padding set
■ The child must be capable of being stretched
When all of the preceding bullet points are true, the showDetailItem component
can stretch its child component. The following components can be stretched inside the
showDetailItem component:
■ decorativeBox
■ panelAccordion
■ panelBox
■ panelCollection
■ panelDashboard
■ panelGroupLayout (only when the layout attribute is set to scroll or
vertical)
■ panelSplitter
■ panelStretchLayout
■ panelTabbed
■ region
■ table
■ tree
■ treeTable
The following components cannot be stretched when placed inside a
showDetailItem component:
■ panelBorderLayout
■ panelFormLayout
■ panelGroupLayout (only when the layout attribute is set to default or
horizontal)
■ panelHeader
■ panelLabelAndMessage
■ panelList
■ tableLayout (MyFaces Trinidad component)
You cannot place components that cannot stretch as a child to a component that
stretches its child components. Therefore, if you need to place one of the components
that cannot be stretched as a child of a showDetailItem component, you need to
wrap that component in different component that does not stretch its child
components.
For example, if you want to place content in a panelList component and have it be
displayed in a showDetailItem component, you might place a panelGroupLayout
component with its layout attribute set to scroll as the chid of the
showDetailItem component, and then place the panelList component in that
component. For more information, see Section 8.2.1, "Geometry Management and
Component Stretching."
8.9.5 What You May Need to Know About showDetailItem Disclosure Events
The showDetailItem component inside of panelAccordion and panelTabbed
components supports queuing of disclosure events so that validation is properly
handled on the server and on the client.
In general, for any component with the disclosed attribute, by default, the event
root for the client AdfDisclosureEvent is set to the event source component: only
the event for the panel whose disclosed attribute is true gets sent to the server.
However, for the showDetailItem component that is used inside of panelTabbed
or panelAccordion component, the event root is the panelTabbed or
panelAccordion component (that is, the event source parent component, not the
8-58 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Items in a Static Box
event source component). This ensures that values from the previously disclosed panel
will not get sent to the server.
For example, suppose you have two showDetailItem components inside a
panelTabbed or panelAccordion component with the discloseMany attribute
set to false and the discloseNone attribute set to false. Suppose the
showDetailItem 1 component is disclosed but not showDetailItem 2. Given this
scenario, the following occurs:
■ On the client:
– When a user clicks to disclose showDetailItem 2, a client-only disclosure
event gets fired to set the disclosed attribute to false for the
showDetailItem 1 component. If this first event is not canceled, another
client disclosure event gets fired to set the disclosed attribute to true for
the showDetailItem 2 component. If this second event is not canceled, the
event gets sent to the server; otherwise, there are no more disclosure changes.
■ On the server:
– The server disclosure event is fired to set the disclosed attribute to true on
the showDetailItem 2 component. If this first server event is not canceled,
another server disclosure event gets fired to set the disclosed attribute to
false for the showDetailItem 1 component. If neither server event is
canceled, the new states get rendered, and the user will see the newly
disclosed states on the client; otherwise, the client looks the same as it did
before.
For the panelAccordion component with the discloseMany attribute set to false
and the discloseNone attribute set to true, the preceding information is the same
only when the disclosure change forces a paired change (that is, when two disclosed
states are involved). If only one disclosure change is involved, there will just be one
client and one server disclosure event.
For the panelAccordion component with the discloseMany attribute set to true
(and any discloseNone setting), only one disclosure change is involved; there will
just be one client and one server disclosure event.
For additional information about disclosure events, see Section 8.8.4, "What You May
Need to Know About Disclosure Events."
When there is not enough space to display everything in all the facets of the title line,
the panelHeader text is truncated and displays an ellipsis. When the user hovers
over the truncated text, the full text is displayed in a tooltip, as shown in Figure 8–39.
When there is more than enough room to display the contents, the extra space is
placed between the context facet and the toolbar, as shown in Figure 8–40.
Note: While you can force the style of the text using the size
attribute (where 0 is the largest text), the value of the size attribute
will not affect the hierarchy. It only affects the style of the text.
8-60 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Items in a Static Box
5. If you are using the header to provide specific messaging information, set
MessageType to one of the following values:
■ confirmation: The confirmation icon (represented by a note page overlaid
with a green checkmark) replaces any specified icon image.
■ error: The error icon (represented by a red circle with an "x" inside) replaces
any specified icon image. The header label also changes to red.
■ info: The info icon (represented by a blue circle with an "I" inside) replaces any
specified icon image.
■ none: Default. No icon is displayed.
■ warning: The warning icon (represented by a yellow triangle with an
exclamation mark inside) replaces any specified icon image.
Figure 8–42 shows the icons used for the different message types.
6. To display help for the header, enter the topic ID for HelpTopicId. For more
information about creating and using help topics, see Section 17.5, "Displaying
Help for Components."
7. If you want to control how the panelHeader component handles geometry
management, expand the Other section and set Type to one of the following. For
more information about geometry management, see Section 8.2.1, "Geometry
Management and Component Stretching."
■ flow: The component will not stretch or stretch its children. The height of the
panelHeader component will be determined solely by its children.
■ stretch: The component will stretch and stretch its child (will only stretch a
single child component).
■ default: if you want the parent component of the panelHeader component to
determine geometry management.
8. To add toolbar buttons to a panel, insert the toolbar component into the
toolbar facet. Then, insert the desired number of commandToolbarButton
components into the toolbar component. For information about using toolbar
and commandToolbarButton, see Section 14.3, "Using Toolbars."
9. To add menus to a panel, insert menu components into the menuBar facet. For
information about creating menus in a menu bar, see Section 14.2, "Using Menus in
a Menu Bar."
Tip: You can place menus in the toolbar facet and toolbars (and
toolboxes) in the menu facet. The main difference between these facets
is location. The toolbar facet is before the menu facet.
11. To add contents to the panel, insert the desired child components into the
panelHeader component.
8-62 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying a Bulleted List in One or More Columns
By default, the disc bullet is used to style the child components. There are other styles
you can use, such as square bullets and white circles. You can also split the list into
columns when you have a very long list of items to display.
3. Insert the desired number of child components (to display as bulleted items) into
the panelList component.
Tip: Panel lists also allow you to use the iterator, switcher, and
group components as direct child components, providing these
components wrap child components that would typically be direct
child components of the panel list.
8.11.2 What You May Need to Know About Creating a List Hierarchy
You can nest panelList components to create a list hierarchy. A list hierarchy, as
shown in Figure 8–44, has outer items and inner items, where the inner items
belonging to an outer item are indented under the outer item. Each group of inner
items is created by one nested panelList component.
To achieve the list hierarchy as shown in Figure 8–44, use a group component to wrap
the components that make up each group of outer items and their respective inner
items. Example 8–14 shows the code for how to create a list hierarchy that has one
outer item with four inner items, and another outer item with two inner items.
8-64 Web User Interface Developer's Guide for Oracle Application Development Framework
Grouping Related Items
<af:group>
<af:commandLink text="item 2"/>
<af:panelList>
<af:commandLink text="item 2.1"/>
<af:commandLink text="item 2.2"/>
</af:panelList>
</af:group>
</af:panelList>
By default, the outer list items (for example, item 1 and item 2) are displayed with the
disc bullet, while the inner list items (for example, item 1.1 and item 2.1) have the
white circle bullet.
For more information about the panelGroupLayout component, see Section 8.12,
"Grouping Related Items."
In all arrangements, each pair of adjacent child components can be separated by a line
or white space using the separator facet of the panelGroupLayout component.
For more information, see Section 8.13, "Separating Content Using Blank Space or
Lines."
When using the horizontal layout, the child components can also be vertically or
horizontally aligned. For example, you could make a short component beside a tall
component align at the top, as shown in Figure 8–46.
8-66 Web User Interface Developer's Guide for Oracle Application Development Framework
Grouping Related Items
hidden, and the search results content does not fit into the area, a scrollbar is rendered,
as shown in Figure 8–47.
3. To add spacing or separator lines between adjacent child components, insert the
spacer or separator component into the separator facet.
4. In the Property Inspector, expand the Appearance section. To arrange the child
components in the desired layout, set Layout to one of the following values:
■ default: Provides consecutive layout with wrapping.
At runtime, when the contents exceed the browser space available (that is,
when the child components are larger than the width of the parent container
panelGrouplayout), the browser flows the contents onto the next line so
that all child components are displayed.
Note: The halign and valign attributes are ignored if the layout is
not horizontal.
■ scroll: Uses a vertical layout, where child components are stacked vertically,
and a vertical scrollbar is provided when necessary.
■ vertical: Uses a vertical layout, where child components are stacked vertically.
8-68 Web User Interface Developer's Guide for Oracle Application Development Framework
Separating Content Using Blank Space or Lines
8.12.2 What You May Need to Know About Geometry Management and the
panelGroupLayout Component
While the panelGroupLayout component cannot stretch its child components, it can
be stretched when it is the child of a panelSplitter or panelStretchLayout
component and its layout attribute is set to either scroll or vertical.
Figure 8–49 shows the effect the spacer component has on the page output as viewed
in a browser.
The width attribute determines the amount of horizontal space to include between
components. Example 8–17 shows part of the source of a page set up to space out two
components horizontally.
The separator component creates a horizontal line. Figure 8–51 shows the
properties.jspx file as it would be displayed with a separator component
inserted between the two panelBox components.
The spacer and separator components are often used in facets of other layout
components. Doing so ensures that the space or line stays with the components they
were meant to separate.
Note: If the height is specified but not the width, a block-level HTML
element is rendered, thereby introducing a new line effect. If the width
is specified, then, irrespective of the specified value of height, it may
not get shorter than the applicable line-height in user agents that
strictly support HTML standards.
8-70 Web User Interface Developer's Guide for Oracle Application Development Framework
9
9 Using Input Components and Defining
Forms
This chapter describes the input components that are used to enter data, select values,
edit text, and load files.
This chapter includes the following sections:
■ Section 9.1, "Introduction to Input Components and Forms"
■ Section 9.2, "Defining Forms"
■ Section 9.3, "Using the inputText Component"
■ Section 9.4, "Using the Input Number Components"
■ Section 9.5, "Using Color and Date Choosers"
■ Section 9.6, "Using Selection Components"
■ Section 9.7, "Using Shuttle Components"
■ Section 9.8, "Using the richTextEditor Component"
■ Section 9.9, "Using File Upload"
In addition to standard input components used to input text, number, date, or color,
ADF Faces includes input type components that provide additional functionality. The
inputFile component allows users to browse for a file to load.
The richTextEditor component provides rich text input that can span many lines
and can be formatted using different fonts, sizes, justification, and other editing
features. The richTextEditor component can also be used with command
components to insert given text into the component. The inserted text can be
preformatted. Additionally, you can customize the buttons that appear in the editor’s
toolbar.
The selection components allow the user to make selections from a list of items instead
of or in addition to typing in values. For example, the selectOneChoice component
lets the user select input from a dropdown list and the selectOneRadio component
lets a user pick from a group of radio buttons.
You can use either selection or list-of-values (LOV) components to display a list. LOV
components should be used when the selection list is large. LOV components are
model-driven using the ListOfValueModel class and may be configured
programmatically using the API. They present their selection list inside a popup
window that may also include a query panel. Selection lists simply display a static list
of values. For more information about using LOV components, see Chapter 11, "Using
List-of-Values Components."
The selectItem component is used within other selection components to represent
the individual selectable items for that component. For example, a selectOneRadio
component will have a selectItem component for each of its radio buttons. If the
radio button selections are coffee, tea, and milk, there would be a selectItem
component for coffee, one for tea, and one for milk.
The form components provide a container for other components. The form
component represents a region where values from embedded input components can
be submitted. Form components cannot be nested. However, the subform component
provides additional flexibility by defining subregions whose component values can be
submitted separately within a form. The resetButton component provides an easy
way for the user to reset input values within a form or subform to their previous state.
All the input and selection components deliver the ValueChangeEvent and
AttributeChangeEvent events. You can create valueChangeListener and
attributeChangeListener methods to provide functionality in response to the
corresponding events.
9-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Forms
All input components, selection components (except selectItem), and the rich text
editor component have a changed attribute that when set to true enables a change
indicator icon to be displayed upon changes in the value field. This indicator allows
the user to easily see which input value has changed, which can be helpful when there
are multiple components on the page. By default, the change indicator usually is
displayed to the left of the component. If the value in a field automatically changes
due to a change in another field’s value, such as an automatically generated postal
code when the city is entered, the postal code field will also display a change indicator.
Figure 9–2 shows changed indicators present for the checkbox and input components.
Tip: You can change the icon or the position of the icon using skins.
For more information, see Chapter 20, "Customizing the Appearance
Using Styles and Skins."
Input components can also display tooltips, error and validation messages, and
context-sensitive help. For more information, see Chapter 17, "Displaying Tips,
Messages, and Help."
All input components have JavaScript client APIs that you can use to set or get
property values. For more information, see the ADF Faces JavaScript API
documentation.
Tip: If you do not already have an af:form tag on the page, and
you drag and drop an ADF Faces component onto the page,
JDeveloper will prompt you to enclose the component within a form
component.
Example 9–1 shows two input components and a Submit button that when clicked will
submit both input values for processing.
<af:inputText value="#{myBean.lastName}"
label="#{Last Name}"
</af:inputText>
<f:facet name="footer">
<af:commandButton text="Submit"/>
</f:facet>
</af:panelFormLayout>
</af:form>
Because there can be only one form component on a page, you can use subforms
within a form to create separate regions whose input values can be submitted. Within
a region, the values in the subform will be validated and processed only if a
component inside the subform caused the values to be submitted. You can also nest a
subform within another subform to create nested regions whose values can be
submitted. For more information about subforms, see Section 4.5, "Using Subforms to
Create Regions on a Page."
Example 9–2 shows a form with two subforms, each containing its own input
components and Submit button. When a Submit button is clicked, only the input
values within that subform will be submitted for processing.
Aside from the basic Submit button, you can add any other command component
within a form and have it operate on any field within the form. ADF Faces provides a
specialized command component: the resetButton component, which when clicked,
resets all the input and selection components within a form. That is, it updates all
components whose values can be edited with the current values of the model. The
resetButton component is different from HTML reset in that the resetButton
component will reset the input components to their previous state which was partially
or fully submitted successfully to the server without any validation or conversion
error. For example, if a user enters value A and clicks the Submit button, and then
9-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Forms
changes the value from A to B and clicks the resetButton component, the value A
will be restored.
You can add multiple inputText components to create an input form. Figure 9–4
shows an input form using three inputText components and a Submit command
button.
You can also configure an insertTextBehavior tag that works with command
components to insert given text into an inputText component. The text to be entered
can be a simple string, or it can be the value of another component, for example the
selected list item in a selectOneChoice component. For example, Figure 9–5 shows
an inputText component with some text already entered by a user.
9-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the inputText Component
The user can then select additional text from a dropdown list, click the command
button, and that text appears in the inputText component as shown in Figure 9–6.
■ Secret: Specify this boolean value that applies only to single-line text controls.
When set to true, the secret attribute hides the actual value of the text from
the user.
■ Wrap: Specify the type of text wrapping to be used in a multiple-row text
control. This attribute is ignored for a single-row component. By default, the
attribute is set to soft, which means multiple-row text wraps visually, but
does not include carriage returns in the submitted value. Setting this attribute
to off will disable wrapping: the multiple-row text will scroll horizontally.
Setting it to hard specifies that the value of the text should include any
carriage returns needed to wrap the lines.
■ ShowRequired: Specify whether or not to show a visual indication that the
field is required. Note that setting the required attribute to true will also
show the visual indication. You may want to use the showRequired attribute
when a field is required only if another field’s value is changed.
■ Changed: Specify whether or not to show a blue circle whenever the value of
the field has changed. If you set this to true, you may also want to set the
changedDesc attribute.
■ ChangedDesc: Specify the text to be displayed in a tooltip on a mouseover of
the changed icon. By default, the text is "Changed." You can override this by
providing a different value.
■ AccessKey: Specify the key to press that will access the field.
■ LabelAndAccessKey: Instead of specifying a separate label and access key,
you can combine the two, so that the access key is part of the label. Simply
precede the letter to be used as an access key with an ampersand (&).
For example, if the label of a field is Description and you want the D to be the
access key, you would enter &Description.
Note: Because the value is being stored in the source of the page in
XML, the ampersand (&) character must be escaped, so the value will
actually be represented in the source of the page using the characters
& to represent the ampersand.
9-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the inputText Component
that in some browsers such as Internet Explorer, a new line is treated as two
characters.
■ Converter: Specify a converter object. For more information, see Section 6.3,
"Adding Conversion."
■ Validator: Specify a method reference to a validator method using an EL
expression. For more information, see Section 6.5, "Adding Validation."
9.3.2 How to Add the Ability to Insert Text into an inputText Component
The insertTextBehavior tag works with command components to insert given
text into an inputText component. The text to be entered can be a simple string, or it
can be the value of another component, for example the selected list item in a
selectOneChoice component. To allow text to be inserted into an inputText
component, add the insertTextBehavior tag as a child to a command component
that will be used to insert the text.
4. By default, the text will be inserted when the action event is triggered by clicking
the command component. However, you can change this to another client event by
choosing that event from the dropdown menu for the triggerType attribute of
the insertTextBehavior component in the Property Inspector.
The inputRangeSlider component has two markers and allows the user to pick the
end points of a range, as shown in Figure 9–9.
9-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the Input Number Components
2. Expand the Data section of the Property Inspector and set the following:
■ Value: Specify the value of the component. If the EL binding for value points
to a bean property with a get method but no set method, the component will
be rendered in read-only mode.
■ Minimum: Specify the minimum value allowed in the input field.
■ Maximum: Specify the maximum value allowed in the input field.
■ StepSize: Specify the increment by which the spinbox will increase or decrease
the number in the input field.
3. Expand the Appearance section and set the attributes. For more information about
setting these attributes, see Section 9.3.1, "How to Add an inputText Component."
The inputDate component presents a text input field for entering dates and a button
for picking dates from a popup calendar, as shown in Figure 9–12. The default date
format is the short date format appropriate for the current locale. For example, the
default format in American English (ENU) is mm/dd/yy. However, you can override
the format using a date-time converter (for more information about using converters,
see Section 6.3, "Adding Conversion").
9-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Color and Date Choosers
When you add a date-time converter and configure it to show both the date and the
time, the date picker is displayed as a modal dialog with additional controls for the
user to enter a time. Additionally, if the converter is configured to show a time zone, a
timezone dropdown list is shown in the dialog, as shown in Figure 9–13.
colors x 8 colors), or 121 (11 colors x 11 colors). The number set for this
attribute will determine the valid value for the width attribute. For example,
if you set the colorData attribute to 49, the width must be 7. If the number
does not match the width, extra color elements in the list will be ignored and
missing color elements will be displayed as no-color. The color list must be an
array of type TrColor on the client side.
■ CustomColorData: Specify the list of custom-defined colors. The number of
colors can be 7, 8, or 11. The color list must be an array of type TrColor on
the client side. On the server side, it must be a List of java.awt.Color
objects, or a list of hexadecimal color strings.
■ DefaultColor: Specify the default color using hexadecimal color code, for
example #000000.
4. Expand the Appearance section and set the following attributes:
■ Width: Specify the width of the standard palette in cells. The valid values are
7, 8, and 11, which correspond to the values of the colorData and
customColorData attributes.
■ CustomVisible: Specify whether or not the Custom Color button and custom
color row are to be displayed. When set to true, the Custom Color button
and custom color row will be rendered.
■ DefaultVisible: Specify whether or not the Default button is to be displayed.
When set to true, the Default button will be rendered. The Default button
allows the user to easily select the color set as the value for the
defaultColor attribute.
■ LastUsedVisible: Specify whether or not the Last Used button is to be
displayed. When set to true the Last Used button will be rendered, which
allows the user to select the color that was most recently used.
5. Expand the Behavior section and set the following attribute:
■ ChooseId: Specify the id of the chooseColor component which can be used
to choose the color value. If not set, the inputColor component has its own
default popup dialog with a chooseColor component.
9-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Color and Date Choosers
■ MaxValue: Specify the maximum value allowed for the date value. When set
to a fixed value on a tag, this value will be parsed as an ISO 8601 date. ISO
8601 dates are of the form "yyyy-MM-dd" (for example: 2002-02-15). All other
uses require java.util.Date objects.
■ DisableDays: Specify a binding to an implementation of the
org.apache.myfaces.trinidad.model.DateListProvider interface.
The getDateList method should generate a List of individual
java.util.Date objects which will be rendered as disabled. The dates must
be in the context of the given base calendar.
9.5.3 What You May Need to Know About Selecting Time Zones Without the inputDate
Component
By default, the inputDate component displays a drop down list of time zones if the
associated converter is configured to do so, for example, if you include the timezone
placeholder z in the converter’s pattern. The end user can only modify the timezone
using this list. The list is configured to display the most common time zones.
However, there may be times when you need to display the list of time zones outside
of the inputDate component. For example, on a Application Preferences page, you
may want to use a selectOneChoice component that allows the user to select the
time zone that will be used to display all inputDates in the application. A backing
bean would handle the conversion between the time zone ID and the
java.util.TimeZone object. Converters for the inputDate instances in the
application would then bind the time zone to that time zone object.
You can access this list using either an API on the DateTimeUtils class, or using an
EL expression on a component.
Following are the methods on DateTimeUtils class:
■ getCommonTimeZoneSelectItems (): Returns a list of commonly used time
zones.
■ getCommonTimeZoneSelectItems (String timeZoneId): Returns a list of
commonly used time zones, including the given time zone if it is not part of the
list.
To access this list using EL, use one of the following expressions:
■ af:getCommonTimeZoneSelectItems
For example:
<f:selectItems value="#{af:getCommonTimeZoneSelectItems()}" id="tzones2" />
■ af:getMergedTimeZoneSelectItems (id)
For example:
<f:selectItems
value="#{af:getMergedTimeZoneSelectItems(demoInput.preferredTimeZoneId)}"
id="tzones" />
If you will be using an inputDate component and a selection list for its time zone on
the same page, you must clear out the local value for the inputDate's timezone to
ensure that the value binding for the selection takes precedence. Otherwise, a non-null
local value will take precedence, and the inputDate component will not appear to be
updated.
In Example 9–4, the backing bean has a reference using the binding attribute to the
inputDate component. When the user picks a new time zone, the id is set and the
code gets the converter for the inputDate and clears out its time zone. When the
page is rendered, since the local value for the converter's time zone is null, it will
evaluate #{demoInput.preferredTimeZone} and obtain the updated time zone.
Example 9–4 Using an inputDate and Time Zone Selection List Together
<af:selectOneChoice label="Select a new timezone"
value="#{demoInput.preferredTimeZoneId}" autoSubmit="true">
<f:selectItems
value="#{af:getMergedTimeZoneSelectItems(demoInput.preferredTimeZoneId)}"
id="tzones" />
</af:selectOneChoice>
<af:inputDate label="First inputDate with timezone bound" id="bound1"
partialTriggers="tzpick" binding="#{demoInput.boundDate1}">
<af:convertDateTime type="both" timeStyle="full"
timeZone="#{demoInput.preferredTimeZone}"/>
</af:inputDate>
DemoInputBean.java
public void setPreferredTimeZoneId(String _preferredTimeZoneId)
{
TimeZone tz = TimeZone.getTimeZone(_preferredTimeZoneId);
setPreferredTimeZone (tz);
this._preferredTimeZoneId = _preferredTimeZoneId;
}
9-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Selection Components
multiple items. The list of items within a selection component is made up of a number
of selectItem components
All the selection components except the selectItem component delivers the
ValueChangeEvent and AttributeChangeEvent events. The selectItem
component only delivers the AttributeChangeEvent event. You must create a
valueChangeListener handler or an attributeChangeListener handler, or
both for them.
The selectOneRadio component creates a component which allows the user to
select a single value from a set of items displayed as a series of radio buttons, as shown
in Figure 9–15.
When the user clicks the icon, the dropdown list is displayed, as shown in Figure 9–23.
9-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Selection Components
component can be configured to include an All selection item that is displayed at the
beginning of the list of selection items. If the number of choices is greater than 15, a
scrollbar will be presented, as shown in Figure 9–24.
For the following components, if you want the label to appear above the control, you
can place them in a panelFormLayout component.
■ selectOneChoice
■ selectOneRadio
■ selectOneListbox
■ selectManyChoice
■ selectManyCheckbox
■ selectManyListbox
For the following components, the attributes disabled, immediate, readOnly,
required, requireMessageDetail, and value cannot be set from JavaScript on
the client for security reasons (for more information, see Section 3.6.1, "How to Set
Property Values on the Client"):
■ selectOneChoice
■ selectOneRadio
■ selectOneListbox
■ selectBooleanRadio
■ selectBooleanCheckbox
■ selectManyChoice
■ selectManyCheckbox
■ selectManyListbox
9-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Shuttle Components
4. Expand the Behavior section of the Property Inspector and set the attributes, as
described in Table 9–2. Note that only attributes specific to the selection
components are discussed here. Many of the attributes are the same as for input
text components. For more information, see Section 9.3.1, "How to Add an
inputText Component."
5. For the boolean components, drag and drop any number of selectItem
components as children to the boolean component. These will represent the items
in the list (for other selection components, the dialog in Step 2 automatically
added these for you).
6. With the selectItem component selected, in the Property Inspector, expand the
Common section, and if not set, enter a value for the value attribute. This will be
the value that will be submitted.
7. Expand the Appearance section, and if not set, enter a value for Label. This will be
the text that is displayed in the list.
8. Expand the Behavior section, and set Disabled to true if you want the item to
appear disabled in the list.
The value attribute of these components, like any other selectMany component,
must be a List or an Array of values that correspond to a value of one of the
contained selectItem components. If a value of one of the selectItems is in the
List or Array, that item will appear in the trailing list. You can convert a
selectManyListbox component directly into a selectManyShuttle; instead of
the value driving which items are selected in the listbox, it affects which items appear
in the trailing list of the selectOrderShuttle component.
Similar to other select components, the List or Array of items are composed of
selectItem components nested within the selectManyShuttle or
selectOrderShuttle component. Example 9–5 shows a sample
selectOrderShuttle component that allows the user to select the top five file types
from a list of file types.
9-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Shuttle Components
<af:selectItem label="XML"/>
<af:selectItem label="JS"/>
<af:selectItem label="PNG"/>
<af:selectItem label="BMP"/>
<af:selectItem label="GIF"/>
<af:selectItem label="CSS"/>
<af:selectItem label="JPR"/>
<af:selectItem label="JSPX"/>
<f:validator validatorId="shuttle-validator"/>
</af:selectOrderShuttle>
■ Value: Specify the value of the component. If the EL binding for the value
points to a bean property with a get method but no set method, the
component will be rendered in read-only mode.
■ ValueChangeListener: Enter an EL expression that resolves to a listener on a
managed bean that handles value change events.
3. In the Property Inspector, expand the Appearance section and set the following:
■ Layout: Specify whether the component will be in horizontal or vertical
layout. The default is horizontal, meaning the leading and trailing list
boxes are displayed next to each other. When set to vertical, the leading list
box is displayed above the trailing list box.
■ LeadingHeader: Specify the header text of the leading list of the shuttle
component.
■ LeadingDescShown: Set to true to display a description of the selected item
at the bottom of the leading list box.
■ TrailingHeader: Specify the header of the trailing list of the shuttle
component.
■ TrailingDescShown: Set to true to display a description of the selected item
at the bottom of the trailing list box.
4. Expand the Behavior section and optionally set the following attributes:
■ ValuePassThru: Specify whether or not the values are passed through to the
client. When valuePassThru is false, the value and the options' values are
converted to indexes before being sent to the client. Therefore, when
valuePassThru is false, there is no need to write your own converter
when you are using custom objects as your values, options, or both. If you
need to know the actual values on the client-side, then you can set
valuePassThru to true. This will pass the values through to the client,
using your custom converter if it is available; a custom converter is needed if
you are using custom objects. The default is false.
■ ReorderOnly (selectOrderShuttle component only): Specify whether or
not the shuttle component is in reorder-only mode, where the user can reorder
the list of values, but cannot add or remove them.
5. In the Structure window, select one of the selectItem components, and in the
Property Inspector, set any needed attributes.
Tip: If you elected to have the leading or trailing list box display a
description, you must set a value for the shortDesc attribute for
each selectItem component.
9.7.2 What You May Need to Know About Using a Client Listener for Selection Events
You can provide the user with information about each selected item before the user
shuttles it from one list to another list by creating JavaScript code to perform
processing in response to the event of selecting an item. For example, your code can
obtain additional information about that item, then display it as a popup to help the
user make the choice of whether to shuttle the item or not. Figure 9–28 shows a
selectManyShuttle component in which the user selects Meyers and a popup
provides additional information about this selection.
9-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Shuttle Components
This code causes the showDetails function to be called any time the property
value changes.
3. In your JavaScript, implement the function entered in the last step. This function
should do the following:
■ Get the shuttle component by getting the source of the event.
■ Use the client JavaScript API calls to get information about the selected items.
In Example 9–7, AdfShuttleUtils.getLastSelectionChange is called to get
the value of the last selected item
if(AdfShuttleUtils.isSelected(shuttleComponent, lastChangedValue))
{
//do something...
}
else
{
//do something else
}
if(AdfShuttleUtils.isLeading(shuttleComponent, lastChangedValue))
{
//queue a custom event (see serverListener) to call a java method on the
server
}
}
}
9-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the richTextEditor Component
■ Ordered/unordered lists
■ Indentation
■ Text color/background color
■ Rich text editing mode/source code editing mode
The value (entered text) of the rich text editor is a well-formed XHTML fragment.
Parts of the value may be altered for browser-specific requirements to allow the value
to be formatted. Also, for security reasons, some features such as script-related tags
and attributes will be removed. There are no guarantees that this component records
only the minimal changes made by the user. Because the editor is editing an XHTML
document, the following elements may be changed:
■ Nonmeaningful whitespace
■ Element minimization
■ Element types
■ Order of attributes
■ Use of character entities
The editor supports only HTML 4 tags, with the exception of:
■ Script, noscript
■ Frame, frameset, noframes
■ Form-related elements (input, select, optgroup, option, textarea, form, button,
label, isindex)
■ Document-related elements (html, head, body, meta, title, base, link)
The richTextEditor component also supports tags that pull in content (such as
applet, iframe, object, img, and a). For the iframe tag, the content should not be
able to interact with the rest of the page because browsers allow interactions only with
content from the same domain. However, this portion of the page is not under the
control of the application.
While the richTextEditor component does not support font units such as px and
em, it does support font size from 1 to 7 as described in the HTML specification. It does
not support embed or unknown tags (such as <foo>).
On the client, the richTextEditor component does not support getValue and
setValue methods. There is no guarantee the component’s value on the client is the
same as the value on the server. Therefore, the richTextEditor does not support
client-side converters and validators. Server-side converters and validators will still
work.
The rich text editor delivers ValueChangeEvent and AttributeChangeEvent
events. Create valueChangeListener and attributeChangeListener handlers
for these events as required.
You can also configure the richTextEditorInsertBehavior tag, which works
with command components to insert given text into the richTextEditor
component. The text to be entered can be a simple string, or it can be preformatted text
held, for example, in a managed bean.
By default, the toolbar in the richTextEditor component allows the user to change
many aspects of the text, such as the font, font size and weight, text alignment, and
view mode, as shown in Figure 9–31.
Figure 9–32 shows a toolbar that has been customized. Many of the toolbar buttons
have been removed and a toolbar with a custom toolbar button and a menu have been
added.
9-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the richTextEditor Component
9.8.2 How to Add the Ability to Insert Text into a richTextEditor Component
To allow text to be inserted into a richTextEditor component, add the
richTextEditorInsertBehavior tag as a child to a command component that
will be used to insert the text.
4. By default, the text will be inserted when the action event is triggered by clicking
the command component. However, you can change this to another client event by
choosing that event from the dropdown menu for the triggerType attribute.
2. In the ADF Faces page of the Component Palette, from the Common Components
panel, drag and drop a Toolbar into each facet and add toolbar buttons or other
components and configure as needed. For more information about toolbars and
toolbar buttons, see Section 14.3, "Using Toolbars."
3. With the richTextEditor component selected, in the Property Inspector, in the
Other section, click the dropdown icon for the toolboxLayout attribute and
select Edit to open the Edit Property: ToolboxLayout dialog. The value for this
attribute should be a list of the custom facet names, in the order in which you
want the contents in the custom facets to appear. In addition to those facets, you
can also include all, or portions, of the default toolbar, using the following
keywords:
■ all: All the toolbar buttons and text in the default toolbar. If all is entered,
then any keyword for noncustom buttons will be ignored.
■ font: The font selection and font size buttons.
■ history: Undo and redo buttons.
■ mode: Rich text mode and source code mode buttons.
■ color: Foreground and background color buttons.
■ formatAll: Bold, italic, underline, superscript, subscript, strikethrough
buttons. If formatAll is specified, formatCommon and formatUncommon
will be ignored.
■ formatCommon: Bold, italic, and underline buttons.
■ formatUncommon: Superscript, subscript, and strikethrough buttons.
■ justify: Left, center, right and full justify buttons.
■ list: Bullet and numbered list buttons.
■ indent: Outdent and indent buttons.
■ link: Add and remove Link buttons.
For example, if you created two facets named customToolbar1 and
customToolbar2, and you wanted the complete default toolbar to appear in
between your custom toolbars, you would enter the following list:
■ customToolbar1
■ all
■ customToolbar2
9-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Using File Upload
You can also determine the layout of the toolbars using the following keywords:
■ newline: Places the toolbar in the next named facet (or the next keyword
from the list in the toolboxLayout attribute) on a new line. For example, if
you wanted the toolbar in the customToolbar2 facet to appear on a new
line, you would enter the following list:
– customToolbar1
– all
– newline
– customToolbar2
If instead, you did not want to use all of the default toolbar, but only the font,
color, and common formatting buttons, and you wanted those buttons to
appear on a new line, you would enter the following list:
– customToolbar1
– customToolbar2
– newline
– font
– color
– formatCommon
■ stretch: Adds a spacer component that stretches to fill all available space so
that the next named facet (or next keyword from the default toolbar) is
displayed as right-aligned in the toolbar.
If the value of the input field is not null, either after the initial load is successful or it
has been specified as an initial value, you can create an Update button that will be
displayed instead of the Browse button, as shown in Figure 9–34.
You can also specify that the component be able to load only a specific file by setting
the readOnly property to true, In this mode, only the specified file can be loaded, as
shown in Figure 9–35.
For security reasons, the following attributes cannot be set from the client:
■ disabled (unless the unsecure property is set. For more information, see
Section 3.6.2, "How to Unsecure the disabled Property.")
■ immediate
■ readOnly
■ requiredMessageDetail
■ value
The inputFile component can be placed in either an h:form tag or an af:form
tag, but in either case, you have to set the form tag to support file upload. If you use
the JSF basic HTML h:form, set the enctype to multipart/form-data. This
would make the request into a multipart request to support file uploading to the
server. If you are using the ADF Faces af:form tag, set usesUpload to true, which
performs the same function as setting enctype to multipart/form-data to support
file upload.
The rich client framework performs a generic upload of the file. You should create an
actionListener or action method to process the file after it has been uploaded (for
example, processing xml files, pdf files, and so on).
The value of an inputFile component is an instance of the
org.apache.myfaces.trinidad.model.UploadedFile interface. The API lets
you get at the actual byte stream of the file, as well as the file's name, its MIME type,
and its size.
Note: The API does not allow you to get path information from the
client about from where the file was uploaded.
The uploaded file may be stored as a file in the file system, but may also be stored in
memory; the API hides that difference. The filter ensures that the UploadedFile
content is cleaned up after the request is complete. Because of this, you cannot usefully
cache UploadedFile objects across requests. If you need to keep the file, you must
copy it into persistent storage before the request finishes.
For example, instead of storing the file, add a message stating the file upload was
successful using a managed bean as a response to the ValueChangeEvent event, as
shown in Example 9–10.
9-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Using File Upload
You can also handle the upload by binding the value directly to a managed bean, as
shown in Example 9–11.
9.9.2 What You May Need to Know About Temporary File Storage
Because ADF Faces will temporarily store files being uploaded (either on disk or in
memory), by default it limits the size of acceptable incoming upload requests to avoid
denial-of-service attacks that might attempt to fill a hard drive or flood memory with
uploaded files. By default, only the first 100 kilobytes in any one request will be stored
in memory. Once that has been filled, disk space will be used. Again, by default, that is
limited to 2,000 kilobytes of disk storage for any one request for all files combined.
Once these limits are exceeded, the filter will throw an EOFException.
Files are, by default, stored in the temporary directory used by the
java.io.File.createTempFile() method, which is usually defined by the
system property java.io.tmpdir. Obviously, this will be insufficient for some
applications, so you can configure these values using three servlet context
initialization parameters, as shown in Example 9–12.
Example 9–12 Parameters That Define File Upload Size and Directory
<context-param>
<!-- Maximum memory per request (in bytes) -->
<param-name>org.apache.myfaces.trinidad.UPLOAD_MAX_MEMORY</param-name>
<!-- Use 500K -->
<param-value>512000</param-value>
</context-param>
<context-param>
<!-- Maximum disk space per request (in bytes) -->
<param-name>org.apache.myfaces.trinidad.UPLOAD_MAX_DISK_SPACE</param-name>
<!-- Use 5,000K -->
<param-value>5120000</param-value>
</context-param>
<context-param>
<!-- directory to store temporary files -->
<param-name>org.apache.myfaces.trinidad.UPLOAD_TEMP_DIR</param-name>
<!-- Use a TrinidadUploads subdirectory of /tmp -->
<param-value>/tmp/TrinidadUploads/</param-value>
</context-param>
<!-- This filter is always required; one of its functions is
file upload. -->
<filter>
<filter-name>trinidad</filter-name>
9-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Using File Upload
<filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class>
</filter>
You can customize the file upload process by replacing the entire
org.apache.myfaces.trinidad.webapp.UploadedFileProcessor class with
the <uploaded-file-processor> element in the trinidad-config.xml
configuration file. Replacing the UploadedFileProcessor class makes the
parameters listed in Example 9–12 irrelevant, they are processed only by the default
UploadedFileProcessor class.
The <uploaded-file-processor> element must be the name of a class that
implements the oracle.adf.view.rich.webapp.UploadedFileProcessor
interface. This API is responsible for processing each individual uploaded file as it
comes from the incoming request, and then making its contents available for the rest of
the request. For most applications, the default UploadedFileProcessor class is
sufficient, but applications that need to support uploading very large files may
improve their performance by immediately storing files in their final destination,
instead of requiring ADF Faces to handle temporary storage during the request.
9-36 Web User Interface Developer's Guide for Oracle Application Development Framework
10
10 Using Tables and Trees
This chapter describes how to display tables and trees using the ADF Faces table,
tree and treeTable components. If your application uses the Fusion technology
stack, then you can use data controls to create tables and trees. For more information
see the "Creating ADF Databound Tables" and "Displaying Master-Detail Data"
chapters of the Oracle Fusion Middleware Web User Interface Developer's Guide for Oracle
Application Development Framework
This chapter includes the following sections:
■ Section 10.1, "Introduction to Tables, Trees, and Tree Tables"
■ Section 10.2, "Displaying Data in Tables"
■ Section 10.3, "Adding Hidden Capabilities to a Table"
■ Section 10.4, "Enabling Filtering in Tables"
■ Section 10.5, "Displaying Data in Trees"
■ Section 10.6, "Displaying Data in Tree Tables"
■ Section 10.7, "Passing a Row as a Value"
■ Section 10.8, "Displaying Table Menus, Toolbars, and Status Bars"
■ Section 10.9, "Exporting Data from Table, Tree, or Tree Table"
■ Section 10.10, "Accessing Selected Values on the Client from Components That Use
Stamping"
components, see Section 10.1.5, "Accessing Client Table, Tree, and Tree Table
Components."
Example 10–1 shows the JSF code for a table whose value for the var attribute is row.
Each outputText component in a column displays the data for the row because its
value is bound to a specific property on the variable.
Example 10–1 JSF Code for a Table Uses the var Attribute to Access Values
<af:table var="row" value="#{myBean.allEmployees}">
<af:column>
<af:outputText value="#{row.firstname}"/>
</af:column>
<af:column>
af:outputText value="#{row.lastname}"/>
</af:column>
</af:table>
The table component displays simple tabular data. Each row in the table displays one
object in a collection, for example one row in a database. The column component
displays the value of attributes for each of the objects.
For example, as shown in Figure 10–1, the Table tab in the File Explorer application
uses a table to display the contents of the selected directory. The table value attribute
is bound to the contentTable property of the tableContentView managed bean
in the File Explorer demo.
The table component provides a range of features for end users, such as sorting
columns, and selecting one or more rows and then executing an application defined
action on the selected rows. It also provides a range of presentation features, such as
showing grid lines and banding, row and column headers, column headers spanning
groups of columns, and values wrapping within cells.
Hierarchical data (that is data that has parent/child relationships), such as the
directory in the File Explorer application, can be displayed as expandable trees using
the tree component. Items are displayed as nodes that mirror the parent/child
structure of the data. Each top-level node can be expanded to display any child nodes,
which in turn can also be expanded to display any of their child nodes. Each expanded
node can then be collapsed to hide child nodes. Figure 10–2 shows the file directory in
the File Explorer application, which is displayed using a tree component.
10-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Tables, Trees, and Tree Tables
Hierarchical data can also be displayed using tree table components. The tree table
also displays parent/child nodes that are expandable and collapsible, but in a tabular
format, which allows the page to display attribute values for the nodes as columns of
data. For example, along with displaying a directory’s contents using a table
component, the File Explorer application has another tab that uses the tree table
component to display the contents, as shown in Figure 10–3.
Like the tree component, the tree table component can show the parent/child
relationship between items. And like the table component, the tree table component
can also show any attribute values for those items in a column. Most of the features
available on a table component are also available in tree table component.
You can add a toolbar and a status bar to tables, trees, and tree tables by surrounding
them with the panelCollection component. The top panel contains a standard
menu bar as well as a toolbar that holds menu-type components such as menus and
menu options, toolbars and toolbar buttons, and status bars. Some buttons and menus
are added by default. For example, when you surround a table, tree, or tree table with
a panelCollection component, a toolbar that contains the View menu is added.
This menu contains menu items that are specific to the table, tree, or tree table
component.
Figure 10–4 shows the tree table from the File Explorer application with the toolbar,
menus, and toolbar buttons created using the panelCollection component.
The number of rows that are displayed on the client are just enough to fill the page as
it is displayed in the browser. More rows are fetched as the user scrolls the component
vertically. The fetchSize attribute determines the number of rows requested from
the client to the server on each attempt to fill the component. The default value is 25.
So if the height of the table is small, the fetch size of 25 is sufficient to fill the
component. However, if the height of the component is large, there might be multiple
requests for the data from the server. Therefore, the fetchSize attribute should be set
to a higher number. For example, if the height of the table is 600 pixels and the height
of each row is 18 pixels, you will need at least 45 rows to fill the table. With a
fetchSize of 25, the table has to execute two requests to the server to fill the table.
For this example, you would set the fetch size to 50.
10-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Tables, Trees, and Tree Tables
However, if you set the fetch size too high, it will impact both server and client. The
server will fetch more rows from the data source than needed and this will increase
time and memory usage. On the client side, it will take longer to process those rows
and attach them to the component.
You can also configure the set of data that will be initially displayed using the
displayRow attribute. By default, the first record in the data source is displayed in
the top row or node and the subsequent records are displayed in the following rows or
nodes. You can also configure the component to first display the last record in the
source instead. In this case, the last record is displayed in the bottom row or node of
the component, and the user can scroll up to view the preceding records. Additionally,
you can configure the component to display the selected row. This can be useful if the
user is navigating to the table, and based on some parameter, a particular row will be
programmatically selected. When configured to display the selected row, that row will
be displayed at the top of the table and the user can scroll up or down to view other
rows.
When you decide to use components whose value can be edited to display your data,
you use the editingMode attribute to determine whether the table, tree, or tree table
should display all rows as available for editing at once, or display all but the currently
active row as read-only. For example, Figure 10–5 shows a table whose rows can all be
edited. The page renders using the components that were added to the page (for
example, inputText, inputDate, and inputComboBoxListOfValues
components).
Figure 10–6 shows the same table (that is, it uses inputText, inputDate, and
inputComboBoxListOfValues components to display the data), but configured so
that only the active row displays the editable components. Users can then click on
another row to make it editable (only one row is editable at a time). Note that
outputText components are used to display the data in the noneditable rows, even
though the same input components as in Figure 10–5 were used to build the page. The
only row that actually renders those components is the active row.
The currently active row is determined by the activeRowKey attribute on the table.
By default, the value of this attribute is the first visible row of the table. When the table
(or tree or tree table) is refreshed, the component scrolls to bring the active row into
view, if it is not already visible. When the user clicks on a row to edit its contents, that
row becomes the active row.
When you allow only a single row (or node) to be edited, the table (or tree or tree
table) performs PPR when the user moves from one row (or node) to the next, thereby
submitting the data (and validating that data) one row at a time. When you allow all
10-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Tables, Trees, and Tree Tables
rows to be edited, data is submitted whenever there is an event that causes PPR to
typically occur, for example scrolling beyond the currently displayed rows or nodes.
Note: You should not use more than one editable component in a
column.
Not all editable components make sense to be displayed in a click-to-edit mode. For
example, those that display multiple lines of HTML input elements may not be good
candidates. These components include:
■ SelectManyCheckbox
■ SelectManyListBox
■ SelectOneListBox
■ SelectOneRadio
■ SelectManyShuttle
The code on the backing bean might look something like this:
public class DynamicContextMenuTableBean
{
...
public void setCurrentTreeRowData(Map currentTreeRowData)
{
_currentTreeRowData = currentTreeRowData;
}
Tables and tree tables contain the bodyContextMenu facet. You can add a popup that
contains a menu to this facet, and it will be displayed whenever a user clicks on the
table, but not within a specific row.
For more information about creating context menus, see Section 13.2, "Declaratively
Creating Popup Elements."
10-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
Note: If your application uses the Fusion technology stack, then you
can use data controls to create tables and the collection model will be
created for you. For more information see the "Creating ADF
Databound Tables" chapter of the Oracle Fusion Middleware Web User
Interface Developer's Guide for Oracle Application Development Framework.
When the user clicks on the expanded icon to collapse it, the component is hidden, as
shown in Figure 10–8.
10-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
For more information about using the detailStamp facet, see Section 10.3, "Adding
Hidden Capabilities to a Table."
■ Grid lines: By default, an ADF table component draws both horizontal and vertical
grid lines. These may be independently turned off using the
horizontalGridVisible and verticalGridVisible attributes.
■ Banding: Groups of rows or columns are displayed with alternating background
colors using the columnBandingInterval attribute. This helps to differentiate
between adjacent groups of rows or columns. By default, banding is turned off.
■ Column groups: Columns in a table can be grouped into column groups, by
nesting column components. Each group can have its own column group heading,
linking all the columns together.
■ Editable cells: When you elect to use input text components to display data in a
table, you can configure the table so that all cells can be edited, or so that the user
must explicitly click in the cell in order to edit it. For more information, see
Section 10.1.3, "Editing Data in Tables, Trees, and Tree Tables."
■ Column stretching: If the widths of the columns do not together fill the whole
table, you can set the columnStretching attribute to determine whether or not
to stretch columns to fill up the space, and if so, which columns should stretch.
■ Column selection: You can choose to allow users to be able to select columns of
data. As with row selection, you can configure the table to allow single or multiple
column selection.
■ Column reordering: Users can reorder the columns at runtime by simply dragging
and dropping the column headers. By default, column reordering is allowed, and
is handled by a menu item in the panelCollection component. For more
information, see Section 10.8, "Displaying Table Menus, Toolbars, and Status Bars."
10-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
Tip: Use start and end instead of left and right if your
application supports multiple reading directions.
If you elect to use a row header column and you configure your table to allow row
selection, the row header column displays a selection arrow when a users hovers
over the row, as shown in Figure 10–11.
For tables that allow multiple selection, users can mouse down and then drag on the
row header to select a contiguous blocks of rows. The table will also autoscroll
vertically as the user drags up or down.
Tip: While the user can change the way the table displays at runtime
(for example the user can reorder columns or change column widths),
those values will not be retained once the user leaves the page unless
you configure your application to allow user customization. For
information, see Chapter 31, "Allowing User Customization on JSF
Pages."
Note: If your application uses the Fusion technology stack, then you
can use data controls to create tables and the binding will be done for
you. For more information see the "Creating ADF Databound Tables"
chapter of the Oracle Fusion Middleware Web User Interface Developer's
Guide for Oracle Application Development Framework.
Once you complete the dialog, and the table and columns are added to the page, you
can use the Property Inspector to configure additional attributes of the table or
columns, and add listeners to respond to table events. You must have an
implementation of the CollectionModel class to which your table will be bound.
10-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
Note: Users can select all rows and all columns in a table by clicking
the column header for the row header if the rowSelection attribute
is set to multiple and that table also contains a row header. If you do
not want users to be able to select all columns and rows, then set
rowSelection to multipleNoSelectAll.
Tip: If you want to use a component other than those listed, select
any component in the Property Inspector, and then manually change
it:
1. In the Structure window, right-click the component created by the dialog.
2. Choose Convert from the context menu.
3. Select the desired component from the list. You can then use the Property
Inspector to configure the new component.
4. Expand the Appearance section. You use this section to set the appearance of the
table, by setting the following table-specific attributes:
■ Width: Specify the width of the table. You can specify the width as either a
percentage or as a number of pixels. The default setting is 300 pixels.
■ ColumnStretching: If the widths of the columns do not together fill the whole
table, you can set this attribute to determine whether or not to stretch columns
to fill up the space, and if so, which columns should stretch.
Note: If the table is placed inside a component that can stretch its
children, only the table will stretch automatically. You must manually
configure column stretching if you want the columns to stretch to fill
the table.
Tip: While the user can change the values of the column width at
runtime, those values will not be retained once the user leaves the
page unless you configure your application to use change persistence.
For information about enabling and using change persistence, see
Chapter 31, "Allowing User Customization on JSF Pages."
10-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
5. Expand the Behavior section. You use this section to configure the behavior of the
table by setting the following table-specific attributes:
■ DisableColumnReordering: By default, columns can be reordered at runtime
using a menu option contained by default in the panelCollection
component. You can change this so that users will not be able to change the
order of columns. (The panelCollection component provides default
menus and toolbar buttons for tables, trees, and tree tables. For more
information, see Section 10.8, "Displaying Table Menus, Toolbars, and Status
Bars".)
Note: While the user can change the order of columns, those values
will not be retained once the user leaves the page unless you configure
your application to allow user customization. For information, see
Chapter 31, "Allowing User Customization on JSF Pages."
■ FetchSize: Set the size of the block that should be returned with each data
fetch. The default is 25.
■ DisplayRow: Specify the row to be displayed in the table during the initial
display. The possible values are first to display the first row at the top of the
table, last to display the last row at the bottom of the table (users will need
to scroll up to view preceding rows) and selected to display the first
selected row in the table.
Note: The total number of rows from the table model must be known
in order for this attribute to work successfully.
■ DisplayRowKey: Specify the row key to display in the table during initial
display. This attribute should be set programmatically rather than
declaratively because the value may not be strings. Specifying this attribute
will override the displayRow attribute.
Note: The total number of rows must be known from the table model
in order for this attribute to work successfully.
■ EditingMode: Specify whether for any editable components, you want all the
rows to be editable (editAll), or you want the user to click a row to make it
editable (clickToEdit). For more information, see Section 10.1.3, "Editing
Data in Tables, Trees, and Tree Tables."
Tip: If you choose clickToEdit, then only the active row can be
edited. This row is determined by the activeRowKey attribute. By
default, when the table is first rendered, the active row is the first
visible row. When a user clicks another row, then that row becomes
the active row. You can change this behavior by setting a different
value for the activeRowKey attribute.
10-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
■ Filterable: Specify whether or not the column can be filtered. A column that
can be filtered has a filter field on the top of the column header. Note that in
order for a column to be filterable, this attribute must be set to true and the
filterModel attribute must be set on the table. Only leaf columns can be
filtered and the filter component is displayed only if the column header is
present. This column's sortProperty attribute must be used as a key for the
filterProperty attribute in the filterModel class.
7. Expand the Appearance section. Use this section to set the appearance of the
column, using the following column-specific attributes:
■ DisplayIndex: Specify the display order index of the column. Columns can be
rearranged and they are displayed in the table based on the displayIndex
attribute. Columns without a displayIndex attribute value are displayed at
the end, in the order in which they appear in the data source. The
displayIndex attribute is honored only for top-level columns, because it is
not possible to rearrange a child column outside of the parent column.
■ Width: Specify the width of the column.
■ MinimumWidth: Specify the minimum number of pixels for the column
width. When a user attempts to resize the column, this minimum width will
be enforced. Also, when a column is flexible, it will never be stretched to be a
size smaller than this minimum width. If a pixel width is defined and if the
minimum width is larger, the minimum width will become the smaller of the
two values. By default, the minimum width is 10 pixels.
■ ShowRequired: Specify whether or not an asterisk should be displayed in the
column header if data is required for the corresponding attribute.
■ HeaderNoWrap and NoWrap: Specify whether or not you want content to
wrap in the header and in the column.
■ RowHeader: Set to true if you want this column to be a row header for the
table.
8. Expand the Behavior section. Use this section to configure the behavior of the
columns, using the following column-specific attributes:
■ SortProperty: Specify the property that is to be displayed by this column. This
is the property that the framework might use to sort the column’s data.
■ Frozen: Specify whether the column is frozen; that is they can’t be scrolled off
the page. In the table, columns up to the frozen column are locked with the
header, and not scrolled with the rest of the columns. The frozen attribute is
honored only on the top-level column, because it is not possible to freeze a
child column by itself without its parent being frozen.
■ Selected: When set to true, the column will be selected on initial rendering.
9. To add a column to an existing table, in the Structure window, right-click the table
and from the context menu choose Insert Inside Table > Column.
10. To add facets to the table, right-click the table and from the context menu, choose
Facets - Table and choose the type of facet you want to add. You can then add a
component directly to the facet.
Tip: Facets can have only one direct child. If you want the facet to
display more than one component, first insert a group component
(such as panelGroupLayout) and then insert the multiple
components as children to the group component.
11. To add facets to a column, right-click the column and from the context menu,
choose Facets - Column and choose the type of facet you want to add. You can
then add a component directly to the facet.
Tip: Facets can have only one direct child. If you want the facet to
display more than one component, first insert a group component
(such as panelGroupLayout) and then insert the multiple
components as children to the group component.
10-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
The component’s value should be bound to the variable value set on the table’s
var attribute and the attribute to be displayed. For example, the table in the File
Explorer application uses file as the value for the var attribute, and the first
column displays the name of the file for each row. Therefore, the value of the
output component used to display the directory name is #{file.name}.
</f:facet>
<af:outputText value="#{file.property.size}" noWrap="true"/>
</af:column>
...
<af:column width="100">
<f:facet name="header">
<af:outputText value="#{explorerBundle['global.properties']}"/>
</f:facet>
<af:commandLink text="#{explorerBundle['global.properties']}"
partialSubmit="true"
action="#{explorer.launchProperties}"
returnListener="#{explorer.returnFromProperties}"
windowWidth="300" windowHeight="300"
useWindow="true"></af:commandLink>
</af:column>
</af:table>
When the user clicks a sortable column header, the table component generates a
SortEvent event. This event has a getSortCriteria property, which returns the
criteria by which the table must be sorted. The table responds to this event by calling
the setSortCriteria() method on the underlying CollectionModel instance,
and calls any registered SortListener instances.
10.2.7 What You May Need to Know About Programmatically Enabling Sorting for Table
Columns
Sorting can be enabled for a table column only if the underlying model supports
sorting. If the model is a CollectionModel instance, it must implement the
following methods:
public boolean isSortable(String propertyName)
public List getSortCriteria()
public void setSortCriteria(List criteria)
10-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tables
10.2.8 What You May Need to Know About Performing an Action on Selected Rows in
Tables
A table can allow users to select one or more rows and perform some actions on those
rows.
When the selection state of a table changes, the table triggers selection events. A
selectionEvent event reports which rows were just deselected and which rows
were just selected.
To listen for selection events on a table, you can register a listener on the table either
using the selectionListener attribute or by adding a listener to the table using the
addselectionListener() method. The listener can then access the selected rows
and perform some actions on them.
The current selection, that is the selected row or rows, are the RowKeySet object,
which you obtain by calling the getSelectedRowKeys() method for the table. To
change a selection programmatically, you can do either of the following:
■ Add rowKey objects to, or remove rowKey objects from, the RowKeySet object.
■ Make a particular row current by calling the setRowIndex() or the
setRowKey() method on the table. You can then either add that row to the
selection, or remove it from the selection, by calling the add() or remove()
method on the RowKeySet object.
Example 10–3 shows a portion of a table in which a user can select some rows then
click the Delete button to delete those rows. Note that the actions listener is bound to
the performDelete method on the mybean managed bean.
Example 10–4 shows an actions method, performDelete, which iterates through all
the selected rows and calls the markForDeletion method on each one.
10.2.9 What You May Need to Know About Dynamically Determining Values for
Selection Components in Tables
There may be a case when you want to use a selectOne component in a table, but
you need each row to display different choices in a component. Therefore, you need to
dynamically determine the list of items at runtime.
While you may think you should use a forEach component to stamp out the
individual items, this will not work because forEach does not work with the
CollectionModel instance. It also cannot be bound to EL expressions that use
component-managed EL variables, as those used in the table. The forEach
component performs its functions in the JSF tag execution step while the table
performs in the following component encoding step. Therefore, the forEach
component will execute before the table is ready and will not perform its iteration
function.
In the case of a selectOne component, the direct child must be the items
component. While you could bind the items component directly to the row variable
(for example, <f:items value="#{row.Items}"/>, doing so would not allow
any changes to the underlying model.
Instead, you should create a managed bean that creates a list of items, as shown in
Example 10–5.
10-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Hidden Capabilities to a Table
}
// Return the items
return items;
}
You can then access the list from the one component on the page, as shown in
Example 10–6.
10.2.10 What You May Need to Know About Using the Iterator Tag
When you do not want to use a table, but still need the same stamping capabilities,
you can use the iterator tag. For example, say you want to display a list of periodic
table elements, and for each element, you want to display the name, atomic number,
symbol, and group. You can use the iterator tag as shown in Example 10–7.
Each child is stamped as many times as necessary. Iteration starts at the index specified
by the first attribute for as many indexes specified by the row attribute. If the row
attribute is set to 0, then the iteration continues until there are no more elements in the
underlying data.
Figure 10–14 shows the same table, but with the detailStamp facet expanded for the
first row.
Note: If you set the table to allow columns to freeze, the freeze will
not work when you display the detailStamp facet. That is, a user
cannot freeze a column while the details are being displayed.
Tip: If the facet folder does not appear in the Structure window,
right-click the table and choose Facets - Table > Detail Stamp.
10-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Enabling Filtering in Tables
2. If the attribute to be displayed is specific to a current record, replace the JSF code
(which simply binds the component to the attribute), so that it uses the table’s
variable to display the data for the current record.
Example 10–8 shows abbreviated code used to display the detailStamp facet
shown in Figure 10–14, which shows details about the selected row.
Note: If your application uses the Fusion technology stack, then you
can drag attributes from a data control and drop them into the
detailStamp facet. You don’t need to modify the code.
Filtered table searches are based on Query-by-Example and use the QBE text or date
input field formats. The input validators are turned off to allow for entering characters
for operators such as > and < to modify the search criteria. For example, you can enter
>1500 as the search criteria for a number column. Wildcard characters may also be
supported. Searches can be either case-sensitive or case-insensitive. If a column does
not support QBE, the search criteria input field will not render for that column.
The filtering feature uses a model for filtering data into the table. The table’s
filterModel attribute object must be bound to an instance of the
FilterableQueryDescriptor class.
Note: If your application uses the Fusion technology stack, then you
can use data controls to create tables and filtering will be created for
you. For more information see the "Creating ADF Databound Tables"
chapter of the Oracle Fusion Middleware Web User Interface Developer's
Guide for Oracle Application Development Framework
In Example 10–9, the table filterVisible attribute is set to true to enable the filter
input fields, and the sortProperty attribute is set on the column to identify the
column in the filterModel instance. Each column element has its filterable
attribute set to true.
10-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Trees
4. In the Structure window, select a column in the table and in the Property Inspector,
and set the following for each column in the table:
■ Filterable: Set to true.
■ FilterFeatures: Set to caseSensitive or caseInsensitive. If not
specified, the case sensitivity is determined by the model.
collapse portions of the hierarchy. Figure 10–17 shows a tree used to display directories
in the File Explorer application.
The ADF Faces tree component uses a model to access the data in the underlying
hierarchy. The specific model class is oracle.adf.view.rich.model.TreeModel,
which extends CollectionModel, described in Section 10.2, "Displaying Data in
Tables."
You must create your own tree model to support your tree. The tree model is a
collection of rows. It has an isContainer() method that returns true if the current
row contains child rows. To access the children of the current row, you call the
enterContainer() method. Calling this method results in the TreeModel instance
changing to become a collection of the child rows. To revert back up to the parent
collection, you call the exitContainer() method.
You may find the oracle.adf.view.rich.model.ChildPropertyTreeModel
class useful when constructing a TreeModel class, as shown in Example 10–10.
10-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Trees
Note: If your application uses the Fusion technology stack, then you
can use data controls to create trees and the model will be created for
you. For more information see the "Displaying Master-Detail Data"
chapter of the Oracle Fusion Middleware Web User Interface Developer's
Guide for Oracle Application Development Framework
You can manipulate the tree similar to the way you can manipulate a table. You can do
the following:
■ To make a node current, call the setRowIndex() method on the tree with the
appropriate index into the list. Alternatively, call the setRowKey() method with
the appropriate rowKey object.
■ To access a particular node, first make that node current, and then call the
getRowData() method on the tree.
■ To access rows for expanded or collapsed nodes, call getAddedSet and
getRemovedSet methods on the RowDisclosureEvent. For more information,
see Section 10.5.4, "What You May Need to Know About Programmatically
Expanding and Collapsing Nodes."
■ To manipulate the node’s child collection, call the enterContainer() method
before calling the setRowIndex() and setRowKey() methods. Then call the
exitContainer() method to return to the parent node.
■ To point to a rowKey for a node inside the tree (at any level) use the
focusRowKey attribute. The focusRowKey attribute is set when the user
right-clicks on a node and selects the Show as top context menu item (or the Show
as top toolbar button in the panelCollection component).
When the focusRowKey attribute is set, the tree renders the node pointed to by
the focusRowKey attribute as the root node in the Tree and displays a
Hierarchical Selector icon next to the root node. Clicking the Hierarchical Selector
icon displays a Hierarchical Selector dialog which shows the path to the
focusRowKey object from the root node of the tree. How this displays depends on
the components placed in the pathStamp facet.
As with tables, trees use stamping to display content for the individual nodes. Trees
contain a nodeStamp facet, which is a holder for the component used to display the
data for each node. Each node is rendered (stamped) once, repeatedly for all nodes. As
each node is stamped, the data for the current node is copied into a property that can
be addressed using an EL expression. Specify the name to use for this property using
the var property on the tree. Once the tree has completed rendering, this property is
removed or reverted back to its previous value.
Because of this stamping behavior, only certain types of components are supported as
children inside an ADF Faces tree. All components that have no behavior are
supported, as are most components that implement the ValueHolder or
ActionSource interfaces.
In Example 10–11, the data for each element is referenced using the variable node,
which identifies the data to be displayed in the tree. The nodeStamp facet displays the
data for each element by getting further properties from the node variable:
Trees also contain a pathStamp facet. This facet determines how the content of the
Hierarchical Selector dialog is rendered, just like the nodeStamp facet determines how
the content of the tree is rendered. The component inside the pathStamp facet can be
a combination of simple outputText, image, and outputFormatted tags and
cannot not be any input component (that is, any EditableValueHolder component)
because no user input is allowed in the Hierarchical Selector popup. If this facet is not
provided, then the Hierarchical Selector icon is not rendered.
For example, including an image and an outputText component in the pathStamp
facet causes the tree to render an image and an outputText component for each node
level in the Hierarchical Selector dialog. Use the same EL expression to access the
value. For example, if you want to show the first name for each node in the path in an
outputText component, the EL expression would be <af:outputText
value="#{node.firstname}"/>.
10-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Trees
the model rows and renders each node. For any given node, the varStatus
attribute provides the following information:
– model: A reference to the CollectionModel instance
– index: The current row index
– rowKey: The unique key for the current node
4. Expand the Appearance section and set the following attributes:
■ DisplayRow: Specify the node to display in the tree during the initial display.
The possible values are first to display the first node, last to display the
last node, and selected to display the first selected node in the tree. The
default is first.
■ DisplayRowKey: Specify the row key to display in the tree during the initial
display. This attribute should be set only programatically. Specifying this
attribute will override the displayRow attribute.
■ Summary: Optionally enter a summary of the data displayed by the tree.
5. Expand the Behavior section and set the following attributes:
■ InitiallyExpanded: Set to true if you want all nodes expanded when the
component first renders.
■ EditingMode: Specify whether for any editable components used to display
data in the tree, you want all the nodes to be editable (editAll), or you want
the user to click a node to make it editable (clickToEdit). For more
information, see Section 10.1.3, "Editing Data in Tables, Trees, and Tree Tables."
■ ContextMenuSelect: Determines whether or not the node is selected when
you right-click to open a context menu. When set to true, the node is selected.
For more information about context menus, see Chapter 13, "Using Popup
Dialogs, Menus, and Windows."
■ RowSelection: Set a value to make the nodes selectable. Valid values are:
none, single, or multiple. For information about how to then
programatically perform some action on the selected nodes, see Section 10.5.5,
"What You May Need to Know About Programmatically Selecting Nodes."
■ ContentDelivery: Specify whether or not data should be fetched when the
component is rendered initially. When the contentDelivery attribute is
immediate, data is fetched as the component is rendered. If the
contentDelivery attribute is lazy, data will be fetched and delivered to
the client during a subsequent request. For more information, see
Section 10.1.1, "Content Delivery."
■ FetchSize: Specify the number of rows in the data fetch block. For more
information, see Section 10.1.1, "Content Delivery."
■ SelectionListener: Optionally enter an EL expression for a listener that
handles selection events. For more information, see Section 10.5.5, "What You
May Need to Know About Programmatically Selecting Nodes."
■ FocusListener: Optionally enter an EL expression for a listener that handles
focus events.
■ RowDisclosureListener: Optionally enter an EL expression for a listener
method that handles node disclosure events.
6. Expand the Advanced section and set the following attributes:
The component’s value should be bound to the variable value set on the tree’s var
attribute and the attribute to be displayed. For example, the tree in the File
Explorer application uses folder as the value for the var attribute, and displays
the name of the directory for each node. Therefore, the value of the output
component used to display the directory name is #{folder.name}.
Tip: Facets can accept only one child component. Therefore, if you
want to use more than one component per node, place the
components in a group component that can be the facet’s direct child,
as shown in Figure 10–18.
10-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Trees
<af:panelGroupLayout>
<af:image id="folderNodeStampImg" source="#{folder.icon}"
inlineStyle="vertical-align:middle; margin-right:3px;
shortDesc="folder icon"/>
<af:outputText id="folderNodeStampText" value="#{folder.name}"/>
</af:panelGroupLayout>
</f:facet>
</af:tree>
10.5.4 What You May Need to Know About Programmatically Expanding and Collapsing
Nodes
The RowDisclosureEvent event has two RowKeySet objects: the RemovedSet
object for all the collapsed nodes and the AddedSet object for all the expanded nodes.
The component expands the subtrees under all nodes in the added set and collapses
the subtrees under all nodes in the removed set.
Your custom rowDisclosureListener method can do post-processing, on the tree
component, as shown in Example 10–13.
The backing bean method that handles row disclosure events is shown in
Example 10–14. The example illustrates expansion of a tree node. For the contraction
of a tree node, you would use getRemovedSet.
if (rks != null) {
int setSize = rks.size();
if (setSize > 1) {
throw new Exception("Unexpected multiple row disclosure
added row sets found.");
}
if (setSize == 0) {
// nothing in getAddedSet indicates this is a node
// contraction, not expansion. If interested only in handling
// node expansion at this point, return.
return;
}
rowKey = rks.iterator().next();
tree.setRowKey(rowKey);
rowData = tree.getRowData();
The backing bean method that handles the disclosed row keys is shown in
Example 10–16.
10-36 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Data in Tree Tables
10.5.5 What You May Need to Know About Programmatically Selecting Nodes
The tree and tree table components allow nodes to be selected, either a single node
only, or multiple nodes. If the component allows multiple selections, users can select
multiple nodes using Control+click and Shift+click operations.
When a user selects or deselects a node, the tree component fires a selectionEvent
event. This event has two RowKeySet objects: the RemovedSet object for all the
deselected nodes and the AddedSet object for all the selected nodes.
Tree and tree table components keep track of which nodes are selected using an
instance of the class oracle.adf.view.rich.model.RowKeySet. This instance is
stored as the selectedRowKeys attribute on the component. You can use this
instance to control the selection state of a node in the hierarchy programatically. Any
node contained by the RowKeySet instance is deemed selected, and all other nodes
are not selected. The addAll() method adds all nodes to the set, and the and
removeAll() method removes all the nodes from the set. Tree and tree table node
selection works in the same way as table row selection. You can refer to sample code
for table row selection in Section 10.2.8, "What You May Need to Know About
Performing an Action on Selected Rows in Tables."
The immediate children of a tree table component must be column components, in the
same way as for table components. Unlike the table, the tree table component has a
nodeStamp facet which holds the column that contains the primary identifier of an
node in the hierarchy. The treeTable component supports the same stamping
behavior as the Tree component (for details, see Section 10.5, "Displaying Data in
Trees").
For example, in the File Explorer application (as shown in Figure 10–19), the primary
identifier is the file name. This column is what is contained in the nodeStamp facet.
The other columns, such as Type and Size, display attribute values on the primary
identifier, and these columns are the direct children of the tree table component. This
tree table uses node as the value of the variable that will be used to stamp out the data
for each node in the nodeStamp facet column and each component in the child
columns. Example 10–17 shows abbreviated code for the tree table in the File Explorer
application.
10-38 Web User Interface Developer's Guide for Oracle Application Development Framework
Passing a Row as a Value
The tree table component supports many of the same attributes as both tables and
trees. For more information about these attributes see Section 10.2, "Displaying Data in
Tables" and Section 10.5, "Displaying Data in Trees."
Tip: The attributes of the tree table are the same as those on the table
and tree components. Refer to Section 10.2.4, "How to Display a Table
on a Page," and Section 10.5.1, "How to Display Data in Trees" for help
in configuring the attributes.
</af:table>
When the user clicks the command button on an employee row, the listener executes,
and the value of #{emp} is retrieved, which corresponds to the current row
(employee) in the table. The retrieved row object is stored as the empDetail property
of pageFlowScope with the #{pageFlowScope.empDetail} EL expression. Then
the action event executes with the static outcome, and the user is navigated to a detail
page. On the detail page, the outputText components get their value from
pageFlowScope.empDetail objects, as shown in Example 10–19.
Figure 10–20 Panel Collection for Tree Table with Menus and Toolbar
10-40 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Table Menus, Toolbars, and Status Bars
The default top-level menu and toolbar items vary depending on the component used
as the child of the panelCollection component:
■ Table and tree: Default top-level menu is View.
■ Table and tree table with selectable columns: Default top-level menu items are
View and Format.
■ Table and tree table: Default toolbar menu is Detach.
■ Table and tree table with selectable columns: Default top-level toolbar items are
Freeze, Detach, and Wrap
■ Tree and tree table (when the pathStamp facet is used): The toolbar buttons Go
Up, Go To Top, and Show as Top also appear.
Example 10–20 shows how the panelCollection component contains menus and
toolbars.
Example 10–20 The panelCollection Component with Table, Menus, and Toolbars
<af:panelCollection
binding="#{editor.component}">
<f:facet name="viewMenu">
<af:group>
<af:commandMenuItem text="View Item 1..."/>
<af:commandMenuItem text="View Item 2.."/>
<af:commandMenuItem text="View Item 3..." disabled="true"/>
<af:commandMenuItem text="View Item 4"/>
</af:group>
</f:facet>
<f:facet name="menus">
<af:menu text="Actions">
<af:commandMenuItem text="Add..." />
<af:commandMenuItem text="Create.." />
<af:commandMenuItem text="Update..." disabled="true"/>
<af:commandMenuItem text="Copy"/>
<af:commandMenuItem text="Delete"/>
<af:commandMenuItem text="Remove" accelerator="control A"/>
<af:commandMenuItem text="Preferences"/>
</af:menu>
</f:facet>
<f:facet name="toolbar">
<af:toolbar>
<af:commandToolbarButton shortDesc="Create" icon="/new_ena.png">
</af:commandToolbarButton>
<af:commandToolbarButton shortDesc="Update" icon="/update_ena.png">
</af:commandToolbarButton>
<af:commandToolbarButton shortDesc="Delete" icon="/delete_ena.png">
</af:commandToolbarButton>
</af:toolbar>
</f:facet>
<f:facet name="secondaryToolbar">
</f:facet>
<f:facet name="statusbar">
<af:toolbar>
<af:outputText id="statusText" ... value="Custom Statusbar Message"/>
</af:toolbar>
</f:facet>
<af:table rowselection="multiple" columnselection="multiple"
...
<af:column
...
</af:column>
10-42 Web User Interface Developer's Guide for Oracle Application Development Framework
Exporting Data from Table, Tree, or Tree Table
shows the table from the ADF Faces application that includes a command button
component that allows users to export the data to an Excel spreadsheet.
When the user clicks the command button, the listener processes the exporting of all
the rows to Excel. As shown in Figure 10–21, you can also configure the
exportCollectionActionListener component so that only the rows the user
selects are exported.
Depending on the browser, and the configuration of the listener, the browser will
either open a dialog, allowing the user to either open or save the spreadsheet as shown
in Figure 10–22, or the spreadsheet will be displayed in the browser. For example, if
the user is viewing the page in Microsoft Internet Explorer, and no file name has been
specified on the exportCollectionActionListener component, the file is
displayed in the browser. In Mozilla Firefox, the dialog opens.
If the user chooses to save the file, it can later be opened in Excel, as shown in
Figure 10–23. If the user chooses to open the file, what happens depends on the
browser. For example, if the user is viewing the page in Microsoft Internet Explorer,
the spreadsheet opens in the browser window. If the user is viewing the page in
Mozilla Firefox, the spreadsheet opens in Excel.
10.9.1 How to Export Table, Tree, or Tree Table Data to an External Format
You create a command component, such as a button, link, or menu item, and add the
exportCollectionActionListener inside this component. Then you associate
the data collection you want to export by setting the
exportCollectionActionListener component’s exportedId attribute to the ID
of the collection component whose data you wish to export.
Tip: If you want users to be able to select rows to export, then set
your table to allow selection. For more information, see Section 10.2.2,
"Formatting Tables."
Tip: If you want your table, tree, or tree table to have a toolbar that
will hold command components, you can wrap the collection
component in a panelCollection component. This component
adds toolbar functionality. For more information, see Section 10.8,
"Displaying Table Menus, Toolbars, and Status Bars."
You may want to change the default label of the command component to a
meaningful name such as Export to Excel.
2. In the Component Palette, from the Operations panel, drag an Export Collection
Action Listener as a child to the command component.
3. In the Insert Export Collection Action Listener dialog, set the following:
■ ExportedId: Specify the ID of the table, tree, or tree table to be exported. Either
enter it manually or use the dropdown menu to choose Edit. Use the Edit
Property dialog to select the component.
■ Type: Set to excelHTML.
10-44 Web User Interface Developer's Guide for Oracle Application Development Framework
Accessing Selected Values on the Client from Components That Use Stamping
10.9.2 What Happens at Runtime: How Row Selection Affects the Exported Data
Exported data is exported in index order, not selected key order. This means that if you
allow selected rows to be exported, and the user selects rows (in this order) 8, 4, and 2,
then the rows will be exported and displayed in Excel in the order 2, 4, 8.
change listener on the client and then have that listener handle determining the
selected row, finding the associated stamped component for that row, use the stamped
component to determine the row-specific name, and finally interact with the selected
data as needed.
Example 10–22 Table Component Uses an outputText Component for Stamped Rows
<af:table var="row" value="#{data}" rowSelection="single">
<af:column headerText="Name">
<af:outputText value="#{row.name}"/>
</af:column>
</af:table>
This code causes the mySelectedRow function to be called any time the selection
changes.
4. In your JavaScript library, implement the function entered in the last step. This
function should do the following:
■ Figure out what row was selected. To do this, use the event object that is
passed into the listener. In the case of selection events, the event object is of
type AdfSelectionEvent. This type provides access to the newly selected
row keys via the getAddedSet() method, which returns a POJSO (plain old
JavaScript object) that contains properties for each selected row key. Once you
have access to this object, you can iterate over the row keys using a "for in"
loop. For example, the code in Example 10–24 extracts the first row key (which
in this case, is the only row key).
10-46 Web User Interface Developer's Guide for Oracle Application Development Framework
Accessing Selected Values on the Client from Components That Use Stamping
var firstRowKey;
var addRowKeys=event.getAddedSet();
■ Find the stamped component associated with the selected row. The client-side
component API AdfUIComponent exposes a findComponent() method
that takes the ID of the component to find and returns the AdfUIComponent
instance. When using stamped components, you need to find a component not
just by its ID, but by the row key as well. In order to support this, the
AdfUITable class provides an overloaded method of findComponent(),
which takes both an ID as well as a row key.
In the case of selection events, the component is the source of the event. So
you can get the table from the source of the event and then use the table to
find the instance using the ID and row key. Example 10–25 shows this, where
nameStamp is the ID of the table.
// Use the table to find the name stamp component by id/row key:
var nameStamp = table.findComponent("nameStamp", firstRowKey);
5. Add any additional code needed to work with the component. Once you have the
stamped component, you can interact with it as you would with any other
component. For example, Example 10–26 shows how to use the stamped
component to get the row-specific value of the name attribute (which was the
stamped value as shown in Example 10–22)and then display the name in an alert.
firstRowKey = rowKey;
break;
}
// We need the table to find our stamped component.
// Fortunately, in the case of selection events, the
// table is the event source.
var table = event.getSource();
// We use the table to find the name stamp component by id/row key:
var nameStamp = table.findComponent("nameStamp", firstRowKey);
if (nameStamp)
{
// This is the row-specific name
var name = nameStamp.getValue();
10.10.2 What You May Need to Know About Accessing Selected Values
Row keys are tokenized on the server, which means that the row key on the client may
have no resemblance to the row key on the server. As such, only row keys that are
served up by the client-side APIs (like AdfSelectionEvent.getAddedSet()) are
valid.
Also note that AdfUITable.findComponent(id, rowKey)method may return
null if the corresponding row has been scrolled off screen and is no longer available
on the client. Always check for null return values from
AdfUITable.findComponent() method.
10-48 Web User Interface Developer's Guide for Oracle Application Development Framework
11
11 Using List-of-Values Components
In this form, the employee name field is an LOV that contains a list of employees.
When the user clicks the search icon of the inputListOfValues component, a
Search and Select popup dialog displays all employees, along with a search field that
allows the user to search for the employee, as shown in Figure 11–2.
When the user returns to the page, the current information for that employee is
displayed in the form, as shown in Figure 11–3. The user can then edit and save the
data.
Other list components, such as selectOneChoice, also allow users to select from a
list, but they do not include a popup dialog and they are intended for smaller lists.
This chapter describes only the inputListOfValues and
inputComboboxListOfValues LOV components. For more information about
select choice components, list box components, and radio buttons, see Chapter 9,
"Using Input Components and Defining Forms."
As shown in the preceding figures, the inputListOfValues component provides a
popup dialog from which the user can search for and select an item. The list is
displayed in a table. In contrast, the inputComboboxListOfValues component
allows the user two different ways to select an item to input: from a simple dropdown
list, or by searching as you can in the inputListOfValues component. Note that the
columns of the table will not stretch to the full width of the dialog.
You can also create custom content to be rendered in the Search and Select dialog by
using the searchContent facet. You define the returnPopupDataValue attribute
11-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to List-of-Values Components
and programmatically set it with a value when the user selects an item from the Search
and Select dialog and then closes the dialog. This value will be the return value from
ReturnPopupEvent to the returnPopupListener. When you implement the
returnPopupListener, you can perform functions such as setting the value of the
LOV component, its dependent components, and displaying the custom content. In the
searchContent facet you can add components such as tables, trees, and inputText to
display your custom content.
If you implement both the searchContent facet and the ListOfValues model, the
searchContent facet implementation will take precedence in rendering the Search
and Select dialog. Example 11–1 show the code to display custom content using a table
component.
Example 11–1 Adding Custom Content to the Search and Select Dialog
<af:inputListOfValues model="#{bean.listOfValuesModel}"
...
returnPopupDataValue="#{bean.returnPopupDataValue}"
returnPopupListener="#{bean.returnPopupListener}">
<f:facet name="searchContent">
<af:table id="t1" value="#{bean.listModel}" var="row"
selectionListener="#{bean.selected}"
...
</f:facet>
</af:inputListOfValues>
If the readOnly attribute is set to true, the input field is disabled. If readOnly is set
to false, then the editMode attribute determines which type of input is allowed. If
editMode is set to select, the value can be entered only by selecting from the list. If
editMode is set to input, then the value can also be entered by typing.
You can also implement the LOV component to automatically display a list of
suggested items when the user types in a partial value. For example, when the user
enters Ca, then a suggested list which partially matches Ca is displayed as a suggested
items list, as shown in Figure 11–4.
The user can select an item from this list to enter it into the input field, as shown in
Figure 11–5.
You add the auto suggest behavior by adding the af:autoSuggestBehavior tag
inside the LOV component with the tag’s suggestItems values set to a method that
retrieves and displays the list. You can create this method in a managed bean. If you
are using ADF Model, the method is implemented by default. You also need to set the
component’s autoSubmit property to true.
In your LOV model implementation, you can implement a smart list that filters the list
further. You can implement a smart list for both LOV components. If you are using
ADF Model, the inputComboboxListOfValues allows you declaratively select a
smart list filter defined as a view criteria for that LOV. If the smart list is implemented,
and auto suggest behavior is also used, auto suggest will search from the smart list
first. If the user waits for two seconds without a gesture, auto suggest will also search
from the full list and append the results. Example 11–2 shows the code for an LOV
component with both auto suggest behavior and smart list.
11-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to List-of-Values Components
implementing any logic for the commandLink to perform its intended action, for
example, launching a popup dialog.
The number of columns to be displayed for each row can be retrieved from the model
using the getItemDescriptors() method. The default is to show all the columns.
The popup dialog from within an inputListOfValues component or the optional
search popup dialog in the inputComboboxListOfValues component also
provides the ability to create a new record. For the inputListOfValues component,
when the createPopupId attribute is set on the component, a toolbar component
with a commandToolbarButton is displayed with a create icon. At runtime, a
commandToolbarButton component appears in the LOV popup dialog, as shown in
Figure 11–7.
When the user clicks the Create button, a popup dialog is displayed that can be used
to create a new record. For the inputComboboxListOfValues, instead of a toolbar,
a commandLink with the label Create is displayed in the customActions facet, at
the bottom of the dialog. This link launches a popup where the user can create a new
record. In both cases, you must provide the code to actually create the new record.
Like the query components, the LOV components rely on a data model to provide the
functionality. This data model is the ListOfValuesModel class. This model uses a
table model to display the list of values, and can also access a query model to perform
a search against the list. You must implement the provided interfaces for the
ListOfValuesModel in order to use the LOV components.
When the user selects an item in the list, the data is returned as a list of objects for the
selected row, where each object is the rowData for a selected row. The list of objects is
available on the ReturnPopupEvent event, which is queued after a selection is made.
If you choose to also implement a QueryModel class, then the popup dialog will
include a Query component that the user can use to perform a search and to filter the
list. Note the following about using the Query component in an LOV popup dialog:
■ The saved search functionality is not supported.
■ The Query component in the popup dialog and its functionality is based on the
corresponding QueryDescriptor class.
■ The only components that can be included in the LOV popup dialog are query,
toolbar, and table.
When the user clicks the Search button to start a search, the
ListOfValuesModel.performQuery() method is invoked and the search is
performed. For more information about the query model, see Chapter 12, "Using
Query Components."
Both components support the auto-complete feature, which allows the user to enter a
partial value in the input field, tab out, and have the dialog populated with the rows
that match the partial criteria. For this to work, you must implement logic so that
when the user tabs out after a partial entry, the entered value is posted back to the
server. On the server, your model implementation filters the list using the partially
entered value and performs a query to retrieve the list of values. ADF Faces provides
APIs for this functionality.
11-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating the ListOfValues Data Model
11-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the inputListOfValues Component
If the component is being used with a data model such as ADF Model, the
suggestedItem method should be provided by the default implementation.
8. If you are not using ADF Model, create the suggestedItems method to process
and display the list. The suggestedItems method signature is shown in
Example 11–4.
11-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the InputComboboxListOfValues Component
you have added a dialog to the popup, then it will intelligently decide when to
refresh the table. If you have not added a dialog to the popup, then the table
will always be refreshed.
■ launchPopupListener: Enter an EL expression that resolves to a
launchPopupListener handler that you implement to provide additional
functionality when the popup dialog is opened.
■ returnPopupListener: Enter an EL expression that resolves to a
returnPopupListener handler that you implement to provide additional
functionality when the value is returned.
The rest of the attributes in this section can be populated in the same manner as
any other input component. For more information, see Section 9.3, "Using the
inputText Component."
5. If you are using a launchPopupListener, you can use the getPopupType()
method of the LaunchPopupEvent class to differentiate the source of the event.
getPopupType() returns DROPDOWN_LIST if the event is a result of the launch
of the LOV Search and Select dialog, and SEARCH_DIALOG if the event is the result
of the user clicking the Search button in the dialog.
6. If you want users to be able to create a new item, create a popup dialog with the
ID given in Step 5. For more information, see Chapter 13, "Using Popup Dialogs,
Menus, and Windows."
7. In the Component Palette, from the Operations panel, drag an Auto Suggest
Behavior and drop it as child to the inputComboboxListOfValues component.
8. In the Insert Auto Suggest Behavior dialog, enter the EL expression that resolves to
a method that takes the submittedValue as the parameter and returns the list of
SelectItem(javax.faces.model.SelectItem) values.
If you are implementing this method in a managed bean, the JSF page entry
should have the format shown in Example 11–5.
If the component is being used with a data model such as ADF Model, the
suggestedItem method should be provided by the default implementation.
9. If you are not using the component with ADF Model, create the
suggestedItems method to process and display the list. The suggestedItems
method signature is shown in Example 11–6.
11-12 Web User Interface Developer's Guide for Oracle Application Development Framework
12
Using Query Components
12
This chapter describes how to use the query and quickQuery search panel
components.
This chapter includes the following sections:
■ Section 12.1, "Introduction to Query Components"
■ Section 12.2, "Implementing the Model for Your Query"
■ Section 12.3, "Using the quickQuery Component"
■ Section 12.4, "Using the query Component"
You can create seeded searches, that is, searches whose criteria are already determined
and from which the user can choose, or you can allow the user to add criterion and
then save those searches. For example, Figure 12–1 shows a seeded search for an
employee. The user can enter values for the criteria on which the search will execute.
The user can also choose the operands (greater than, equals, less than) and the
conjunction (matches all or matches any, which creates either an "and" or "or" query).
The user can click the Add Fields dropdown list to add one or more criteria and then
save that search. If the application is configured to use persistence, then those search
criteria, along with the chosen operands and conjunctions, can be saved and
reaccessed using a given search name (for more information about persistence, see
Chapter 31, "Allowing User Customization on JSF Pages").
The quickQuery component is a simplified version of the query component. The
user can perform a search on any one of the searchable attributes by selecting it from a
dropdown list. Figure 12–2 shows a quickQuery component in horizontal layout.
Both the query and quickQuery components use the QueryModel class to define
and execute searches. Create the associated QueryModel classes for each specific
search you want users to be able to execute.
12-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Implementing the Model for Your Query
2. Create a QueryListener handler method on a managed bean that listens for the
QueryEvent event (this will be referenced by a button on the query component).
This listener will invoke the proper APIs in the QueryModel to execute the query.
Example 12–1 shows the listener method of a basic QueryListener
implementation that constructs a String representation of the search criteria.
This String is then displayed as the search result.
12-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Implementing the Model for Your Query
Table 12–1 shows UI artifacts rendered for the query component, the associated class,
class property, and methods used by the artifact.
Table 12–1 Query UI Artifacts and Associated Model Class Operations and Properties
UI Artifact Class Property/Methods Used Comments
1 Search panel The QueryDescriptor instance Based on a saved search.
provides the items displayed in the
panel.
2 Disclosure icon Opens or closes the search panel
3 Match type radio Available through the Displays the default conjunction to use
button getConjunction() method on the between search fields, when a query is
ConjunctionCriterion class. performed. If a default is set, and it is the
same for all search fields, it appears
selected. If the search fields are configured
such that a mix of different conjunctions
must be used between them, then a value
may not be selected on the UI.
For example, if the All conjunction type is
used between all the search fields, then
All appears selected. If it is a mix of All
and Any, then none of the radio buttons
appears selected.
The Match Type will be read only if the
conjunctionReadOnly property is set to
true. Its not rendered at all when the
displayMode attribute is set to simple.
12-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Implementing the Model for Your Query
Table 12–1 (Cont.) Query UI Artifacts and Associated Model Class Operations and
UI Artifact Class Property/Methods Used Comments
4 Group of search The collection of search fields for a Displays one or more search fields
fields QueryDescriptor object is associated with the currently selected
represented by a search.
ConjunctionCriterion object,
returned by the method
getConjunctionCriterion() on the
QueryDescriptor class. The
getCriterionList() method returns
a List<Criterion> list.
5 Search field An AttributeCriterion class Each search field contains a label, an
provides information specific to a search operator, one or more value components
field instance. An (for example, an input text component),
AttributeCriterion object is an and an optional delete icon. The
item in the List<Criterion> list information required to render these can be
returned by getCriterionList() either specific to an instance of a search
method on the field (in a saved search) or it can be generic
ConjunctionCriterion class (see and unchanging regardless of which saved
#4). search it is part of.
An AttributeDescriptor class For example, assume an Employee
provides static information pertaining to business object contains the search fields
a search field. This is available through Employee Name and Salary.
the method getAttribute(), on the
A user can then configure two different
AttributeCriterion class.
searches: one named Low Salaried
The getConverter() method of the Employees and one named High Salaried
AttributeDescriptor class can be Employees. Both searches contain two
overridden to return a converter object search fields based on the Employee and
of type Salary attributes. Even though both
javax.faces.convert.Converter. saved searches are based on the same
When defined, the attribute value is attributes of the Employee object, the
converted using this converter instance. search field Salary is configured to have its
The default return value is null. default operator as less than and value as
50000.00 for the low Salaried Employees
The hasDependentCriterion
search and for the High Salaried
method in the AttributeCriterion
Employees search, with a default operator
class returns true if the criterion has
of greater than and value of 100000.00.
dependents. If the criterion has
Selecting the saved searches on the UI will
dependents, then the dependent
show the appropriate operator and values
criterion fields are refreshed when the
for that search.
value for this criterion changes. By
default this method returns false. Regardless of the search selected by the
user, the search field for Salary always has
to render a number component, and the
label always has to show Salary.
6 Saved Searches System- and user-saved searches are Displays a list of available system- and
dropdown available through the methods user-saved searches.
getSystemQueries() and
A Personalize option is also added if the
getUserQueries() on the
saveQueryMode property is set to
QueryModel class.
default. Selecting this option opens a
Personalize dialog, which allows users to
personalize saved searches. They can
duplicate or update an existing saved
search.
Table 12–2 shows the behaviors of the different UI artifacts, and the associated
methods invoked to execute the behavior.
12-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Implementing the Model for Your Query
12-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the quickQuery Component
search on one attribute, and if successful, may want to continue to a more complex
search. The quickQuery component supports this by allowing you to place command
components in the end facet, which you can bind to a method on a managed bean that
allows the user to switch from a quickQuery to a query component.
The quickQuery component renders the searchable criteria in a dropdown list and
then, depending on the type of the criteria chosen at runtime, the quickQuery
component renders different criteria fields based on the attribute type. For example, if
the attribute type is Number, it renders an inputNumberSpinbox component. You
do not need to add these components as long as you have implemented the complete
model for your query. If instead you have the logic in a managed bean and do not
need a complete model, then you create the quickQuery component artifacts
manually. For more information, see Section 12.3.2, "How to Use a quickQuery
Component Without a Model."
■ model: Enter an EL expression that evaluates to the class that implements the
QueryModel class, as created in Section 12.2, "Implementing the Model for
Your Query."
■ value: Enter an EL expression that evaluates to the class that implements the
QueryDescriptor class, as created in Section 12.2, "Implementing the Model
for Your Query."
3. Expand the Behavior section and set the following attributes:
■ conjunctionReadOnly: Specify whether or not the user should be able to set
the Match Any or Match All radio buttons. When set to false, the user can
set the conjunction. When set to true, the radio buttons will not be rendered.
■ queryListener: Enter an EL expression that evaluates to the QueryListener
handler you created in Section 12.2, "Implementing the Model for Your
Query."
4. Drag and drop a table (or other component that will display the search results)
onto the page. Set the results component’s PartialTriggers with the ID of the
quickQuery component. The value of this component should resolve to a
CollectionModel object that contains the filtered results.
5. If you want users to be able to click the Advanced link to turn the quickQuery
component into a full query component, add a command component to the End
facet of the quickQuery component, and implement logic that will hide the
quickQuery component and display the query component.
12-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the quickQuery Component
10. If you want users to be able to click the Advanced link to turn the quickQuery
component into a full query component, add a command component to the End
facet of the quickQuery component, and implement logic that will hide the
quickQuery component and display the query component.
11. In the Component Palette, from the Common Components panel, drag a table (or
other component that will display the search results) onto the page. Set the results
component’s PartialTriggers with the ID of the quickQuery component.
The value of this component should resolve to a CollectionModel object that
contains the filtered results.
12.3.3 What Happens at Runtime: How the Framework Renders the quickQuery
Component and Executes the Search
When the quickQuery component is bound to a QueryDescriptor object, the
selectOneChoice and inputText components are automatically added at runtime
as the page is rendered. However, you can provide your own components. If you do
provide both the component to display the searchable attributes and the inputText
components, then you need the QueryListener handler to get the name-value pair
from your components.
If you provide only your own component to show the searchable attributes (and use
the default input text component), the framework will display an input text
component. You must have your QueryListener handler get the attribute name
from the dropdown list and the value from the
QueryDescriptor.getCurrentCriterion() method to perform the query.
If you provide only your own component to collect the searchable attribute value (and
use the default selectOneChoice component to provide the attribute name), then
the framework will display the selectOneChoice component. You must have your
QueryListener handler get the attribute name from the
QueryDescriptor.getCurrentCriterion() method and the value from your
component.
If you choose not to bind the QuickQuery component value attribute to a
QueryDescriptor object, and you provide both components, when the Go button is
clicked, the framework queues a QueryEvent event with a null QueryDescriptor
object. The provided QueryListener handler then executes the query using the
changeValueListener handler to access the name and the input component to
access the value. You will need to implement a QueryListener handler to retrieve
the attribute name from your selectOneChoice component and the attribute value
from your inputText component, and then perform a query.
Table 12–3 Rendered Component for Search Criteria Field of Type String
Component When Multiple
Operator Component Select Is Enabled
Starts with af:inputText af:inputText
If the underlying attribute is the Number data type, the component that will be
rendered is shown in Table 12–4.
12-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the query Component
Table 12–4 Rendered Component for Search Criteria Field of Type Number
Component When Multiple
Operator Component Select Is Enabled
Equals Default list type hint af:selectManyChoice
If the underlying attribute is the Date data type, the component that will be rendered
is shown in Table 12–5.
Table 12–5 Rendered Component for Search Criteria Field of Type Date
Component When Multiple
Operator Component Select Is Enabled
Equals Default list type hint af:selectManyChoice
If a search criterion's underlying attribute was defined as an LOV, in order for the
auto-complete feature to work, the ListOfValues model instance returned by the
getModelList method of the AttributeCriterion class must return true for its
isAutoCompleteEnabled method. For more information about LOV, see
Chapter 11, "Using List-of-Values Components."
When autoSubmit is set to true, any value change on the search criterion will be
immediately pushed to the model. The query component will automatically flush its
criterion list only when it has dependent criteria. If the criterion instance has no
dependent criteria but autoSubmit is set to true, then the query component will be
only partially refreshed.
A Match All or Match Any radio button group further modifies the query. A Match
All selection is essentially an AND function. The query will return only rows that match
all the selected criteria. A Match Any selection is an OR function. The query will return
all rows that match any one of the criteria items.
After the user enters all the search criteria values (including null values) and selects
the Match All or Match Any radio button, the user can click the Search button to
initiate the query. The query results can be displayed in any output component.
Typically, the output component will be a table or tree table, but you can associate
other display components such as af:forms, af:outputText, and graphics to be
the results component by specifying it in the resultComponentId attribute.
If the Basic or Advanced button is enabled and displayed, the user can toggle between
the two modes. Each mode will display only the search criteria that were defined for
that mode. A search criteria field can be defined to appear only for basic, only for
advanced, or for both modes.
In advanced mode, the control panel also includes an Add Fields button that exposes a
popup list of searchable attributes. When the user selects any of these attributes, a
dynamically generated search criteria input field and dropdown operator list is
displayed. The position of all search criteria input fields, as well as newly added fields,
are determined by the model implementation.
This newly created search criteria field will also have a delete icon next to it. The user
can subsequently click this icon to delete the added field. The originally defined search
criteria fields do not have a delete icon and therefore cannot be deleted by the user.
Figure 12–6 shows an advanced mode query component with a dynamically added
search criteria field named Salary. Notice the delete icon (an X) next to the field.
Figure 12–6 Advanced Mode Query with Dynamically Added Search Criteria
The user can also save the entered search criteria and the mode by clicking the Save
button. A popup dialog allows the user to provide a name for the saved search and
specify hints by selecting checkboxes. A persistent data store is required if the saved
search is to be available beyond the session. For more information about persistence,
see Chapter 31, "Allowing User Customization on JSF Pages."
A seeded search is essentially a saved search that was created by the application
developer. When the component is initialized, any seeded searches associated with
that query component become available for the user to select.
Any user-created saved searches and seeded system searches appear in the Saved
Search dropdown list. The seeded searches and user-saved searches are separated by a
divider.
Users can also personalize the saved and seeded searches for future use.
Personalization of saved searches requires the availability of a persistent data store.
For more information about persistence, see Chapter 31, "Allowing User
Customization on JSF Pages."
12-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the query Component
Along with the default display described previously, you can also configure the query
component to display in a compact mode or simple mode. The compact mode has no
header or border, and the Saved Search dropdown list moves next to the expand or
collapse icon. Figure 12–7 shows the same query component as in Figure 12–6, but set
to compact mode.
The simple mode displays the component without the header and footer, and without
the buttons typically displayed in those areas. Figure 12–8 shows the same query
component set to simple mode.
The query component supports toolbar and footer facets that allow you to add
additional components to the query, such as command buttons. For example, you can
create command components to toggle between the quickQuery and query
components and place those in a toolbar in the toolbar facet.
12-18 Web User Interface Developer's Guide for Oracle Application Development Framework
13
Using Popup Dialogs, Menus, and Windows
13
This chapter describes how to create and use popup elements in secondary windows
including dialogs, menus, and windows on JSF pages. The chapter also describes how
to use the ADF Faces dialog framework to create dialogs with a separate page flow.
This chapter includes the following sections:
■ Section 13.1, "Introduction to Using Popup Elements"
■ Section 13.2, "Declaratively Creating Popup Elements"
■ Section 13.3, "Invoking Popup Elements"
■ Section 13.4, "Displaying Contextual Information"
■ Section 13.5, "Controlling the Automatic Cancellation of Inline Popups"
You can also use components within a popup to display contextual information
related to another component. When so configured, the related component displays a
small square. When moused over, the icon grows and also displays a note icon as
shown in Figure 13–2.
When the user clicks the note icon, the associated popup displays its enclosed content.
ADF Faces also provides a dialog framework to support building pages for a process
displayed separate from the parent page. This framework supports multiple dialog
pages with a control flow of their own. For example, say a user is checking out of a
web site after selecting a purchase and decides to sign up for a new credit card before
completing the checkout. The credit card transaction could be launched using the
dialog framework in an external browser window. The completion of the credit card
transaction does not close the checkout transaction on the original page.
This dialog framework can also be used inline as part of the parent page. This can be
useful when you want the pages to have a control flow of their own, but you don’t
want the external window blocked by popup blockers.
If your application uses the full Fusion technology stack, note that this dialog
framework is integrated with ADF Faces Controller for use with ADF task flows. For
more information, see the "Running an ADF Bounded Task Flow as a Modal Dialog"
chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application
Development Framework.
13-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Declaratively Creating Popup Elements
Both the dialog and panelWindow components support definition help, content
displayed when a user moves the cursor over a help icon (a blue circle with a question
mark). For more information, see Section 17.5, "Displaying Help for Components."
Typically, you use a command component in conjunction with the
showPopupBehavior tag to launch a popup element. You associate the
showPopupBehavior tag with the component it should launch. This tag also controls
the positioning of the popup element (when needed).
In addition to being used with action events on command components, the
showPopupBehavior tag can be used in conjunction with other events, such as the
showDetail event and the selection event. For more information, see Section 13.3,
"Invoking Popup Elements."
By default, the content of the popup element is not sent from the server until the
popup element is displayed. This represents a trade-off between the speed of showing
the popup element when it is opened and the speed of rendering the parent page.
Once the popup element is loaded, by default the content will be cached on the client
for rapid display.
You can modify this content delivery strategy by setting the contentDelivery
attribute on the popup component to one of the following options:
■ lazy - The default strategy previously described. The content is not loaded until
you show the popup element once, after which it is cached.
■ immediate - The content is loaded onto the page immediately, allowing the
content to be displayed as rapidly as possible. Use this strategy for popup
elements that are consistently used by all users every time they use the page.
■ lazyUncached - The content is not loaded until the popup element is displayed,
and then the content is reloaded every time you show the popup element. Use this
strategy if the popup element shows data that can become stale or outdated.
If you choose to set the popup component’s contentDelivery attribute to lazy or
lazyUncached, you can further optimize the performance of the popup component
and the page that hosts it by setting another popup component attribute
(childCreation) to deferred. This defers the creation of the popup component's
child components until the application delivers the content. The default value for the
childCreation attribute is immediate.
13-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Declaratively Creating Popup Elements
Tip: It does not matter where the popup component appears on the
page, as the position is driven by the component used to invoke the
popup. However, the popup component must be within a form
component.
2. In the Property Inspector, expand the Common section and set the following
attributes:
■ ContentDelivery: Select how the content is delivered to the component in the
popup.
Tip: A dialog will not dismiss if there are any ADF Faces messages
with a severity of error or greater.
13-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Declaratively Creating Popup Elements
}
else
{
// Check if we are deleting a folder
if (selectedFileItem.isDirectory())
{
_feBean.setSelectedDirectory(null);
}
}
this.deleteSelectedFileItem(selectedFileItem);
}
The dialogEvent is propagated to the server only when the outcome is ok, yes,
or no. You can block this if needed. For more information, see Section 5.3.4, "How
to Prevent Events from Propagating to the Server.")
If the user instead clicks the Cancel button (or the Close icon), the outcome is
cancel, the popupCancel client event is raised on the popup component, and
any other events (including the dialogEvent) are prevented from getting to the
server. However, the popupCancel event is delivered to the server.
8. If you want to set a fixed size for the dialog, or if you have set resize to on or set
stretchChildren to first, expand the Other section and set the following
attributes:
■ ContentHeight: Enter the desired height in pixels.
■ ContentWidth: Enter the desired width in pixels.
Tip: While the user can change the values of these attributes at
runtime (if the resize attribute is set to on), the values will not be
retained once the user leaves the page unless you configure your
application to use change persistence. For information about enabling
and using change persistence, see Chapter 31, "Allowing User
Customization on JSF Pages."
By default, added command components do not dismiss the dialog. You need to
bind the actionListener on the command component to a handler that
manages closing the dialog, as well as any needed processing. For examples on
how to do this, see the tag documentation.
10. Insert components to display or collect data for the dialog. Use a layout
component like panelGroupLayout to contain the components.
11. Add logic on the parent page to invoke the popup and dialog. For more
information, see Section 13.3, "Invoking Popup Elements."
Tip: It does not matter where the popup component appears on the
page, as the position is driven by the component used to invoke the
popup. However, the popup component must be within a form
component.
2. In the Property Inspector, expand the Common section and set the following
attributes:
13-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Declaratively Creating Popup Elements
Tip: Values of input components are not reset when a user closes the
panelWindow component. If the user opens the window a second
time, those values will still display. If you want the values to match
the current values on the server, then set the contentDelivery
attribute to lazyUncached.
6. If you want to set a fix size for the window, or if you have set resize to on or set
stretchChildren to first, expand the Other section and set the following
attributes:
■ ContentHeight: Enter the desired height in pixels.
■ ContentWidth: Enter the desired width in pixels.
Tip: While the user can change the values of these attributes at
runtime (if the resize attribute is set to on), the values will not be
retained once the user leaves the page unless you configure your
application to use change persistence. For information about enabling
and using change persistence, see Chapter 31, "Allowing User
Customization on JSF Pages."
7. Insert components to display or collect data for the window. Use a layout
component like panelGroupLayout to contain the components.
8. Add logic on the parent page to invoke the popup and panel window. For more
information, see Section 13.3, "Invoking Popup Elements."
Tip: It does not matter where the popup component appears on the
page, as the position is driven by the component used to invoke the
popup. However, the popup component must be within a form
component.
2. In the Property Inspector, expand the Common section and set the following
attributes.
■ ContentDelivery: Determines how the content is delivered to the component
in the popup.
13-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Declaratively Creating Popup Elements
5. Add logic on the parent page to invoke the popup and context menu. For more
information, see Section 13.3, "Invoking Popup Elements."
Tip: It does not matter where the popup component appears on the
page, as the position is driven by the component used to invoke the
popup. However, the popup component must be within a form
component.
2. In the Property Inspector, expand the Common section and set the following
attributes.
■ ContentDelivery: Determines how the content is delivered to the component
in the popup.
■ Animate: Select true to enable animation. Animation is determined by
configuration in the trinidad-config.xml file and by its skin properties
(for more information, see Section A.6.2.1, "Animation Enabled"). You can
override this setting by selecting false.
■ LauncherVar: Enter a variable to be used to reference the launch component.
This variable is reachable only during event delivery on the popup or its child
components, and only if the EventContext is set to launcher.
■ EventContext: Set to launcher if the popup is shared by multiple objects, for
example if the window within the popup will display information for the
selected row in a table. Setting this attribute to launcher makes the row
clicked current before the event listener is called, and returns only data for
that row. For more information, see Section 13.2.5, "What Happens at Runtime:
Popup Component Events."
■ PopupCancelListener: set to an EL expression that evaluates to a handler with
the logic that you want to invoke when the window is dismissed.
3. Optionally, in the Property Inspector, expand the Other section and set a value for
the AutoCancel property to determine the automatic cancel behavior. For more
information, see Section 13.5, "Controlling the Automatic Cancellation of Inline
Popups."
4. From the Component Palette, drag and drop a Note Window as a direct child to
the popup component.
5. To enter the text to display in the window:
1. Click the Source tab to view the page source code.
2. Remove the closing slash (/) from the af:noteWindow tag.
3. Below the af:noteWindow tag, enter the text to display, using simple
HTML tags, and ending with a closed af:noteWindow tag.
Example 13–3 shows text for a note window.
13-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Declaratively Creating Popup Elements
6. Add logic on the parent page to invoke the popup and note window. For more
information, see Section 13.3, "Invoking Popup Elements."
Using the variable source, you can take values from the source and apply them, or you
can set values. For example, you could get the full name value of the people object
used in the table, and set it as the value of the testBean’s fullName property used
by the window, using a setPropertyListener and clientAttribute tag, as
shown in Example 13–5.
Example 13–5 Setting the Value of a Component in a Popup Using the launcherVar
Property
<af:popup id="noteWindow" contentDelivery="lazyUncached" eventContext="launcher"
launcherVar="source">
<af:noteWindow>
<af:outputText value="#{testBean.fullName}"/>
</af:noteWindow>
<af:setPropertyListener from="#{source.attributes.fullName}"
to="#{testBean.fullName}" type="popupFetch"/>
</af:popup>
<af:table var="person" value="#{testBean.people}">
<af:column id="firstName">
<f:facet name="header">
<af:outputText value="First Name"/>
</f:facet>
<af:commandLink text="#{person.firstName}">
<af:showPopupBehavior popupId="::noteWindow" triggerType="mouseHover"/>
<af:clientAttribute name="fullName" value="#{person.fullName}"/>
</af:commandLink>
</af:column>
</af:table>
In this example, the launcherVar property source gets the full name for the current
row using the popupFetch event. For more information about using the
setPropertyListener tag, see Section 4.7.2, "How to Use the pageFlowScope
Scope Without Writing Java Code." For more information about using client attributes,
see Section 3.7, "Using Bonus Attributes for Client-Side Components." For more
information about the showPopupBehavior tag, see Section 13.3, "Invoking Popup
Elements."
Popups also invoke the following client-side events:
■ popupOpening: Fired when the popup is invoked. If this event is canceled in a
client-side listener, the popup will not be shown.
■ popupOpened: Fired after the popup becomes visible. One example for using this
event would be to create custom rules for overriding default focus within the
popup.
■ popupCanceled: Fired when a popup is unexpectedly dismissed by
auto-dismissal or by explicitly invoking the popup client component's cancel
method. This client-side event also has a server-side counterpart.
■ popupClosed: Fired when the popup is hidden or when the popup is
unexpectedly dismissed. This client-side event also has a server-side counterpart.
When a popup is closed by an affirmative condition, for example, when the Yes button
is clicked, it is hidden. When a popup is closed by auto-dismissal, for example when
either the Close icon or the Cancel button is clicked, it is canceled. Both types of
dismissals result in raising a popupClosed client-side event. Canceling a popup also
raises a client-side popupCanceled event that has an associated server-side
counterpart. The event will not be propagated to the server unless there are registered
listeners for the event. If it is propagated, it prevents processing of any child
components to the popup, meaning any submitted values and validation are ignored.
You can create a listener for the popupCanceled event that contains logic to handle
any processing needed when the popup is canceled.
If you want to invoke some logic based on a client-side event, you can create a custom
client listener method. For more information, see Section 3.2, "Listening for Client
Events." If you want to invoke server-side logic based on a client event, you can add a
serverListener tag that will invoke that logic. For more information, see
Section 5.4, "Sending Custom Events from the Client to the Server."
13-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Invoking Popup Elements
The showPopupBehavior tag listens for a specified event, for example the
actionEvent on a command component, or the disclosureEvent on a
showDetail component. However, the showPopupBehavior tag also cancels
delivery of that event to the server. Therefore, if you need to invoke some server-side
logic based on the event that the showPopupBehavior tag is listening for, then you
need to use either JavaScript to launch the popup, or to use a custom event as
documented in Section 5.4, "Sending Custom Events from the Client to the Server."
Note: The event selected for the triggerType attribute will not be
delivered to the server. If you need to invoke server-side logic based
on this event, then you must launch the popup using either JavaScript
or a custom event as documented in Section 5.4, "Sending Custom
Events from the Client to the Server."
4. From the AlignId dropdown, choose Edit, and then use the Edit Property: AlignId
dialog to select the component with which you want the popup to align.
5. From the Align dropdown menu, choose how the popup should be positioned
relative to the component selected in the previous step.
Example 13–6 shows sample code that displays some text in the af:popup component
with the id “popup1" when the button "Click Me" is clicked.
<af:popup id="popup1">
<af:panelGroupLayout layout="vertical">
<af:outputText value="Some"/>
<af:outputText value="popup"/>
<af:outputText value="content"/>
</af:panelGroupLayout>
</af:popup>
The code in Example 13–6 tells ADF Faces to align the popup contents with the
commandButton that is identified by the id button, and to use the alignment position
of afterEnd, which aligns the popup element underneath the button, as shown in
Figure 13–4.
13-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Contextual Information
When the user places the cursor over the square, a larger triangle with a note icon and
tooltip is displayed, indicating that additional information is available, as shown in
Figure 13–6
3. In the Component Palette, from the Operations panel, drag a Show Popup
Behavior and drop it as a child to the contextInfo component.
4. With the showPopupBehavior tag selected in the editor, in the Property
Inspector, set the attributes as described in Section 13.3.1, "How to Use the
af:showPopupBehavior Tag." For the triggerType value, be sure to enter
contextInfo.
13-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Controlling the Automatic Cancellation of Inline Popups
13.5.2 What Happens When You Disable the Automatic Cancellation of an Inline Popup
JDeveloper sets the af:popup component autoCancel property’s value to
disabled, as shown in Example 13–7:
At runtime, the Fusion web application restores an inline popup after it rerenders a
page if the inline popup displayed before invocation of the command to rerender the
page.
13-20 Web User Interface Developer's Guide for Oracle Application Development Framework
14
14 Using Menus, Toolbars, and Toolboxes
This chapter describes how to create menu bars and toolbars that contain tool buttons.
For information about creating navigation menus, that is, menus that allow you to
navigate through a hierarchy of pages, see Section 18.5, "Using Navigation Items for a
Page Hierarchy."
This chapter includes the following sections:
■ Section 14.1, "Introduction to Menus, Toolbars, and Toolboxes"
■ Section 14.2, "Using Menus in a Menu Bar"
■ Section 14.3, "Using Toolbars"
When a user chooses a menu item in the menu bar, the menu component displays a list
of menu items, as shown in Figure 14–2.
Buttons in a toolbar also allow a user to invoke some sort of action on an application
or to open a popup menu that behaves the same as a standard menu.
You can organize toolbars and menu bars using a toolbox. The toolbox gives you the
ability to define relative sizes for the toolbars on the same line and to define several
layers of toolbars and menu bars vertically.
14-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Menus in a Menu Bar
You can use more than one menu bar by enclosing them in a toolbox. Enclosing them
in a toolbox stacks the menu bars so that the first menu bar in the toolbox is displayed
at the top, and the last menu bar is displayed at the bottom. When you use more than
one menu bar in a single toolbox row (by having them grouped inside the toolbox),
then the flex attribute will determine which menu bar will take up the most space.
If you wish menu bars to be displayed next to each other (rather than being stacked),
you can enclose them in a group component.
Tip: You can also use the toolbox component to group menu bars
with toolbars, or to group multiple menu bars. Use the group
component to group menu bars and toolbars on the same row.
Within a menu bar, you can set one component to stretch so that the menu bar will
always be the same size as its parent container. For example, in Figure 14–5, the menu
bar is set to stretch a spacer component that is placed between the Disabled GMI menu
and the Component Guide button. When the window is resized, that spacer
component either stretches or shrinks so that the menu bar will always be the same
width as the parent. Using a spacer component like this also ensures that any
components to the right of the spacer will remain right-justified in the menu bar.
When a window is resized such that all the components within the menu bar can no
longer be displayed, the menu bar displays an overflow icon, identified by the arrow
cursor as shown in Figure 14–6.
Clicking that overflow icon displays the remaining components in a popup window,
as shown in Figure 14–7.
Menus and submenus can be made to be detachable and to float on the browser
window. Figure 14–8 shows the New submenu in the File menu configured to be
detachable. The top of the menu is rendered with a bar to denote that it can be
detached.
The user can drag the detachable menu to anywhere within the browser. When the
mouse button is released, the menu stays on top of the application until the user closes
it, as shown in Figure 14–9.
14-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Menus in a Menu Bar
Tip: Consider using detachable menus when you expect users to:
■ Execute similar commands repeatedly on a page.
■ Execute similar commands on different rows of data in a large
table, tree table, or tree.
■ View data in long and wide tables, tree tables, or trees. Users can
choose which columns or branches to hide or display with a single
click.
■ Format data in long or wide tables, tree tables, or trees.
The menu and commandMenuItem components can each include an icon image.
Figure 14–10 shows the Delete menu item configured to display a delete icon.
Figure 14–11 Square Icon and Radio Button Denote the Chosen Menu Items
Because an action is expected when a user chooses a menu item, you must bind the
action or actionListener attribute of the commandMenuItem component to
some method that will execute the needed functionality.
Along with commandMenuItem components, a menu can also include one or more
goMenuItem components. These are navigation components similar to the goLink
component, in that they perform direct page navigation, without delivering an
ActionEvent event. Figure 14–14 shows three goMenuItem components used to
navigate to external web sites.
Aside from menus that are invoked from menu bars, you can also create context
menus that are invoked when a user right-clicks a UI component, and popup menus
that are invoked when a user clicks a command component. For more information, see
Section 13.2.3, "How to Create a Context Menu."
By default, the contents of the menu are delivered immediately, as the page is
rendered. If you plan on having a large number of children in a menu (multiple menu
14-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Menus in a Menu Bar
and commandMenuItem components), you can choose to configure the menu to use
lazy content delivery. This means that the child components are not retrieved from the
server until the menu is accessed.
You can also create menus that mainly provide navigation throughout the application,
and are not used to cause any change on a selected item in an application. To create
this type of menu, see Section 18.6, "Using a Menu Model to Create a Page Hierarchy."
2. Create a menu bar by dragging and dropping a Panel Menu Layout from the
Layout panel of the Component Palette. If you are using a toolbox component,
the Panel Menu layout should be dropped as a direct child of the toolbox
component.
Tip: Toolboxes also allow you to use the iterator, switcher, and group
components as direct children, providing these components wrap
child components that would usually be direct children of the toolbox.
For more information about toolboxes, see Section 14.3, "Using
Toolbars."
3. If grouping more than one menu bar within a toolbox, for each menu bar, expand
the Appearance section and set the flex attribute to determine the relative sizes
of each of the menu bars. The higher the number given for the flex attribute, the
longer the toolbox will be. For the set of menu bars shown in Example 14–5,
menubar2 will be the longest, menubar4 will be the next longest, and because
their flex attributes are not set, the remaining menu bars will be the same size
and shorter than menubar4.
<af:menu text="MenuA"/>
</af:menBar>
<af:menuBar id="menuBar2" flex="2">
<af:menu text="MenuB"/>
</af:menuBar>
<af:menuBar id="menuBar3" flex="0">
<af:menu text="MenuC"/>
</af:menuBar>
<af:menuBar id="menuBar4" flex="1">
<af:menu text="MenuD"/>
</af:toolbar>
</af:toolbox>
Tip: You can use the group component to group menu bars (or
menu bars and toolbars) that you want to appear on the same row. If
you do not use the group component, the menu bars will appear on
subsequent rows.
For information about how the flex attribute works, see Section 14.3.2, "What
Happens at Runtime: Determining the Size of Menu Bars and Toolbars."
4. Insert the desired number of menu components into the menu bar by dragging a
Menu from the Component Palette, and dropping it as a child to the menuBar
component.
You can also insert commandMenuItem components directly into a menu bar by
dragging and dropping a Menu Item. Doing so creates a commandMenuItem
component that renders similar to a toolbar button.
Tip: Menu bars also allow you to use the iterator, switcher, and
group components as direct children, providing these components
wrap child components that would usually be direct children of the
menu bar.
5. For each menu component, expand the Appearance section in the Property
Inspector and set the following attributes:
■ Text: Enter text for the menu’s label. If you wish to also provide an access key
(a letter a user can use to access the menu using the keyboard), then leave this
attribute blank and enter a value for textAndAccessKey instead.
■ TextAndAccessKey: Enter the menu label and access key, using conventional
ampersand notation. For example, &File sets the menu label to File, and
at the same time sets the menu access key to the letter F. For more information
about access keys and the ampersand notation, see Section 22.3, "Specifying
Component-Level Accessibility Properties."
14-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Menus in a Menu Bar
■ Icon: Use the dropdown list to select the icon. If the icon does not display in
this menu, use the dropdown menu to the right of the list to choose Edit, and
browse to select the icon.
6. If you want the menu to be detachable (as shown in Figure 14–8), expand the
Behavior section in the Property Inspector and set the Detachable attribute to
true. At runtime, the user can drag the menu to detach it, and drop it anywhere
on the screen (as shown in Figure 14–9).
7. If you want the menu to use lazy content delivery, expand the Other section in the
Property Inspector and set the ContentDelivery attribute to lazy.
Note: If you use lazy content delivery, any accelerators set on the
child commandMenuItem components will not work because the
contents of the menu are not known until the menu is accessed. If
your menu must support accelerators, then ContentDelivery must be
set to immediate.
8. To create a menu item that invoke some sort of action along with navigation, drag
a MenuItem from the Component Palette and drop it as a child to the menu
component to create a commandMenuItem component. Create a number of
commandMenuItem components to define the items in the vertical menu.
If necessary, you can wrap the commandMenuItem components within a group
component to display the items as a group. Example 14–2 shows simplified code
for grouping the Folders and Search menu items in one group, the Table, Tree
Table and List menu items in a second group, and the Refresh menu item by itself
at the end.
You can also insert another menu component into an existing menu component to
create a submenu (as shown in Figure 14–3).
Tip: Menus also allow you to use the iterator and switcher
components as direct children, providing these components wrap
child components that would usually be direct children of the menu.
14-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Menus in a Menu Bar
this attribute blank and enter a value for TextAndAccessKey instead. Or, you
can set the access key separately using the accessKey attribute.
■ Selected: Set to true to have this menu item appear to be chosen. The
selected attribute is supported for check-, radio-, and antonym-type menu
items only.
■ SelectedText: Set the alternate label to display for this menu item when the
menu item is chosen. This value is ignored for all types except antonym.
Example 14–3 shows the Special menu with one group of menu items configured
to use radio buttons and another group of menu items configured to show blue
squares when chosen. The last group contains a menu item configured to be the
antonym Open when it is first displayed, and then it toggles to Closed.
Figure 14–16 shows how the menu will be displayed when it is first accessed.
10. Expand the Appearance section and set the following attributes:
■ Icon: Use the dropdown list to select the icon. If the icon does not display in
this menu, use the dropdown menu to the right of the list to choose Edit, and
browse to select the icon.
■ Accelerator: Enter the keystroke that will activate this menu item’s command
when the item is chosen, for example, Control O. ADF Faces converts the
keystroke and displays a text version of the keystroke (for example, Ctrl+O)
next to the menu item label, as shown in Figure 14–3.
Note: If you choose to use lazy content delivery, any accelerators set
on the child commandMenuItem components will not work because
the contents of the menu are not known until it is accessed. If your
menu must support accelerator keys, then the contentDelivery
attribute must be set to immediate.
■ TextAndAccessKey: Enter the menu item label and access key, using
conventional ampersand notation. For example, &Save sets the menu
item label to Save, and at the same time sets the menu item access key to the
letter S. For more information about access keys and the ampersand notation,
see Section 22.3, "Specifying Component-Level Accessibility Properties."
11. Expand the Behavior section and set the following attributes:
14-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Toolbars
■ TargetFrame: Use the dropdown list to specify where the new page should
display. Values are
– _blank: The link opens the document in a new window.
– _parent: The link opens the document in the window of the parent. For
example, if the link appeared in a dialog, the resulting page would render
in the parent window.
– _self: The link opens the document in the same page or region.
– _top: The link opens the document in a full window, replacing the entire
page.
■ Text: Enter the text for the link.
14. If you want a menu bar to stretch so that it equals the width of the containing
parent component, set stretchId to be the ID of the component within the menu
bar that should be stretched so that the menu bar is the same size as the parent.
This one component will stretch, while the rest of the components in the menu bar
remain a static size.
You can also use the stretchId attribute to justify components to the left and
right by inserting a spacer component, and setting that component ID as the
stretchId for the menu bar, as shown in Example 14–7.
text, an icon, or a combination of both. Toolbar buttons can also open menus in a
popup window. Along with toolbar buttons, other UI components, such as dropdown
lists, can be displayed in toolbars. Figure 14–17 shows the toolbar from the File
Explorer application.
Tip: Toolbars can also include command buttons and command links
(including the commandImageLink component) instead of toolbar
buttons. However, toolbar buttons provide additional functionality,
such as opening popup menus. Toolbar buttons can also be used
outside of a toolbar component
The toolbar component can contain many different types of components, such as
inputText components, LOV components, selection list components, and command
components. ADF Faces also includes a commandToolbarButton component that
has a popup facet, allowing you to provide popup menus from a toolbar button. You
can configure your toolbar button so that it only opens the popup dialog and does not
fire an action event. As with menus, you can group related toolbar buttons on the
toolbar using the group component.
You can use more than one toolbar by enclosing them in a toolbox. Enclosing toolbars
in a toolbox stacks them so that the first toolbar on the page is displayed at the top,
and the last toolbar is displayed on the bottom. For example, in the File Explorer
application, the currently selected folder name is displayed in the Current Location
toolbar, as shown in Figure 14–17. When you use more than one toolbar, you can set
the flex attribute on the toolbars to determine which toolbar should take up the most
space. In this case, the Current Location toolbar is set to be the longest.
If you wish toolbars to be displayed next to each other (rather than stacked), you can
enclose them in a group component.
Tip: You can also use the toolbox component to group menu bars
with toolbars, or to group multiple menu bars. As with grouping
toolbars, use the group component to group menu bars and toolbars
on the same row.
Within a toolbar, you can set one component to stretch so that the toolbar will always
be the same size as its parent container. For example, in the File Explorer application,
the lower toolbar that displays the current location contains the component that shows
the selected folder. This component is set to stretch so that when the window is
resized, that component and the toolbar will always be the same width as the parent.
However, because no component in the top toolbar is set to stretch, it does not change
size when the window is resized. When a window is resized such that all the
components within the toolbar can no longer be displayed, the toolbar displays an
overflow icon, identified by an arrow cursor in the upper right-hand corner, as shown
in Figure 14–18.
14-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Toolbars
Clicking that overflow icon displays the remaining components in a popup window,
as shown in Figure 14–19.
When you expect overflow to occur in your toolbar, it is best to wrap it in a toolbox
that has special layout logic to help in the overflow.
2. In the Component Palette, from the Common Components panel, drag and drop a
Toolbar onto the JSF page. If you are using a toolbox component, the Toolbar
should be dropped as a direct child of the toolbox component.
Tip: Toolboxes also allow you to use the iterator, switcher, and group
components as direct children, providing these components wrap
child components that would usually be direct children of the toolbox.
3. If grouping more than one toolbar within a toolbox, for each toolbar, select the
toolbar, expand the Appearance section and set the flex attributes to determine
the relative sizes of each of the toolbars. The higher the number given for the flex
attribute, the longer the toolbox will be. For the set of toolbars shown in
Example 14–5, toolbar2 will be the longest, toolbar4 will be the next longest,
and because their flex attributes are not set, the remaining toolbars will be the
same size and shorter than toolbar4.
Tip: You can use the group component to group toolbars (or menu
bars and toolbars) that you want to appear on the same row. If you do
not use the group component, the toolbars will appear on subsequent
rows.
For information about how the flex attribute works, see Section 14.3.2, "What
Happens at Runtime: Determining the Size of Menu Bars and Toolbars."
4. Insert components into the toolbar as needed. To create a
commandToolbarButton drag a ToolbarButton from the Component Palette
and drop it as a direct child of the toolbar component.
14-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Toolbars
Tip: You can use the group component to wrap related buttons on
the bar. Doing so inserts a separator between the groups, as shown
surrounding the group for the Select Skin dropdown list and Refresh
button in Figure 14–17.
Toolbars also allow you to use the iterator and switcher components
as direct children, providing these components wrap child
components that would usually be direct children of the toolbar.
Tip: You can place other components, such as command buttons and
links, input components, and select components in a toolbar.
However, they may not have the capability to stretch. For details
about stretching the toolbar, see Step 9.
Note: When setting the type to radio, you must wrap the toolbar
button in a group tag that includes other toolbar buttons whose types
are set to radio as well.
14-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Toolbars
="true"
validator="#{explorer.headerManager.validatePathDisplay}"/>
</af:toolbar>
You can also use the stretchId attribute to justify components to the left and
right by inserting a spacer component, and setting that component ID as the
stretchId for the toolbar, as shown in Example 14–7.
<!-- Insert a stretched spacer to push subsequent buttons to the right -->
14.3.2 What Happens at Runtime: Determining the Size of Menu Bars and Toolbars
When a page with a menu bar or toolbar is first displayed or resized, the space needed
for each bar is based on the value of the bar’s flex attribute. The percentage of size
allocated to each bar is determined by dividing its flex attribute value by the sum of
all the flex attribute values. For example, say you have three toolbars in a toolbox,
and those toolbars are grouped together to display on the same line. The first toolbar is
given a flex attribute value of 1, the second toolbar also has a flex attribute value of
1, and the third has a flex attribute value of 2, giving a total of 4 for all flex
attribute values. In this example, the toolbars would have the following allocation
percentages:
■ Toolbar 1: 1/4 = 25%
■ Toolbar 2: 1/4 = 25%
■ Toolbar 3: 2/4 = 50%
Once the allocation for the bars is determined, and the size set accordingly, each
element within the toolbars are placed left to right. Any components that do not fit are
placed into the overflow list for the bar, keeping the same order as they would have if
displayed, but from top to bottom instead of left to right.
14-20 Web User Interface Developer's Guide for Oracle Application Development Framework
15
15 Creating a Calendar Application
This chapter describes how to use the ADF Faces calendar component to create a
calendar application.
This chapter includes the following sections:
■ Section 15.1, "Introduction to Creating a Calendar Application"
■ Section 15.2, "Creating the Calendar"
■ Section 15.3, "Configuring the Calendar Component"
■ Section 15.4, "Adding Functionality Using Popup Components"
■ Section 15.5, "Customizing the Toolbar"
■ Section 15.6, "Styling the Calendar"
You can configure the calendar so that it only displays a subset of those views. For
example, you may not want your calendar to use the month and list views. You can
configure it so that only the day and week views are available, as shown in
Figure 15–2. Because only day and week views are available, those are the only
buttons displayed in the toolbar.
Figure 15–2 Calendar Configured to Use Only Week and Day Views
By default, the calendar displays dates and times based on the locale set in the
trinidad-config.xml file (for example, Section A.6, "Configuration in
trinidad-config.xml"). If a locale is not set in that file, then it is based on the locale sent
by the browser. For example, in the United States, by default, the start day of the week
is Sunday, and 2 p.m. is shown as 2:00 PM. In France, the default start day is Monday,
and 2 p.m. is shown as 14:00. The time zone for the calendar is also based on the
setting in trinidad-config.xml. You can override the default when you configure
the calendar. For more information, see Section 15.3, "Configuring the Calendar
Component."
The calendar uses the CalendarModel class to display the activities for a given time
period. You must create your own implementation of the model class for your
calendar. If your application uses the Fusion technology stack, then you can create
ADF Business Components over your data source that represents the activities, and
the model will be created for you. You can then declaratively create the calendar, and it
will automatically be bound to that model. For more information, see the "Using the
ADF Faces Calendar Component" section of the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
If your application does not use the Fusion technology stack, then you create your own
implementation of the CalendarModel class and the associated
CalendarActivity and CalendarProvider classes. The classes are abstract
classes with abstract methods. You must provide the functionality behind the methods,
suitable for your implementation of the calendar. For more information, see
Section 15.2, "Creating the Calendar."
The calendar includes a toolbar with built-in functionality that allows a user to change
the view (between daily, weekly, monthly, or list), go to the previous or next day, week,
or month, and return to today. The toolbar is fully customizable. You can choose which
buttons and text to display, and you can also add buttons or other components. For
more information, see Section 15.5, "Customizing the Toolbar."
15-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Creating a Calendar Application
Tip: When these toolbar buttons are used, attribute values on the
calendar are changed. You can configure these values to be persisted
so that they remain for the user during the duration of the session. For
more information, see Chapter 31, "Allowing User Customization on
JSF Pages."
You can also configure your application so that the values will be
persisted and used each time the user logs into the system. For this
persistence to take place, your application must use the Fusion
technology stack. For more information, see the "Allowing User
Customizations at Runtime" chapter of the Oracle Fusion Middleware
Fusion Developer's Guide for Oracle Application Development Framework.
The calendar component displays activities based on those activities and the provider
returned by the CalendarModel class. By default, the calendar component is
read-only. That is, it can display only those activities that are returned. You can add
functionality within supported facets of the calendar so that users can edit, create, and
delete activities. When certain events are invoked, popup components placed in these
corresponding facets are opened, which can allow the user to act on activities or the
calendar.
For example, when a user clicks on an activity in the calendar, the
CalendarActivityEvent is invoked and the popup component in the
ActivityDetail facet is opened. You might use a dialog component that contains a
form where users can view and edit the activity, as shown in Figure 15–3.
background, as shown in Figure 15–1. You can customize how the activities are
displayed by changing the color ramp.
Each activity is associated with a provider, that is, an owner. If you implement your
calendar so that it can display activities from more than one provider, you can also
style those activities so that each provider’s activity shows in a different color, as
shown in Figure 15–4.
15-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating the Calendar
This class is responsible for returning a collection of calendar activities, given the
following set of parameters:
■ Provider ID: The owner of the activities. For example, you may implement the
CalendarModel class such that the calendar can return just the activities
associated with the owner currently in session, or it can also return other owners’
activities.
■ Time range: The expanse of time for which all activities that begin within that time
should be returned. A date range for a calendar is inclusive for the start time and
exclusive for the end time (also known as half-open), meaning that it will return all
activities that intersect that range, including those that start before the start time,
but end after the start time (and before the end time).
A calendar activity represents an object on the calendar, and usually spans a certain
period of time. The CalendarActivity class is an abstract class whose methods you
can implement to return information about the specific activities.
Activities can be recurring, have associated reminders, and be of a specific time type
(for example, hour or minute). Activities can also have start and end dates, a location,
a title, and a tag.
The CalendarProvider class represents the owner of an activity. A provider can be
either enabled or disabled for a calendar.
3. Create a managed bean that will hold information and logic for providers.
■ Extend the oracle.adf.view.rich.model.CalendarProvider class.
■ Implement the abstract methods.
■ Implement any other required functionality for the provider.
2. Expand the Calendar Data section of the Property Inspector, and enter an EL
expression for Value that resolves to the managed bean that extends the
CalendarModel class.
To configure a calendar:
1. With the calendar component selected, expand the Common section of the
Property Inspector, and set the following:
■ View: Select the view (either day, list, month, or week) that should be the
default when the calendar is displayed. Users change this value when they
click the corresponding button in the calendar’s toolbar.
■ StartDayOfWeek: Enter the day of the week that should be shown as the
starting day, at the very left in the monthly or weekly view. When not set, the
default is based on the user’s locale. Valid values are:
– sun
– mon
– tue
15-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuring the Calendar Component
– wed
– thu
– fri
– sat
■ StartHour: Enter a number that represents the hour (in 24 hour format, with 0
being midnight) that should be displayed at the top of the day and week view.
While the calendar (when in day or week view) starts the day at 12:01 a.m.,
the calendar will automatically scroll to the startHour value, so that it is
displayed at the top of the view. The user can always scroll above that time to
view activities that start before the startHour value.
■ ListType: Select how you want the list view to display activities. Valid
values are:
– day: Shows activities only for the active day.
– dayCount: Shows a number of days including the active day and after,
based on the value of the listCount attribute.
– month: Shows all the activities for the month to which the active day
belongs.
– week: Shows all the activities for the week to which the active day belongs
■ ListCount: Enter the number of days’ activities to display (used only when the
listType attribute is set to dayCount).
Figure 15–5 shows a calendar in list view with the listType set to dayCount
and the listCount value set to 7.
2. Expand the Calendar Data section of the Property Inspector, and set the following:
■ ActiveDay: Set the day used to determine the date range that is displayed in
the calendar. By default, the active day is today’s date for the user. Do not
change this if you want today’s date to be the default active day when the
calendar is first opened.
Note that when the user selects another day, this becomes the value for the
activeDay attribute. For example, when the user first accesses the calendar,
the current date, February 6, 2009 is the active day. The month view will show
February. If the user uses the next button to scroll to the next month, the active
date will become March 6, 2009.
■ TimeZone: Set the time zone for the calendar. If not set, the value is taken
from AdfFacesContext. The valid value is a java.util.TimeZone object.
3. Expand the Other section of the Property Inspector and set AvailableViews. The
value can be one of or a combination of the following:
■ month
■ week
■ day
■ list
■ all
If you want to enter more than one value, enter the values with a space between.
For example, if you want the calendar to use day and week views, you would
enter the following:
day week
Note: If all is entered, then all views are available, regardless if one
is left out of the list.
4. If you want the user to be able to drag a handle on an existing activity to expand
or collapse the time period of the activity, then implement a handler for
CalendarActivityDurationChangeListener. This handler should include
functionality that changes the end time of the activity. If you want the user to be
able to move the activity (and, therefore, change the start time as well as the end
time), then implement drag and drop functionality. For more information, see
Section 32.7, "Adding Drag and Drop Functionality to a Calendar."
You can now add the following functionality:
■ Allow users to create, edit, and delete activities using popup components. For
more information, see Section 15.4, "Adding Functionality Using Popup
Components."
■ Allow users to move activities around on the calendar. For more information, see
Section 32.7, "Adding Drag and Drop Functionality to a Calendar."
■ Change or add to the toolbar buttons in the toolbar. For more information, see
Section 15.5, "Customizing the Toolbar."
■ Change the appearance of the calendar and events. For more information, see
Section 15.6, "Styling the Calendar."
15-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Functionality Using Popup Components
2. Based on Table 15–1, create popup components in the facets that correspond to the
user actions for which you want to provide functionality. For example, if you want
users to be able to delete an activity by clicking it and pressing the Delete key, you
add a popup dialog to the activityDelete facet.
To add a popup component, right-click the facet in the Structure window and
choose Insert inside facetName > ComponentName.
For more information about creating popup components, see Chapter 13, "Using
Popup Dialogs, Menus, and Windows."
15-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Functionality Using Popup Components
Example 15–1 shows the JSF code for a dialog popup component used in the
activityDelete facet.
Figure 15–7 shows how the dialog is displayed when a user clicks an activity and
presses the Delete key.
if (activity == null)
{
// no activity with that id is found in the model
System.out.println("No activity with event " + ae.toString());
setCurrActivity(null);
return;
}
setCurrActivity(new DemoCalendarActivityBean((DemoCalendarActivity)activity,
getTimeZone()))
4. Implement the logic for the popup component in the handler for the popup event.
For example, for the delete dialog, implement a handler for the dialogListener
that actually deletes the activity when the dialog is dismissed. For more
information about creating dialogs and other popup components, see Chapter 13,
"Using Popup Dialogs, Menus, and Windows."
Figure 15–9 shows a toolbar that has been customized. It has added toolbar buttons,
including buttons that are right-aligned on the top toolbar, and buttons in a second
toolbar.
15-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Toolbar
2. In the ADF Faces page of the Component Palette, from the Common Components
panel, drag and drop a Toolbar to each facet and add toolbar buttons and
configure the buttons and toolbar as needed. For more information about toolbars
and toolbar buttons, see Section 14.3, "Using Toolbars."
3. In the Property Inspector, from the dropdown menu next to the toolboxLayout
attribute, choose Edit.
4. In the Edit Property: ToolboxLayout dialog set the value for this attribute. It
should be a list of the custom facet names, in the order in which you want the
contents in the custom facets to appear. In addition to those facets, you can also
include all, or portions of the default toolbar, using the following keywords:
■ all: Displays all the toolbar buttons and text in the default toolbar
■ dates: Displays only the previous, next, and today buttons
■ range: Displays only the string showing the current date range
■ views: Displays only the buttons that allows the user to change the view
Note: If you use the all keyword, then the dates, range, and
views keywords are ignored.
■ customToolbar1
■ all
■ customToolbar2
You can also determine the layout of the toolbars using the following keywords:
■ newline: Places the toolbar in the next named facet (or the next keyword
from the list in the toolboxLayout attribute) on a new line. For example, if
you wanted the toolbar in the customToolbar2 facet to appear on a new
line, the list would be:
– customToolbar1
– all
– newline
– customToolbar2
If instead, you did not want to use all of the default toolbar, but only the views
and dates sections, and you wanted those to each appear on a new line, the list
would be:
– customToolbar1
– customToolbar2
– newline
– views
– newline
– dates
■ stretch: Adds a spacer component that stretches to fill up all available space
so that the next named facet (or next keyword from the default toolbar) is
displayed as right-aligned in the toolbar. Example 15–3 shows the value of the
toolboxLayout attribute for the toolbar displayed in Figure 15–9, along with
the toolbar placed in the customToolbarAlign facet. Note that the toolbar
buttons displayed in the customToolbarBold facet are right-aligned in the
toolbar because the keyword stretch is named before the facet.
15-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Styling the Calendar
</f:facet>
. . .
</af:calendar>
Note that instead of using a single color, a range of a color is used in the calendar. This
is called a color ramp. A color ramp is a set of colors in a color family to represent the
different states of activities. For example, T.F.’s activities use the Blue ramp. Activities
whose time span is within one day are displayed in medium blue text. Activities that
span across multiple days are shown in a medium blue box with white text. Darker
blue is the background for the start time, while lighter blue is the background for the
title. These three different blues are all part of the Blue color ramp.
The CalendarActivityRamp class is a subclass of InstanceStyles, and can take
a representative color (for example, the blue chosen for T.F.’s activities) and return the
correct color ramp to be used to display each activity in the calendar.
The activityStyles attribute must be bound to a map object. The map key is the set
returned from the getTags method on an activity. The map value is an
InstanceStyles object, most likely an instance of CalendarActivityRamp. This
InstanceStyles object will take in skinning keys, and for each activity, styles will
be returned.
To style activities:
1. In your CalendarActivity class, have the getTags method return a string set
that will be used by the activityStyles attribute to map the returned string to
a specific style. For example, to use the different color ramps for the different
providers shown in Figure 15–11, you must return a string for each provider. In
this case, an activity belonging to the current user might return Me, an activity
belonging to L.E. might return LE, and an activity belonging to T.F. might return
TF. For more information about implementing the CalendarActivity class, see
Section 15.2.2, "How to Create a Calendar."
2. Create a map whose key is the string returned from the getTags method, and
whose value is an InstanceStyles object (for example, a
CalendarActivityRamp instance).
For example, to use the different color ramps shown in Figure 15–11, you would
create a map using the values shown in Table 15–2.
15-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Styling the Calendar
3. In the Structure window, select the calendar component, and in the Property
Inspector, bind the activityStyles attribute to the map.
if ("af|calendar::month-grid-cell-header-misc".equals(key))
{
}
else if ("af|calendar::month-grid-cell-header-day-link".equals(key))
{
return null;
}
2. In a managed bean, create an instance of the DateCustomizer class, for example:
private DateCustomizer _dateCustomizer = new DemoDateCustomizer();
15-18 Web User Interface Developer's Guide for Oracle Application Development Framework
16
Using Output Components
16
This chapter describes how to display output text, images, and icons using ADF Faces
components, and how to use components that allow users to play video and audio
clips.
This chapter includes the following sections:
■ Section 16.1, "Introduction to Output Text, Image, Icon, and Media Components"
■ Section 16.2, "Displaying Output Text and Formatted Output Text"
■ Section 16.3, "Displaying Icons"
■ Section 16.4, "Displaying Images"
■ Section 16.5, "Using Images as Links"
■ Section 16.6, "Displaying Images in a Carousel"
■ Section 16.7, "Displaying Application Status Using Icons"
■ Section 16.8, "Playing Video and Audio Clips"
Example 16–1 shows two outputText components: the first specifies the text to be
displayed explicitly, and the second takes the text from a managed bean and converts
the value to a text value ready to be displayed (for more information about conversion,
see Section 6.3, "Adding Conversion").
You can use the escape attribute to specify whether or not special HTML and XML
characters are escaped for the current markup language. By default, characters are
escaped.
Example 16–2 illustrates two outputText components, the first of which uses the
default value of true for the escape attribute, and the second of which has the
attribute set to false.
Example 16–2 Output Text With and Without the escape Property Set
<af:outputText value="<h3>output & heading</h3>"/>
<af:outputText value="<h3>output & heading</h3>"
escape="false"/>
Figure 16–1 shows the different effects seen in a browser of the two different settings of
the escape attribute.
You should avoid setting the escape attribute to false unless absolutely necessary.
A better choice is to use the outputFormatted component, which allows a limited
number of HTML tags.
As with the outputText component, the outputFormatted component also
displays the text specified for the value property, but the value can contain HTML
tags. Use the formatting features of the outputFormatted component specifically
when you want to format only parts of the value in a certain way. If you want to use
the same styling for the whole component value, instead of using HTML within the
16-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Output Text and Formatted Output Text
value, apply a style to the whole component. If you want all instances of a component
to be formatted a certain way, then you should create a custom skin. For more
information about using inline styles and creating skins, see Chapter 20, "Customizing
the Appearance Using Styles and Skins."
Example 16–3 shows an outputFormatted component displaying only a few words
of its value in bold.
2. Expand the Common section of the Property Inspector and set the value attribute
to the value to be displayed. If you are using the outputFormatted component,
use HTML formatting codes to format the text as needed, as described in
Table 16–1 and Table 16–2.
The outputFormatted component also supports the styleUsage attribute
whose values are the following predefined styles for the text:
■ inContextBranding
■ instruction
■ pageStamp
Figure 16–3 shows how the styleUsage values apply styles to the component.
16.2.2 What You May Need to Know About Allowed Format and Character Codes in the
outputFormatted Component
Only certain formatting and character codes can be used. Table 16–1 lists the
formatting codes allowed for formatting values in the outputFormatted component.
Table 16–2 lists the character codes for displaying special characters in the values.
16-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Images
The attributes class, style, and size can also be used in the value attribute of the
outputFormatted component, as can href constructions. All other HTML tags are
ignored.
If you want to display icons outside of a message component, you use the icon
component and provide the name of the icon type you want to display.
Note: The images used for the icons are determined by the skin the
application uses. If you want to change the image, create a custom
skin. For more information, see Chapter 20, "Customizing the
Appearance Using Styles and Skins."
When you use messages in an ADF Faces application, the icons are automatically
added for you. You do not have to add them to the message component. However, you
can use the icons outside of a message component. To display one of the standard
icons defined in the skin for your application, you use the icon component.
The image component can also be used as a link and can include an image map,
however, it must be placed inside a goLink component. For more information, see
Section 16.5, "Using Images as Links."
To display an image:
1. In the Component Palette, from the Common Components panel, drag and drop
an Image onto your page.
16-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Images in a Carousel
■ Select the goLink component and in the Property Inspector, set Destination to
the URI of the image map on the server.
5. If the whole image is to link to a single destination, select the goLink component
and enter the URI of the destination as the value of Destination.
A carouselItem component stretches its sole child component. If you place a single
image component inside of the carouselItem, the image stretches to fit within the
square allocated for the item (as the user spins the carousel, these dimensions shrink or
grow).
The carousel component uses a CollectionModel class to access the data in the
underlying collection. This class extends the JSF DataModel class and adds on
support for row keys. In the DataModel class, rows are identified entirely by index.
However, to avoid issues if the underlying data changes, the CollectionModel class
is based on row keys instead of indexes.
You may also use other model classes, such as java.util.List, array, and
javax.faces.model.DataModel. If you use one of these other classes, the
carousel component automatically converts the instance into a CollectionModel
class, but without any additional functionality. For more information about the
CollectionModel class, see the MyFaces Trinidad Javadoc at
16-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Images in a Carousel
http://myfaces.apache.org/trinidad/trinidad-1_
2/trinidad-api/apidocs/index.html.
Note: If your application uses the Fusion technology stack, you can
create ADF Business Components over your data source that
represents the items, and the model will be created for you. You can
then declaratively create the carousel, and it will automatically be
bound to that model. For more information, see the "Using the ADF
Faces Carousel Component" section of the Oracle Fusion Middleware
Fusion Developer's Guide for Oracle Application Development Framework
The carousel components are virtualized, meaning not all the items that are there for
the component on the server are delivered to and displayed on the client. You
configure the carousel to fetch a certain number of rows at a time from your data
source. The data can be delivered to the component either immediately upon
rendering, or lazily fetched after the shell of the component has been rendered. By
default, the carousel lazily fetches data for the initial request. When a page contains
one or more of these components, the page initially goes through the standard
lifecycle. However, instead of the carousel fetching the data during that initial request,
a special separate partial page rendering (PPR) request is run on the component, and
the number of items set as the value of the fetch size for the carousel is then returned.
Because the page has just been rendered, only the Render Response phase executes for
the carousel, allowing the corresponding data to be fetched and displayed. When a
user does something to cause a subsequent data fetch (for example spinning the
carousel for another set of images), another PPR request is executed.
Performance Tip: You should use lazy delivery when the page
contains a number of components other than a carousel. Using lazy
delivery allows the initial page layout and other components to be
rendered first before the data is available.
Use immediate delivery if the carousel is the only context on the page,
or if the carousel is not expected to return a large set of items. In this
case, response time will be faster than using lazy delivery (or in some
cases, simply perceived as faster), as the second request will not go to
the server, providing a faster user response time and better server
CPU utilizations. Note however that only the number of items
configured to be the fetch block will be initially returned. As with lazy
delivery, when a user’s actions cause a subsequent data fetch, the next
set of items are delivered.
The number of items that are displayed on the client are just enough to fill the page as
it is displayed in the browser. More items are fetched as the user spins the component.
The fetchSize attribute determines the number of items requested from the client to
the server on each attempt to fill the component. The default value is 25.
To Create a Carousel:
1. Create the data model that will provide the collection of images to display. The
data model can be a List, Array, DataModel or CollectionModel. If the
collection is anything other than a CollectionModel, the framework will
automatically convert it to a CollectionModel. For more information about the
CollectionModel class, see the MyFaces Trinidad Javadoc at
http://myfaces.apache.org/trinidad/trinidad-1_
2/trinidad-api/apidocs/index.html.
The data model should provide the following information for each of the images
to be displayed in the carousel:
■ URL to the images
■ Title, which will be displayed below the image in the carousel
■ Short description used for text displayed when the user mouses over the
image
For examples, see the CarouselBean.java and the
CarouselMediaBean.java classes in the ADF Faces demo application.
2. In the Component Palette, from the Common Components panel, drag and drop a
Carousel onto the page.
3. In the Property Inspector, expand the Common section, and set the following:
■ Orientation: By default, the carousel displays horizontally. Select vertical if
you want it to display vertically, as shown in Figure 16–6. If you set it to
horizontal, you must configure how the items line up using the halign
attribute. If you set it to vertical, set how the items line up using the
valign attribute.
■ Halign: Specify how you want items in a vertical carousel to display. Valid
values are:
– Center: Aligns the items so that they have the same centerpoint. This is
the default.
– End: Aligns the items so that the right edges line up (when the browser is
displaying a left-to-right language).
– Start: Aligns the items so that the left edges line up (when the browser is
displaying a left-to-right language).
■ Valign: Specify how you want items in a horizontal carousel to display. Valid
values are:
– Bottom: Aligns the items so that the bottom edges line up.
– Middle: Aligns the items so that they have the same middle point. This is
the default.
– Top: Aligns the items so that the top edges line up.
■ Value: Bind the carousel to the model.
4. Expand the Data section and set the following:
■ Var: Enter a variable that will be used in EL to access the individual item data.
■ VarStatus: Enter a variable that will be used in EL to access the status of the
carousel. Common properties of varStatus include:
– model: Returns the CollectionModel for the component.
16-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Images in a Carousel
// Redraw the detail panel so that we can update the selected details.
RequestContext rc = RequestContext.getCurrentInstance();
rc.addPartialTarget(_detailPanel);
}
7. Expand the Advanced section and set CurrentItemKey. Specify which item is
showing when the carousel is initially rendered. The value should be (or evaluate
to) the item’s primary key in the CollectionModel:
8. From the Component Palette, drag a Carousel Item to the nodeStamp facet of the
Carousel component.
Bind the CarouselItem component’s attributes to the properties in the data
model using the variable value set on the carousel’s var attribute. For example,
the carousel in Example 16–4 uses item as the value for the var attribute. So the
value of the carouselItem’s text attribute would be item.title (given that
title is the property used to access the text used for the carousel items on the
data model).
9. Drag an image from the Component Palette and drop it as a child to the
carouselItem.
Bind the image component’s attributes to the properties in the data model using
the variable value set on the carousel’s var attribute. For example, the carousel in
Example 16–4 uses item as the value for the var attribute. So the value of the
image’s source attribute would be item.url (given that url is the property
used to access the image).
You can surround the image component with other components if you want more
functionality. For example, Figure 16–7 shows a carousel whose images are
surrounded by a panelGroupLayout component and that also uses a
Performance Tip: The simpler the structure for the carousel is, the
faster it will perform.
16-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Application Status Using Icons
16.6.2 What You May Need to Know About the Carousel Component and Different
Browsers
In some browsers, the visual decoration of the carousel’s items will be richer. For
example, Safari and Google Chrome display subtle shadows around the carousel’s
items, and the noncurrent items have a brightness overlay to help make clear that the
auxiliary items are not the current item, as shown in Figure 16–8.
■ When your application is configured to use the Active Data Service (ADS), what
the status indicator displays depends on how ADS is configured.
ADS can be configured to either have data pushed to the model, or it can be
configured to have the application poll for the data at specified intervals.
Table 16–3 shows the icons that are used to display server states for push and poll
modes (note that the icons are actually animated).
After you drop a status indicator component onto the page, you can use skins to
change the actual image files used in the component. For more information about
using skins, see Chapter 20, "Customizing the Appearance Using Styles and Skins."
Tip: For help in setting attributes, use the field’s dropdown menu to
view a description of the attribute.
16-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Playing Video and Audio Clips
size to use, although you can specify the type of content yourself, using the
contentType attribute.
You can specify which controls are to be available to the user, and other player features
such as whether or not the clip should play automatically, and whether or not it
should play continuously or a specified number of times.
For example, you can have the player display all controls available, the most
commonly used controls, or no controls.
As an example, Example 16–7 uses the all setting for a media component.
16-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Playing Video and Audio Clips
Tip: Using the width and height attributes can lead to unexpected
results because it is difficult to define a suitable width and height to
use across different players and different player control
configurations. Instead of defining the size of the complete display,
you can instead define just the size of the media content area using the
innerWidth and innerHeight attributes.
■ InnerWidth and InnerHeight: Define the size in pixels of only the media
content area. This is the preferred scheme, because you control the amount of
space allocated to the player area for your clip.
Tip: If you do not specify a size for the media control, a default inner
size, determined by the content type of the media resource, is used.
While this works well for audio content, it can cause video content to
be clipped or to occupy too much space.
If you specify dimensions from both schemes, such as a height and
an innerHeight, the overall size defined by the height attribute is
used. Similarly, if you specify both a width and an innerWidth, the
width attribute is used.
5. Expand the Behavior section and set Autostart. By default, playback of a clip will
not start until the user starts it using the displayed controls. You can specify that
playback is to start as soon as the clip is loaded by setting the autostart
attribute to true.
Set PlayCount to the number of times you want the media to play. Once started,
by default, the clip with play through once only. If the users have controls
available, they can replay the clip. However, you can specify that the clip is to play
back a fixed number of times, or loop continuously, by setting a value for the
playCount attribute. Setting the playCount attribute to 0 replays the clip
continuously. Setting the attribute to some other number plays the clip the
specified number of times.
Example 16–8 shows an af:media component in the source of a page. The component
will play a video clip starting as soon as it is loaded and will continue to play the clip
until stopped by the user. The player will display all the available controls.
16-18 Web User Interface Developer's Guide for Oracle Application Development Framework
17
17 Displaying Tips, Messages, and Help
This chapter describes how to define and display tips and messages for ADF Faces
components, and how to provide different levels of help information for users.
This chapter includes the following sections:
■ Section 17.1, "Introduction to Displaying Tips and Messages"
■ Section 17.2, "Displaying Tips for Components"
■ Section 17.3, "Displaying Hints and Error Messages for Validation and
Conversion"
■ Section 17.4, "Grouping Components with a Single Label and Message"
■ Section 17.5, "Displaying Help for Components"
converter, when the user clicks in the field, a note window displays a hint that shows
the expected pattern, as shown in Figure 17–2. If the inputDate component was also
configured with a minimum or maximum value, the hint would display that
information as well. These hints are provided by the converters and validators
automatically.
ADF Faces uses the standard JSF messaging API. JSF supports a built-in framework for
messaging by allowing FacesMessage instances to be added to the FacesContext
object using the addMessage(java.lang.String clientId, FacesMessage
message) method. In general there are two types of messages that can be created:
component-level messages, which are associated with a specific component based on
any client ID that was passed to the addMessage method, and global-level messages,
which are not associated with a component because no the client ID was passed to the
addMessage method.When conversion or validation fails on an
EditableValueHolder ADF Faces component, FacesMessages objects are
automatically added to the message queue on the FacesContext instance, passing in
that component’s ID. These messages are then displayed in the note window for the
component. ADF Faces components are able to display their own messages. You do
not need to add any tags.
For example, if a user enters a date incorrectly in the field shown in Figure 17–2, an
error message is displayed, as shown in Figure 17–3. Note that the error message
appears in the note window along with the hint.
If you want to display a message for a non-ADF Faces component, or if you want the
message to be displayed inline instead of the note window, use the ADF Faces
message component.
Similarly, the document tag handles and displays all global FacesMessages objects
(those that do not contain an associated component ID), as well as component
FacesMessages. Like component messages, you do not need to add any tags for
messages to be displayed. Whenever a global message is created (or more than two
component messages), all messages in the queue will be displayed in a popup
window, as shown in Figure 17–4.
17-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Displaying Tips and Messages
However, you can use the ADF Faces messages component if you want messages to
display on the page rather than in a popup window. For more information about
displaying hints and messages for components, see Section 17.3, "Displaying Hints and
Error Messages for Validation and Conversion."
Instead of having each component display its own messages, you can use the
panelLabelAndMessage component to group components and display a message in
one area. This can be very useful when you have to group components together. For
example, the File Explorer application uses a panelLabelAndMessage component
where users enter a telephone number. The telephone number input field is actually
three separate inputText components. The panelLabelAndMessage component
wraps three inputText components. Instead of each having its own label and
message, the three have just one label and one message, as shown in Figure 17–3. For
more information, see Section 17.4, "Grouping Components with a Single Label and
Message."
Instead of configuring messages for individual component instances, you can create a
separate help system that provides information that can be reused throughout the
application.You create help information using different types of providers, and then
reference the help text from the UI components. The following are the three types of
help supported by ADF Faces:
■ Definition: Provides a help icon (question mark in a blue circle) with the help text
appearing when the user mouses over the icon, as shown in Figure 17–5.
Figure 17–5 Definition Messages Display When Mousing Over the Icon
■ External URL: You can have a help topic that resides in an external application,
which will open in a separate browser window. For example, instead of displaying
instruction help, Figure 17–7 shows the Select Skin selectOneChoice
component configured to open a help topic about skins. When a user clicks the
help icon, the help topic opens.
For more information about creating help systems, see Section 17.5, "Displaying
Help for Components."
17-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Hints and Error Messages for Validation and Conversion
If the text to be used is stored in a resource bundle, use the dropdown list to select
Select Text Resource. Use the Select Text Resource dialog to either search for
appropriate text in an existing bundle, or to create a new entry in an existing
bundle. For more information about using resource bundles, see Chapter 21,
"Internationalizing and Localizing Pages."
17.3 Displaying Hints and Error Messages for Validation and Conversion
Validators and converters have a default hint that is displayed to users when they click
in the associated field. For converters, the hint usually tells the user the correct format
to use. For validators, the hint is used to convey what values are valid.
For example, in the File Explorer application, when a user clicks in the input date field
on the Speak with Customer Service page, a tip is displayed showing the correct
format to use, as shown in Figure 17–10.
When the value of an ADF Faces component fails validation, or cannot be converted
by a converter, the component displays the resulting FacesMessage instance.
For example, entering a date that does not match the dateStyle attribute of the
converter results in an error message, as shown in Figure 17–11.
You can override the default validator and converter hint and error messages. Each
ADF Faces validator and converter component has attributes you can use to define the
detail messages to be displayed for the user. The actual attributes vary according to the
validator or converter. Figure 17–12 shows the attributes that you can populate to
override the messages for the convertDateTime converter, as displayed in the
Property Inspector.
If you do not want messages to be displayed in the note window, you can use the
message component, and messages will be displayed inline with the component.
Figure 17–13 shows how messages are displayed using the message component.
17-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Hints and Error Messages for Validation and Conversion
JSF pages in an ADF Faces application use the document tag, which among other
things, handles displaying all global messages (those not associated with a
component) in a popup window. However, if you want to display global messages on
the page instead, use the messages component.
Note: You can override messages only for ADF Faces components. If
you want to create a message for a non-ADF Faces component (for
example for the f:validator component), then use the message
component. For more information, see Section 17.3.3, "How to Display
Component Messages Inline."
2. In the Property Inspector, expand the Messages section and enter a value for the
attribute for which you want to provide a message.
The values can include dynamic content by using parameter placeholders such as
{0}, {1}, {2}, and so on. For example, the messageDetailConvertDate attribute
on the convertDateTime converter uses the following parameters:
■ {0} the label that identifies the component
■ {1} the value entered by the user
■ {2}an example of the format expected by the component.
Using these parameters, you could create this message:
{1} is not using the correct date format. Please enter the date as follows:
{2}.
Tip: Use the dropdown menu to view the property help, which
includes the parameters accepted by the message.
If the text to be used is stored in a resource bundle, use the dropdown list to select
Select Text Resource. Use the Select Text Resource dialog to either search for
appropriate text in an existing bundle, or to create a new entry in an existing
bundle. For more information about using resource bundles, see Chapter 21,
"Internationalizing and Localizing Pages."
17.3.2 What You May Need to Know About Overriding Default Messages Globally
Instead of changing the message string per component instance with the
messageDetail[XYZ] attributes, override the string globally so that the string will
be displayed for all instances. To override globally, create a message bundle whose
contents contain the key for the message and the message text you wish to use.
You create and use a message bundle in the same way you create and use resource
bundles for translation, using either Java classes or properties files. For procedures and
information, see Chapter 21, "Internationalizing and Localizing Pages."
For message key information, see Appendix B, "Message Keys for Converter and
Validator Messages."
17-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Grouping Components with a Single Label and Message
Note: The message icon and message content that will be displayed
are based on what was given when the FacesMessage object was
created. Setting the messageType or message attributes on the
message component causes the messageType or message attribute
values to be displayed at runtime, regardless of whether or not an
error has occurred. Only populate these attributes if you want the
content to always be displayed when the page is rendered.
Example 17–1 panelLabelAndMessage Can Display a Single Label and Help Topic
<af:panelLabelAndMessage labelAndAccessKey="#{explorerBundle['help.telephone']}"
helpTopicId="HELP_TELEPHONE_NUMBER"
labelStyle="vertical-align: top;
padding-top: 0.2em;">
<af:inputText autoTab="true" simple="true" maximumLength="3"
columns="3">
<af:convertNumber type="number" integerOnly="true"/>
</af:inputText>
<af:inputText autoTab="true" simple="true" maximumLength="3"
columns="3">
<af:convertNumber type="number" integerOnly="true"/>
</af:inputText>
<af:inputText autoTab="true" simple="true" maximumLength="4"
columns="4">
<af:convertNumber type="number" integerOnly="true"/>
</af:inputText>
<af:outputText value="#{explorerBundle['help.extension']}"/>
<af:inputText simple="true" columns="4">
<af:convertNumber type="number" integerOnly="true"/>
</af:inputText>
</af:panelLabelAndMessage>
Figure 17–15 shows how the panelLabelAndMessage and nested components are
displayed in a browser.
The panelLabelAndMessage component also includes an End facet that can be used
to display additional components at the end of the group. Figure 17–16 shows how the
telephone number fields would be displayed if the End facet was populated with an
outputText component.
17-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
■ label: Enter the label text to be displayed for the group of components.
■ for: Use the dropdown menu to choose Edit. In the Edit Property dialog, select
the ID of the child input component. If there is more than one input
component, select the first component.
Set the for attribute to the first inputComponent to meet accessibility
requirements.
If one or more of the nested input components is a required component and you
want a marker to be displayed indicating this, set the showRequired attribute to
true.
4. To place content in the End facet, drag and drop the desired component into the
facet.
Because facets accept one child component only, if you want to add more than one
child component, you must wrap the child components inside a container, such as
a panelGroupLayout or group component.
The second type of help is Instruction help. Where Instruction help is displayed
depends on the component with which it is associated. The panelHeader and Search
panel components display Instruction help within the header. Figure 17–18 shows how
the text that typically is displayed as Definition help as shown in Figure 17–17 would
be displayed as Instruction help within the panelHeader component.
All other components that support Instruction help display the text within a note
window, as shown in Figure 17–19. Note that no help icon is displayed.
17-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
The last type of help is External URL help. You provide a URL to a web page in an
external application, and when the help icon is clicked, the web page opens in a
separate browser window, as shown in Figure 17–20. Instead of clicking a help icon,
you can use JavaScript to open a help window based on any client-based event.
■ Have the UI components access the help contained in the providers by using the
component’s helpTopicId attribute. A helpTopicId attribute contains the
following.
■ The prefix that is used by the provider of the help
■ The topic name
For example, the value of the helpTopicId attribute on the inputText
component shown in Figure 17–19 might be RBHELP_FILE_NAME, where RBHELP
is the resource bundle help providers prefix, and FILE_NAME is the help topic
name.
Note: All prefixes under which help providers are registered must be
unique. It is also not permissible for one prefix to begin with the same
characters as another prefix. For example, if help providers have
already been registered for the two prefixes AAB and AC, then the
following prefixes are all invalid and will cause an exception to be
thrown at registration time: AABC, A, AA, AC, ACB. However, the
following are valid: AAD, AB, and so on.
UI components access the help content based on the topic name.
Therefore, if you use the same topic name for two different types of
help (as shown in Example 17–2), then both types of help will be
displayed by the UI component.
Note: If you wish to use an external URL help type, create a subclass
of the ResourceBundleHelpProvider class. For more information,
see Step 3.
17-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
3. If you want to use External URL help, then you also must extend the
ResourceBundleHelpProvider class and implement the getExternalUrl
method. Example 17–4 shows an example method.
if (topicId == null)
return null;
if (topicId.contains("TOPICID_ALL") ||
topicId.contains("TOPICID_DEFN_URL") ||
topicId.contains("TOPICID_INSTR_URL") ||
topicId.contains("TOPICID_URL"))
return http://www.myURL.com;
else
return null;
}
In Example 17–4, all the topics in the method return the same URL. You would
have to create separate if statements to return different URLs.
If you want the external window to be launched based on a component’s client
event instead of from a help icon, use a JavaScript function. For more information,
see Section 17.5.4, "How to Use JavaScript to Launch an External Help Window."
Note: All prefixes under which help providers are registered must be
unique. It is also not permissible for one prefix to begin with the same
characters as another prefix. For example, if help providers have
already been registered for the two prefixes AAB and AC, then the
following prefixes are all invalid and will cause an exception to be
thrown at registration time: AABC, A, AA, AC, ACB. However, the
following are valid: AAD, AB, and so on.
UI components access the help content based on the topic name.
Therefore, if you use the same topic name for two different types of
help (as shown in Example 17–5), then both types of help will be
displayed by the UI component.
17-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
oracle.adf.view.rich.help.ELHelpProvider
</help-provider-class>
<property>
<property-name>helpSource</property-name>
<value>#{adfBundle['project1xliff.view.Project1XliffBundle']}</value>
</property>
</help-provider>
</adf-faces-config>
</adf-settings>
Example 17–7 Managed Bean that Returns a Map of Help Text Strings
public class ELHelpProviderMapDemo
{
public ELHelpProviderMapDemo()
{
}
The first string must contain the prefix, the topic name, and the help type, for
example, MAPHELP_CREDIT_CARD_DEFINITION. In this example, MAPHELP
will become the prefix used to access the bean. CREDIT_CARD is the topic name,
and DEFINITION is the type of help. The second string is the help text.
17-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
Note: All prefixes under which help providers are registered must be
unique. It is also not permissible for one prefix to begin with the same
characters as another prefix. For example, if help providers have
already been registered for the two prefixes AAB and AC, then the
following prefixes are all invalid and will cause an exception to be
thrown at registration time: AABC, A, AA, AC, ACB. However, the
following are valid: AAD, AB, and so on.
UI components access the help content based on the topic name.
Therefore, if you use the same topic name for two different types of
help (as shown in Example 17–7), then both types of help will be
displayed by the UI component.
Note: If you wish to use external URL help, create a subclass of the
ELHelpProvider class. For more information, see Step 4.
2. Register the managed bean in the faces-config.xml file. Example 17–8 shows
the bean shown in Example 17–7 registered in the faces-config.xml file.
For more information about using and registering managed beans, see Section 2.6,
"Creating and Using Managed Beans."
3. Register the managed bean as a help provider in the adf-settings.xml file (for
information on creating the adf-settings.xml file if one does not exist, see
Section A.5.1, "How to Configure for ADF Faces in adf-settings.xml").
To register the provider, open the adf-settings.xml file and add the following
elements:
■ <help-provider>: Create and use the prefix attribute to define the prefix
that UI components will use to access this help provider. This must be unique
in the application.
4. If you want to use External URL help with the managed bean provider, then
extend the ELHelpProvider class and implement the getExternalUrl
method. Example 17–10 shows an example method.
In Example 17–10, all the topics in the method return the same URL. You must
create separate if statements to return different URLs.
If you want the external window to be launched based on a component’s client
event instead of from a help icon, use a JavaScript function. For more information,
see Section 17.5.4, "How to Use JavaScript to Launch an External Help Window."
17-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
2. Drag and drop a component whose client event will cause the function to be
called. You must set the clientId on this component to true.
3. In the Component Palette, from the Operations panel, drag and drop a Client
Listener as a child to the component created in Step 2. Configure the
clientListener to invoke the function created in Step 1. For more information
about using the clientListener tag, see Section 3.2, "Listening for Client
Events."
Example 17–12 shows the code used to have a click event on a
commandToolbarButton component launch the helpClient.jspx page.
Faces providers all use a property to define the actual source of the help strings. To
access a property in the adf-settings.xml file, create a method that sets a
property that is a String. For example:
public void setMyCustomProperty(String arg)
4. To register the provider, open the adf-settings.xml file and add the following
elements:
■ <help-provider>: Use the prefix attribute to define the prefix that UI
components will use to access this help provider. This must be unique in the
application.
17-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Displaying Help for Components
This example will return both the definition and instruction help defined in the
XLIFF file in Example 17–5.
3. If you want to provide help for a component that does not support help, you can
instead add an outputText component to display the help text, and then bind
that component to the help provider, for example:
<af:outputFormatted
value="#{adfFacesContext.helpProvider['XLIFF_CREDIT_CARD'].instructions}"/>
17.5.7 What You May Need to Know About Combining Different Message Types
When you add help messages to input components that may already display messages
for validation and conversion, ADF Faces displays the messages in the following order
within the note window:
1. Validation and conversion error messages.
2. Validation and conversion hints.
3. For input and select components only, Instruction help. For panelHeader
components, Instruction help is always displayed below the header.
4. Value for shortDesc attribute.
Figure 17–21 shows an inputDate component that contains a converter, instruction
help, and a tip message.
17-24 Web User Interface Developer's Guide for Oracle Application Development Framework
18
Working with Navigation Components
18
This chapter describes how to use ADF Faces navigation components such as
commandButton, navigationPane, and train to provide navigation in web user
interfaces.
This chapter includes the following sections:
■ Section 18.1, "Introduction to Navigation Components"
■ Section 18.2, "Using Buttons and Links for Navigation"
■ Section 18.3, "Configuring a Browser’s Context Menu for Command Links"
■ Section 18.4, "Using Buttons or Links to Invoke Functionality"
■ Section 18.5, "Using Navigation Items for a Page Hierarchy"
■ Section 18.6, "Using a Menu Model to Create a Page Hierarchy"
■ Section 18.7, "Creating a Simple Navigational Hierarchy"
■ Section 18.8, "Using Train Components to Create Navigation Items for a Multi-Step
Process"
■ Components that render items such as tabs and breadcrumbs for navigating
hierarchical pages. See Section 18.5, "Using Navigation Items for a Page
Hierarchy".
■ Train components for navigating a multistep process. See Section 18.8, "Using
Train Components to Create Navigation Items for a Multi-Step Process".
In addition to using command components for navigation, ADF Faces also includes
listener tags that you can use in conjunction with command components to have
specific functionality execute when the action event fires. For more information, see
Section 18.4, "Using Buttons or Links to Invoke Functionality".
18-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Buttons and Links for Navigation
ADF Faces also includes a toolbar button that provides additional functionality, such
as a popup facet that can open popup menus from a toolbar button. For more
information, see Section 14.3, "Using Toolbars".
You can configure your application to allow end users invoke a browser’s context
menu when they right-click a command component that renders a link. End users who
right-click the link rendered by a command component may use a browser’s context
menu to invoke an action that you do not want them to invoke (for example, open the
link in a new window). For more information, see Section 18.3, "Configuring a
Browser’s Context Menu for Command Links."
3. Set the icon attribute to the URI of the image file you want to use for inside a
commandButton or commandImageLink component (this is not supported for
commandLink). For a commandImageLink component, you can also set the
hoverIcon, disabledIcon, and depressedIcon attributes.
Tip: You can use either the text attribute (or textAndAccessKey
attribute) or the icon attribute, or both.
5. Expand the Behavior section and set the disabled attribute to true if you want
to show the component as a non-interactive button or link.
6. Set the partialSubmit attribute to true to fire a partial page request each time
the component is activated. For more information, see Section 7.2, "Enabling
Partial Page Rendering Declaratively".
7. Set the immediate attribute to true if you want skip the Process Validations and
Update Model phases. The component’s action listeners (if any), and the default
JSF ActionListener handler are executed at the end of the Apply Request
Values phase of the JSF lifecycle. For more information, see Section 4.2, "Using the
Immediate Attribute".
Command buttons and links can also be used to open secondary windows through
these attributes: useWindow, windowHeight, windowWidth, launchListener,
and returnListener. For information about opening secondary windows, see
Chapter 18, "Working with Navigation Components".
18-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuring a Browser’s Context Menu for Command Links
3. Set the icon attribute to the URI of the image file you want to use for inside a
goButton or goImageLink component (not supported for goLink). For a
goImageLink component, you can also set the hoverIcon, disabledIcon,
depressedIcon, and iconPosition attributes.
The iconPosition attribute supports two values: leading (default) and
trailing. Set to leading to render the icon before the text. Set to trailing to
render the icon after the text.
Tip: You can use either the text attribute (or textAndAccessKey
attribute) or the icon attribute, or both.
4. Set the destination attribute to the URI of the page to which the link should
navigate.
For example, in the File Explorer application, the goLink component in the
popups.jspx file has the following EL expression set for its destination
attribute:
destination="http://www.oracle.com"
5. Set the targetFrame attribute to specify where the new page should display.
Acceptable values are:
■ _blank: The link opens the document in a new window.
■ _parent: The link opens the document in the window of the parent. For
example, if the link appeared in a dialog, the resulting page would render in
the parent window.
■ _self: The link opens the document in the same page or region.
■ _top: The link opens the document in a full window, replacing the entire
page.
6. Expand the Behavior section and set the disabled attribute to true if you want
to show the component as a non-interactive button or link. You set the disabled
attribute for the goImageLink component in the Other section.
framework allows the end user´s browser to render a context menu for these
command components. The context menu may present menu options that invoke a
different action (for example, open a link in a new window) to that specified by the
command component. The components for which you can configure this behavior
include the following:
■ af:commandLink
■ af:commandImageLink
■ af:commandMenuItem (stand-alone or within an af:menuBar component)
■ af:commandNavigationItem if no value is specified for the destination
attribute, the ADF Faces framework enables the browser context menu in the
following scenarios:
– For the two anchors that af:commandNavigationItem renders when inside
an af:train component
– When an af:commandNavigationItem renders inside an
af:breadCrumbs component
– When an af:commandNavigationItem renders inside an
af:navigationPane component (any hint--tabs, bar, buttons, choice, list)
■ af:panelTabbed: the tabs and overflow indicators
■ af:panelAccordion: the disclosure link and overflow indicators
You cannot configure this behavior for components that specify a destination and do
not invoke an action. Examples of these components include the following:
■ af:goLink
■ af:goImageLink
■ af:commandNavigationItem where you specify a value for the destination
attribute and no value for the action attribute
18-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Buttons or Links to Invoke Functionality
18.3.2 What Happens When You Configure a Browser’s Context Menu for Command
Links
If you followed the procedure outlined in Section 18.3, "Configuring a Browser’s
Context Menu for Command Links," JDeveloper writes a value to the web.xml file, as
shown in Example 18–1.
For more information about ADF Faces configuration options in your application’s
web.xml file, see Section A.2, "Configuration in web.xml."
At runtime, end users can invoke a browser’s context menu by right-clicking on the
links rendered by certain components, as described in Section 18.3, "Configuring a
Browser’s Context Menu for Command Links."
After the content has been sent to the browser, how that content is displayed or saved
depends on the option selected in the dialog. If the Open with option was selected, the
application associated with that file type will be invoked to display the content. For
example, a text file may result in the Notepad application being started. If the Save to
Disk option was selected, depending on the browser, a popup dialog may appear to
select a file name and a location in which to store the content.
Example 18–2 shows the tags of a command button with the
fileDownloadActionListener tag to download the file content Hi there! to the
user.
Example 18–3 shows the managed bean method used to process the file download.
18-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Navigation Items for a Page Hierarchy
An application may consist of pages that are related and organized in a tree-like
hierarchy, where users gain access to specific information on a page by drilling down a
path of links. For example, Figure 18–4 shows a simple page hierarchy with three
levels of nodes under the top-level node, Home. The top-level node represents the root
parent page; the first-level nodes, Benefits and Employee Data, represent parent pages
that contain general information for second-level child nodes (such as Insurance and
View Employee) that contain more specific information; the Insurance node is also a
parent node, which contains general information for third-level child nodes, Health
and Dental. Each node in a page hierarchy (except the root Home node) can be a
parent and a child node at the same time, and each node in a page hierarchy
corresponds to a page.
Navigation in a page hierarchy follows the parent-child links. For example, to view
Health information, the user would start drilling from the Benefits page, then move to
the Insurance page where two choices are presented, one of which is Health. The path
of selected links starting from Home and ending at Health is known as the focus path in
the tree.
In addition to direct parent-child navigation, some cross-level or cross-parent
navigation is also possible. For example, from the Dental page, users can jump to the
Paid Time Off page on the second level, and to the Benefits page or the Employee Data
page on the first level.
As shown in Figure 18–4, the Help node, which is not linked to any other node in the
hierarchy but is on the same level as the top-level Home node, is a global node. Global
nodes represent global pages (such as a Help page) that can be accessed from any page
in the hierarchy.
Typical widgets used in a web user interface for a page hierarchy are tabs, bars, lists,
and global links, all of which can be created by using the navigationPane
component. Figure 18–5 shows the hierarchy illustrated in Figure 18–4, as rendered
using the navigationPane and other components.
18-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Navigation Items for a Page Hierarchy
In general, tabs are used as first-level nodes, as shown in Figure 18–5, where there are
tabs for the Benefits and Employee Detail pages. Second-level nodes, such as
Insurance and Paid Time Off are usually rendered as bars, and third-level nodes, such
as Health and Dental are usually rendered as lists. However, you may use tabs for
both first- and second-level nodes. Global links (which represent global nodes) are
rendered as text links. In Figure 18–5, the Home and Help global links are rendered as
text links.
One navigationPane component corresponds to one level of nodes, whether they
are first-, second-, or third-level nodes, or global nodes. Regardless of the type of
navigation items the navigationPane component is configured to render for a level,
you always use the commandNavigationItem component to represent each item
within the navigationPane component.
The navigationPane component simply renders tabs, bars, lists, and global links for
navigation. To achieve the positioning and visual styling of the page background, as
shown in Figure 18–10 and Figure 18–11, you use the decorativeBox component as
the parent to the first level navigationPane component. The decorativeBox
component uses themes and skinning keys to control the borders and colors of its
different facets. For example, if you use the default theme, the decorativeBox
component body is white and the border is blue, and the top-left corner is rounded. If
you use the medium theme, the body is a medium blue. For information about using
themes and skins, see Chapter 20, "Customizing the Appearance Using Styles and
Skins".
Tip: Because creating a page hierarchy requires that each page in the
hierarchy use the same layout and look and feel, consider using a
template to determine where the navigation components should be
placed and how they should be styled. For more information, see
Section 19.3, "Using Page Templates".
For each page of simpler hierarchies, you first use a series of navigationPane
components to represent each level of the hierarchy. Then you add
commandNavigationItem components as direct children of the navigationPane
components for each of links for each level. For example, to create the Health
insurance page as shown in Figure 18–5, you would first use a navigationPane
component for each level displayed on the page, in this case it would be four: one for
the global links, one for the first-level nodes, one for the second-level nodes, and one
for the third-level nodes. You would then need to add commandNavigationItem
components as children to each of the navigationPane components to represent the
individual links. If instead you were creating the Benefits page, as shown in
Figure 18–6, you would create only three navigationPane components (one each for
the global, first, and second levels), and then create just the
commandNavigationItem components for the links seen from this page.
As you can see, with large hierarchies, this process can be very time consuming and
error prone. Instead of creating each of the separate commandNavigationItem
components on each page, for larger hierarchies you can use an XMLMenuModel
implementation and managed beans to dynamically generate the navigation items on
the pages. The XMLMenuModel class, in conjunction with a metadata file, contains all
the information for generating the appropriate number of hierarchical levels on each
page, and the navigation items that belong to each level. Instead of using multiple
commandNavigationItem components within each navigationPane component
and marking the current items as selected on each page, you declaratively bind each
navigationPane component to the same XMLMenuModel implementation, and use
one commandNavigationItem component in the nodeStamp facet to provide the
navigation items. The commandNavigationItem component acts as a stamp for
navigationPane component, stamping out navigation items for nodes (at every
level) held in the XMLMenuModel object. The JSF navigation model, through the
default ActionListener mechanism, is used to choose the page to navigate to when
users select a navigation item. For more information about the menu model, see
Section 18.6, "Using a Menu Model to Create a Page Hierarchy".
On any page, to show the user’s current position in relation to the entire page
hierarchy, you use the breadCrumbs component with a series of
commandNavigationItem components or one commandNavigationItem
component as a nodeStamp, to provide a path of links from the current page back to
the root page (that is, the current nodes in the focus path).
For more information about creating a navigational hierarchy using the
XMLMenuModel, see Section 18.6, "Using a Menu Model to Create a Page Hierarchy".
For more information about manually creating a navigational hierarchy, see
Section 18.7, "Creating a Simple Navigational Hierarchy".
Note: If you want to create menus that can be used to cause some
sort of change in an application (for example, a File menu that
contains the commands Open and Delete), then see Chapter 14, "Using
Menus, Toolbars, and Toolboxes".
18-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
Section 18.5, "Using Navigation Items for a Page Hierarchy" describes how you can
create a navigation menu for a very simple page hierarchy using navigationPane
components with multiple commandNavigationItem children components. Using
the same method for more complex page hierarchies would be time consuming and
error prone. It is inefficient and tedious to manually insert and configure individual
commandNavigationItem components within navigationPane and
breadCrumbs components on several JSF pages to create all the available items for
enabling navigation. It is also difficult to maintain the proper selected status of each
item, and to deduce and keep track of the breadcrumb links from the current page
back to the root page.
For more complex page hierarchies (and even for simple page hierarchies), a more
efficient method of creating a navigation menu is to use a menu model. A menu model
is a special kind of tree model. A tree model is a collection of rows indexed by row keys.
In a tree, the current row can contain child rows (for more information about a tree
model, see Section 10.5, "Displaying Data in Trees"). A menu model is a tree model that
knows how to retrieve the rowKey of the node that has the current focus (the focus
node). The menu model has no special knowledge of page navigation and places no
requirements on the nodes that go into the tree.
The XMLMenuModel class creates a menu model from a navigation tree model. But
XMLMenuModel class has additional methods that enable you to define the
hierarchical tree of navigation in XML metadata. Instead of needing to create Java
classes and configuring many managed beans to define and create the menu model (as
you would if you used one of the other ADF Faces menu model classes), you create
one or more XMLMenuModel metadata files that contain all the node information
needed for XMLMenuModel class to create the menu model.
the XMLMenuModel metadata file. See Section 18.6.2, "What Happens When You
Use the Create ADF Menu Model Wizard".
■ Create a JSF page for each of the hierarchical nodes (including any global nodes).
Tip: Typically, you would use a page template that contains a facet
for each level of items (including global items and breadcrumbs) to
create each JSF page. For example, the navigationPane component
representing global items might be wrapped in a facet named
navigationGlobal, and the navigationPane component
representing first level tabs might be wrapped in a navigation1
facet. For information about creating page templates, see Chapter 19,
"Creating and Reusing Fragments, Page Templates, and Components".
If you wanted each node in the hierarchy to have its own page to which a user can
navigate, then you would create an item node in the metadata for each page. You nest
the children nodes inside the parent node to create the hierarchy. However, say you
did not need a page for the Employee Data node, but instead wanted the user to
navigate directly to the View Employee page. You would then use a group node to
represent the Employee Data page and use the group node's idref attribute to
reference the page that opens (the View Employee page) when an end user clicks the
Employee Data tab. The group node allows you to retain the hierarchy without
needing to create pages for nodes that are simply aggregates for their children nodes.
You can also nest menu models using the shared nodes. This approach is
recommended where you have sub trees in the hierarchy (for example, the Benefits
tree) as it makes the page hierarchy easier to maintain. For example, you might create
the entire Benefits tree as its own model so that it could be reused across an
application. Instead of creating the nodes for each use, you could instead create the
18-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
nodes once as a separate menu and then within the different hierarchies, use a shared
node to reference the Benefits menu model.
Example 18–4 shows an XMLMenuModel metadata file for defining a page hierarchy
illustrated in Figure 18–7.
Within the root menu element, global nodes are any types of nodes that are direct
children of the menu element; in other words, the first level of elements under the
menu element are global nodes. For example, the code in Example 18–4 shows three
global nodes, namely, Home, Help, and Preferences. Within a first-level child node,
nodes can be nested to provide more levels of navigation. For example, the code in
Example 18–4 shows two second-level nodes under Home, namely, Benefits and
Employee Data. Within Benefits, there are two third-level nodes, Insurance and Paid
Time Off, and so on.
JDeveloper simplifies creating metadata for an XMLMenuModel class by providing the
Create ADF Menu Model wizard.
For each navigation case, specify a unique outcome string, and the path to the JSF
page that should be displayed when the navigation system returns an outcome
value that matches the specified string.
18-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
3. In the Create ADF Menu Model dialog, enter a file name for the XMLMenuModel
metadata file, for example, root_menu.
4. Enter a directory for the metadata file. By default, JDeveloper will save the
XMLMenuModel metadata file in the WEB-INF directory of the application.
When you click OK, JDeveloper automatically does the following for you:
■ Creates a managed bean for the model in the faces-config.xml file, using
the name specified in Step 3 for the managed bean name.
■ Sets the value of the managed bean's source managed property to the
XMLMenuModel metadata file, specified in Step 3, for example,
/WEB-INF/root_menu.xml.
■ Displays the source file (that is, /WEB-INF/root_menu.xml) as a blank
XMLMenuModel metadata file in the source editor, as shown in Example 18–6.
resourceBundle="org.apache.myfaces.demo.xmlmenuDemo.resource.MenuBundle"
var="bundle">
<itemNode id="in1" label="#{bundle.somelabel1}" ../>
<itemNode id="in2" label="#{bundle.somelabel2}" ../>
</menu>
For more information about using resource bundles, see Chapter 21,
"Internationalizing and Localizing Pages".
6. In the Structure window, add the desired elements for the nodes in your
hierarchy, using itemNode, groupNode, or sharedNode as needed. To begin,
right-click menu and choose Insert inside menu, and then choose the desired
element from the context menu, as shown in Figure 18–8.
18-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
As you build the XMLMenuModel metadata file, the tree structure you see in the
Structure window exactly mirrors the indentation levels of the menu metadata, as
shown in Figure 18–9.
7. For each element used to create a node, set the properties in the Property
Inspector, as described in Table 18–2 for itemNode elements, Table 18–3 for
groupNode elements, and Table 18–4 for sharedNode elements.
A groupNode element does not have the action or destination attribute that
performs navigation directly, but it points to a child node that has the action
outcome or destination URI, either directly by pointing to an itemNode child
(which has the action or destination attribute), or indirectly by pointing to a
groupNode child that will then point to one of its child nodes, and so on until an
itemNode element is reached. Navigation will then be determined from the action
outcome or destination URI of that itemNode element.
Consider the groupNode code shown in Example 18–9. At runtime, when users
click groupNode id="gn1", or groupNode id="gn11", or itemNode
id="in1", the navigation outcome is "goToSubTabOne", as specified by the first
itemNode reached (that is itemNode id="id1"). Table 18–3 shows the
attributes you must specify when you use a groupNode element.
18-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
18.6.2 What Happens When You Use the Create ADF Menu Model Wizard
When you use the Create ADF Menu Model wizard to create an XMLMenuModel
metadata file, JDeveloper automatically configures for you a managed bean for the
metadata file in the faces-config.xml file, using the metadata file name you
provide as the managed bean name.
Example 18–10 shows part of the faces-config.xml file that contains the
configuration of one XMLMenuModel metadata file. By default, JDeveloper uses the
oracle.adf.view.rich.model.MDSMenuModel class as the managed bean class,
and request as the managed bean scope, which is required and cannot be changed.
In addition, the following managed properties are added by JDeveloper for each
XMLMenuModel managed bean:
■ createHiddenNodes: When true, specifies that the hierarchical nodes must be
created even if the component’s rendered attribute is false. The
createHiddenNodes value is obtained and made available when the source
menu metadata file is opened and parsed. This allows the entire hierarchy to be
created, even when you do not want the actual component to be rendered.
The createHiddenNodes property must be placed before the source property,
which JDeveloper does for you when the managed bean is automatically
configured. The XMLMenuModel managed bean must have this value already set
to properly parse and create the menu's XML metadata from the source
managed property.
■ source: Specifies the source metadata file to use.
For each XMLMenuModel metadata file that you create in a project using the wizard,
JDeveloper configures a managed bean for it in the faces-config.xml file. For
example, if you use a sharedNode element in an XMLMenuModel to reference another
XMLMenuModel metadata file (as shown in Example 18–8), you would have created
two metadata files. And JDeveloper would have added two managed bean
configurations in the faces-config.xml file, one for the main (root) menu model,
and a second managed bean for the shared (referenced) menu model, as shown in
Example 18–11.
This means, if you use shared nodes in your XMLMenuModel metadata file, the
faces-config.xml file will have a root menu model managed bean, plus menu
model managed beans for any menu models referenced through shared nodes.
18-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
level attribute value is 0 (zero), followed by 1 for the next level (typically tabs), 2 for
the next level after that (typically bars), and so on. For example, if you had a page
hierarchy like the one shown in Figure 18–7 and Example 18–4, you would use three
navigationPane components on a page such as Home (for the three levels of
navigation under the Home node), plus one more navigationPane component for
the global nodes.
As described in Section 18.7.1, "How to Create a Simple Page Hierarchy", you use the
hint attribute to specify the type of navigation item you want to use for each
hierarchical level (for example, buttons, tabs, or bar). But instead of manually
adding multiple commandNavigationItem components yourself to provide the
navigation items, you bind each navigationPane component to the XMLMenuModel
managed bean, and insert only one commandNavigationItem component into the
nodeStamp facet of each navigationPane component, as shown in Example 18–12.
For example, to create any of the pages as shown in the hierarchy in Figure 18–5,
you would drag and drop four navigationPane components.
3. For each navigationPane component, in the Property Inspector, expand the
Common section and set the Hint attribute to one of the following types of
navigation items to determine how the navigationPane will display the
following:
■ bar: Displays the navigation items separated by a bar, for example the
Insurance and Paid Time Off links in Figure 18–11.
■ buttons: Displays the navigation items separated by a bar in a global area, for
example the Home and Help links in Figure 18–11.
■ choice: Displays the navigation items in a popup list when the associated
dropdown icon is clicked. You must include a value for the navigationPane
component’s icon attribute and you can associate a label to the dropdown list
using the title attribute.
■ list: Displays the navigation items in a bulleted list, for example the Health
and Dental links in Figure 18–11.
■ tabs: Displays the navigation items as tabs, for example the Benefits and
Employee Data tabs in Figure 18–11.
4. Set the level attribute to point to the appropriate level of metadata in the
XMLMenuModel metadata file. The level attribute is a zero-based index number:
Starting with global nodes in the metadata file (that is, direct children nodes under
the menu element as shown in Example 18–4), the level attribute value is 0
(zero), followed by 1 for the next level (typically tabs), 2 for the next level after
that (typically bars), and so on.
The commandNavigationItem component is able to get its metadata from the
metadata file through the level attribute on the parent navigationPane
component. By default, if you do not specify a level attribute value, 0 (zero) is
used, that means the navigationPane component will take the metadata from
the first-level under the menu element for rendering by the
commandNavigationItem component.
18-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
5. In the Property Inspector, expand the Data section. Set the value attribute to the
menu model managed bean that is configured for the root XMLMenuModel class in
the faces-config.xml file.
Note: The value attribute can reference root menu models and
menu models referenced by shared nodes. If you reference a shared
node in the value attribute, the faces-config.xml file needs to
have a new managed bean entry with a different managed bean name
than the one which is used in a root menu model definition in the
menu model metadata file. This promotes the menu model of a shared
node to a root menu model which can then be referred to in the value
attribute.
6. Set the var attribute to text that you will use in the commandNavigationItem
components to get the needed data from the menu model.
As the hierarchy is created at runtime, and each node is stamped, the data for the
current node is copied into the var attribute, which can then be addressed using
an EL expression. You specify the name to use for this property in the EL
expression using the var property.
Tip: You use the same value for the var attribute for every
navigationPane component on the page or in the application.
7. Drag and drop a Navigation Item from the Component Palette to the nodeStamp
facet of the navigationPane component.
8. Set the values for the remaining attributes that have corresponding values in the
metadata using EL expressions that refer to the menu model (whose metadata
contains that information). You access these values using the value of the var
attribute you set for the parent navigationPane component in Step 6 along with
the name of the corresponding itemNode element that holds the value in the
metadata. Table 18–5 shows the attributes on the navigation item that has
corresponding values in the metadata.
Table 18–5 Navigation Item Attributes and the Associated Menu Model Attributes
Navigation Item Attribute Associated Menu Model Element Attribute
text label
action doAction
icon icon
destination destination
visible visible
rendered rendered
For example, if you had set the var attribute on the parent navigationPane
component to menuNode, you would use #{menuNode.doAction} as the EL
expression for the value of the action attribute. This would resolve to the action
property set in the metadata for each node. Example 18–13 shows the JSF code for
binding to a menu model for the HR example.
To create a breadcrumb:
1. Create a breadCrumbs component by dragging and dropping a Bread Crumbs
component from the Component Palette to the JSF page.
2. By default, breadcrumb links are displayed in a horizontal line. To change the
layout to be vertical, in the Property Inspector, expand the Common section and
set the orientation attribute to vertical.
3. In the Property Inspector, expand the Data section. Set the value attribute to the
root menu model managed bean as configured in the faces-config.xml file.
This is the same bean to which the navigationPane component is bound.
18-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
Note: The value attribute should reference only a root menu model
and not any menu models referenced through shared nodes. For
example, if you use a shared node in your main XMLMenuModel
element (as shown in Example 18–8), JDeveloper would have created
managed bean configurations for the shared node and the root
XMLMenuModel bean that consumes the shared model. The shared
model managed bean is automatically incorporated into the root
menu model managed bean as the menu tree is parsed at startup.
4. Set the var attribute to text that you will use in the commandNavigationItem
components to get the needed data from the menu model.
As the hierarchy is created at runtime, and each node is stamped, the data for the
current node is copied into the var attribute, which can then be addressed using
an EL expression. You specify the name to use for this property in the EL
expression using the var property.
Tip: You can use the same value for the var attribute for the
breadCrumbs component as you did for the navigationPane
components on the page or in the application.
6. Set the values for the remaining attributes that have corresponding values in the
metadata using EL expressions that refer to the menu model (whose metadata
contains that information). You access these values using the value of the var
attribute you set for the parent breadCrumbs component in Step 4 along with the
name of the corresponding itemNode element that holds the value in the
metadata. Table 18–5 shows the attributes on the navigation item that has
corresponding values in the metadata.
For example, if you had set the var attribute on the breadCrumbs component to
menuNode, you would use #{menuNode.doAction} as the EL expression for the
value of the action attribute. This would resolve to the action property set in the
metadata for each node.
18-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Menu Model to Create a Page Hierarchy
18.6.6 What You May Need to Know About Using Custom Attributes
Custom attributes that you have created can be displayed, but only for itemNode
elements. To add an itemNode element to access the value of a custom attribute, you
need to get the tree from the menu model by:
■ Calling the menu models getWrappedData() method
■ Calling the getFocusRowKey() method to get the current focus path
■ Using this focus path to traverse the tree and return a list of nodes in the focus
path
■ Testing one or more of these nodes for custom attribute(s) by calling the
getCustomProperty() API
Example 18–15 shows an example of the required code.
tree.exitContainer();
}
return nodeList;
}
return label;
}
18-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a Simple Navigational Hierarchy
{
FacesContext context = FacesContext.getCurrentInstance();
PropertyResolver resolver = context.getApplication().getPropertyResolver();
// Get a node
Object node = tree.getRowData();
if (propVal == myVal)
{
return node;
}
if (node != null)
return node;
tree.exitContainer();
}guap
}
return null;
}
Figure 18–10 Navigation Items Available from the View Employee Page
When you create the hierarchy manually, first determine the focus path of each page
(that is, where exactly in the hierarchy the page resides) in order to determine the
exact number of navigationPanes and commandNavigationItem components
needed for each page, as well as to determine whether or not each component should
be configured as selected when the user visits the page. For example, in Figure 18–10,
which shows the Employee Data page, only the child bars of Employee Data are
needed, and the Employee Data tab renders as selected.
Similarly in Figure 18–11, which shows the Health page, only the child bars of Benefits
are needed, and the Benefits tab must be configured as selected. Additionally for this
page, you would create the child nodes under Insurance, which can be presented as
vertical lists on the side of the page. The contents of the page are displayed in the
middle, to the right of the vertical lists.
Regardless of the type of navigation items you use (such as tabs or bars), a series of
commandNavigationItem child components within each navigationPane
component provide the actual navigation items. For example, in Figure 18–11 the
actual link for the Employee Data tab, the Insurance and Paid Time Off bars, and the
Health and Dental links in the list are each provided by a commandNavigationItem
component.
18-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a Simple Navigational Hierarchy
<to-view-id>/globalhelp.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goEmp</from-outcome>
<to-view-id>/empdata.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goBene</from-outcome>
<to-view-id>/benefits.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goIns</from-outcome>
<to-view-id>/insurance.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goPto</from-outcome>
<to-view-id>/pto.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goView</from-outcome>
<to-view-id>/viewdata.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goCreate</from-outcome>
<to-view-id>/createemp.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goHealth</from-outcome>
<to-view-id>/health.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>goDental</from-outcome>
<to-view-id>/dental.jspx</to-view-id>
</navigation-case>
</navigation-rule>
dropped into specific areas of a template that already contains layout components
to create the look and feel of the page.
4. For each navigationPane component, in the Property Inspector, expand the
Common section and set the Hint attribute to one of the following types of
navigation items to determine how the navigationPane component will be
displayed:
■ bar: Displays the navigation items separated by a bar, for example the
Insurance and Paid Time Off links in Figure 18–11.
■ buttons: Displays the navigation items separated by a bar in a global area, for
example the Home and Help links in Figure 18–11.
■ choice: Displays the navigation items in a popup list when the associated
dropdown icon is clicked. You must include a value for the navigationPane
component’s icon attribute and you can associate a label to the dropdown list
using title attribute.
■ list: Displays the navigation items in a bulleted list, for example the Health
and Dental links in Figure 18–11.
■ tabs: Displays the navigation items as tabs, for example the Benefits and
Employee Data tabs in Figure 18–11.
5. For each navigationPane component, add the needed
commandNavigationItem components to represent the different links by
dragging and dropping a Navigation Item from the Common Components
section of the Component Palette. Drop a Navigation Item as a child to the
navigationPane component for each link needed.
For example, to create the Health page as shown in Figure 18–11, you would use a
total of six commandNavigationItem components, two for each
navigationPane component.
18-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a Simple Navigational Hierarchy
the user that the item has been selected. For example, in Figure 18–11 the Benefits
tab, Insurance bar, and Health list item are shown as selected by a change in either
background color or font style. You do not have to write any code to show the
selected status; the selected attribute on the commandNavigationItem
component for that item takes care of turning on the selected status when the
attribute value is true.
Example 18–17 shows code used to generate the navigation items that are available
when the current page is Health. Because the Health page is accessed from the
Insurance page from the Benefits page, the commandNavigationItem components
for those three links have selected="true".
Example 18–17 Sample Code Using Individual Navigation Items on One Page
<af:navigationPane hint="buttons">
<af:commandNavigationItem text="Home" action="goHome"/>
<af:commandNavigationItem text="Help" action="goHelp"/>
</af:navigationPane>
.
.
.
<af:navigationPane hint="tabs">
<af:commandNavigationItem text="Benefits" action="goBene"
selected="true"/>
<af:commandNavigationItem text="Employee Data" action="goEmp"/>
</af:navigationPane>
.
.
.
<af:navigationPane hint="bar">
<af:commandNavigationItem text="Insurance" action="goIns"
selected="true"/>
<af:commandNavigationItem text="Paid Time Off" action="goPto"/>
</af:navigationPane>
.
.
.
<af:navigationPane hint="list">
<af:commandNavigationItem text="Health" action="goHealth"
selected="true"/>
<af:commandNavigationItem text="Dental" action="goDental"/>
</af:navigationPane>
To create a breadcrumb:
1. Create a breadCrumbs component by dragging and dropping a Bread Crumbs
component from the Component Palette to the JSF page.
Tip: Depending on the renderer or client device type, the last link in
the breadcrumb may not be displayed, but you still must add the
commandNavigationItem component for it. On clients that do
display the last breadcrumb link, the link is always disabled
automatically because it corresponds to the current page.
18-36 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Train Components to Create Navigation Items for a Multi-Step Process
If you have a set of pages that users should visit in a particular order, consider using
the train component on each page to display a series of navigation items that guide
users through the multistep process. Figure 18–12 shows an example of what a
rendered train component might look like on a page. Not only does a train display
the number of steps in a multistep process, it also indicates the location of the current
step in relation to the entire process.
The train component renders each configured step represented as a train stop, and
with all the stops connected by lines. Each train stop has an image (for example, a
square block) with a label underneath the image.
Each train stop corresponds to one step or one page in your multistep process. Users
navigate the train stops by clicking an image or label, which causes a new page to be
displayed. Typically, train stops must be visited in sequence, that is, a user must start
at step 1, move to step 2, then step 3, and so on; a user cannot jump to step 3 if the user
has not visited step 2.
As shown in Figure 18–12, the train component provides at least four styles for train
stops. The current stop where the user is visiting is indicated by a bold font style in the
train stop’s label, and a different image for the stop; visited stops before the current
stop are indicated by a different label font color and image color; the next stop
immediately after the current stop appears enabled; any other stops that have not been
visited are grayed-out.
A train stop can include a subtrain, that is, you configure a command component (for
example, a commandButton component) to start a child multistep process from a
parent stop, and then return to the correct parent stop after completing the subprocess.
Suppose stop number 3 has a subprocess train containing two stops, when the user
navigates into the first stop in the subprocess train, ADF Faces displays an icon
representation of the parent train before and after the subprocess train, as shown in
Figure 18–13.
You can use the trainButtonBar component in conjunction with the train
component to provide additional navigation items for the train, in the form of Back
and Next buttons, as shown in Figure 18–14. These Back and Next buttons allow users
to navigate only to the next or previous train stop from the current stop. You can also
use the trainButtonBar component without a train component. For example, you
may want to display just the Back and Next buttons without displaying the stops
when not all of the stops will be visited based on some conditional logic.
Both train components work by having the value attribute bound to a train model of
type org.apache.myfaces.trinidad.model.MenuModel. The train menu model
contains the information needed to:
■ Control a specific train behavior (that is, how the train advances users through the
train stops to complete the multistep process).
■ Dynamically generate the train stops, including the train stop labels, and the status
of each stop (that is, whether a stop is currently selected, visited, unvisited, or
disabled).
Note: In an application that uses the ADF Model layer and ADF
Controller, this navigation and display is set up and handled in a
different manner. For more information, see the "Creating a Train"
section of the Oracle Fusion Middleware Fusion Developer's Guide for
Oracle Application Development Framework.
Briefly, a menu model for the train is implemented by extending the MenuModel
abstract class, which in turn extends the TreeModel class (for more information, see
Chapter 10, "Using Tables and Trees"). A MenuModel object represents the menu
structure of a page or application or could represent the hierarchy of pages and stops
involved in a flow.
Because an instance of a MenuModel class is a special kind of a TreeModel object, the
nodes in the TreeModel object can represent the stops of a train. The node instance
that represents a train stop within the train component can be of type
TrainStopModel, or it can be any object as long as it provides the same EL structure
as a TrainStopModel object. However, the TrainStopModel class exposes
methods to retrieve the outcome, as well as the label of a stop and its immediate,
disabled, and visited attribute states.
The MenuModel class can also indicate where in the tree the current train stop (page)
is focused. The getFocusRowKey() method in the MenuModel class returns the
rowKey object of the focus page for the current viewId. The menu model
implementation for the train must also have a specific train behavior, which you can
create by extending the
org.apache.myfaces.trinidad.model.ProcessMenuModel class. The train
behavior controls what stops along the train users can visit while visiting at a current
train stop.
To create a train stop model, you can either extend the TrainStopModel abstract
class and implement the abstract methods, or you can create your own class with the
same method signatures. Your class must return a rowData object.
Binding a train component to a train menu model is similar to binding a
navigationPane component to an XMLMenuModel class (described in Section 18.6.3,
"How to Bind to the XMLMenuModel in the JSF Page"). However, as long as your
TrainStopModel implementation returns a rowData object, you do not need to
18-38 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Train Components to Create Navigation Items for a Multi-Step Process
Tip: If you need to collate information for the train stops from
various places, then you will need to manually create the nodeStamp
facet and the individual commandNavigationItem components that
represent the train stops. For more information, see Section 18.8.3,
"How to Bind to the Train Model in JSF Pages".
The MenuModel implementation of your train model must provide specific train
behavior. Train behavior defines how you want to control the pages users can access
based on the page they are currently visiting. ADF Faces supports two train behaviors:
Plus One and Max Visited.
Suppose there are 5 pages or stops in a train, and the user has navigated from page 1
to page 4 sequentially. At page 4 the user jumps back to page 2. Where the user can go
next depends on which train behavior is used in the train model.
In Max Visited, from the current page 2 the user can go back to page 1, go ahead to
page 3, or jump ahead to page 4. That is, Max Visited allows the user to return to a
previous page or advance to any page up to the farthest page already visited. The user
cannot jump ahead to page 5 from page 2 because page 5 has not yet been visited.
Given the same situation, in the Plus One behavior the user can only go ahead to page
3 or go back to page 1. That is, Plus One allows the user to return to a previous page or
advance one more stop further than the current stop. The user cannot jump ahead to
page 4 even though page 4 has already been visited.
To define and use a train for all pages in a multistep process:
■ Create a JSF navigation rule and the navigation cases for the train. Creating a
navigation rule and its navigation cases for a train is similar to Section 18.7.1,
"How to Create a Simple Page Hierarchy", where you create one global navigation
rule that has the navigation cases for all the train stops in the train.
Note: You may want to set the value of the redirect element to
true for each navigation case that you define within the JSF
navigation rule if each train stop is an individual page and you want
the client browser’s URL to reference each new page. If you enable
partial page rendering, the displayed URL may be different. For more
information about the redirect element, see the JavaServer Faces
specification. For more information about partial page rendering, see
Chapter 7, "Rerendering Partial Page Content".
■ Create a train model that implements a specific train behavior and provides the
train stop items for stamping. This includes creating a train stop model class and a
menu model class. See Section 18.8.1, "How to Create the Train Model".
■ Configure managed beans for the train model. See Section 18.8.2, "How to
Configure Managed Beans for the Train Model".
18-40 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Train Components to Create Navigation Items for a Multi-Step Process
The disabled attribute is set to true only if that page in the train cannot be
reached from the current page. The ProcessMenuModel class uses the following
logic to determine the value of the disabled attribute:
■ Plus One: The disabled attribute will be true for any page beyond the next
available page.
■ Max Visited: When the current stop and the maximum page visited are the
same, the behavior is the same as the Plus One behavior. If the current page is
before the maximum page visited, then disabled is set to true for any page
beyond the maximum page visited.
By default, ADF Faces uses the Max Visited behavior when a non-null maxPathKey
value is passed into the train model, as determined by the managed bean you will
create to support the behavior (for more information, see Section 18.8.2, "How to
Configure Managed Beans for the Train Model"). If the maxPathKey value is null,
then ADF Faces uses the Plus One behavior.
18-42 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Train Components to Create Navigation Items for a Multi-Step Process
</managed-property>
<managed-property>
<property-name>outcome</property-name>
<value>guide.train</value>
</managed-property>
<managed-property>
<property-name>label</property-name>
<value>First Step</value>
</managed-property>
<managed-property>
<property-name>model</property-name>
<value>trainMenuModel</value>
</managed-property>
</managed-bean>
The managed properties set the values to the train stop model object (the class
created in Step 1 in Section 18.8.1, "How to Create the Train Model").
The viewId value is the path and file name to the page that is navigated to when
the user clicks a train stop.
The outcome property value is the action outcome string that matches a JSF
navigation case. The default JSF ActionListener mechanism is used to choose
the page associated with the train stop as the view to navigate to when the train
stop is selected.
The label property value is the train stop label text that displays beneath the
train stop image. The value can be static or an EL expression that evaluates to a
string in a resource bundle.
The model property value is the managed bean name of the train model (see
Example 18–24).
If a train stop has subprocess train children, the managed bean configuration
should also include the property (for example, children) that lists the managed
bean names of the subprocess train stops in value expressions (for example,
#{train4a}), as shown in Example 18–21.
Example 18–21 Managed Bean for a Train Stop with Subprocess train Children
<managed-bean>
<managed-bean-name>train4</managed-bean-name>
<managed-bean-class>project1.DemoTrainStopModel</managed-bean-class>
<managed-bean-scope>none</managed-bean-scope>
<managed-property>
<property-name>viewId</property-name>
<value>/train4.jspx</value>
</managed-property>
<managed-property>
<property-name>outcome</property-name>
<value>guide.train4</value>
</managed-property>
<managed-property>
<property-name>label</property-name>
<value>Fourth Step</value>
</managed-property>
<managed-property>
<property-name>children</property-name>
<list-entries>
<value-class>project1.DemoTrainStopModel</value-class>
<value>#{train4a}</value>
<value>#{train4b}</value>
<value>#{train4c}</value>
</list-entries>
</managed-property>
<managed-property>
<property-name>model</property-name>
<value>trainMenuModel</value>
</managed-property>
</managed-bean>
18-44 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Train Components to Create Navigation Items for a Multi-Step Process
</list-entries>
</managed-bean>
The list-entries element contains the managed bean names for the train stops
(excluding subprocess train stops) in value expressions (for example,
#{train1}), listed in the order that the stops should appear on the train.
3. Configure a managed bean to create the train tree model from the train list.
The train tree model wraps the entire train list, including any subprocess train
lists. The train model managed bean should be instantiated with a
childProperty value that is the same as the property name that represents the
list of subprocess train children (see Example 18–21).
The childProperty property defines the property name to use to get the child
list entries of each train stop that has a subprocess train.
The wrappedData property value is the train list instance to wrap, created by the
managed bean in Step 2.
4. Configure a managed bean to create the train model from the train tree model.
This is the bean to which the train component on each page is bound. The train
model wraps the train tree model. The train model managed bean should be
instantiated with a viewIdProperty value that is the same as the property name
that represents the pages associated with the train stops.
Example 18–24 shows sample managed bean code for a train model.
</managed-property>
<!-- to enable plusOne behavior instead, comment out the maxPathKey property -->
<managed-property>
<property-name>maxPathKey</property-name>
<value>TRAIN_DEMO_MAX_PATH_KEY</value>
</managed-property>
</managed-bean>
The viewIdProperty property value is set to the property that is used to specify
the page to navigate to when the user clicks the train stop.
The wrappedData property value is the train tree instance to wrap, created by the
managed bean in Step 3.
The maxPathKey property value is the value to pass into the train model for
using the Max Visited train behavior. ADF Faces uses the Max Visited behavior
when a non-null maxPathKey value is passed into the train model. If the
maxPathKey value is null, then ADF Faces uses the Plus One behavior.
The trainMenuModel in the EL expression is the managed bean name for the train
model (see Example 18–24).
If you cannot use the simplified binding, you must bind the train value to the train
model bean, manually add the nodeStamp facet to the train, and to that, add a
commandNavigationItem component, as shown in Example 18–25.
Example 18–25 Metadata to Bind a Train Component to the Train Model Bean
<af:train value="#{aTrainMenuModel}" var="stop">
<f:facet name="nodeStamp">
<af:commandNavigationItem
text="#{stop.label}"
action="#{stop.outcome}"
...
</af:commandNavigationItem>
</f:facet>
</af:train>
18-46 Web User Interface Developer's Guide for Oracle Application Development Framework
19
Creating and Reusing Fragments, Page
19
This chapter describes how you can create reusable content and then use that content
to build portions of your JSF pages or entire pages.
This chapter includes the following sections:
■ Section 19.1, "Introduction to Reusable Content"
■ Section 19.2, "Using Page Fragments"
■ Section 19.3, "Using Page Templates"
■ Section 19.4, "Using Declarative Components"
■ Section 19.5, "Adding Resources to Pages"
details about creating and using page fragments, see Section 19.2, "Using Page
Fragments."
■ Page templates: By creating page templates, you can create entire page layouts
using individual components and page fragments. For example, if you are
repeatedly laying out some components in a specific way in multiple JSF pages,
consider creating a page template for those pages. When you use the page
template to build your pages, you can be sure that the pages are always consistent
in structure and layout across the application. For details about creating and using
page templates, see Section 19.3, "Using Page Templates," and Section 19.3.3, "How
to Create JSF Pages Based on Page Templates."
■ Declarative components: The declarative components feature allows you to
assemble existing, individual UI components into one composite, reusable
component, which you then declaratively use in one or more pages. For example,
if you are always inserting a group of components in multiple places, consider
creating a composite declarative component that comprises the individual
components, and then reusing that declarative component in multiple places
throughout the application. Declarative components can also be used in page
templates. For details about creating and using declarative components, see
Section 19.4, "Using Declarative Components."
Tip: If your application uses the ADF Controller and the ADF Model
layer, then you can also use ADF regions. Regions used in conjunction
with ADF bounded task flows, encapsulate business logic, process
flow, and UI components all in one package, which can then be reused
throughout the application. For complete information about creating
and using ADF bounded task flows as regions, see the "Using Task
Flows as Regions" chapter of the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
19-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Fragments
pages use the same form, then you might find it beneficial to create page fragments
containing those components in the form, and reuse those page fragments in several
pages. Deciding on how many page fragments to create for one or more complex
pages depends on your application, the degree to which you wish to reuse portions of
a page between multiple pages, and the desire to simplify complex pages.
Page fragments are incomplete JSF pages. A complete JSF page that uses ADF Faces
must have the document tag enclosed within an f:view tag. The contents for the
entire page are enclosed within the document tag. A page fragment, on the other
hand, represents a portion of a complete page, and does not contain the f:view or
document tags. The contents for the page fragment are simply enclosed within a
jsp:root tag.
When you build a JSF page using page fragments, the page can use one or more page
fragments that define different portions of the page. The same page fragment can be
used more than once in a page, and in multiple pages.
For example, the File Explorer application uses one main page (index.jspx) that
includes the following page fragments:
■ popups.jspx: Contains all the popup code used in the application.
■ help.jspx: Contains the help content.
■ header.jspx: Contains the toolbars and menus for the application.
■ navigators.jspx: Contains the tree that displays the folder hierarchy of the
application.
■ contentViews.jspx: Contains the content for the folder selected in the
navigator pane.
Example 19–1 shows the abbreviated code for the included header.jspx page
fragment. Note that it does not contain an f:view or document tag.
When you consume a page fragment in a JSF page, at the part of the page that will use
the page fragment contents, you insert the jsp:include tag to include the desired
page fragment file, as shown in Example 19–2, which is abbreviated code from the
index.jspx page.
When you modify a page fragment, the pages that consume the page fragment are
automatically updated with the modifications. With pages built from page fragments,
when you make layout changes, it is highly probable that modifying the page
fragments alone is not sufficient; you may also have to modify every page that
consumes the page fragments.
19-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Fragments
Note: If the consuming page uses ADF Model data binding, the
included page fragment will use the binding container of the
consuming page. Only page fragments created as part of
ADF bounded task flows can have their own binding container. For
information about ADF bounded task flows, see the "Getting Started
With ADF Task Flows" chapter of the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
Like complete JSF pages, page fragments can also be based on a page template, as
shown in Example 19–3. For information about creating and applying page templates,
see Section 19.3, "Using Page Templates," and Section 19.3.3, "How to Create JSF Pages
Based on Page Templates."
dropdown list. For more information about using page templates, see
Section 19.3.3, "How to Create JSF Pages Based on Page Templates."
■ If you want to use a Quick Start Layout, select the Quick Start Layout radio
button and then click Browse to select the layout you want your fragment to
use. Quick Start Layouts provide the correctly configured layout components
need to achieve specific behavior and look. For more information, see
Section 8.2.3, "Using Quick Start Layouts."
When the page fragment creation is complete, JDeveloper displays the page
fragment file in the visual editor.
6. To define the page fragment contents, drag and drop the desired components from
the Component Palette onto the page.
You can use any ADF Faces or standard JSF component, for example table,
panelHeader, or f:facet.
Example 19–4 shows an example of a page fragment that contains a menu component.
Example 19–5 Entries in web.xml for Recognizing and Interpreting .jsff Files
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsff</url-pattern>
<is-xml>true</is-xml>
</jsp-property-group>
</jsp-config>
19-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Templates
recognize that files with extension .jsff are actually JSP documents, and thus must
be interpreted as XML documents.
2. Add a jsp:include tag by dragging and dropping Include from the Component
Palette.
3. In the Insert Include dialog, use the dropdown list to select the JSF page to include.
Optionally, select whether or not to flush the buffer before the page is included.
For more information, click Help in the dialog.
To use page templates in an application, you first create a page template definition.
Page template definitions must be JSF documents written in XML syntax (with the file
extension of .jspx) because page templates embed XML content. In contrast to
regular JSF pages where all components on the page must be enclosed within the
f:view tag, page template definitions cannot contain an f:view tag and must have
pageTemplateDef as the root tag. Either the template or the page that uses the
template must contain the document tag, but they cannot both contain the tag (by
default, JDeveloper adds the document tag to the consuming page).
A page template can have fixed content areas and dynamic content areas. For example,
if a Help button should always be located at the top right-hand corner of pages, you
could define such a button in the template layout, and when page authors use the
template to build their pages, they do not have to add and configure a Help button.
Dynamic content areas, on the other hand, are areas of the template where page
authors can add contents within defined facets of the template or set property values
that are specific to the type of pages they are building.
The entire description of a page template is defined within the pageTemplateDef
tag, which has two sections. One section is within the xmlContent tag, which
contains all the page template component metadata that describes the template’s
supported content areas (defined by facets), and available properties (defined as
attributes). The second section (anything outside of the xmlContent tag) is where all
the components that make up the actual page layout of the template are defined. The
components in the layout section provide a JSF component subtree that is used to
render the contents of the page template.
Facets act as placeholders for content on a page. In a page that consumes a template,
page authors can insert content for the template only in named facets that have
already been defined. This means that when you design a page template, you must
define all possible facets within the xmlContent tag, using a facet element for each
named facet. In the layout section of a page template definition, as you build the
19-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Templates
template layout using various components, you use the facetRef tag to reference the
named facets within those components where content can eventually be inserted into
the template by page authors.
For example, the fileExplorerTemplate template contains a facet for copyright
information and another facet for application information, as shown in Example 19–6.
While the pageTemplateDef tag describes all the information and components
needed in a page template definition, the JSF pages that consume a page template use
the pageTemplate tag to reference the page template definition. Example 19–7 shows
how the index.jspx page references the fileExplorerTemplate template,
provides values for the template’s attributes, and places content within the template’s
facet definitions.
At design time, page developers using the template can insert content into the
appCopyright facet, using the f:facet tag, as shown in Example 19–8
At runtime, the inserted content is displayed in the right location on the page, as
indicated by af:facetRef facetName="appCopyright" in the template
definition.
19-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Templates
<default-value>100</default-value>
</attribute>
When page authors use the template, they can modify the headerGlobalSize value
using f:attribute, as shown in the following code:
<af:pageTemplate ..>
<f:attribute name="headerGlobalSize" value="50"/>
.
.
.
</af:pageTemplate>
At runtime, the specified attribute value is substituted into the appropriate part of the
template, as indicated by the EL expression that bears the attribute name.
For a simple page template, it is probably sufficient to place all the components for the
entire layout section into the page template definition file. For a more complex page
template, you can certainly break the layout section into several smaller fragment files
for easier maintenance, and use jsp:include tags to include and connect the various
fragment files.
When you break the layout section of a page template into several smaller fragment
files, all the page template component metadata must be contained within the
xmlContent tag in the main page template definition file. There can be only one
xmlContent tag within a pageTemplateDef tag. You cannot have page template
component metadata in the fragment files; fragment files can contain portions of the
page template layout components only.
Note: You cannot nest page templates inside other page templates.
If your template requires resources such as custom styles defined in CSS or JavaScript,
then you need to include these on the consuming page, using the af:resource tag.
For more information, see Section 19.5, "Adding Resources to Pages."
4. Accept the directory name for the template definition, or choose a new location.
5. Enter a Page Template name for the page template definition.
6. If you want to use one of the predefined quick layouts, select Use a Quick Start
Layout and click Browse to select the one you want to use.
7. To add named facets, click the Facet Definitions tab and click the Add icon.
Facets are predefined areas on a page template where content can eventually be
inserted when building pages using the template. Each facet must have a unique
name. For example, you could define a facet called main for the main content area
of the page, and a facet called branding for the branding area of the page.
8. To add attributes, click the Attributes tab and click the Add icon.
Attributes are UI component attributes that can be passed into a page when
building pages using the template. Each attribute must have a name and class
type. Note that whatever consumes the attribute (for example an attribute on a
component that you configure in Step 12) must be able to accept that type. You can
assign default values, and you can specify that the values are mandatory by
selecting the Required checkbox.
9. If the page template contents use ADF Model data bindings, select the Create
Associated ADFm Page Definition checkbox, and click Model Parameters to add
one or more model parameters. For information about using model parameters
and ADF Model data bindings, see the "Using Page Templates" section of the
Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development
Framework.
Once you complete the wizard, JDeveloper displays the page template definition
file in the visual editor. Example 19–10 shows the code JDeveloper adds for you
when you use the wizard to define the metadata for a page template definition.
You can view this code in the source editor.
Tip: Once a template is created, you can add facets and attributes by
selecting the pageTemplateDef tag in the Structure window and
using the Property Inspector.
19-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Templates
Note: When you change or delete any facet name or attribute name
in the template component metadata, you have to manually change or
delete the facet or attribute name referenced in the layout section of
the template definition, as well as the JSF pages that consume the
template.
10. Drag a component from the Component Palette and drop it onto the page in the
visual editor.
In the layout section of a page template definition (or in fragment files that contain
a portion of the layout section), you cannot use the f:view tag, because it is
already used in the JSF pages that consume page templates.
Best Practice Tip: You should not use the document or form tags
in the template. While theoretically, template definitions can use the
document and form tags, doing so means the consuming page
cannot. Because page templates can be used for page fragments,
which in turn will be used by another page, it is likely that the
consuming page will contain these tags.
You can add any number of components to the layout section. If you did not
choose to use one of the quick start layouts, then typically, you would add a panel
component such as panelStretchLayout or panelGroupLayout, and then
add the components that define the layout into the panel component. For more
information, see Chapter 8, "Organizing Content on Web Pages."
Declarative components and databound components may be used in the layout
section. For information about using declarative components, see Section 19.4,
"Using Declarative Components." For information about using databound
components in page templates, see the "Using Page Templates" section of the
Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development
Framework.
11. Within those components (in the layout section) where content can eventually be
inserted by page authors using the template, drag FacetRef from the Component
Palette and drop it in the desired location on the page.
For example, if you have defined a main facet for the main content area on a page
template, you might add the facetRef tag as a child in the center facet of
panelStretchLayout component to reference the main facet. At design time,
when the page author drops content into the main facet, the content is placed in
the correct location on the page as defined in the template.
When you use the facetRef tag to reference the appropriate named facet,
JDeveloper displays the Insert FacetRef dialog. In that dialog, select a facet name
from the dropdown list, or enter a facet name. If you enter a facet name that is not
already defined in the component metadata of the page template definition file,
JDeveloper automatically adds an entry for the new facet definition in the
component metadata within the xmlContent tag.
Note: Each facet can be referenced only once in the layout section of
the page template definition. That is, you cannot use multiple
facetRef tags referencing the same facetName value in the same
template definition.
12. To specify where attributes should be used in the page template, use the page
template’s var attribute value to reference the relevant attributes on the
appropriate components in the layout section.
The var attribute of the pageTemplateDef tag specifies the EL variable name
that is used to access the page template’s own attributes. As shown in
Example 19–10, the default value of var used by JDeveloper is attrs.
For example, if you have defined a title attribute and added the panelHeader
component, you might use the EL expression #{attrs.title} in the text
value of the panelHeader component, as shown in the following code, to
reference the value of title:
<af:panelHeader text="#{attrs.title}">
13. To include another file in the template layout, use the jsp:include tag wrapped
inside the subview tag to reference a fragment file, as shown in the following
code:
<f:subview id="secondaryDecoration">
<jsp:include page="fileExplorerSecondaryDecoration.jspx"/>
</f:subview>
The included fragment file must also be an XML document, containing only
jsp:root at the top of the hierarchy. For more information about using
fragments, see Section 19.2.3, "How to Use a Page Fragment in a JSF Page."
By creating a few fragment files for the components that define the template
layout, and then including the fragment files in the page template definition, you
can split up an otherwise large template file into smaller files for easier
maintenance.
19-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Templates
The first time you use the wizard to create a JSF page template in a project, JDeveloper
automatically creates the pagetemplate-metadata.xml file, which is placed in the
/ViewController/src/META-INF directory in the file system.
For each page template that you define using the wizard, JDeveloper creates a page
template definition file (for example, sampleTemplateDef1.jspx), and adds an
entry to the pagetemplate-metadata.xml file. Example 19–11 shows an example
of the pagetemplate-metadata.xml file.
The pagetemplate-metadata.xml file contains the names and paths of all the page
templates that you create in a project. This file is used to determine which page
templates are available when you use a wizard to create template-based JSF pages, and
when you deploy a project containing page template definitions.
You can use page templates to build JSF pages or page fragments. If you modify the
layout section of a page template later, all pages or page fragments that use the
template are automatically updated with the layout changes.
In the page that consumes a template, you can add content before and after the
pageTemplate tag. In general, you would use only one pageTemplate tag in a
page, but there are no restrictions for using more than one.
JDeveloper simplifies the creation of JSF pages based on page templates by providing
a template selection option in the Create JSF Page or Create JSF Page Fragment wizard.
Tip: Only page templates that have been created using the template
wizard in JDeveloper are available for selection. If the Use Page
Template dropdown list is disabled, this means no page templates are
available in the project where you are creating new pages.
By default, JDeveloper displays the new page or page fragment in the visual
editor. The facets defined in the page template appear as named boxes in the
visual editor. If the page template contains any default values, you should see the
values in the Property Inspector, and if the default values have some visual
representation (for example, size), that will be reflected in the visual editor, along
with any content that is rendered by components defined in the layout section of
the page template definition.
2. In the Structure window, expand jsp:root until you see af:pageTemplate (which
should be under af:form).
Within the form tag, you can drop content before and after the pageTemplate
tag.
3. Add components by dragging and dropping components from the Component
Palette in the facets of the template. In the Structure window, within
af:pageTemplate, the facets (for example, f:facet - main) that have been
predefined in the component metadata section of the page template definition are
shown.
The type of components you can drop into a facet may be dependent on the
location of the facetRef tag in the page template definition. For example, if
you’ve defined a facetRef tag to be inside a table component in the page
template definition, then only column components can be dropped into the facet
because the table component accepts only column components as children.
Tip: The content you drop into the template facets may contain
ADF Model data binding. In other words, you can drag and drop
items from the Data Controls panel. For more information about using
ADF Model data binding, see Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
19-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Page Templates
You can assign static values to the predefined attributes, or you can use EL
expressions (for example, #{myBean.somevalue}). When you enter a value for
an attribute, JDeveloper adds the f:attribute tag to the code, and replaces the
attribute’s default value (if any) with the value you assign (see Example 19–12).
At runtime, the default or assigned attribute value is used or displayed in the
appropriate part of the template, as specified in the page template definition by
the EL expression that bears the name of the attribute (such as
#{attrs.someAttributeName}).
</f:view>
</jsp:root>
Note: Page templates are processed during JSP execution, not during
JSF processing (that is, component tree creation). This means that
fragments built from page templates cannot be used within tags that
require the component tree creation. For example, you could not
include a fragment based on a template within an iterator tag and
expect it to be included in a loop.
For information about what happens when the page template uses ADF Model data
binding, see the "Using Page Templates" section of the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
19.3.6 What You May Need to Know About Page Templates and Naming Containers
The pageTemplate component acts as a naming container for all content in the
template (whether it is direct content in the template definition, or fragment content
included using the jsp:include action). When working with client-side events in
template-based pages, you must include the template’s ID when using code to locate a
component. For more details, see Section 5.3.7, "What You May Need to Know About
Using Naming Containers."
19-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Declarative Components
used UI elements repeatedly, you can define a declarative component that comprises
those components, and then reuse that composite declarative component in multiple
places or pages.
Tip: Facets are the only area within a declarative component that can
contain content. That is, when used on a JSF page, a declarative
component may not have any children. Create facets for all areas
where content may be needed.
■ Attributes: You define attributes whose values can be used to populate attributes
on the individual components. For example, if your declarative component uses a
panelHeader component, you may decide to create an attribute named Title.
You may then design the declarative component so that the value of the Title
attribute is used as the value for the text attribute of the panelHeader
component. You can provide default values for attributes that the user can then
override.
■ Methods: You can define a method to which you can bind a property on one of the
included components. For example, if your declarative component contains a
button, you can declare a method name and signature and then bind the
19-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Declarative Components
If your declarative component requires resources such as custom styles defined in CSS
or JavaScript, then you need to include these using the af:resource tag on the
consuming page. For more information, see Section 19.5, "Adding Resources to Pages."
Best Practice Tip: Because the tag library definition (TLD) for the
declarative component must be generated before the component can
be used, the component must be deployed to a JAR file before it can be
consumed. It is best to create an application that contains only your
declarative components. You can then deploy all the declarative
components in a single library for use in multiple applications.
19-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Declarative Components
Tip: You must create attributes for any attributes on the included
components for which you want users to be able to set or change
values.
Remember to also add attributes for any tags you may need to add to
support functionality of the component, for example values required
by the attributeDragSource tag used for drag and drop
functionality.
10. To add declarative methods, click the Methods tab and click the Add icon.
Declarative methods allow you to bind command component actions or action
listeners to method signatures, which will later resolve to actual methods of the
same signature on backing beans for the page on which the components are used.
You can click the ellipses button to open the Method Signature dialog, which
allows you to search for and build your signature.
When you complete the dialog, JDeveloper displays the declarative component
definition file in the visual editor.
Tip: Once a declarative component is created, you can add facets and
attributes by selecting the componentDef tag in the Structure
window, and using the Property Inspector.
11. Drag a component from the Component Palette and drop it as a child to the
componentDef tag in the Structure window.
Suppose you dropped a panelBox component. In the Structure window,
JDeveloper adds the component after the xmlContent tag. It does not matter
where you place the components for layout, before or after the xmlContent tag,
but it is good practice to be consistent.
You can use any number of components in the component layout of a declarative
component. Typically, you would add a component such as panelFormLayout
or panelGroupLayout, and then add the components that define the layout into
the panel component.
12. Within those components (in the layout section) where content can eventually be
inserted by page authors using the component, use the facetRef tag to reference
the appropriate named facet.
For example, if you have defined a content facet for the main content area, you
might add the facetRef tag as a child in the panelBox component to reference
the content facet. At design time, when the page developer drops components
into the content facet, the components are placed in the panelBox component.
When you drag FacetRef from the Component Palette and drop it in the desired
location on the page, JDeveloper displays the Insert FacetRef dialog. In that dialog,
select a facet name from the dropdown list, or enter a facet name. If you enter a
facet name that is not already defined in the component metadata of the definition
file, JDeveloper automatically adds an entry for the new facet definition in the
component metadata within the xmlContent tag.
Note: Each facet can be referenced only once. That is, you cannot use
multiple facetRef tags referencing the same facetName value in
the same declarative component definition.
13. To specify where attributes should be used in the declarative component, use the
Property Inspector and the Expression Builder to bind component attribute values
to the created attributes.
For example, if you have defined a title attribute and added a panelBox as a
component, you might use the dropdown menu next to the text attribute in the
Property Inspector to open the Expression Builder, as shown in Figure 19–4.
Figure 19–4 Opening the Expression Builder for an Attribute in the Property Inspector
In the Expression Builder, you can expand the JSP Objects > attrs node to select
the created attribute that should be used for the value of the attribute in the
Property Inspector. For example, Figure 19–5 shows the title attribute selected in
the Expression Builder. Click the Insert Into Expression button and then click OK
to add the expression as the value for the attribute.
19-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Declarative Components
14. To specify the methods that command buttons in the declarative component
should invoke, use the dropdown menu next to that component’s
actionListener attribute and choose Edit to open the Edit Property dialog.
This dialog allows you to choose one of the declarative methods you created for
the declarative component.
In the dialog, select Declarative Component Methods, select the declarative
method from the dropdown list, and click OK.
<attribute-class>java.lang.String</attribute-class>
<required>true</required>
</attribute>
<attribute>
<attribute-name>buttonText1</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
. . .
<component-extension>
<component-tag-namespace>component</component-tag-namespace>
<component-taglib-uri>/componentLib1</component-taglib-uri>
<method-attribute>
<attribute-name>method1</attribute-name>
<method-signature>
void method(javax.faces.event.ActionEvent)
</method-signature>
</method-attribute>
<method-attribute>
<attribute-name>method2</attribute-name>
<method-signature>
void method(javax.faces.event.ActionEvent)
</method-signature>
</method-attribute>
. . .
</component-extension>
</component>
</af:xmlContent>
Metadata for the included components is contained after the xmlContent tag. The
code for these components is the same as it might be in a standard JSF page, including
any attribute values you set directly on the components. Any bindings you created to
the attributes or methods use the component’s variables in the bindings.
Example 19–14 shows the code for the panelBox component with the three buttons in
the toolbar. Notice that the facetRef tag appears as a child to the panelBox
component, as any content a page developer will add will then be a child to the
panelBox component.
19-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Declarative Components
The first time you use the wizard to create a declarative component in a project,
JDeveloper automatically creates the declarativecomp-metadata.xml file, which
is placed in the /ViewController/src/META-INF directory in the file system.
For each declarative component that you define using the wizard, JDeveloper creates a
declarative component definition file (for example, componentDef1.jspx), and
adds an entry to the declarativecomp-metadata.xml file. Example 19–15 shows
an example of the declarativecomp-metadata.xml file.
When you drag a declarative component that contains required attributes onto a page,
a dialog opens where you enter values for any defined attributes.
Once the declarative component is added to the page, you must manually bind the
declarative methods to actual methods on managed beans.
Before proceeding with the following procedure, you must already have added the
ADF Library JAR that contains the declarative components to the project where you
are creating JSF pages that are to consume the declarative components. For
instructions on how to add an ADF Library JAR, see the "Reusing Application
Components" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for
Oracle Application Development Framework.
19-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Declarative Components
Note: If you want to use ADF Model layer bindings as values for the
attributes, then to create these bindings manually by using the
Expression Builder to locate the needed binding property.
4. In the Structure window, again select the declarative component element, for
example, dc:myPanelBox. The Property Inspector displays all the attributes and
methods that have been predefined in the declarative component definition (for
example, title). The attributes might have default values.
You can assign static values to the attributes, or you can use EL expressions (for
example, #{myBean.somevalue}). For any of the methods, you must bind to a
method that uses the same signature as the declared method defined on the
declarative component.
At runtime, the attribute value will be displayed in the appropriate location as
specified in the declarative component definition by the EL expression that bears
the name of the attribute (for example, #{attrs.someAttributeName}).
5. If you need to include resources such as CSS or JavaScript, then you need to
include these using the af:resource tag. For more information, see Section 19.5,
"Adding Resources to Pages."
19.4.5 What Happens When You Use a Declarative Component on a JSF Page
After adding a declarative component to the page, the visual editor displays the
component’s defined facets as named boxes, along with any content that is rendered
by components defined in the component layout section of the declarative component
definition.
Like other UI components, JDeveloper adds the declarative component tag library
namespace and prefix to the jsp:root tag in the page when you first add a
declarative component to a page, for example:
<jsp:root xmlns:dc="/dcomponentLib1: ..>
In this example, dc is the tag library prefix, and /dcomponentLib1 is the namespace.
JDeveloper adds the tag for the declarative component onto the page. The tag includes
values for the component’s attributes as set in the dialog when adding the component.
Example 19–16 shows the code for the MyPanelBox declarative component to which a
user has added a panelGroupLayout component that contains three
outputFormatted components.
Example 19–16 JSF Code for a Declarative Component that Contains Content
<dc:myPanelBox title="My Panel Box" buttonText1="Button 1"
display1="true" display2="true" buttonText2="Button 2"
display3="false">
<f:facet name="Content">
<af:panelGroupLayout layout="scroll">
<af:outputFormatted value="outputFormatted1"
styleUsage="instruction"/>
<af:outputFormatted value="outputFormatted2"
styleUsage="instruction"/>
<af:outputFormatted value="outputFormatted3"
styleUsage="instruction"/>
</af:panelGroupLayout>
</f:facet>
</dc:myPanelBox>
19-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Resources to Pages
can be added to the page during any page request, but they must be added before the
document component is rendered.
The resource tag can be used with PPR. During PPR, the following requirements
apply:
■ URL resources are compared on the client before being added to the page. This
ensures duplicates are not added.
■ CSS resources are removed from the page during a PPR navigation. The new page
will have the new CSS resources.
To add resources:
1. From the Operations section of the Component Palette, drag and drop a Resource
tag anywhere onto the consuming page.
2. In the Insert Resource dialog, select either css or javascript.
3. In the Property Inspector, enter the URI of the resource as the value for the
source attribute. Start the URI with a single forward slash (/) if the URI should
be context relative. Start the URI with two forward slashes if the URI should be
server relative. If you start the URI with something other than one or two slashes,
the URI will be resolved relative to URI location in the browser
19-32 Web User Interface Developer's Guide for Oracle Application Development Framework
20
Customizing the Appearance Using Styles
20
and Skins
This chapter describes how to change the appearance of your application by changing
style properties using Oracle ADF Faces skins and component style attributes.
This chapter includes the following sections:
■ Section 20.1, "Introduction to Skins, Style Selectors, and Style Properties"
■ Section 20.2, "Applying Custom Skins to Applications"
■ Section 20.3, "Defining Skin Style Properties"
■ Section 20.4, "Changing the Style Properties of a Component"
■ Section 20.5, "Referring to URLs in a Skin’s CSS File"
■ Section 20.6, "Deploying a Custom Skin File in a JAR File"
It is beyond the scope of this guide to explain the concept of CSS. For extensive
information on style sheets, including the official specification, visit the W3C web site
at:
http://www.w3c.org/
20-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Skins, Style Selectors, and Style Properties
Note: The syntax in a skin style sheet is based on the CSS 3.0
specification. However, many browsers do not yet adhere to this
version. At runtime, ADF Faces converts the CSS to the CSS 2.0
specification.
ADF Faces also provides the simple skin, shown in Figure 20–2 as applied to the File
Explorer Application index page.
Skins provide more options than setting standard CSS styles and layouts. The skin's
CSS file is processed by the skin framework to extract skin properties and icons and
register them with the Skin object. For example, you can customize the skin file using
rules and pseudo classes that are supported by the skinning framework. Supported
rules and pseudo classes include @platform, @agent, @accessibility-profile,
:rtl, :lang, and @locale. For more information, see Section 20.1.2, "Skin Style
Selectors".
■ Component selectors
Component-specific selectors are selectors that can apply a skin to a particular
ADF Faces component. Example 20–2 shows the selector set to red as the
background color for the content area of the af:inputText component.
Each category may include one or more of these types of ADF Faces skin selectors:
■ Standard selectors
Standard selectors are those that directly represent an element that can have styles
applied to it. For example, af|body represents the af:body component. You can
set CSS styles, properties, and icons for this type of element.
■ Selectors with pseudo-elements
Pseudo-elements are used to denote a specific area of a component that can have
styles applied. Pseudo-elements are denoted by a double colon followed by the
portion of the component the selector represents. For example,
af|chooseDate::days-row provides the styles and properties for the
appearance of the dates within the calendar grid.
■ Icon selectors
20-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Skins, Style Selectors, and Style Properties
Some components render icons (<img> tags) within them using a set of base icons.
These icons can have skins applied even though they are not rendered with CSS in
the same way as the background-image CSS property. Instead, the icons are
registered with the Skin object for use by the renderer. Icon selectors are denoted
by -icon for component selectors and Icon:alias for global selectors. For
example, the af:inputDate component has a changed icon that can have a skin
using the selector af|inputDate::changed-icon. The changed icon can also
be globally set for all components using that icon with the global selector
.AFChangedIcon:alias. For more information, see Section 20.3.2, "How to
Apply Skins to Icons".
■ Resource strings
The text rendered by ADF Faces components is translatable. The text is abstracted
as a resource string that has skins applied. For example, af_dialog.LABEL_OK
is a resource string for the text label of an af:dialog component when the OK
button has been configured. Resource strings do not have skins in the CSS skin
file, but in a resource bundle referenced from the skin definition file in the
trinidad-skins.xml file using the <bundle-name> parameter. You can also
use the <translation-source> parameter for an EL binding to point to a Map
or ResourceBundle. For more information, see Section 20.3.1, "How to Apply
Skins to Text".
■ Selectors with style properties
Skin style properties allow you to customize the rendering of a component
throughout the application. A CSS property is stored with a value in the Skin
object and is available when the component is being rendered. For example, in
af|breadCrumbs{-tr-show-last-item: false}, the skin property
-tr-show-last-item is set to hide the last item in the af:breadCrumbs
navigation path.
The CSS specification defines pseudo-classes such as :hover and :active that can
apply to almost every component. ADF Faces provides additional pseudo-classes for
specialized functions. Pseudo-classes are denoted in the selector by a colon followed
by the class definition. The following are common pseudo-classes used by ADF Faces
style selectors:
■ Alias: The :alias pseudo-class is a special type of class that serves as a syntax
aid to organize code in your skin file. You can, for example, use it to set styles for
more than one component or more than one portion of a component. You can also
create your own alias classes that you can then include on other selectors. For
example, you can define an alias pseudo-class (.AFLabel:alias) where you
define label colors for a number of form components. Subsequent changes to the
alias pseudo-class impact all components referenced by the alias pseudo-class.
af|inputText::label,
af|inputChoice::label,
af|selectOneChoice::label {-tr-rule-ref: ".AFLabel:alias"}
.AFLabel:alias { color: blue }
The .AFLabel:alias pseudo-class has color set to blue, but you can change all
the component’s label color to red by simply changing .AFLabel:alias:
.AFLabel:alias {color: red}
For more information, see Section 20.3.5, "How to Create a Custom Alias".
■ Drag and drop: The two pseudo-classes available are :drag-source applied to
the component initiating the drag and removed once the drag is over, and
You can also use :rtl to apply to skin icons. For more information, see
Section 20.3.2, "How to Apply Skins to Icons".
■ Inline editing: This pseudo-class is applied when the application activates a
component subtree for editing in the browser. For example, :inline-selected
is a pseudo-class applied to currently selected components in the active
inline-editable subtree.
■ Message: This pseudo-class is used to set component-level message styles using
CSS pseudo-classes of :fatal, :error, :warning, :confirmation, and
:info. For more information, see Section 20.3.3, "How to Apply Skins to
Messages".
You may not want your selector's CSS properties to be applied to all browsers, all
platforms, all locales, and both reading-directions. For example, you may need to add
some padding in Internet Explorer that you do not need on any other browser. You
may want the font style to be different on Windows than it is on other platforms. To
style a selector for a particular user environment, put that skinning information inside
a skinning framework rule or :rtl pseudo-class. The skinning framework picks the
styles based on the HTTP request information, such as agent and platform, and merges
them with the styles without rules. Those CSS properties that match the rules get
merged with those outside of any rules. The most specific rules that match a user's
environment take precedence. The skinning framework currently supports these rules
and pseudo-classes:
■ @platform and @agent
Define platform styles using @platform and browser styles using @agent.
The supported values to set a platform-specific style are windows, macos, linux,
solaris, and ppc. For a browser agent-specific style, the supported values are
ie, mozilla, gecko, webkit (maps to safari), ice, and email.
In this example, the content area of the af:inputText component is set to the
color pink for versions 7 and 8 of Internet Explorer, and set to version 1.9 of gecko
on Windows and Linux platforms:
20-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Skins, Style Selectors, and Style Properties
Note that the following syntax examples results in the same behavior:
@agent ie and (version: 7.*)
@agent ie and (version: 7)
In order to specify only version 7.0.x of Internet Explorer, use the following syntax:
@agent ie and (version: 7.0)
■ :rtl
Use the :rtl pseudo-class to create a style or icon definition when the browser is
displaying a right-to-left language.
■ :lang or @locale
■ Suppress skin styles with the -tr-inhibit skin property.
Suppress or reset CSS properties inherited from a base skin with the
-tr-inhibit skin property. For example, the -tr-inhibit:padding property
will remove any inherited padding. Remove (clear) all inherited properties with
the -tr-inhibit:all property. The suppressed property name must be
matched exactly with the property name in the base skin.
■ Merge styles with the -tr-rule-ref property.
Create your own alias and combine it with other style selectors using the
-tr-rule-ref property. For more information, see Section 20.3.5, "How to
Create a Custom Alias".
■ Alter themes of child components with the -tr-children-theme property.
For more information, see Section 20.3.4, "How to Apply Themes to Components".
Example 20–3 shows several selectors in the CSS file that will be merged together to
provide the final style.
{
@agent ie, gecko
{
af|inputText::content {background-color:pink}
}
}
@agent ie
{
af|someComponent {width: 25px; height: 10px}
}
/* For IE 7 and 8, we also need some margins.*/
@agent ie (version: 7) and (version: 8)
{
af|someComponent {margin: 5px;}
}
/* The following selectors are for all platforms and all browsers. */
/* rounded corners on the top-start and top-end */
/* shows how to use :rtl mode pseudo-class. The start image in ltr mode is the */
/* same as the end image in the right-to-left mode. */
af|panelBox::medium af|panelBox::top-start,
af|panelBox::medium af|panelBox::top-end:rtl {
background-image: url(/https/www.scribd.com/skins/purple/images/panelBoxStart.png);
width:8px;
height:8px
}
af|panelBox::medium af|panelBox::top-end,
af|panelBox::medium af|panelBox::top-start:rtl {
background-image: url(/https/www.scribd.com/skins/purple/images/panelBoxEnd.png);
height: 8px;
width: 8px;
}
The selectors used to apply skins to the ADF Faces components are defined in the
"Skin Selectors for Fusion’s ADF Faces Components" and "Skin Selectors for Fusion’s
Data Visualization Tools Components" topics in JDeveloper’s online help.
You can also apply themes as a way to implement look and feel at the component
level. For information about themes, see Section 20.3.4, "How to Apply Themes to
Components".
For information about defining skin style properties, see Section 20.3, "Defining Skin
Style Properties".
20-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Applying Custom Skins to Applications
can be partitioned into their own JAR files, reducing the number of files that may have
to be deployed to an application.
The steps to apply a custom skin to your application are the following:
1. Add a custom skin to your application. For details, see Section 20.2.1, "How to
Add a Custom Skin to an Application".
2. Register the custom skin. For details, see Section 20.2.2, "How to Register the XML
Schema Definition File for a Custom Skin" and Section 20.2.3, "How to Register a
Custom Skin".
3. Configure the application to use the custom skin. For details, see Section 20.2.4,
"How to Configure an Application to Use a Custom Skin".
4. Deploy a custom skin in a JAR file. For details, see Section 20.6, "Deploying a
Custom Skin File in a JAR File".
20.2.2 How to Register the XML Schema Definition File for a Custom Skin
You need to register the trindidad-skins.xsd file with JDeveloper if you plan to
register a custom skin, as described in Section 20.2.3, "How to Register a Custom Skin".
The trindidad-skins.xsd file defines the valid elements for a custom skin.
20-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Applying Custom Skins to Applications
Note: In the Add Schema dialog, make sure the value in the
Extension input field is .xml. If you change it to .xsd, when you
later create XML files, you will not be able to use the XML schema you
have created.
4. Click OK.
■ <extends>
You extend a custom skin by using this element. The default value for this
element is simple.desktop. However, you can extend any skin by using
this element.
For example, you can easily change the font of the entire skin by extending the
skin and creating a CSS with the font alias. For example, extend the
fusion.desktop family as follows:
<extends>fusion.desktop</extends>
<style-sheet-name>skins/fod_skin.css</style-sheet-name>
In the CSS, set the alias to change the font for the entire skin:
.AFDefaultFontFamily:alias {font-family: Tahoma}
.AFDefaultFont:alias {font-size: 16px}
■ <render-kit-id>
This value determines which render kit to use for the skin. You can enter one
of the following:
– org.apache.myfaces.trinidad.desktop: The skin will
automatically be used when the application is rendered on a desktop.
– org.apache.myfaces.trinidad.pda: The skin will be used when the
application is rendered on a PDA.
■ <style-sheet-name>
This is the URL of the custom style sheet. The style sheet name file is retrieved
as a URL object using the following methods:
– For nonstatic URLs, those that could change after the server has started,
the URL is created by calling new
java.new.URL(style-sheet-name) if style-sheet-name starts
with http:, https:, file:, ftp:, or jar:. Otherwise, the URL is
created by calling <FacesContext> <ExternalContext>
getResource<style-sheet-name>. It will add a slash (/) to delimit
20-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Applying Custom Skins to Applications
the URL parts if it is not already present. For example, the slash is added
between skins/bigfont/bigfont.css.
– If still not retrieved, the URL is created using the <ClassLoader>
getResource in a style-sheet-name format similar to
META-INF/purpleSkin/styles/myPurpleSkin.css. Once the URL
is converted to this format, it can be searched for in JAR files that may
contain the style sheet.
■ <bundle-name>
This is the resource bundle created for the skin. If you did not create a custom
bundle, then you do not need to declare this element. For more information,
see Section 20.3.1, "How to Apply Skins to Text".
■ <translation-source>
This is an EL binding that can point to a Map or a ResourceBundle. You can
use this instead of the bundle name if you would like to be more dynamic in
your skin translations at runtime. The <bundle-name> tag takes precedence.
Example 20–4 shows the entry in the trinidad-skins.xml file for the mySkin
skin.
Note: If you do not see the skin, check to see whether or not the
af:document tag has been added to the page. The af:document tag
initializes the skin framework to create the CSS and link it to the page.
2. Replace the <skin-family> value with the family name for the skin you wish to
use.
Example 20–5 shows the configuration to use for the mySkin skin family.
20-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Skin Style Properties
Figure 20–3 shows the application of the default fusion skin on the af:goButton
component and the component icon.
Figure 20–4 shows the new appearance of the button and icon by setting the following
style properties in a custom skin:
af|goButton::access-key {color: red;}
af|goButton::icon-style {border: 1px solid black;}
The ADF Faces skin style selectors used by the default skin are defined in the "Skin
Selectors for Fusion’s ADF Faces Components" and "Skin Selectors for Fusion’s Data
Visualization Tools Components" topics in JDeveloper’s online help. They are located
in All Online Help > Developing Oracle ADF Faces Applications.
JDeveloper provides coding support while editing your CSS files. You can invoke the
CSS code editor when editing your file directly or when editing an ADF Faces
component in the JSP source editor. Code support is available for the following:
■ Code insight
■ Error highlighting
■ Preview of styles
■ Refactoring
■ Finding usages
■ Quick comment
■ Formatting
■ In the Application Navigator, right-click where you want the file to be placed
and choose New to open the New Gallery.
■ In the Categories tree, select Java, and in the Items list, select Java Class.
■ Enter a name and package for the class. The class must extend
java.util.ListResourceBundle.
2. Add any keys to your bundle that you wish to override and set the text as needed.
Example 20–7 shows the SkinBundle custom resource bundle.
20-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Skin Style Properties
3. Set the name of your custom resource bundle in the <bundle-name> parameter
of the trinidad-skins.xml file. Example 20–8 shows the custom SkinBundle
set in the trinidad-skins.xml file.
}
}
<id>
purple.desktop
</id>
<family>
purple
</family>
<render-kit-id>
org.apache.myfaces.trinidad.desktop
</render-kit-id>
<style-sheet-name>
skins/purple/purpleSkin.css
</style-sheet-name>
<translation-source>
#{skinTranslationMap.resourceBundle}
</translation-source>
</skin>
Icons and buttons can both use the rtl pseudo-class. This defines an icon or button
for use when the application displays in right-to-left mode. Example 20–12 shows the
rtl pseudo-class used for an icon.
20-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Skin Style Properties
to reflect the new status. If styles are not defined for the status in question, then the
default styles are used.
In order to define styles for your input components based on message levels that are
tied to them, you would append a style pseudo-class to your component definition.
For example, to define the base style for the content region of the af:inputText
component to a background color of purple, use the style selector
af|inputText::content{background-color:purple}. To define the content
region of the component when an error message is present, use the skin style selector
af|inputText:error::content.
The valid message properties are :fatal, :error, :warning, :confirmation, and
:info.
To set the theme for a component, specify a theme attribute in the skin selector in the
CSS file. For example, the selector to change the text color under an af:panelTabbed
component to a dark theme is:
af|panelTabbed[theme="dark"] {
color: red;
}
inherit the dark theme defined for the af:document parent component in the JSPX
page. Set the -tr-children-theme property in the CSS file as follows:
af|panelTabbed::content {
-tr-children-theme: default;
}
By default, themes are not set for components or their child components. Because
themes are inherited, the following values are supported when a component has a
theme attribute that is not set:
■ not given - If no theme is given, the theme is inherited, as in
<af:decorativeBox>...
■ #{null}- The theme is inherited; same as not given.
■ inherit - The theme is inherited; same as null.
■ default - The theme is removed for the component and its child components.
■ empty string - If the theme is set to a blank string, it has the same behavior as
default. For example, <af:decorativeBox theme=""> will remove the
theme for the component and its child components.
Because the themes are added to every HTML element of a component that supports
themes and that has style classes, there is no need for containment-style CSS selectors
for themes. With the exception of :ltr and :rtl, all theme selectors should always
appear on the last element of the selector. For example, the selector to apply a dark
theme to each step of an af:breadCrumbs component would be:
af|breadCrumbs::step:disabled[theme="dark"] {
color:#FFFFFF;
}
Color incompatibility may occur if a component sets its background color to a color
that is not compatible with its encompassing theme color. For example, if a
panelHeader component is placed in a dark theme, the CSS styles inside the
panelHeader component will set its component background to a light color without
changing its foreground color accordingly. The result is a component with a light
foreground on a light background. Many other components also set their foreground
color to a light color when placed in a dark theme.
If color incompatibility occurs, you can resolve color incompatibility between parent
and child components by setting a value for the -tr-children-theme property. For
components that do not have a parent-child relationship, you can manually set the
component’s theme color to a color that is compatible with the surrounding theme
color. You do this by inserting the panelGroupLayout or panelStretchLayout
component inside the component and by setting the panelGroupLayout or
panelStretchLayout theme to a compatible color.
<af:panelHeader text="Header Level 0">
<af:panelGroupLayout layout="vertical" theme="default">
...
</af:panelGroupLayout>
</af:panelHeader>
20-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining Skin Style Properties
The Refresh button on the page resubmits the page. Every time the page refreshes,
the EL expression is evaluated and if there is a change, the page is redrawn with
the new skin.
<skin-family>#{sessionScope.skinFamily}</skin-family>
20-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Referring to URLs in a Skin’s CSS File
JDeveloper adds the corresponding code for the component to the JSF page.
Example 20–15 shows the source for an af:outputText component with an
inlineStyle attribute.
4. The ADF Faces component may have other style attributes not available for styling
that do not register on the root DOM element. For example, for the
af:inputText component, set the text of the element using the contentStyle
property, as shown in Example 20–17.
<af:inputText value="outputText1"
contentStyle="color:Red;"/>
2. You can also use EL expressions for the styleClass attribute to conditionally set
style attributes. For example, if you want the date to be displayed in red when an
action has not yet been completed, you could use code similar to that in
Example 20–16.
You specify the complete URL to the resource. For example, a URL in the
following format:
http://www.mycompany.com/WebApp/Skin/skin1/img/errorIcon.gif
■ Relative
You can specify a relative URL if the URL does not start with / and no protocol is
present. A relative URL is based on the location of the skin’s CSS file. For example,
if the skin's CSS file directory is WebApp/Skin/skin1/ and the specified URL is
img/errorIcon.gif, the final URL is
/WebApp/Skin/mySkin/img/errorIcon.gif
■ Context relative
This format of URL is resolved relative to the context root of your web application.
You start a context relative root with /. For example, if the context relative root of a
web application is:
/WebApp
and the specified URL is:
/img/errorIcon.gif
the resulting URL is:
/WebApp/img/errorIcon.gif
■ Server relative
A server relative URL is resolved relative to the web server. This differs to the
context relative URL in that it allows you reference a resource located in another
application on the same web server. You specify the start of the URL using //. For
example, write a URL in the following format:
//WebApp/Skin/mySkin/img/errorIcon.gif
20-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Deploying a Custom Skin File in a JAR File
■ The JAR file must be placed in the WEB-INF/lib directory of the view layer
project of the application to deploy (or use a shared library at the
application-server level).
2. Confirm that the directory in the META-INF directory starts with adf. The
images directory contains all the images used within the oracleblaf.css skin.
The CSS reference to the images should have a path similar to this:
af|inputColor::launch-icon:rtl {
content:url(../adf/oracle/skin/images/cfsortl.png);
width: 12; height: 12;
left:-7px;
position:relative;
right:-7px;
top:5px;
}
Because the skin can be discovered at runtime, you do not need to code the skin
family name.
Note: The skin definition in the JAR file is not displayed in the
JDeveloper visual editor. You may see a message in the log window
that the skin family could not be found. You can ignore this message.
20-26 Web User Interface Developer's Guide for Oracle Application Development Framework
21
Internationalizing and Localizing Pages
21
This chapter describes how to configure JSF pages or an application to display text in
the correct language of a user’s browser.
This chapter includes the following sections:
■ Section 21.1, "Introduction to Internationalization and Localization of ADF Faces
Pages"
■ Section 21.2, "Using Automatic Resource Bundle Integration in JDeveloper"
■ Section 21.3, "Manually Defining Resource Bundles and Locales"
■ Section 21.4, "Configuring Pages for an End User to Specify Locale at Runtime"
■ Section 21.5, "Configuring Optional ADF Faces Localization Properties"
For any text you add to a component, for example if you define the label of an
af:commandButton component by setting the text attribute, you must provide a
resource bundle that holds the actual text, create a version of the resource bundle for
each locale, and add a <locale-config> element to define default and support
locales in the application’s faces-config.xml file. You must also add a
<resource-bundle> element to your application’s faces-config.xml file in
order to make the resource bundles available to all the pages in your application. Once
you have configured and registered a resource bundle, the Expression Language (EL)
editor will display the key from the bundle, making it easier to reference the bundle in
application pages.
To simplify the process of creating text resources for text you add to ADF components,
JDeveloper supports automatic resource bundle synchronization for any translatable
string in the visual editor. When you edit components directly in the visual editor or in
the Property Inspector, text resources are automatically created in the base resource
bundle.
Note: Any text retrieved from the database is not translated. This
document explains how to localize static text, not text that is stored in
the database.
For instance, if the title of this page is My Purchase Requests, instead of having My
Purchase Requests as the value for the title attribute of the af:panelPage
component, the value is bound to a key in the UIResources resource bundle. The
UIResources resource bundle is registered in the faces-config.xml file for the
application, as shown in Example 21–1.
The resource bundle is given a variable name (in this case, res) that can then be used
in EL expressions. On the page, the title attribute of the af:panelPage component is
then bound to the myDemo.pageTitle key in that resource bundle, as shown in
Example 21–2.
The UIResources resource bundle has an entry in the English language for all static
text displayed on each page in the application, as well as for text for messages and
global text, such as generic labels. Example 21–3 shows the keys for the myDemo page.
Example 21–3 Resource Bundle Keys for the myDemo Page Displayed in English
#myDemo Screen
myDemo.pageTitle=My Purchase Requests
myDemo.menubar.openLink=Open Requests
myDemo.menubar.pendingLink=Requests Awaiting customer
myDemo.menubar.closedLink=Closed Requests
myDemo.menubar.allRequests=All Requests
myDemo.menubar.newLink=Create New Purchase Request
21-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Automatic Resource Bundle Integration in JDeveloper
myDemo.selectAnd=Select and
myDemo.buttonbar.view=View
myDemo.buttonbar.edit=Edit
Note that text in the banner image and data retrieved from the database are not
translated.
Example 21–4 shows the resource bundle version for the Italian (Italy) locale,
UIResources_it. Note that there is not an entry for the selection facet’s title, yet it
was translated from Select to Seleziona automatically. That is because this text is part of
the ADF Faces table component’s selection facet.
Example 21–4 Resource Bundle Keys for the myDemo Page Displayed in Italian
#myDemo Screen
myDemo.pageTitle=Miei Ticket
myDemo.menubar.openLink=Ticket Aperti
myDemo.menubar.pendingLink=Ticket in Attesa del Cliente
myDemo.menubar.closedLink=Ticket Risolti
myDemo.menubar.allRequests=Tutti i Ticket
myDemo.menubar.newLink=Creare Nuovo Ticket
myDemo.selectAnd=Seleziona e
myDemo.buttonbar.view=Vedere Dettagli
myDemo.buttonbar.edit=Aggiorna
■ From the text input window, choose Select Text Resource to launch the Select Text
Resource dialog, as shown in Figure 21–2. The dialog can also be accessed by
right-clicking the component and choosing Select Text Resource for, or from the
Property Inspector, by clicking the icon to the right of a translatable property and
selecting Select Text Resource.
■ From the text input window, select Expression Builder to launch the Expression
Builder dialog. The dialog can also be accessed from the Property Inspector by
clicking the icon to the right of a translatable property and selecting Expression
Builder.
■ In the Property Inspector, enter a valid expression language string for a
translatable property.
2. In the Project Properties dialog, select Resource Bundle to display the resource
bundle options, as shown in Figure 21–3.
21-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Automatic Resource Bundle Integration in JDeveloper
By default, JDeveloper creates the generated resource bundle in the view subdirectory
of the project’s Application Sources directory.
21-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Manually Defining Resource Bundles and Locales
Tip: The getBundle method used to load the bundle looks for the
default locale classes before it returns the base class bundle. If it fails
to find a match, it throws a MissingResourceException error. A
base class with no suffixes should always exist as a default. Otherwise,
it may not find a match and the exception is thrown.
■ In the Application Navigator, right-click where you want the file to be placed
and choose New from the context menu to open the New Gallery.
■ In the Categories tree, select General, and in the Items list, select File. Click
OK.
■ In the Create File dialog, enter a name for the file using the convention
<name><_lang>.properties for the using the properties file or <name><_
lang>.xlf for using the XLIFF file, where the <_lang> suffix is provided for
translated files, as in _de for German, and omitted for the base language.
2. Enter the content for the file. You can enter the content manually by entering the
key-value pairs. You can use the Edit Resource Bundle dialog to enter the
key-value pairs, as described in Section 21.3.2, "How to Edit a Resource Bundle
File".
■ If you are creating a property file, create a key and value for each string of
static text for this bundle. The key is a unique identifier for the string. The
value is the string of text in the language for the bundle. If you are creating a
localized version of the base resource bundle, any key not found in this
version will inherit the values from the base class.
21-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Manually Defining Resource Bundles and Locales
For example, the key and the value for the title of the myDemo page is:
myDemo.pageTitle=My Purchase Requests
■ If you are creating an XLIFF file, enter the proper tags for each key-value pair.
For example:
<?xml version="1.0" encoding="windows-1252" ?>
<xliff version="1.1" xmlns="urn:oasis:names:tc:xliff:document:1.1">
<file source-language="en" original="myResources" datatype="xml">
<body>
<trans-unit id="NAME">
<source>Name</source>
<target/>
<note>Name of employee</note>
</trans-unit>
<trans-unit id="HOME_ADDRESS">
<source>Home Address</source>
<target/>
<note>Adress of employee</note>
</trans-unit>
<trans-unit id="OFFICE_ADDRESS">
<source>Office Address</source>
<target/>
<note>Office building </note>
</trans-unit>
</body>
</file>
</xliff>
■ In the Categories tree, select General, and in the Items list, select Java Class.
Click OK.
■ In the Create Java Class dialog, enter a name and package for the class. The
class must extend java.util.ListResourceBundle.
import java.util.ListResourceBundle;
2. In the Edit Resource Bundles dialog, select the resource bundle file you want to
edit from the Resource Bundle dropdown list, as shown in Figure 21–4, or click
the Search icon to launch the Select Resource Bundle dialog.
21-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Manually Defining Resource Bundles and Locales
3. In the Select Resource Bundle dialog, select the file type from the File type
dropdown list. Navigate to the resource bundle you want to edit, as shown in
Figure 21–5. Click OK.
4. In the Edit Resource Bundles dialog, click the Add icon to add a key-value pair, as
shown in Figure 21–6. When you have finished, click OK.
21-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Manually Defining Resource Bundles and Locales
After you have added the locales, the faces-config.xml file should have code
similar to the following:
<locale-config>
<default-locale>en</default-locale>
<supported-locale>ar</supported-locale>
<supported-locale>ca</supported-locale>
<supported-locale>cs</supported-locale>
<supported-locale>da</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>zh_Ch</supported-locale>
</locale-config>
After you have added the resource bundle, the faces-config.xml file should
have code similar to the following:
<resource-bundle>
<base-name>oracle.fodemo.storefront.StoreFrontUIBundle</base-name>
<var>res</var>
</resource-bundle>
2. Bind all attributes that represent strings of static text displayed on the page to the
appropriate key in the resource bundle, using the variable defined in the
faces-config.xml file for the <resource-bundle> element. Example 21–7
shows the code for the View button on the myDemo page.
3. You can also use the adfbundle keyword to resolve resource strings from specific
resource bundles as EL expressions in the JSF page.
The usage format is #{adfBundle[ bundleID ] [ resource_Key ]}, where
bundleID is the fully qualified bundle ID, such as project.EmpMsgBundle,
and resource_Key is the resource key in the bundle, such as Deptno_LABEL.
Example 21–8 shows how adfbundle is used to provide the button text with a
resource strings from a specific resource bundle.
21-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuring Pages for an End User to Specify Locale at Runtime
21.3.5 What You May Need to Know About Custom Skins and Control Hints
If you use a custom skin and have created a custom resource bundle for the skin, you
must also create localized versions of the resource bundle. Similarly, if your
application uses control hints to set any text, you must create localized versions of the
generated resource bundles for that text.
4. Bind the locale attribute of the f:view tag to the locale value in the backing
bean.
1. In the Structure window for the JSF page, right-click the f:view tag and
choose Go to Properties.
2. In the Property Inspector, use the dropdown menu next to the locale attribute
to open the Expression Builder.
3. Use the Expression Builder to bind to the locale value in the backing bean, as
shown in Figure 21–9.
Figure 21–9 Expression Builder Binding the Locale Attribute to a Backing Bean
JDeveloper also generates the required methods in the backing bean for the page.
Example 21–10 shows extracts for the backing bean that correspond to Example 21–9.
...
import oracle.adf.view.rich.component.rich.input.RichSelectOneChoice;
...
21-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuring Optional ADF Faces Localization Properties
...
public void setD2(RichDocument d2) {
this.d2 = d2;
}
...
Example 21–11 Configuring Currency Code and Separators for Numbers and Decimal
Point
<!-- Set the currency code to US dollars. -->
<currency-code>USD</currency-code>
<!-- Set the number grouping separator to period for German -->
<!-- and comma for all other languages -->
<number-grouping-separator>
#{view.locale.language=='de' ? '.' : ','}
</number-grouping-separator>
<formatting-locale>
#{request.locale}
21-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuring Optional ADF Faces Localization Properties
</formatting-locale>
<!-- Set the time zone to Pacific Daylight Savings Time -->
<time-zone>PDT</time-zone>
21-20 Web User Interface Developer's Guide for Oracle Application Development Framework
22
Developing Accessible ADF Faces Pages
22
This chapter describes how to add accessibility support to ADF Faces components
with keyboard shortcuts and text descriptions of the component name and state.
Accessibility guidelines for ADF pages that use partial page rendering, scripting,
styles, and certain page and navigation structures are also described.
This chapter includes the following sections:
■ Section 22.1, "Introduction to Accessible ADF Faces Pages"
■ Section 22.2, "Exposing Accessibility Preferences"
■ Section 22.3, "Specifying Component-Level Accessibility Properties"
■ Section 22.4, "Creating Accessible Pages"
■ Section 22.5, "Running Accessibility Audit Rules"
This code sets the application’s accessibility support to the screen reader mode.
3. Enter the element name <accessibility-profile> and accessibility profile
value (high-contrast, large-fonts). For example:
<!-- Enable both high-contrast and large-fonts content -->
<accessibility-profile>high-contrast large-fonts</accessibility-profile>
This code sets the application’s profile support to use both high contrast and large
fonts.
4. Alternatively, you can use the Structure window to insert the value:
a. In the Application Navigator, select the trinidad-config.xml file.
b. In the Structure window, right-click the XML file root element, choose the
Insert Inside menu item, and click the <accessibility-mode> element.
c. Double-click the newly inserted element in the Structure window to open the
Property Inspector. Enter a value or select one from the dropdown list.
22-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Specifying Component-Level Accessibility Properties
Once you have configured the trinidad-config.xml file, you can retrieve the
property values programmatically or by using JSF EL expressions.
For example the following code returns nothing if the accessibility mode is not
explicitly set:
String mode=ADFFacesContext.getCurrentInstance().getAccessibilityMode;
Note: Access keys are not displayed if the accessibility mode is set to
screenReader mode. For more information, see Section 22.2,
"Exposing Accessibility Preferences."
The same access key can be bound to several components. If the same access key
appears in multiple locations in the same page, the rendering agent will cycle among
the components accessed by the same key. That is, each time the access key is pressed,
the focus will move from component to component. When the last component is
reached, the focus will return to the first component.
Using access keys on af:goButton and af:goLink components may immediately
activate them in some browsers. Depending on the browser, if the same access key is
assigned to two or more go components on a page, the browser may activate the first
component instead of cycling through the components that are accessed by the same
key.
To develop accessible page and navigation structures follow the additional
accessibility guidelines described in Section 22.4, "Creating Accessible Pages."
22-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Specifying Component-Level Accessibility Properties
22-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Specifying Component-Level Accessibility Properties
Access key modifiers are browser and platform-specific. If you assign an access key
that is already defined as a menu shortcut in the browser, the ADF Faces component
access key will take precedence. Refer to your specific browser’s documentation for
details.
In some browsers, if you use a space as the access key, you must provide the user with
the information that Alt+Space or Alt+Spacebar is the access key because there is no
way to present a blank space visually in the component's label or textual label. For that
browser you could provide text in a component tooltip using the shortDesc
attribute.
Once you set up your application to use resource bundles, the resource bundle keys
show up in the Expression Language (EL) editor so that you can assign them
declaratively.
In the following example, the UI component accesses the resource bundle:
<af:outputText value="#{res[’login.date’]}"/
For more information, see Chapter 21, "Internationalizing and Localizing Pages."
22-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Accessible Pages
When specifying sizes using CSS, use size units that scale relative to the font size
rather than absolute units. For example, use em, ex or % units rather than px. This
is particularly important when specifying heights using CSS, because low-vision
users may scale up the font size, causing contents restricted to fixed or absolute
heights to be clipped.
■ Do not use CSS positioning.
CSS positioning should be used only in the case of positioning the stretched layout
component. Do not use CSS positioning elsewhere.
22-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Running Accessibility Audit Rules
These attributes can be set to one of the WAI-ARIA landmark roles, including:
■ banner
■ complimentary
■ contentinfo
■ main
■ navigation
■ search
When any of the landmark-related attributes is set, ADF Faces renders a role attribute
with the value you specified.
2. In the Audit: Profiles dialog, deselect all checkboxes except ADF Faces
Accessibility Rules.
3. Save the profile with a unique name and click OK.
22-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Part IV
Part IV Using ADF Data Visualization
Components
Components
This chapter highlights the common characteristics and focus of the ADF Data
Visualization components, which are an expressive set of interactive ADF Faces
components. The remaining chapters in this part of the guide provide detailed
information about how to create and customize each component.
This chapter includes the following sections:
■ Section 23.1, "Introduction to ADF Data Visualization Components"
■ Section 23.2, "Defining the ADF Data Visualization Components"
■ Section 23.3, "Providing Data for ADF Data Visualization Components"
■ Section 23.4, "Downloading Custom Fonts for Flash Images"
23.2.1 Graph
The graph component gives you the capability of producing more than 50 types of
graphs, including a variety of bar graphs, pie graphs, line graphs, scatter graphs, and
stock graphs. This component lets you evaluate multiple data points on multiple axes
in many ways. For example, a number of graphs assist you in the comparison of
results from one group against the results from another group.
The following kinds of graphs can be produced by the graph component:
■ Area graph: Creates a graph in which data is represented as a filled-in area. Use
area graphs to show trends over time, such as sales for the last 12 months. Area
graphs require at least two groups of data along an axis. The axis is often labeled
with increments of time such as months.
■ Bar graph: Creates a graph in which data is represented as a series of vertical bars.
Use to examine trends over time or to compare items at the same time, such as
sales for different product divisions in several regions.
■ Bar (horizontal) graph: Creates a graph that displays bars horizontally along the
Y-axis. Use to provide an orientation that allows you to show trends or compare
values.
■ Bubble graph: Creates a graph in which data is represented by the location and
size of round data markers (bubbles). Use to show correlations among three types
of values, especially when you have a number of data items and you want to see
the general relationships. For example, use a bubble graph to plot salaries (X-axis),
years of experience (Y-axis), and productivity (size of bubble) for your work force.
Such a graph allows you to examine productivity relative to salary and experience.
■ Combination graph: Creates a graph that uses different types of data markers
(bars, lines, or areas) to display different kinds of data items. Use to compare bars
and lines, bars and areas, lines and areas, or all three.
■ Funnel graph: Creates a graph that is a visual representation of data related to
steps in a process. The steps appear as vertical slices across a horizontal cylinder.
As the actual value for a given step or slice approaches the quota for that slice, the
slice fills. Typically a funnel graph requires actual values and target values against
a stage value, which might be time. For example, use this component to watch a
process (such as a sales pipeline) move towards a target across the stage of the
quarters of a fiscal year.
■ Line graph: Creates a graph in which data is represented as a line, as a series of
data points, or as data points that are connected by a line. Line graphs require data
for at least two points for each member in a group. For example, a line graph over
months requires at least two months. Typically a line of a specific color is
associated with each group of data such as Americas, Europe, and Asia. Use to
compare items over the same time.
■ Pareto graph: Creates a graph in which data is represented by bars and a
percentage line that indicates the cumulative percentage of bars. Each set of bars
identifies different sources of defects, such as the cause of a traffic accident. The
bars are arranged by value, from the largest number to the lowest number of
incidents. A Pareto graph is always a dual-Y graph in which the first Y-axis
corresponds to values that the bars represent and the second Y-axis runs from 0 to
100% and corresponds to the cumulative percentage values. Use the Pareto graph
to identify and compare the sources of defects.
■ Pie graph: Creates a graph in which one group of data is represented as sections of
a circle causing the circle to look like a sliced pie. Use to show the relationship of
parts to a whole such as how much revenue comes from each product line.
23-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining the ADF Data Visualization Components
■ Radar graph: Creates a graph that appears as a circular line graph. Use to show
patterns that occur in cycles, such as monthly sales for the last three years.
■ Scatter/polar graph: Creates a graph in which data is represented by the location
of data markers. Use to show correlation between two different kinds of data
values such as sales and costs for top products. Scatter graphs are especially useful
when you want to see general relationships among a number of items.
■ Sparkchart: Creates a simple, condensed graph that displays trends or variations,
often in the column of a table or inline with text. Sparkcharts are simple in design,
with limited features and formatting options, showing as much data as possible.
■ Stock graph: Creates a graph in which data shows the high, low, and closing prices
of a stock. Each stock marker displays three separate values.
In JDeveloper, you can create and data bind a graph by dragging a data control from
the Data Controls Panel. A Component Gallery displays available graph categories,
types, and descriptions to provide visual assistance when designing graphs and
defining a quick layout. Figure 23–1 shows the Component Gallery that displays when
creating a graph from a data control.
For information about the data binding of graphs, see the "Creating Databound ADF
Graphs" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle
Application Development Framework.
Figure 23–1 Component Gallery for Graphs from Data Controls Panel
You can also create a graph on your page by dragging a graph component from the
Component Palette. This approach allows you the option of designing the graph user
interface before binding the component to data. Figure 23–2 shows the Component
Gallery that displays when creating a pie graph from the Component Palette.
Figure 23–2 Component Gallery for Pie Graphs from Component Palette
All graphs support Flash, SVG, and PNG rendering. Graph components support
interactivity on initial display and data change including the use of zooming and
scrolling, the use of an adjustable time selector window to highlight specific sections
on a time axis, the use of line and legend highlighting and fading to filter the display
of data points, and the use of dynamic reference lines and areas.
Figure 23–3 show an application dashboard that illustrates:
■ bar graph
■ pie graph with exploded slice
23-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining the ADF Data Visualization Components
Figure 23–4 shows an application dashboard that illustrates, clockwise from top left:
■ curved line graph with time selector window
■ pie graph with 3D effect and an exploded slice
■ bar graph with 3D effect
Figure 23–5 shows a line sparkchart displaying sales trends in a table column.
23.2.2 Gauge
The gauge component renders graphical representations of data. Unlike the graph, a
gauge focuses on a single data point and examines that point relative to minimum,
maximum, and threshold indicators to identify problem areas.
One gauge component can create a single gauge or a set of gauges depending on the
data provided.
The following kinds of gauges can be produced by this component:
■ Dial gauge: Creates a gauge that indicates its metric value along an 180-degree arc.
This type of gauge usually has an indicator in the shape of a line or an arrow that
points to the value that the gauge is plotting.
■ Status meter gauge: Creates a gauge that indicates the progress of a task or the
level of some measurement along a horizontal rectangular bar. An inner rectangle
shows the current level of a measurement against the ranges marked on an outer
rectangle.
■ Status meter gauge (vertical): Creates a gauge that indicates the progress of a task
of the level of some measurement along a vertical rectangular bar.
■ LED (lighted electronic display) gauge: Creates a gauge that depicts graphically a
measurement, such as key performance indicator (KPI). Several styles of graphics
are available for LED gauges such as arrows that indicate good (up arrow), fair
(left- or right-pointing arrow), or poor (down arrow).
You can specify any number of thresholds for a gauge. However, some LED gauges
(such as those with arrow or triangle indicators) support a limited number of
thresholds because there are a limited number of meaningful directions for them to
point. For arrow or triangle indicators, the threshold limit is three.
In JDeveloper, a Component Gallery displays available gauges categories, types, and
descriptions to provide visual assistance when designing gauges and defining a quick
layout. Figure 23–6 shows the Component Gallery for gauges.
23-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining the ADF Data Visualization Components
All gauge components can use Flash, SVG, and PNG rendering.
Figure 23–7 shows a set of dial gauges set with thresholds to display warehouse stock
levels.
Figure 23–8 shows a set of status meter gauges set with thresholds.
23-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Defining the ADF Data Visualization Components
the simultaneous display of a color theme, a graph theme (bar or pie graph), and point
themes. You can create any number of each type of theme and you can use the map
toolbar to select the desired themes at runtime.
As an example of a geographic map, consider a base map of the United States with a
color theme that provides varying color intensity to indicate the popularity of a
product within each state, a pie chart theme that shows the stock levels of warehouses,
and a point theme that identifies the exact location of each warehouse. When all three
themes are superimposed on the United States map, you can easily evaluate whether
there is sufficient inventory to support the popularity level of a product in specific
locations. Figure 23–10 shows a geographic map with color theme, pie graph theme,
and point theme.
Figure 23–10 Geographic Map with Color Theme, Pie Graph Theme, and Point Theme
23-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Downloading Custom Fonts for Flash Images
Embedded fonts are used for display and printing purposes, they are not installed on
the client, and they cannot be edited. They are used by the Flash Player, in memory,
and are cleared when the player terminates. Although embedded fonts require a
roundtrip to the server to download the font SWF file, they provide a consistent look
across all clients, support text rotation, and minimize distortion or anti-aliasing.
Oracle provides one font, Albany WT, for use in Flash images when necessary. This
font does not provide any non-plain variations such as Bold or Italic. The Albany WT
font is used instead of the default font to support certain animations not supported by
Flash with device fonts, if the application does not specify and provide its own
embedded font to use instead.
Specific fonts and their respective SWF files can be added to your application as
embedded fonts to be passed to the Flash engine. The engine will defer-load any font
specified in the list until that font is required by any text or labels in a graph or gauge
definition. Example 23–1 defines the Georgia font with a Bold and Italic combination.
23-12 Web User Interface Developer's Guide for Oracle Application Development Framework
24
Using ADF Graph Components
24
This chapter describes how to use an ADF graph component to display data, and
provides the options for graph customization.
This chapter includes the following sections:
■ Section 24.1, "Introduction to the Graph Component"
■ Section 24.2, "Understanding the Graph Tags"
■ Section 24.3, "Understanding Data Requirements for Graphs"
■ Section 24.4, "Creating a Graph"
■ Section 24.5, "Changing the Graph Type"
■ Section 24.6, "Customizing the Appearance of Graphs"
■ Section 24.7, "Customizing the Appearance of Specific Graph Types"
■ Section 24.8, "Adding Specialized Features to Graphs"
■ Section 24.9, "Animating Graphs with Active Data"
For information about the data binding of ADF graphs, see the "Creating Databound
ADF Graphs" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle
Application Development Framework.
When a graph is inserted into a JSF page using the Component Gallery, a set of child
tags that support customization of the graph is automatically inserted. Example 24–1
shows the source code for a horizontal bar graph with the quick-start layout selected
in the Component Gallery in Figure 24–1.
Figure 24–2 shows the visual editor display of the horizontal bar graph created with
the Component Gallery in Figure 24–1.
24-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding the Graph Tags
When editing a graph in the visual editor, graph components such as the title, legend
area, plot area, background, axis labels, and display of bars can be selected to display a
context menu with editing choices. For more information about editing a graph in the
visual editor, see Section 24.6, "Customizing the Appearance of Graphs."
Graphs are displayed in a default size of 400 X 300 pixels. You can customize the size
of a graph or specify dynamic resizing to fit an area across different browser window
sizes. When graphs are displayed in a horizontally or vertically restricted area, for
example in a web page sidebar, the graph is displayed in a fully featured, although,
simplified display.
To support visually impaired users who read web pages with a screen reader, graphs
are automatically replaced with pivot tables when screen reader mode is enabled for
the application. Screen readers can more easily navigate and read the data in a pivot
table than in a graph. For information about enabling screen reader mode, see
Section 22.2, "Exposing Accessibility Preferences." For information about ADF pivot
tables, see Section 26.1, "Introduction tithe ADF Pivot Table Component."
■ Child set tags: These tags wrap a set of an unlimited number of related tags. For a
list and description of these tags, see Section 24.2.4, "Child Set Tags."
■ Graph tag: Although available, but not the preferred method, the dvt:graph tag
lets you create an instance of a graph for any supported graph type. Even though
some graph attributes and some graph child tags are meaningful only for certain
graph types, the graph tag has a complete set of graph attributes and supports the
use of all graph child tags. Therefore, the dvt:graph tag provides full flexibility
for choosing graph types, customizing graphs, and changing from one graph type
to another.
For complete descriptions of all the tags, their attributes, and a list of valid values,
consult the DVT tag documentation. To access this documentation for a specific tag in
JDeveloper, select the tag in the Structure window and press F1. To access the full ADF
Data Visualization Tools tag library in JDeveloper Help, expand the Javadoc and Tag
Library References node in the online Help Table of Contents and click the link to the
tag library in the JDeveloper Tag Library Reference topic.
24-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding the Graph Tags
funnel graph to watch a process where the different sections of the funnel
represent different stages in the sales cycle.
■ dvt:lineGraph: Creates a graph in which data is represented as a line, as a
series of data points, or as data points that are connected by a line. Line graphs
require data for at least two points for each member in a group. For example, a line
graph over months requires at least two months. Typically a line of a specific color
is associated with each group of data such as the Americas, Europe, and Asia. Use
line graphs to compare items over the same time.
■ dvt:paretoGraph: Creates a graph in which data is represented by bars and a
percentage line that indicates the cumulative percentage of bars. Each set of bars
identifies different sources of defects, such as the cause of a traffic accident. The
bars are arranged by value, from the largest number to the lowest number of
incidents. A Pareto graph is always a dual-Y graph in which the first y-axis
corresponds to values that the bars represent and the second y-axis runs from 0%
to 100% and corresponds to the cumulative percentage values. Use Pareto graphs
to identify and compare the sources of defects.
■ dvt:pieGraph: Creates a graph in which one group of data is represented as
sections of a circle causing the circle to look like a sliced pie. Use pie graphs to
show the relationship of parts to a whole such as how much revenue comes from
each product line.
■ dvt:radarGraph: Creates a graph that appears as a circular line graph. Use
radar graphs to show patterns that occur in cycles, such as monthly sales for the
last three years.
■ dvt:scatterGraph: Creates a graph in which data is represented by the location
of data markers. Use scatter graphs to show correlation between two different
kinds of data values such as sales and costs for top products. Use scatter graphs in
particular to see general relationships among a number of items. A scatter graph
can display data in a directional manner as a polar graph.
■ dvt:sparkChart: Creates a simple, condensed graph that displays trends or
variations in a single data value, typically stamped in the column of a table or in
line with related text. Sparkcharts have basic conditional formatting.
■ dvt:stockGraph: Creates a graph in which data shows the high, low, and
closing prices of a stock. Each stock marker displays two to four separate values
(not counting the optional volume marker) depending on the specific type of stock
graph chosen.
■ Annotations that insert notes for specific data points: dvt:annotationSet and
dvt:annotation tags.
■ Appearance and titles for the graph: dvt:background, dvt:graphFont,
dvt:graphFootnote, dvt:graphPlotArea, dvt:graphSubtitle, and
dvt:graphTitle tags.
■ Colors and appearance of bars, areas, lines, and pie slices (also known as series
items): dvt:seriesSet and dvt:series tags.
■ Legend appearance: dvt:legendArea, dvt:legendText, and
dvt:legendTitle tags.
■ Marker customization related to each axis: dvt:markerText, dvt:x1Format,
dvt:y1Format, dvt:y2Format, and dvt:zFormat tags.
■ Reference lines and reference areas: dvt:referenceObjectSet and
dvt:referenceObject tags.
■ Customization for the ordinal axis (also known as the category axis) used with bar,
area, combination, line, radar, and stock graphs with group labels: dvt:o1Axis,
dvt:o1MajorTick, dvt:o1TickLabel, and dvt:o1Title tags.
■ Customization for the x-axis used with scatter and bubble graphs with numerical
labels: dvt:x1Axis, dvt:x1MajorTick, dvt:x1TickLabel,
dvt:x1MinorTick, and dvt:x1Title tags.
■ Customization for the y1-axis: dvt:y1Axis, dvt:y1BaseLine,
dvt:y1MajorTick, dvt:y1TickLabel, dvt:y1MinorTick, and
dvt:y1Title tags.
■ Customization for the y2-axis: dvt:y2Axis, dvt:y2BaseLine,
dvt:y2MajorTick, dvt:y2TickLabel, dvt:y2MinorTick, and
dvt:y2Title tags.
24-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Data Requirements for Graphs
■ Logical: Some graph types cannot accept certain kinds of data. The following
examples apply:
– Negative data issues: Do not pass negative data to a pie graph or to a
percentage bar, line, or area graph. Markers will not display for negative data
in percentage graphs.
– Null or zero data: You cannot see markers for null data because markers will
not be produced for null data. Also, if a graph receives zero data and the axis
line is at zero, the marker is not visible. However, if the axis line is at nonzero,
the zero marker is visible.
– Insufficient sets (or series) of data: Dual-Y graphs require a set of data for each
y-axis. Usually, each set represents different information. For example, the
y1-axis might represent sales for specific countries and time periods, while the
y2-axis might represent total sales for all countries. If you pass only one set of
y-axis data, then the graph cannot display data on two different Y-axes. It
displays the data on a single y-axis.
Similar graphs share similar data requirements. For example, you can group the
following graphs under the category of area graphs:
■ Absolute area graph.
■ Stacked area graph.
■ Percentage area graph.
24-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Data Requirements for Graphs
Note: When you look at a bubble graph, you can identify groups of
data by examining tooltips on the markers. However, identifying
groups is not as important as looking more at the overall pattern of
the data markers.
24-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Data Requirements for Graphs
■ The first data value is the X value. It determines the location of the marker along
the x-axis, which is the location around the circle, clockwise.
■ The second data value is the Y value. It determines the location of the marker
along the y-axis, which is the distance from the center of the graph.
Data guidelines for a polar graph require at least two data values for each marker.
24-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Data Requirements for Graphs
■ Floating bar sparkcharts require two series of data values, one for the float offset,
and one for the bar value Figure 24–4 shows an example of a floating bar
sparkchart in a table column.
■ High-low-close stock graphs that also show volume can display the data for only
one stock. The label for this stock appears in the legend of the graph.
24-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a Graph
24.4.1.1.1 Series and Groups of Data A graph displays series and groups of data. Series
and groups are analogous to the rows and columns of a grid. Usually the rows in the
grid appear as a series in a graph and the columns in the grid appear as groups in the
graph.
For most graphs, a series appears as a set of markers that are the same color. Usually
the graph legend shows the identification and associated color of each series. For
example, in a bar graph, the yellow bars might represent the sales of shoes and the
green bars might represent the sales of boots.
Groups appear differently in different graph types. In a clustered bar graph, each
cluster is a group. In a stacked bar graph, each stack is a group. In a multiple pie
graph, each pie is a group. A group might represent time periods, such as years. A
group might also represent geographical locations such as regions.
Depending on the data requirements for a graph type, a single group might require
multiple data values. For example, a scatter graph requires two values for each data
marker. The first value determines where the marker appears along the x-axis while
the second value determines where the marker appears along the y-axis.
24.4.1.1.2 Structure of the List of Tabular Data The list that contains the tabular data
consists of a three-member Object array for each data value to be passed to the
graph. The members of each array must be organized as follows:
■ The first member (index 0) is the column label, in the grid, of the data value. This
is generally a String. If the graph has a time axis, then this should be a Java Date.
Column labels typically identify groups in the graph.
■ The second member (index 1) is the row label, in the grid, of the data value. This is
generally a String. Row labels appear as series labels in the graph, usually in the
legend.
■ The third member (index 2) is the data value, which is usually Double.
24.4.1.1.3 Example of a List of Data Figure 24–5 has three columns: 2006, 2007, and 2008.
This graph also has two row: Shoes and Boots. This data produces a graph that
compares annual sales for boots and shoes over a three-year period.
Example 24–3 shows code that creates the list of data required for a graph to compare
annual sales of shoes and boots for a three-year period.
24-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Changing the Graph Type
{
for (int r = 0; r < rowLabels.length; r++)
{
list.add (new Object [] {colLabels[c], rowLabels[r],
new Double (values[r][c])});
}
}
return list;
}
2. In the Data attributes category of the Property Inspector, click the TabularData
attribute dropdown menu and choose Expression Builder.
3. From the ensuing dialog, use the search box to locate the managed bean.
4. Expand the managed bean node and select the method that contains the list of
tabular data.
5. Click OK.
In the Expression Builder, the tabularData attribute is set to reference the method
that you selected in the managed bean. For example, for a managed bean named
named sampleGraph and a method named getTabularData, the tabularData
attribute has the following setting: #(sampleGraph.tabularData).
24.4.2 What Happens When You Create a Graph Using Tabular Data
When you create a graph that is powered by data obtained from a list referenced the
tabulularData attribute a vertical clustered bar graph is created by default. You
have the option of changing the settings of the graphType attribute to any of the
more than 50 graphs that are available as long as the tabular data meets the data
requirements for that graph type. You can also change the settings of the many
additional attributes on the dvt:graph tag.
Customize the graph by dragging any of the graph child tags to the dvt:graph node
in the Structure window and providing settings for the attributes that you want to
specify.
2. In the Common attributes category of the Property Inspector, for the SubType
attribute, select the desired type from the attribute dropdown menu. The valid
values will vary depending on the graph.
When you edit graph components in the visual editor, specialized context menus and
Property Inspector buttons are available to support the customization of graph
features. Popups in the editor provide confirmation of selection of the graph feature to
be customized. For example, Figure 24–6 shows the popup displayed in the plot area
of a line graph.
24-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
When the graph feature is selected in the visual editor, a specialized editing context
menu is made available. Figure 24–7 shows the line graph plot area context menu from
which you can choose a variety of options including removing the default display of
the horizontal grid marks. You can also use the context menu or the Property Inspector
buttons to configure special fill effects in the plot area. The selection of the graph tags
is synchronized in the visual editor, Structure window, Property Inspector, and source
editor.
For additional information about configuring line graphs, see. Section 24.7.2,
"Changing the Appearance of Lines in Graphs." For additional information about
configuring special fill effects, see Section 24.8.2, "Using Gradient Special Effects in
Graphs."
24.6.1 Changing the Color, Style, and Display of Graph Data Values
For most graph types, an entry appears in the legend for each set of data values
represented as graph bars, lines, areas, points, and slices. This entry identifies a set of
related data values and displays the color that represents the set in the graph. For
example, a bar graph might use yellow bars to represent the sales of shoes and green
bars to represent the sales of boots. The graph component refers to each set of related
data values as a series.
The graph automatically assigns a different color to each set of data values. You can
customize the colors assigned to each series, including the fill color and the border
color. For some graph types, you can enable filtering the display of data values in a
graph by hiding or showing the series from the graph legend.
You can specify additional characteristics for specific graph types such as the width
and style of lines in a line graph with choices including solid lines, dotted lines, lines
with dashes, and so on. For more information, see Section 24.7.2, "Changing the
Appearance of Lines in Graphs."
For scatter graphs you can separate data marker shape and color from the series to
display the interdependence of data values. For more information, see Section 24.7.4,
"Customizing Scatter Graph Series Markers."
You can also customize the colors of each series in a graph by adding gradient special
effects. For more information, see Section 24.8.2, "Using Gradient Special Effects in
Graphs."
24.6.1.1 How to Specify the Color and Style for Individual Series Items
Use one dvt:seriesSet tag to wrap all the individual dvt:series tags for a graph
and set attributes for color and style of graph data markers.
24.6.1.2 How to Control the Number of Different Colors Used for Series Items
The graph stores separate properties (such as color) for a specific number of series.
Beyond that number, the graph repeats series properties. By default, a graph allows up
to 30 different series items for which it displays separate properties.
The value in the seriesObjectCount attribute of the graph determines the number
of series before properties are repeated. If seriesObjectCount is set to the value 4,
then series 5 has the same properties as series 1, series 6 has the same properties as
series 2, and so on.
24-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
■ withoutRescale: Hides the series, but does not rescale the graph.
24-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
Use the dvt:graphFont tag as a child of the specific subcomponent for which you
want to format text. For an example of formatting text in a graph, see Section 24.6.5.2,
"How to Specify Titles and Footnotes in a Graph,".
2. Register the custom skin with the application in the trinidad-skins.xml file.
For example, mySkin.css extends the default blafplus-rich.desktop style
sheet:
<?xml version="1.0" encoding="ISO-8859-1"?>
<skins xmlns="http://myfaces.apache.org/trinidad/skin">
<skin>
<id>mySkinExtends.desktop</id>
<family>mySkinExtends</family>
<extends>blafplus-rich.desktop</extends>
<render-kit-id>org.apache.myfaces.trinidad.desktop</render-kit-id>
<style-sheet-name>skins/mySkin.css</style-sheet-name>
</skin>
</skins>
4. Package the custom skin into a jar file to deploy with the application. The
trinidad-skins.xml file that defines the skin and that references the CSS file
must be within the META-INF directory.
For detailed information about applying a custom skin to applications, see Chapter 20,
"Customizing the Appearance Using Styles and Skins."
2. In the Style attributes category of the Property Inspector, enter a value for the
inlineStyle attribute of the graph tag. For example:
24-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
inlineStyle="width:200px;height:200px"
Note: You can also customize the colors of the background and plot
area in a graph by adding gradient special effects. For more
information, see Section 24.8.2, "Using Gradient Special Effects in
Graphs."
24-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
c. If you want to provide specific font characteristics for the text, then in the
Structure window, right-click the dvt:graphTitle node and choose Insert
inside dvt:graphTitle > Font.
d. Use the Property Inspector to specify values for the attributes of the
dvt:graphFont tag.
2. If you want to enter a graph subtitle, do the following:
a. In the Structure window, right-click the graph node and choose Insert inside
dvt:<type>Graph > ADF Data Visualization > Subtitle.
b. Use the Property Inspector to specify values in the attributes of the
dvt:graphSubtitle tag.
c. If you want to provide specific font characteristics for the text, in the Structure
window, right-click the dvt:graphSubtitle node and choose Insert inside
dvt:graphSubtitle > Font.
d. Use the Property Inspector to specify values for the attributes of the
dvt:graphFont tag.
3. If you want to enter a graph footnote, do the following:
a. In the Structure window, right-click the graph node and choose Insert inside
dvt:<type>Graph > ADF Data Visualization > Footnote.
b. Use the Property Inspector to specify values in the attributes of the
dvt:graphFootnote tag.
c. If you want to provide specific font characteristics for the text, then in the
Structure window, right-click the dvt:graphFootnote node and choose Insert
inside dvt:graphFootnote > Font.
d. Use the Property Inspector to specify values for the attributes of the
dvt:graphFont tag.
For each axis, there are several graph child tags that support customization. The
following sections discuss the options available for various kinds of customization of
an axis.
24-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
■ asNeeded: Scrolling is enabled, but the scrollbar is not initially present. After
zooming on the graph, the scrollbar displays and remains visible for the session.
■ hidden: Scrolling is enabled but the scroll bar is always hidden. User may use pan
scrolling.
24.6.6.3 How to Control the Appearance of Tick Marks and Labels on an Axis
Tick marks are used to indicate specific values along a scale on a graph. The following
graph child tags support customization of the tick marks and their labels on an axis:
■ Major tick: Controls the color, width, and style of tick marks on the axis. Includes
the following tags: dvt:o1MajorTick, dvt:x1MajorTick,
dvt:y1MajorTick, and dvt:y2MajorTick. Major tick increments are
calculated automatically by default, or you can specify the tick steps with the
majorIncrement attribute.
■ Minor tick: Controls the color, width, and style of minor tick marks on the axis.
Includes the following tags: dvt:x1MinorTick, dvt:y1MinorTick, and
dvt:y2MinorTick. Minor tick increments are one-half of the major tick
increment by default, or you can specify the tick steps with the minorIncrement
attribute. Minor ticks do not support labels.
■ Tick label: Controls the rotation of major tick label text and lets you specify font
characteristics for the label. Includes the following tags: dvt:o1TickLabel,
dvt:x1TickLabel, dvt:y1TickLabel, and dvt:y2TickLabel. These tags
can also have a dvt:graphFont child tag to change font characteristics of the
label.
a. In the Structure window, right-click the graph node and choose Insert inside
dvt:<type>Graph > ADF Data Visualization > X1 Minor Tick.
b. In the Property Inspector, enter desired values for the characteristics of the
font.
Note: For the tickStyle attribute you must specify a value other
than GS_NONE or GS_AUTOMATIC.
The procedure for controlling the appearance of tick marks on any graph axis is
similar to the procedure for the x-axis. However, you customize the major tick and
label tags and insert the minor ticks related to the specific axis that you want to
customize.
Note: There is no format for the ordinal axis because that axis does
not contain numeric values.
To format numbers on these axes, insert child tags for the appropriate axis as shown in
Section 24.6.2, "Formatting Numbers in Graphs."
24-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Graphs
■ Specifying the font characteristics and positioning of the text that is related to each
colored entry in the legend, dvt:legendText tag
■ Specifying an optional title and font characteristics for the legend area,
dvt:legendTitle tag
values. For specific graph types, options include displaying cumulative data value
for each stacked graph marker or displaying percentage data value for each pie
slice marker.
■ SeriesTooltipLabel: Specifies whether tooltips are displayed for each set of values
that appear in a legend. This attribute also controls the kind of information that
appears in a series tooltip. For example, you could choose to display text that
identifies a general term for the entire series (such as Product) or a specific term
for a given member of the series (such as a specific Product name).
Note: The graph displays series tooltip labels only if the graph’s
markerTooltipType attribute has a setting that includes text.
24-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Specific Graph Types
You can use the graph’s customToolTipCallback attribute to specify tooltips that
vary on an object by object basis. For example:
<dvt:graph id="g2" customToolTipCallback="#{customToolTipCallback.callback}"
24-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of Specific Graph Types
■ On the dvt:seriesSet tag, you can affect all the dvt:series tags within that
set by specifying values for the following attributes:
– defaultMarkerShape: Used only for line, scatter, and combination graphs.
Identifies a default marker shape for all the series in the series set.
– defaultMarkerType: Used only for combination graphs. Valid values
include MT_AREA, MT_BAR, MT_MARKER, and MT_DEFAULT.
■ On the dvt:series tag, you can specify settings for each individual series using
the following line attributes:
– lineWidth: Specifies the width of a line in pixels
– lineStyle: Specifies whether you want the graph to use solid lines, dotted
lines, dashed lines, or dash-dot combination lines.
See the procedures in Section 24.6.1.1, "How to Specify the Color and Style for
Individual Series Items" for more information about using the dvt:seriesSet tag
and the dvt:series tag.
The row header attributes can be used to override the default series specification.
Figure 24–9 shows a scatter graph that displays the data values for the City attribute
mapped to shapes and the Product attribute mapped to colors.
Use the following attributes to customize the scatter graph series markers:
■ markerShape - Specifies the row header attribute name to use to set the marker
color. The graph will display the default index based series marker colors if this
attribute is not specified.
■ markerColor - Specifies the row header attribute name to use to set the marker
shape. The graph will display the default index based series marker shapes if this
attribute is not specified.
For example, specify City and Product as separate series item markers using this code:
<dvt:scatterGraph markerColor="Product" markerShape="City"
value="#{bindings.View1.graphModel}"/>
24-36 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Specialized Features to Graphs
c. If you are creating a reference area, then specify the low value and the high
value that represent the reference area on the specified axis.
5. In the Structure window, right-click the graph node and choose Go To Properties.
6. In the Property Inspector, select the Appearance attributes category and do the
following to control the display of reference lines and reference areas:
a. If you have defined reference lines (which must be related to a series), then
expand the dvt:series node and specify a value for the behavior of the
displaySeries attribute.
The value RO_DISPLAY_AUTOMATIC enables the display of a reference line
only when the cursor moves over a series item (such as a bar) or over the
corresponding series entry in the graph legend. This choice prevents the
confusion that might occur if multiple series reference lines were displayed all
the time.
b. If you have defined reference areas (which must be related to specific axes),
then associate the reference object with the appropriate axis or axes.
24.8.1.2 What Happens When You Create Reference Lines or Areas During Design
When you create reference lines or areas during design, XML code is generated within
the graph XML on the JSF page. The reference objects (both lines and areas) are
wrapped by the dvt:referenceObjectSet tags. Example 24–6 shows the code for
three reference areas associated with the y1-axis, one reference area associated with the
y2-axis, and four reference lines associated with different series.
Example 24–6 XML Code for Reference Lines and Areas in a Graph
<dvt:barGraph value ="#{sampleGraph.graphDataModel}" graphType="BAR_VERT_CLUST2Y"
imageFormat="FLASH">
<dvt:referenceObjectSet
displayX1="RO_DISPLAY_AUTOMATIC"
displayY2="RO_DISPLAY_AUTOMATIC"
<dvt:referenceObject index="1" type="RO_AREA" association="Y1AXIS"
location="RO_BACK" color="#55FF0000" lowValue="0" highValue="4000"
displayedInLegend="true" text="Low"/>
<dvt:referenceObject index="2" type="RO_AREA" association="Y1AXIS"
location="RO_BACK" color="#55FFFF00" lowValue="4000" highValue="10000"
displayedInLegend="true" text="Medium"/>
<dvt:referenceObject index="3" type="RO_AREA" association="Y1AXIS"
location="RO_BACK" color="#5500FF00" lowValue="10000" highValue="18000"
displayedInLegend="true" text="High"/>
<dvt:referenceObject index="4" type="RO_AREA" association="Y2AXIS"
location="RO_FRONT" color="#550000FF" lowValue="300" highValue="700"/>
<dvt:referenceObject index="5" type="RO_LINE" association="SERIES" series="0"
location="RO_FRONT" color="#ffff66" lineValue="5000" lineWidth="3"
lineStyle="LS_SOLID"/>
<dvt:referenceObject index="6" type="RO_LINE" association="SERIES" series="0"
location="RO_FRONT" color="#ffff66" lineValue="16730" lineWidth="3"
lineStyle="LS_SOLID"/>
<dvt:referenceObject index="7" type="RO_LINE" association="SERIES" series="1"
location="RO_BACK" color="#99cc66" lineValue="500" lineWidth="3"
lineStyle="LS_SOLID"/>
<dvt:referenceObject index="8" type="RO_LINE" association="SERIES" series="1"
location="RO_BACK" color="#99cc66" lineValue="1711" lineWidth="3"
lineStyle="LS_SOLID"/>
</dvt:referenceObjectSet>
</dvt:barGraph>
24-38 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Specialized Features to Graphs
24-40 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Specialized Features to Graphs
24.8.2.2 What Happens When You Add a Gradient Special Effect to a Graph
Example 24–8 shows the XML code that is generated when you add a gradient fill to
the background of a graph and specify two stops.
Example 24–8 XML Code Generated for Adding a Gradient to the Background of a Graph
<dvt:graph >
<dvt:background borderColor="#848284">
<dvt:specialEffects fillType="FT_GRADIENT" gradientDirection="GD_RADIAL"
gradientNumStops="2">
<dvt:gradientStopStyle stopIndex="0" gradientStopPosition="60"
gradientStopColor="FFFFCC"/>
<dvt:gradientStopStyle stopIndex="1" gradientStopPosition="90"
gradientStopColor="FFFF99"/>
</dvt:specialEffects>
</dvt:background>
</dvt:graph>
24-42 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Specialized Features to Graphs
points are added to the display of an active data graph. Relative time range
specifications are not limited to use in active data graphs.
2. In the Appearance attributes category, expand the dvt:timeAxis node and specify
values for the following attributes:
a. In the timeRangeMode attribute, specify the value TRM_RELATIVE_LAST
or TRM_RELATIVE_FIRST depending on whether the relative range applies
to the end of the time range (such as the last seven days) or to the beginning of
the time range (such as the first seven days).
b. In the timeRelativeRange attribute, specify the relative range in
milliseconds.
2. In the Appearance attributes category, specify the values for the following
attributes:
a. In the timeRangeMode attribute, specify the value TRM_EXPLICIT.
b. In the timeRangeStart attribute, enter the initial date for the time range.
c. In the timeRangeEnd attribute, enter the ending date for the time range.
Annotations are associated with a data value on a graph to provide information when
the cursor moves over the data value. An unlimited number of annotations can be
defined for a graph using dvt:annotation tags and multiple annotations can be
associated with a single data value. The annotations are wrapped in a
dvt:annotationSet tag that is a child of the graph tag.
The data marker associated with the annotation is defined using these attributes of the
dvt:annotation tag:
■ series - Specifies the zero-based index of a series in a graph. In most graphs,
each series appears as a set of markers that are the same color. For example, in a
multiple pie graph, each yellow slice might represent sales of shoes, while each
green slice represents the sales of boots. In a bar graph, all of the yellow bars might
represent the sales of shoes, and the green bars might represent the sales of boots.
■ group - Specifies the zero-based index of a group in a graph. Groups appear
differently in different graph types. In a clustered bar graph, each cluster of bars is
a group. In a stacked bar graph, each stack is a group. In a multiple pie graph,
each pie is a group.
Example 24–11 shows a set of annotations for an area graph.
You can control the position of the annotation in the plot area of a graph using these
attributes:
■ position - Specifies the type of positioning to use for the annotation. Valid
values are:
– dataValue (default) - Positions the annotation by the data value defined in
the series and group attributes. Overlap with other annotations is avoided.
– absolute - Positions the annotation at the exact point defined by the xValue
and the yValue in graphs with both those axes. Overlap with other
annotations is not avoided.
– percentage - Positions the annotation at the exact point defined by using the
xValue and yValue as a percentage between 0 and 100 of the plot area of
graphs with both those axes. Overlap with other annotations is not avoided.
■ xValue - Specifies the X value at which to position the annotation. This setting
only applies when the annotation position is absolute or percentage.
■ yValue - Specifies the Y value at which to position the annotation. This setting
only applies when the annotation position is absolute or percentage.
■ horizontalAlignment - Specifies the horizontal positioning of the annotation.
This setting only applies when the annotation position attribute is absolute or
percentage. Valid values are LEFT (default), CENTER, LEADING, or RIGHT.
■ verticalAlignment - Specifies the vertical positioning of the annotation. This
setting only applies when the annotation position attribute is absolute or
percentage. Valid values are CENTER (default), TOP, or BOTTOM.
24-44 Web User Interface Developer's Guide for Oracle Application Development Framework
Animating Graphs with Active Data
support animation effects for active data. The Active Data Service (ADS) allows you to
bind ADF Faces components to an active data source using the ADF model layer. To
allow this, you must configure the components and the bindings so that the
components can display the data as it is updated in the source.Alternatively, you can
configure the application to poll the data source for changes at prescribed intervals.
To use the Active Data Service, you must have a data source that publishes events
when data is changed, and you must create business services that react to those events
and the associated data controls to represent those services. For more information
about ADS and configuring your application, see the "Using the Active Data Service"
chapter in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application
Development Framework.
24-46 Web User Interface Developer's Guide for Oracle Application Development Framework
25
Using ADF Gauge Components
25
This chapter describes how to use a databound ADF gauge component to display data,
and provides the options for gauge customization.
This chapter includes the following sections:
■ Section 25.1, "Introduction to the Gauge Component"
■ Section 25.2, "Understanding Data Requirements for Gauges"
■ Section 25.3, "Creating a Gauge"
■ Section 25.4, "Customizing Gauge Type, Layout, and Appearance"
■ Section 25.5, "Adding Gauge Special Effects and Animation"
■ Section 25.6, "Using Custom Shapes in Gauges"
For information about the data binding of gauges, see the "Creating Databound ADF
Gauges" section in the Oracle Fusion Middleware Fusion Developer's Guide for Oracle
Application Development Framework.
When a gauge component is inserted into a JSF page using the Component Gallery, a
set of child tags that support customization of the gauge is automatically inserted.
Example 25–1 shows the code inserted in the JSF page for a dial gauge with the
quick-start layout selected in the Component Gallery in Figure 25–1.
25-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to the Gauge Component
Gauges are displayed in a default size of 200 X 200 pixels. You can customize the size
of a gauge or specify dynamic resizing to fit an area across different browser window
sizes. When gauges are displayed in a horizontally or vertically restricted area, for
example in a web page sidebar, the gauge is displayed in a small image size. Although
fully featured, the smaller image is a simplified display.
■ Status Meter: Indicates the progress of a task or the level of some measurement
along a rectangular bar. An inner rectangle shows the current level of a
measurement against the ranges marked on an outer rectangle. Figure 25–3 shows
the Plasma HD TV stock level using a status meter gauge.
■ Status Meter (vertical): Indicates the progress of a task or the level of some
measurement along a vertical rectangular bar. Figure 25–4 shows the Plasma HD
TV stock level using a vertical status meter gauge.
Figure 25–6 shows the same stock level using a LED arrow.
For dial and status meter gauges, a tooltip of contextual information automatically
displays when a users moves a mouse over the plot area, indicator, or threshold
region. Figure 25–7 shows the indicator tooltip for a dial gauge.
25-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to the Gauge Component
■ Shape Attributes Set: The gauge supports interactivity properties for its child
elements. For example, the alt text of a gauge plot area can be displayed as a
tooltip when the user moves the mouse over that area at runtime. For more
information, see Section 25.5.3, "How to Add Interactivity to Gauges."
25-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating a Gauge
For more information, see the “Creating Databound ADF Gauges" section in the
Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development
Framework.
■ Tabular data: You can provide CSV (comma-separated value) data to a gauge
through the tabularData attribute of the dvt:gauge tag.
■ The second member (index 1) is the row label, in the grid, of the data value. This is
generally a String.
■ The third member (index 2) is the data value, which is usually Double.
Figure 25–9 has five columns: Quota, Sales, Margin, Costs, and Units. The example has
three rows: London, Paris, and New York. This data produces a gauge set with five
gauges in each row and lets you compare values such as sales across the three cities.
Example 25–2 shows code that creates the list of tabular data required for the gauge
that compares annual results for three cities.
25-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Gauge Type, Layout, and Appearance
4. In the Expression Builder dialog, use the search box to locate the managed bean.
5. Expand the managed bean node and select the method that creates the list of
tabular data.
6. Click OK.
The Expression is created.
For example, if the name of the managed bean is sampleGauge and the name of
the method that creates the list of tabular data is getGaugeData, the Expression
Builder generates the code #{sampleGauge.gaugeData} as the value for the
tabularData attribute of the dvt:gauge tag.
25.3.3 What Happens When You Create a Gauge Using Tabular Data
When you create a gauge tag that is powered by data obtained from a list referenced in
the tabularData attribute, the following results occur:
■ A gauge is generated with a setting in its tabularData attribute. The settings for
all other attributes for this gauge are provided by default.
■ You have the option of changing the setting of the gaugeType attribute in the
Property Inspector to DIAL, LED, STATUSMETER, or VERTICALSTATUSMETER.
25-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Gauge Type, Layout, and Appearance
Note: For the final threshold, the maximum value of the gauge is
used as the threshold maximum value regardless of any entry you
make in the threshold tag for the final threshold.
4. Repeat Step 2 and Step 3 to create each threshold in the gauge from the lowest
minimum value to the highest maximum value.
You have the option of adding any number of thresholds to gauges. However, arrow
and triangle LED gauges support thresholds only for the three directions to which they
point.
25-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Gauge Type, Layout, and Appearance
25.4.6 What Happens When You Format the Number in a Gauge Metric Label
When you add a metric label and number formatting to a gauge, XML code is
generated. Example 25–3 shows a sample of the XML code that is generated.
Example 25–3 XML Code Generated When Formatting a Number in a Metric Label
<dvt:gauge>
<dvt:metricLabel position="LP_BELOW_GAUGE" numberType="NT_PERCENT">
<dvt:numberFormat posNumFmt="POS_NUMFMT_NUM_POS"/>
</dvt:metricLabel>
</dvt:gauge>
Example 25–4 XML Code Generated When You Format Text in a Gauge Metric Label
<dvt:gauge>
<dvt:metricLabel>
<dvt:gaugeFont name="Tahoma" size="11" color="#3C3C3C" bold="true"/>
</dvt:metricLabel>
</dvt:gauge>
25-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Gauge Type, Layout, and Appearance
– content: Specifies where tick marks occur within a gauge set. Valid values
are any combination separated by spaces or commas including:
* TC_INCREMENTS: Display tick marks in increments.
* TC_MAJOR_TICK: Display tick marks for minimum, maximum, and
incremental values.
* TC_MIN_MAX: Display tick marks for minimum and maximum values.
* TC_METRIC: Display tick marks for actual metric values.
* TC_NONE: Display no tick marks.
* TC_THRESHOLD: Display tick marks for threshold values.
■ dvt:tickLabel: Identifies major tick marks that will have labels, the location of
the labels (interior or exterior of the gauge), and the format for numbers displayed
in the tick labels.
25-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Gauge Special Effects and Animation
25.5.2 What Happens When You Add a Gradient Special Effect to a Gauge
When you add a gradient fill to the background of a gauge and specify two stops,
XML code is generated. Example 25–5 shows the XML code that is generated.
Example 25–5 XML Code Generated for Adding a Gradient to the Background of a
Gauge
<dvt:gauge >
<dvt:gaugeBackground borderColor="#848284">
<dvt:specialEffects fillType="FT_GRADIENT" gradientDirection="GD_RADIAL">
<dvt:gradientStopStyle stopIndex="0" gradientStopPosition="60"
gradientStopColor="FFFFCC"/>
<dvt:gradientStopStyle stopIndex="1" gradientStopPosition="90"
gradientStopColor="FFFF99"/>
</dvt:specialEffects>
</dvt:gaugeBackground>
</dvt:gauge>
25-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Gauge Special Effects and Animation
For example, Example 25–6 shows the code for a dial gauge where the tooltip of the
indicator changes from "Indicator" to "Indicator is Clicked" when the user clicks the
indicator, and the tooltip for the gauge metric label displays "Metric Label" when the
user mouses over that label at runtime.
You can also use a backing bean method to return the value of the attribute.
Example 25–7 shows sample code for referencing a backing bean and Example 25–8
shows the backing bean sample code.
Figure 25–10 shows a dial gauge with the dial indicator animated to display the data
change at each threshold level.
25-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Custom Shapes in Gauges
Table 25–2 shows the metadata IDs and the descriptions used for internal calculations,
not rendered in the gauge.
25-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Custom Shapes in Gauges
Example 25–9 shows a sample SVG file used to specify custom shapes for the
components of a gauge.
Example 25–9 Sample SVG File Used for Gauge Custom Shapes
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0">
25.6.3 What You May Need to Know About Supported SVG Features
The custom shapes available to you support the following SVG features:
■ Transformations
■ Paths
■ Basic shapes
■ Fill and stroke painting
■ Linear and radial gradients
SVG features that are not supported by custom shapes in JDeveloper include:
■ Unit Identifiers: All coordinates and lengths should be specified without the unit
identifiers, and are assumed to be in pixels. The parser does not support unit
identifiers, because the size of certain units can vary based on the display used.
For example, an inch may correspond to different numbers of pixels on different
displays. The only exceptions to this are gradient coordinates, which can be
specified as percentages.
■ Text: All text on the gauge is considered data, and should be specified through the
tags or data binding.
■ Specifying Paint: The supported options are none, 6-digit hexadecimal, and a
<uri> reference to a gradient.
■ Fill Properties: The fill-rule attribute is not supported.
■ Stroke Properties: The stroke-linecap, stroke-linejoin,
stroke-miterlimit, stroke-disarray, and stroke-opacity attributes
are not supported.
■ Linear Gradients and Radial Gradients: The gradientUnits,
gradientTransform, spreadMethod, and xlink:href are not supported.
Additionally, the r, fx, and fy attributes on the radial gradient are not supported.
■ Elliptical Arc Out-of-Range Parameters: If rx, ry, and x-axis-rot are too small
such that there is no solution, the ellipse should be scaled uniformly until there is
exactly one solution. The SVG parser will not support this.
25-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Custom Shapes in Gauges
■ General Error Conditions: The SVG input is expected to be well formed and
without errors. The SVG parser will not perform any error checking or error
recovery for incorrectly formed files, and it will stop parsing when it encounters
an error in the file.
25-26 Web User Interface Developer's Guide for Oracle Application Development Framework
26
Using ADF Pivot Table Components
26
This chapter describes how to use a databound ADF pivot table component to display
data, and provides the options for pivot table customization.
This chapter includes the following sections:
■ Section 26.1, "Introduction tithe ADF Pivot Table Component"
■ Section 26.2, "Understanding Data Requirements for a Pivot Table"
■ Section 26.3, "Pivoting Layers"
■ Section 26.4, "Using Selection in Pivot Tables"
■ Section 26.5, "Sorting in a Pivot Table"
■ Section 26.6, "Sizing in a Pivot Table"
■ Section 26.7, "Updating Pivot Tables with Partial Page Rendering"
■ Section 26.8, "Exporting from a Pivot Table"
■ Section 26.9, "Customizing the Cell Content of a Pivot Table"
■ Section 26.10, "Pivot Table Data Cell Stamping and Editing"
■ Section 26.11, "Using a Pivot Filter Bar with a Pivot Table"
For information about the data binding of ADF pivot tables, see the "Creating
Databound ADF Pivot Tables" section in the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
Figure 26–1 Sales Pivot Table with Multiple Rows and Columns
Pivot tables support on-demand data scrolling for large data sets. Only the data being
viewed in the pivot table is loaded. As the user scrolls vertically or horizontally, data is
fetched or discarded to fill the new pivot table view. Figure 26–2 shows a pivot table
with a large data set using on-demand data scrolling.
A pivot filter bar is a component that can be added to a pivot table to provide the user
with a way to filter pivot table data in layers not displayed in one of the other edges of
the pivot table. Users can also drag and drop these layers between the pivot filter bar
and the associated pivot table to change the view of the data. Figure 26–3 shows a
pivot filter bar for a pivot table.
26-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Pivoting Layers
– Row edge: The vertical axis to the left of the body of the pivot table. In
Figure 26–1, the row edge contains two layers, Year and Product, and each row
in the pivot table represents the combination of a particular year and a
particular product.
– Column edge: The horizontal axis above the body of the pivot table. In
Figure 26–1, the column edge contains three layers, Measure, Channel, and
Geography, and each column in the pivot table represents the combination of a
particular measure value (Sales or Units), a particular channel indicator (All
Channels), and a particular geographic location (World or Boston).
– Page edge: The edge represented by the pivot filter bar, whose layers can be
filtered or pivoted with the layers in the row and column edges.
■ Layers: Nested attributes that appear in a single edge. In Figure 26–1, the
following three layers appear in the column edge: Measure, Channel, and
Geography. The following two layers appear in the row edge: Year and Product.
■ Header cell: The labels that identify the data displayed in a row or column. Row
header cells appear on the row edge, and column header cells appear on the
column edge.
■ Data cell: The cells within the pivot table that contain data values, not header
information. In the sample, the first data cell contains a value of 20,000.000.
■ QDR (Qualified Data Reference): A fully qualified data reference to a row, a
column, or an individual cell. For example, in Figure 26–1, the QDR for the first
data cell in the pivot table must provide the following information:
– Year=2007
– Product=Tents
– Measure=Sales
– Channel=All Channels
– Geography=World
When you move the mouse over a layer, the layer’s pivot handle and an optional pivot
label are displayed. If you move the mouse over the pivot handle, the cursor changes
to a four-point arrow drag cursor. You can then use the handle to drag the layer to the
new location. If you move the mouse over a layer on the row edge, the pivot handle
appears above the layer, as shown in Figure 26–4.
If you move the cursor over a layer in the column edge, the pivot handle appears to
the left of the layer, as shown in Figure 26–5.
If, in Figure 26–4, you drag the pivot handle of the Time (Year) layer from the row edge
to the column edge between the Measure (Sales) layer and the Channel layer, the pivot
table will change shape as shown in Figure 26–6.
26-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Selection in Pivot Tables
At runtime, selection in a data cell highlights the cell, as shown in Figure 26–7.
Editable data cells are opened for editing by double-clicking the cell or selecting the
cell and pressing F2. Data cells selected for direct editing are displayed as shown in
Figure 26–8.
Data cells selected for dropdown list editing are displayed as shown in Figure 26–9.
For more information about enabling data cell editing, see Section 26.10, "Pivot Table
Data Cell Stamping and Editing."
26-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Updating Pivot Tables with Partial Page Rendering
a. Position the cursor in the row header on the separator between the row you
want to resize and the next row.
b. When the cursor changes to a double-sided arrow, click and drag the row
separator to the desired location.
2. If you want to resize a column, do the following:
a. Position the cursor in the column header on the separator between the column
you want to resize and the next column.
b. When the cursor changes to a double-sided arrow, click and drag the column
separator to the desired location.
3. If you want to resize a layer, do the following:
a. Position the cursor in the row or column header on the separator between the
layer you want to resize and the next layer.
b. When the cursor changes to a double-sided arrow, click and drag the layer
separator to the desired location.
26.6.3 What You May Need to Know About Resizing Rows, Columns, and Layers
When you resize rows, columns, or layers, the new sizes remain until you perform a
pivot operation. After a pivot operation, the new sizes are cleared and the pivot table
rows, columns, and layers return to their original sizes.
If you do not perform a pivot operation, then the new sizes remain for the life of the
session. However, you cannot save these sizes through MDS (Metadata Services)
customization.
When the user clicks the command button, by default all the rows and columns are
exported in an Excel format written to the file specified in the filename attribute of
the tag. Alternatively, you can configure the dvt:exportPivotTableData
component so that only the rows the user selects are exported, by setting the
exportedData attribute to selected. Example 26–4 shows the sample code for the
Export to Excel command button.
26-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Cell Content of a Pivot Table
– value: A java.lang.Object that contains the value in the data cell that
you want to format.
2. Pass the DataCellContext to a method expression for the dataFormat
attribute of the pivot table.
3. In the method expression, write code that specifies the kind of formatting you
want to apply to the data cells of the pivot table. This method expression must
return a CellFormat object.
26-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Cell Content of a Pivot Table
Example 26–5 shows sample code that produces the required custom formats for the
sales totals, but not for the stoplight formatting. The example includes the code for
method expressions for both the dataFormat attribute and the headerFormat
attribute of the dvt:pivotTable tag. If you want to include stoplight formatting in
the pivot table, you might want to include the code from Example 26–6.
Example 26–5 Sample Code to Change Style and Text Style in a Pivot Table
public CellFormat getDataFormat(DataCellContext cxt)
{
CellFormat cellFormat = new CellFormat(null, null, null);
QDR qdr = cxt.getQDR();
//Obtain a reference to the product category column.
Object productCateg = qdr.getDimMember("ProductCategory");
//Obtain a reference to the product column.
Object product = qdr.getDimMember("ProductId");
26-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Pivot Table Data Cell Stamping and Editing
}
cellFormat.setStyle(color);
}
return cellFormat;
}
<!-- This is the default data cell that will be used for all data attributes-->
<dvt:dataCell>
<af:commandImageLink text="Go"
icon="/images/go.gif"
actionListener="#{pivotTableBean.imageLinkClick}"/>
<af:outputText value="#{cellData.dataValue}" />
</dvt:dataCell>
</dvt:pivotTable>
Actions associated with the image are handled through a registered listener,
actionListener. In a bean class you specify the method to be called when the
image link is clicked, for example:
public void imageLinkClick (javax.faces.event.ActionEvent.action)
26.10.2 How to Specify Images, Icons, Links, and Read-Only Content in Header Cells
In the same way that you use stamping in data cells, you can customize the content in
header cells using the dvt:headerCell child component to place a read-only
component in each header cell. Only read-only components or noneditable
components are supported, including af:outputText, af:image, af:icon,
af:commandImageLink, and af:commandLink.
Example 26–9 shows sample code for using an af:commandImageLink as a custom
image and af:icon as a custom icon in pivot table header cells.
26-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Pivot Filter Bar with a Pivot Table
<dvt:headerCell>
<af:switcher defaultFacet="default" facetName="#{cellData.layerName}">
<f:facet name="Geography">
<af:outputText value="#{cellData.label}"
shortDesc="#{cellData.label}"/>
<af:icon name="info" shortDesc="#{cellData.indent}" />
</f:facet>
<f:facet name="Channel">
<af:outputText value="#{cellData.label}" />
<af:commandImageLink shortDesc="Sample commandImageLink"
icon="/resources/images/pivotTableCSVDemo/smily-normal.gif"
hoverIcon="/resources/images/pivotTableCSVDemo/smily-glasses.gif"
/>
<af:commandButton text="Go to Tag Guide page" immediate="true"
action="guide" />
</f:facet>
<f:facet name="Product">
<af:outputText value="#{cellData.label}" />
<af:commandButton text="Go to Tag Guide page" immediate="true"
action="guide" />
</f:facet>
You can also change the display of data in the pivot table by pivoting layers between
the row, column, or page edges. Use the pivot handle to drag the layers between the
edges as desired. Figure 26–17 shows the modified pivot table and pivot filter bar
when the Channel data layer is pivoted to the page edge.
Figure 26–17 Pivot Table and Pivot Filter Bar After Pivot
You can associate a pivot filter bar with a pivot table in any of the following ways:
■ Create a pivot table using the Data Controls Panel.
When you drag a data collection from the Data Controls Panel to create a pivot
table on your page, the Select Display Attributes page of the Create Pivot Table
wizard provides the option to create a pivot filter bar to associate with the pivot
table. You can choose to specify zero or more attributes representing data layers in
the page edge. The data model and associated properties are automatically
configured for you. For detailed information, see the "Creating Databound ADF
Pivot Tables" section in the Oracle Fusion Middleware Fusion Developer's Guide for
Oracle Application Development Framework.
■ Add a pivot filter bar to a pivot table bound to data.
26-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Using a Pivot Filter Bar with a Pivot Table
From the ADF Data Visualizations page of the Component Palette, Pivot Table
panel, you can drag a dvt:pivotFilterBar element above a dvt:pivotTable
element that has been bound to a data collection. In this instance, you must
configure the data model and associated properties in order for the pivot filter bar
to work with the pivot table.
■ Add a pivot filter bar to a pivot table not bound to data.
From ADF Data Visualizations page of the Component Palette, Pivot Table panel,
you can drag a dvt:pivotFilterBar element above a dvt:pivotTable
element that has not been bound to a data collection. In this instance, you must
configure the data model and associated properties in order for the pivot filter bar
to work with the pivot table.
26-18 Web User Interface Developer's Guide for Oracle Application Development Framework
27
27 Using ADF Geographic Map Components
This chapter describes how to use an ADF geographic map component with
databound themes to display data, and provides the options for map customization.
This chapter includes the following sections:
■ Section 27.1, "Introduction to Geographic Maps"
■ Section 27.2, "Understanding Data Requirements for Geographic Maps"
■ Section 27.3, "Customizing Map Size, Zoom Control, and Selection Area Totals"
■ Section 27.4, "Customizing Map Themes"
■ Section 27.5, "Adding a Toolbar to a Map"
For information about the data binding of ADF geographic map themes, see the
"Creating Databound ADF Geographic Maps" section in the Oracle Fusion Middleware
Fusion Developer's Guide for Oracle Application Development Framework.
■ Color: Applies to regions. For example, a color theme might identify a range of
colors to represent the population in the states of a region or the popularity of a
product in the states of a region. A map can have multiple color themes visible at
different zoom levels. For example, a color theme at zoom levels 1 to 5 might
represent the population of a state, and the county median income at zoom levels 6
to 10.
■ Point: Displays individual latitude/longitude locations in a map. For example, a
point theme might identify the locations of warehouses in a map. If you customize
the style of the point that is displayed, you might choose to use a different image
for the type of inventory (electronics, housewares, garden supplies) in a set of
warehouses to differentiate them from each other.
■ Graph: Creates any number of pie graph themes and bar graph themes. However,
only one graph theme can be visible at a given time. You select the desired theme
from the View menu of the map toolbar. Graph themes can show statistics related
to a given region such as states or counties. For example, a graph theme could
display the sales values for a number of products in a state.
Figure 27–1 Geographic Map of Southwest US with Color, Point, and Pie Graph Themes
27-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Geographic Maps
zoomed-out all the way (that is, the zoom level is set to 0). At zero, the entire map
is displayed.
You can customize the location and the initial setting of the zoom control in the
dvt:map tag. The View menu (which appears in the map toolbar just above the
sample map) lets you determine the visibility of the zoom control. By default, the
initial zoom level for a map is set to 0.
– Pan icons: Consists of icons (with arrows that point north, south, east, west,
northeast, northwest, southeast, and southwest) at the top of the zoom control.
You can use these icons to move the entire map in specific directions.
– Zoom slider: Consists of a slider with a thumb for large scale zooming and
icons for zooming a single level. You can use the plus icon to zoom in and the
minus icon to zoom out one level at a time. When the thumb is at the bottom
of the slider, the zoom level is zero.
■ Scale: Consists of two horizontal bars that display in the lower left-hand corner of
the map below the information panel and above the copyright. Figure 27–3 shows
the scale. The top bar represents miles (mi) and the bottom bar represents
kilometers (km). Labels appear above the miles bar and below the kilometers bar
in the format: [distance] [unit of measure]. The length and distance values of the
bars change as the zoom level changes and as the map is panned.
■ Information panel: Displays latitude and longitude in the lower left-hand corner
above the scale. Figure 27–3 shows the information panel. By default, the
information panel is not visible. You can display this panel from the View menu or
by clicking the Information button on the toolbar.
■ Measurement panel: Displays either distance, area, or radius depending on which
tools in the toolbar are currently in use. Text appears in the following format:
[label] [value] [unit of measure] to the right of the information panel. Figure 27–4
shows the measurement panel with a distance measurement. Area measurement
and radius measurement appear in a similar manner with the appropriate labels.
27-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Geographic Maps
27.3 Customizing Map Size, Zoom Control, and Selection Area Totals
You can customize the map size, zoom strategy, appearance of selected regions, and
the initial display of the information window and the scale bar.
27-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Map Size, Zoom Control, and Selection Area Totals
For a width that uses the entire available width of the page and a height of 400
pixels, use the following setting:
inlineStyle="width:600px;height:400px".
import java.util.Iterator;
import oracle.adf.view.faces.bi.component.geoMap.DataContent;
import oracle.adf.view.faces.bi.event.MapSelectionEvent;
public SelectionListener() {
}
m_total = 0.0;
Iterator selIterator = mapSelectionEvent.getIterator();
while (selIterator.hasNext())
{
DataContent dataContent = (DataContent) selIterator.next();
if (dataContent.getValues() != null)
{
Double allData[] = dataContent.getValues();
m_total += allData[0];
}
}
}
27-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Map Themes
27.4.5 What Happens When You Customize the Point Images in a Map
When you use the Insert Point Style Item wizard to specify a custom image
representing a range of data values for a point theme, a child
dvt:mapPointStyleItem tag is defined inside the parent dvt:mapPointTheme
tag. Example 27–2 shows the code generated on a JSF page for a map point theme that
has three custom point images that represent ranges of inventory at each warehouse
point.
The initial point style setting (ps0) applies to values that do not exceed 500. This point
style displays an image for very low inventory and provides corresponding tooltip
information.
The second point style setting (ps1) applies to values between 500 and 1000. This
point style displays an image for low inventory and provides corresponding tooltip
information.
The final point style setting (ps2) applies to values between 1000 and 1600. This point
style displays an image for high inventory and provides corresponding tooltip
information.
27-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Map Themes
Example 27–2 Map Point Theme Code with Custom Point Images
<dvt:map id="map1"
.
.
.
<dvt:mapPointTheme id="mapPointTheme1"
shortLabel="Warehouse Inventory"
value="{bindings.WarehouseStockLevelsByProduct1.geoMapModel}">
<dvt:mapPointStyleItem id="ps0" minValue="0"
maxValue="500"
imageURL="/images/low.png"
selectedImageURL="/images/lowSelected.png"
shortLabel="Very Low Inventory"/>
<dvt:mapPointStyleItem id="ps1" minValue="500"
maxValue="1000"
imageURL="/images/medium.png"
selectedImageURL="/images/mediumSelected.png"
shortLabel="Low Inventory"/>
<dvt:mapPointStyleItem id="ps2" minValue="1000"
maxValue="1600"
imageURL="/images/regularGreen.png"
selectedImageURL="/images/regularGreenSelected.png"
shortLabel="High Inventory"/>
</dvt:mapPointTheme>
</dvt:map>
27.4.7 What Happens When You Customize the Bars in a Map Bar Graph Theme
When you use the Edit Bar Graph Map Theme Binding dialog to customize the bars in
a map bar graph theme, the sequence of the bars reflect the sequence of the entries in
the Series Attribute column in the dialog. Example 27–3 shows sample XML code
generated when you customize the bars in a map bar graph.
Example 27–3 Code for Customizing the Bars in a Map Bar Graph
<dvt:map
.
.
.
<dvt:mapBarGraphTheme
.
.
.
<dvt:mapBarSeriesSet>
<dvt:mapBarSeriesItem color="#333399" id="bar1"/>
<dvt:mapBarSeriesItem color="#0000ff" id="bar2"/>
</dvt:mapBarSeriesSet>
</dvt:mapBarGraphTheme>
</dvt:map>
27-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Map Themes
There are no attributes to set for this tag. It is used to wrap the individual pie
graph item tags.
2. In the Structure window, right-click the dvt:mapPieSliceSet node and choose
Insert inside dvt:mapPieSliceSet > Pie Slice Item.
3. In the Property Inspector, enter any unique ID and color you want to use for the
first slice that appears in the graph.
To find the sequence of the slices in the graph, examine the Edit Pie Graph Map
Theme Binding dialog. The sequence of the entries in the Pie Slices Attribute
column of that dialog determines the sequence that slices appear in the graph. For
example, in Figure 27–7, the first slice in the graph represents Sales, the second
slice represents Profit, and the third slice represents Cost.
27.4.9 What Happens When You Customize the Slices in a Map Pie Graph Theme
When you use the Edit Pie Graph Map Theme Binding dialog to customize the slices
in a map pie graph theme, the sequence of the slices reflect the sequence of the entries
in the Pie Slices Attribute column of the dialog. Example 27–4 shows sample XML
code generated in a JSF page when you customize the slices in a map pie graph.
Example 27–4 Code for Customizing the Slices in a Map Pie Graph
<dvt:map
.
.
.
<dvt:mapPieGraphTheme
.
.
.
<dvt:mapPieSliceSet>
<dvt:mapPieSliceItem color="#ffffff" id="slice1"/>
<dvt:mapPieSliceItem color="#ffff00" id="slice2"/>
<dvt:mapPieSliceItem color="#ff0000" id="slice3"/>
</dvt:mapPieSliceSet>
</dvt:mapPieGraphTheme>
</dvt:map>
27-14 Web User Interface Developer's Guide for Oracle Application Development Framework
28
Using ADF Gantt Chart Components
28
This chapter describes how to use a databound ADF Gantt chart component to display
data, and provides the options for customizing Gantt charts.
This chapter includes the following sections:
■ Section 28.1, "Introduction to the ADF Gantt Chart Components"
■ Section 28.2, "Understanding Gantt Chart Tags and Facets"
■ Section 28.3, "Understanding Gantt Chart User Interactivity"
■ Section 28.4, "Understanding Data Requirements for the Gantt Chart"
■ Section 28.5, "Creating an ADF Gantt Chart"
■ Section 28.6, "Customizing Gantt Chart Legends, Toolbars, and Context Menus"
■ Section 28.7, "Working with Gantt Chart Tasks and Resources"
■ Section 28.8, "Specifying Nonworking Days, Read-Only Features, and Time Axes"
■ Section 28.9, "Printing a Gantt Chart"
■ Section 28.10, "Using Gantt Charts as a Drop Target or Drag Source"
For information about the data binding of ADF Gantt charts, see the "Creating
Databound ADF Gantt Charts" section in the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
Both Gantt chart regions are based on an ADF Faces tree table component. For more
information about ADF tree tables, including virtualization of rows, see Chapter 10,
"Using Tables and Trees".
■ Scheduling Gantt chart: A scheduling Gantt chart is used for resource scheduling.
The chart is based on manual scheduling boards and shows resources vertically,
with corresponding activities on the horizontal time axis. Examples of resources
include people, machines, or rooms. The scheduling Gantt chart uses a single line
to graph all the tasks that are assigned to a resource as shown in Figure 28–3.
28-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to the ADF Gantt Chart Components
Note: The View menu items do not require that you write application
code to make them functional. However, you must provide
application code for any items that you want to use on the other
menus.
– Toolbar buttons: The right section of the toolbar displays a set of action
buttons for working with the Gantt chart. Each Gantt chart type has a set of
default options. Figure 28–5 shows a sample toolbar for a project Gantt chart.
28-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Gantt Chart Tags and Facets
</f:facet>
<af:column headerText="Resource">
<af:outputText value="#{task.resourceName}"/>
</af:column>
<af:column headerText="Start Date">
<af:outputText value="#{task.startTime}"/>
</af:column>
<af:column headerText="End Date">
<af:outputText value="#{task.endTime}"/>
</af:column>
</dvt:projectGantt>
In addition to the nodeStamp facet, other facets are used for customizations by the
Gantt chart components. Table 28–1 shows the facets supported by Gantt chart
components.
For complete descriptions of all the Gantt chart tags, their attributes, and a list of valid
values, consult the DVT tag documentation. To access this documentation for a specific
tag in JDeveloper, select the tag in the Structure window and press F1. To access the
full ADF Data Visualization Tools tag library in JDeveloper Help, expand the Javadoc
and Tag Library References node in the online Help Table of Contents and click the
link to the tag library in the JDeveloper Tag Library Reference topic.
28-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Gantt Chart User Interactivity
When a user interaction involves a change in data, the Gantt chart processes the
change by performing validation, event handling, and update of the data model.
Validation ensures that the data submitted meets basic requirements, for example, that
a date is valid and does not fall into a nonworking time period. When validation fails,
the update of the data model is omitted, and an error message is returned.
When a Gantt chart server-side event is fired, an event with validated information
about the change is sent to the registered listener. The listener is then responsible for
updating the underlying data model. A customized event handler can be registered by
specifying a method binding expression on the dataChangeListener attribute of
the Gantt chart component.
Server-side events supported by the Gantt chart include:
■ Update of data in the table cells of the Gantt chart table region
■ Create, update, delete, move, cut, copy, paste, indent, outdent of tasks
■ Reassignment of resource by dragging the task bar from one row to another
■ Drag the task bar to another date
■ Extend the duration of a task
■ Link or unlink tasks
■ Select a row or multiple rows in the Gantt chart table region
■ Undo or redo of user actions
■ Double-click on a task bar
Users can filter the data in a Gantt chart using a dropdown list from the toolbar. You
can create a custom filter.
28.3.1.1 Scrolling and Panning the List Region or the Chart Region
The Gantt chart design lets you perform horizontal scrolling of the table and the chart
regions independently. This is especially helpful when you want to hold specific task
or resource information constant in the table region while scrolling through multiple
time periods of information in the chart region.
Users can also zoom in and out on the time scale of a Gantt chart by holding the Ctrl
key and using the mouse scroll wheel.
In project and scheduling Gantt charts, users can pan the chart area by dragging it
vertically and horizontally using the mouse. A move cursor displays when the user
clicks inside the chart area, other than on a task.
2. In the Go to Date dialog, specify the desired date by clicking the Select Date icon
and indicating the date in the calendar.
3. Click OK.
The display of the chart region of the Gantt chart begins at the date you requested.
Note: You must keep at least one column visible in the table region.
2. From the ensuing menu, select either Show As List, for an expanded list, or Show
As Hierarchy, for a collapsed list.
28-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Data Requirements for the Gantt Chart
3. Click OK.
■ Task node: Represents a collection of tasks. The task node definition has the
following types of optional accessors:
– subTask (available only for project Gantt chart)
– splitTask
■ Split task node: Represents a collection of split tasks. A split task node definition
does not have accessors.
■ Dependency node: Represents a collection of dependencies for a task. A
dependency node definition does not have accessors.
■ Recurring task node: Represents a collection of recurring tasks. A recurring task
node definition does not have accessors.
Table 28–2 shows a complete list of data object keys for the project Gantt chart.
28-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Understanding Data Requirements for the Gantt Chart
Table 28–2 (Cont.) Data Object Keys for Project Gantt Chart
Data Object Key Data Type and Description
startTime (required) Date. The starting time for all tasks.
Subtasks (node) An optional list of subtasks for all tasks.
taskId (required) String. The unique identifier for all tasks.
type Sting. The type of the tasks for all tasks.
Table 28–3 Data Object Keys for the Resource Utilization Gantt Chart
Data Object Key Data Type and Description
label String. The label associated with the task bar.
labelAlign String. The alignment of the label in the task bar. Valid values are
top (default) and inside.
resourceId (required) String. The unique identifier of a resource.
timeBuckets (required) List. The list of tasks associated with a resource.
time (required) Date. The start time of the time bucket.
values (required) Double. The values of the metrics.
28-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Gantt Chart Legends, Toolbars, and Context Menus
Table 28–4 (Cont.) Data Object Keys for Scheduling Gantt Charts
Data Object Key Data Type and Description
labelPlacement String. The alignment of the label in the task bar for all tasks.
Valid values are left (default), right, inside, inside_left,
inside_right, and inside_center.
Recurring tasks (node) A list of recurring tasks for all tasks.
resourceId (required) String. The unique identifier of a resource.
Split tasks (node) A collection of tasks without a continuous time line for all tasks.
startTime (required) Date. The start time for all tasks.
startupTime Date. The startup time before a task begins.
Tasks (node) (required) A list of tasks associated with a resource.
taskId (required) String. The unique identifier of the task for all tasks.
taskType String. The type of the task for all tasks.
workingDaysOfTheWeek Object. A list of the working days of the week.
workingEndTime Date. The work end time for the resource.
workingStartTime Date. The work start time for the resource.
You can customize the information displayed when a task or time bucket is selected by
using the keys and label attributes on the Gantt chart legend tag. The keys attribute
should specify the data object keys used to retrieve the value to display and the
labels attribute should contain the corresponding labels for the values retrieved with
the keys. If these attributes are not specified, the legend will use the entire space of the
information panel.
You can also add icons to the legend by using the iconKeys and iconLabels
attributes on the Gantt chart legend tag. Icons will be automatically resized to 12 by 12
pixels if the icon size is too large.
Example 28–2 show sample code to display information about an On Hold task in the
legend of a project Gantt chart.
Example 28–4 shows sample code for specifying a new toolbar button.
Actions initiated on the menu bar and toolbar buttons are handled through a
registered listener, DataChangeListener, on the Gantt chart component. For
example, when a user presses the delete button in the toolbar, a DataChangeEvent
with the ID of the task selected for deletion would be fired on the server. The
28-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing Gantt Chart Legends, Toolbars, and Context Menus
registered listener is then responsible for performing the actual deletion of the task,
and the Gantt chart data model is refreshed with the updated information.
You can register DataChangeListener by specifying a method binding using the
dataChangeListener attribute on the Gantt chart tag. For example, if you put the
code in a backing bean in a method called handleDataChange, then the setting for
the dataChangeListener attribute becomes:
"#{myBackingBean.handleDataChange}".
Example 28–5 shows sample code in a backing bean.
<f:facet name="tablePopupMenu">
<af:popup>
<af:commandMenuItem text="Custom" disabled="true"/>
</af:popup>
</f:facet>
</dvt:projectGantt>
You can also dynamically change the context menu at runtime. Example 28–7 shows
sample code to update a custom popup menu on a task bar based on which task is
selected in the chart region of a project Gantt chart.
For more information about using the af:popup components see Chapter 13, "Using
Popup Dialogs, Menus, and Windows".
28-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Working with Gantt Chart Tasks and Resources
For tasks that have more than one bar, such as a split or recurring task, properties are
defined for each individual bar.
Example 28–9 shows sample code to define the properties for a custom task type in the
.jspx file.
shows sample code to define a TaskbarFormat object fill and border color and
register the object with the taskbarFormatManager.
Example 28–13 show sample code for adding a double-click event to a task bar.
28-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Specifying Nonworking Days, Read-Only Features, and Time Axes
var="task"
doubleClickListener="#{projectGanttDoubleClick.handleDoubleClick}">
</dvt:projectGantt>
28-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Specifying Nonworking Days, Read-Only Features, and Time Axes
bean in a method called whatToTurnOff that returns a String array of the values,
then the setting for the featuresOff attribute becomes:
"#{BackingBean.whatToTurnOff}".
Example 28–15 Gantt Chart Time Axis Set to Months and Weeks
<f:facet name="major">
<dvt:timeAxis scale="months"/>
</f:facet>
<f:facet name="minor">
<dvt:timeAxis scale="weeks"/>
</f:facet>
The time units you specify for the major and minor axes apply only to the initial
display of the Gantt chart. At runtime, the user can zoom in or out on a time axis to
display the time unit level at a different level.
4. Also in the Property Inspector, set the Scale attribute for major and minor time
axis, and specify the ZoomOrder attribute to zoom to the custom times scales.
Example 28–17 shows sample code for setting a threeyears minor time axis and
a fiveyears major time axis.
28-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Printing a Gantt Chart
Example 28–18 Code for Setting the Time Period Option for Printing a Gantt Chart
_printer.setStartTime(startDate);
_printer.setEndTime(endDate);
Example 28–19 Sample ActionListener for Handling the Gantt Chart Print Event
public void handleAction(GanttActionEvent evt)
{
if (GanttActionEvent.PRINT == evt.getActionType())
{
FacesContext _context = FacesContext.getCurrentInstance();
ServletResponse _response = (ServletResponse)
_context.getExternalContext().getResponse();
_response.setContentType("application/pdf");
ServletOutputStream _sos = _response.getOutputStream();
// Generate FO.
GanttPrinter _printer = new GanttPrinter(m_gantt);
// Set column visibility by column index.
_printer.setColumnVisible(0, false);
// Set start and end date.
_printer.setStartTime(startDate);
_printer.setEndTime(endDate);
// Set top, bottom, left, and right margins in pixels.
_printer.setMargin(25, 16, 66, 66);
// Set height and width in pixels.
_printer.setPageSize(440, 660);
File _file = File.createTempFile("gantt", "fo");
OutputStream _out = new FileOutputStream(_file);
_printer.print(_out);
_out.close();
// generate PDF.
FOProcessor _processor = new FOProcessor();
_processor.setData(new FileInputStream(_file),"UTF-8"));
_processor.setOutputFormat(FOProcessor.FORMAT_PDF);
_processor.setOutput(_sos);
_processor.generate();
_context.responseComplete();
}
}
28-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Gantt Charts as a Drop Target or Drag Source
Example 28–20 shows sample code for adding drag and drop functionality to a
scheduling Gantt chart.
Example 28–20 Sample Code for Adding Drag and Drop Functionality
<dvt:schedulingGantt value="#{test.treeModel}"
.............
<af:schedulingDragSource actions="COPY MOVE" modelName="treeModel" />
</dvt:projectGantt>
Example 28–21 shows sample code for the listener method for handling the drop
event.
// Get the drag source, which is a row key, to identify which row has been
dragged.
RowKeySetImpl _rowKey = (RowKeySetImpl)_
transferable.getTransferData(DataFlavor.ROW_KEY_SET_FLAVOR).getData();
// Set the row key on the table model (source) to get the data.
// m_tableModel is the model for the Table (the drag source).
object _key = _rowKey.iterator().next();
m_tableModel.setRowKey(_key);
For a detailed procedure about adding drag and drop functionality for collections, see
Section 32.4, "Adding Drag and Drop Functionality for Collections".
28-26 Web User Interface Developer's Guide for Oracle Application Development Framework
29
29 Using ADF Hierarchy Viewer Components
This chapter describes how to use an ADF hierarchy viewer component to display
data, and provides the options for hierarchy view customization.
This chapter includes the following sections:
■ Section 29.1, "Introduction to Hierarchy Viewers"
■ Section 29.2, "Data Requirements for Hierarchy Viewers"
■ Section 29.3, "Managing Nodes in a Hierarchy Viewer"
■ Section 29.4, "Navigating in a Hierarchy Viewer"
■ Section 29.5, "Adding Interactivity to a Hierarchy Viewer Component"
■ Section 29.6, "Using Panel Cards"
■ Section 29.7, "Customizing the Appearance of a Hierarchy Viewer"
■ Section 29.8, "Adding Search to a Hierarchy Viewer"
For information about the data binding of ADF hierarchy viewers, see the "Creating
Databound Hierarchy Viewers" section in the Oracle Fusion Middleware Fusion
Developer's Guide for Oracle Application Development Framework.
A node is a shape that references the data in a hierarchy, for example, employees in
an organization or computers in a network. You configure the child elements of
the dvt:node element to reference whatever data you want to display. The
dvt:node element supports the use of one or more f:facet elements that
display content at different zoom levels (100%, 75%, 50%, and 25%). The f:facet
element supports the use of many ADF Faces components, such as
af:outputText, af:image, and af:panelGroupLayout, in addition to the
ADF Data Visualization dvt:panelCard component.
At runtime, the node contains controls that allow users to navigate between nodes
and to show or hide other nodes by default. For information about specifying
node content and defining zoom levels, see Section 29.3.1, "How to Specify Node
Content."
■ dvt:link
You set values for the attributes of the dvt:link element to connect one node
with another node. For information about how to customize the appearance of the
link and add labels, see Section 29.7.4, "How to Configure the Display of Links and
Labels."
■ dvt:panelCard
The panel card element provides a method to dynamically switch between
multiple sets of content referenced by a node element using animation by, for
example, horizontally sliding the content or flipping a node over.
The f:facet tag for each zoom level supports the use of a dvt:panelCard
element that contains one or more af:showDetailItem elements defining the
content to be displayed at the specified zoom level. At runtime, the end user uses
the controls on the node to dynamically switch between the content that the
af:showDetailItem elements reference. For more information, see Section 29.6,
"Using Panel Cards."
29-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Hierarchy Viewers
id="pgl4">
<af:image id="i1"/>
</af:panelGroupLayout>
<af:spacer width="5" height="5" id="s2"/>
<af:panelGroupLayout layout="vertical" id="pgl1">
<af:outputText value=" attribute value1 "
inlineStyle="font-weight:bold;font-size:20px;color:#383A47"
id="ot5"/>
<af:outputText value=" attribute value2"
inlineStyle="font-size:20px;color:#383A47"
id="ot9"/>
<af:outputText value=" attribute value3"
inlineStyle="font-size:11px;font-style:italic;color:#383A47"
id="ot2"/>
</af:panelGroupLayout>
</af:panelGroupLayout>
<af:spacer height="5" id="s1"/>
<af:separator id="s4"/>
<af:spacer height="5" id="s3"/>
<dvt:panelCard effect="slide_horz"
inlineStyle="border-width:1px;border-color:#CCCCCC;
font-size:16px;font-weight:bold;color:#5a6a7a"
id="pc1">
<af:showDetailItem text="first group title "
inlineStyle="font-weight:bold;font-size:16px;color:#5a6a7a"
id="sdi1">
<af:panelFormLayout inlineStyle="width:100%;height:100%;padding:5px"
id="pfl1">
<af:panelLabelAndMessage label="attribute label4"
labelStyle="font-size:14px;color:#5A6A7A" id="plam2">
<af:outputText value="attribute value4"
inlineStyle="font-size:14px;color:#383A47" id="ot3">
</af:panelLabelAndMessage>
<af:panelLabelAndMessage label="attribute label5"
labelStyle="font-size:14px;color:#5A6A7A" id="plam6">
<af:outputText value="attribute value5"
inlineStyle="font-size:14px;color:#383A47" id="ot8">
</af:panelLabelAndMessage>
<af:panelLabelAndMessage label="attribute label6"
labelStyle="font-size:14px;color:#5A6A7A" id="plam5">
<af:outputText value="attribute value6"
inlineStyle="font-size:14px;color:#383A47" id="ot6">
</af:panelLabelAndMessage>
</af:panelFormLayout>
</af:showDetailItem>
<af:showDetailItem text="second group title "
inlineStyle="font-weight:bold;
font-size:16px;color:#5a6a7a" id=sd12">
<af:panelFormLayout inlineStyle="width:100%;height:100%;padding:5px"
id="pfl2">
<af:panelLabelAndMessage label="attribute label7"
labelStyle="font-size:14px;color:#5A6A7A" id="plam3">
<af:outputText value="attribute value7"
inlineStyle="font-size:14px;color:#383A47" id="ot7"/>
</af:panelLabelAndMessage>
<af:panelLabelAndMessage label="attribute label8"
labelStyle="font-size:14px;color:#5A6A7A"id="plam4">
<af:outputText value="attribute value8"
inlineStyle="font-size:14px;color:#383A47" id="ot1"/>
</af:panelLabelAndMessage>
Figure 29–1 Hierarchy Viewer Component with Control Panel and Nodes
The Control Panel provides controls so that a user can manipulate the position and
appearance of a hierarchy viewer component at runtime. By default, it appears in a
hidden state in the upper left-hand corner of the hierarchy viewer component, as
illustrated by Figure 29–2.
29-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Hierarchy Viewers
You cannot configure the Control Panel to appear in another location. Users click the
Hide or Show Control Panel button shown in Figure 29–2 to hide or expand the
Control Panel. Figure 29–3 shows the expanded Control Panel.
You can configure the hierarchy viewer component so that the Control Panel does not
appear to the user at runtime. For information about the procedure, see Section 29.7.3,
"How to Configure the Display of the Control Panel."
Table 29–1 describes the functionality that the controls in the Control Panel provide to
users. The Panel Selector is automatically enabled if a node in your hierarchy viewer
component contains a dvt:panelCard element with one or more
af:showDetailItem elements. The Layout Selector appears automatically if the
hierarchy viewer component uses one of the following layouts:
■ Vertical top down
■ Horizontal left to right
■ Tree
■ Radial
■ Circle
For more information about layouts for a hierarchy viewer component, see
Section 29.1.3, "Available Hierarchy Viewer Layout Options."
Panel Selector Displays a list of node panels that you have defined.
Users can use the panel selector to show the same panel
on all nodes at once.
Layout Selector Allows a choice of layouts. Users can change the layout
of the hierarchy viewer component from the layout you
defined to one of the layout options presented by the
component. For more information, see Section 29.1.3,
"Available Hierarchy Viewer Layout Options."
29-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Hierarchy Viewers
■ circle - Circle, root node in center and all leaf nodes arranged in concentric
circle, with parent nodes arranged within the circle
Figure 29–4 shows an example of a circle layout for a hierarchy viewer component.
You can define the initial layout of the hierarchy viewer when you insert the
component on the page from either the Data Controls panel to bind a data collection to
the hierarchy viewer component, or from the Component Palette to insert the
component and bind to data later. The available layouts are displayed in the Hierarchy
Viewer Types area of the Component Gallery, shown in Figure 29–5.
In the Quick Start Layouts area of the Component Gallery you can also choose to
generate the dvt:panelCard element to support multiple sets of content for a node,
the selection shown in Figure 29–5.
29-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Managing Nodes in a Hierarchy Viewer
29-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Managing Nodes in a Hierarchy Viewer
■ af:commandButton
■ af:commandImageLink
■ af:commandLink
■ af:commandMenuItem
■ af:goButton
■ af:goLink
■ af:image
For information about how to use the af:image component, see Section 29.7.2,
"How to Include Images in a Hierarchy Viewer."
■ af:menu
■ af:outputFormatted
■ af:outputText
■ af:panelFormLayout
■ af:panelGroupLayout
For information about how to use the panelGroupLayout component, see
Section 8.12.1, "How to Use the panelGroupLayout Component."
■ af:panelLabelAndMessage
■ af:separator
■ af:showDetailItem
■ af:showPopupBehavior
For information about how to use the af:showPopupBehavior component, see
Section 29.5.2, "How to Configure a Hierarchy Viewer to Invoke a Popup
Window."
■ af:spacer
■ dvt:panelCard
For more information about how to use the dvt:panelCard component, see
Section 29.6, "Using Panel Cards."
The hierarchy viewer component renders in a Flash Player only. For this reason,
certain properties of ADF Faces components that you specify as node content may not
be supported and the component will not render as you expect.
For more information, see Section 29.3.3, "How to Specify a Node Definition for an
Accessor."
3. For information about configuring the properties in the Style section of the
Property Inspector for the node component, see Section 20.4, "Changing the Style
Properties of a Component."
The hover window is automatically displayed when the user moves the mouse over
the node, reflecting the shape attribute set for the node. A node with the shape
attribute roundedRect, for example, will have a hover window with the same
attribute, as shown in Figure 29–8.
29-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Managing Nodes in a Hierarchy Viewer
29.3.4 How to Associate a Node Definition with a Particular Set of Data Rows
You can use a node component’s rendered property to associate the node with a
particular set of data rows or with a single data row. The rendered property accepts a
boolean value so you can write an EL expression that evaluates to true or false to
determine what data rows you associate with a node definition. For example, assume
that you want a node to display data based on job title. You write an EL expression for
the node component’s rendered property similar to the following pseudo EL
expression that evaluates to true when a job title matches the value you specify (in
this example, CEO):
rendered="#{node.title == 'CEO'}"
When you use the node component’s rendered property in this way, you do not
define a value for the node component’s type property.
2. In the Property Inspector, expand the Behavior section of the Property Inspector
and write a value for the hierarchy viewer component’s navigateUpListener
property that specifies a method to update the data model so that it references the
new anchor node when the user navigates up to a new anchor node.
3. Click OK.
29-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Navigating in a Hierarchy Viewer
29-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Interactivity to a Hierarchy Viewer Component
<af:panelFormLayout>
</af:panelFormLayout>
</af:dialog>
</af:popup>
For more information about using the af:showPopupBehavior tag, see Section 13.3,
"Invoking Popup Elements."
Example 29–4 shows sample code for creating the context menu
</af:menu>
</af:popup>
For more information about using the af:menu component, see Chapter 13, "Using
Popup Dialogs, Menus, and Windows."
29-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Using Panel Cards
29-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Customizing the Appearance of a Hierarchy Viewer
the source attribute bound to the URL of the desired image. The following code
example renders an image.
<af:panelGroupLayout>
<af:image source="/person_id=#{node.PersonId}"
inlineStyle="width:64px;height:90px;"/>
</af:panelGroupLayout>
You can customize the appearance of links and labels by setting properties of the
dvt:link element in a hierarchy viewer. Figure 29–14 illustrates links with a
dashDot value set for the linkStype attribute.
4. Optionally, also in the Property Inspector, use the rendered property to stamp
the link for a particular relationship between nodes. The property accepts a
boolean value so you can write an EL expression that evaluates to true or false
to determine if the link represents the relationship. For example, assume that you
want a link to display based on reporting relationship. You write an EL expression
for the link component’s rendered property similar to the following EL
29-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Search to a Hierarchy Viewer
expression that evaluates to true when the relationship matches the value you
specify (in this example, CONSULTANT):
rendered="#{node.relationship == "CEO"}
Each stamped row references the current row using the var attribute of the
dvt:searchResults tag.
29-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Search to a Hierarchy Viewer
Example 29–5 shows sample code for configuring search in a hierarchy viewer.
29.8.2 What You May Need to Know About Configuring Search in a Hierarchy Viewer
Search in a hierarchy viewer is based on the searchable attributes or columns of the
data collection that is the basis of the hierarchy viewer data model. Using a query
results collection defined in data controls in Oracle ADF, JDeveloper makes this a
declarative task. For more information, see the "How to Create a Databound Search in
a Hierarchy Viewer" section in the Oracle Fusion Middleware Fusion Developer's Guide for
Oracle Application Development Framework.
29-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Part V
Part V Advanced Topics
This chapter describes how to create custom ADF Faces rich client components.
This chapter includes the following sections:
■ Section 30.1, "Introduction to Custom ADF Faces Components"
■ Section 30.2, "Setting Up the Workspace and Starter Files"
■ Section 30.3, "Client-Side Development"
■ Section 30.4, "Server-Side Development"
■ Section 30.5, "Deploying a Component Library"
■ Section 30.6, "Adding the Custom Component to an Application"
ADF Faces components are derived from the Apache MyFaces Trinidad component
library. Because of this, many of the classes you extend when creating a custom ADF
Faces component are actually MyFaces Trinidad classes. For more information about
the history of ADF Faces, including its evolution, see Chapter 1, "Introduction to ADF
Faces Rich Client."
Between the JSP and the JSF components is the Application class. The tag library
uses a factory method on the application object to instantiate a concrete component
instance using the mnemonic referred to as the componentType.
A component can render its own markup but this is not considered to be a best
practice. The preferred approach is to define a render kit that focuses on a strategy for
rendering the presentation. The component uses a factory method on the render kit to
get the renderer associated with the particular component. If the component is
consumed in an application that uses Facelets, then a component handler creates the
component.
In addition to functionality, any custom component you create must use an ADF Faces
skin to be able to be displayed properly with other ADF Faces components. To use a
skin, you must create and register the skinning keys and properties for your
component. This chapter describes only how to create and register skins for custom
components. For more information about how skins are used and created in general,
see Chapter 20, "Customizing the Appearance Using Styles and Skins."
30-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Custom ADF Faces Components
30-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Custom ADF Faces Components
Table 30–1 (Cont.) Client-Side and Server-Side Artifacts for a Custom Component
Client Server
Composite Resource Loader:
com.<component_
package>.faces.resource.<Loader_
name>ResourceLoader.java
Extends:
org.myfaces.trinidad.resource.
RegxResourceLoader.java
JavaScript Resource Loader:
com.<component_
package>.faces.resource.<Script_Loader_
name>ResourceLoader.java
Extends:
org.myfaces.trinidad.resource.
AggregateingResourceLoader.java
Resource Bundle:
com.<component_
package>.faces.resource.<Bundle_
name>Bundle.java
Extends:
java.util.ListResouceBundle.java
The tagPane component receives a collection of tags in a Java Map collection. The key
of the map is the tag name. The value is a weight assigned to the tag. In the File
Explorer application, the weight is the number of times the tag occurs and in most
cases, the number of files associated with the tag. The tag name is displayed in the
body text of a link and the font size used to display the name represents the weight.
Each tag’s font size will be proportionally calculated within the minimum and
maximum font sizes based upon the upper and lower weights assigned to all tags in
the set of files. To perform these functions, the tagPane custom component must have
both client-side and server-side behaviors.
On the server side, the component displays the map of tags by rendering HTML
hyperlinks. The basic markup rendering is performed on the server. A custom event
on the component is defined to handle the user clicking a link, and then to display the
associated files. These server-side behaviors are defined using a value expression and
a method expression.
For example, the tagPane component includes:
■ A tag property for setting a Map<String, Number> collection of tags.
■ A tagSelectionListener method-binding event that is invoked on the server
when the user clicks the link for the tag.
■ An orderBy property for displaying the sequence of tags from left to right in the
order of descending by weight or alternatively displaying the tag links ascending
alphabetically.
To allow each tag to be displayed in a font size that is proportional to its weight
(occurrences), the font size is controlled using an inline style. However, each tag and
the component’s root markup node also uses a style class.
Example 30–1 shows how the tagPane component might be used in a JSF page.
30-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Custom ADF Faces Components
orderBy="alpha"
partialTriggers="tagCountLabel"/>
Because the tagPane component must be used with other ADF Faces components, it
must use the same skins. Therefore, any styling is achieved through the use of
cascading style sheets (CSS) and corresponding skin selectors. For example, the
tagPane component needs skin selectors to specify the root element, and to define the
style for the container of the links and the way the hyperlinks are displayed.
Example 30–2 shows a sample set of style selectors in the CSS file for the tagPane
component.
Example 30–2 CSS Style Selectors for the Sample Custom Component
acme|tagPane - root element
acme|tagPane::content - container for the links
acme|tagPane::tag - tag hyperlink
You may need to specify the HTML code required for the custom component on the
server side.
Example 30–3 shows HTML server-side code used for the tagPane component.
On the client side, the component requires a JavaScript component counterpart and a
component peer that defines client-side behavior. All DOM interaction goes through
the peer (for more information, see Chapter 3, "Using ADF Faces Architecture"). The
component peer listens for the user clicking over the hyperlinks that surround the tag
names. When the links are clicked, the peer raises a custom event on the client side,
which propagates the event to the server side for further processing.
Table 30–2 lists the client-side and server-side artifacts for the tagPane component.
Referencing the naming conventions in Table 30–1, the component_package is
com.adfdemo.acme and the prefix is Acme.
Table 30–2 Client-Side and Server-Side Artifacts for the tagPane Custom Component
Client Server
Component: Component
com.adfdemo.acme.js.component. com.adfdemo.acme.faces.component.TagPane.
java
AcmeTagPane.js
Extends:
Extends:
org.apache.myfaces.trinidad.component.
oracle.adf.view.js.component.
UIXObject.java
AdfUIObject.js
Event: Event:
com.adfdemo.acme.js.event. com.adfdemo.acme.faces.event.
AcmeTagSelectEvent.js TagSelectEvent.java
Extends: Extends:
oracle.adf.view.js.component. javax.faces.event.FacesEvent.java
AdfComponentEvent.js
Event Listener:
com.adfdemo.acme.faces.event.
SelectListener
Extends:
com.faces.event.FacesListener
Component Peer:
com.adfdemo.acme.js.component.
AcmeTagPanePeer.js
Extends:
oracle.adf.view.js.laf.rich.
AdfRichUIPeer.js
Component Renderer:
com.adfdemo.acme.faces.render.
TagPaneRenderer.java
Extends:
oracle.adf.view.rich.render.RichRenderer.
java
Component JSP Tag:
oracle.adfdemo.acme.faces.taglib.
TagPaneTag.java
Extends:
javax.faces.webapp.UIComponentELTag.java
30-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Setting Up the Workspace and Starter Files
Table 30–2 (Cont.) Client-Side and Server-Side Artifacts for the tagPane Custom Component
Client Server
Composite Resource Loader:
oracle.adfdemo.acme.faces.resource.
AcmeResourceLoader.java
Extends:
org.myfaces.trinidad.resource.
RegxResourceLoader.java
JavaScript Resource Loader:
oracle.adfdemo.acme.faces.resource.
ScriptsResourceLoader.java
Extends:
org.myfaces.trinidad.resource.
AggregateingResourceLoader.java
Resource Bundle:
oracle.adfdemo.acme.faces.resource.
AcmeSimpleDesktopBundle.java
Extends:
java.util.ListResouceBundle.java
30-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Setting Up the Workspace and Starter Files
c. In the Create Deployment Profile dialog, enter a name for the Deployment
Profile name. For example, the tagPane component might use
adf-richclient-demo-acme.
d. In the Edit JAR Deployment Profile Properties dialog, click OK.
3. In the Project Properties dialog, add library dependencies.
a. Select Libraries and Classpath in the left pane.
b. Click Add Library.
c. In the Add Library dialog, select ADF Faces Runtime 11, Facelets Runtime (if
using Facelets), JSF 1.2, and JSP Runtime, and click OK.
d. Click OK to close the Project Properties dialog.
4. Register XML schemas.
The custom component requires several XML configuration files. You can use
JDeveloper to register the XML schemas associated with these configuration files.
You must add schemas for three configuration files: faces-config.xml,
trinidad-skins.xml, and trinidad-config.xml. By preregistering these
schemas, you can create a template XML configuration file without having to
know the specifics about the markup structure. The names and locations of the
schemas are assumed by the base installation of JDeveloper.
a. Select Tools > Preferences. In the Preferences dialog, select XML Schemas in
the left pane, and click Add.
b. In the Add Schema dialog, click Browse to navigate to the XML schemas
included in your JDeveloper build, as shown in Table 30–3.
Note: In the Add Schema dialog, make sure Extension is set to .xml.
If you change it to XSD, when you later create XML files, you will not
be able to use the XML schema you have created.
2. In the New Gallery, expand General, select XML, and then Select XML Document
from XML Schema, and click OK.
3. In the Create XML from XML Schema dialog:
■ XML File: Enter faces-config.xml.
■ Directory: Append \src\META-INF to the end of the directory entry.
■ Select Use Registered Schemas and click Next.
4. Enter the following:
■ Target Namespace: Select http://java.sun.com/xml/ns/javaee.
■ Root Element: Select faces-config.
Leave the defaults for the other fields, and click Finish.
The new file will automatically open in the XML editor.
5. Add the following schema information after the first line in the file:
<?xml version="1.0" encoding="US-ASCII"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee">
30-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Setting Up the Workspace and Starter Files
2. In the New Gallery, expand General, select File and click OK.
3. In the Create File dialog:
■ Enter a file name, for example, acme-simple-desktop.css.
■ Append \src\META-INF\component_prefix\styles to the end of the
Directory entry, where component_prefix is the prefix that will be used in
the component library. For example, for the tagPane component, acme is the
prefix, therefore, the string to append would be \META-INF\acme\styles.
2. In the New Gallery, expand General and then File, and click OK.
3. In the Create File dialog:
■ Enter component_prefix.resources for File Name, where component_
prefix will be the prefix used in the component library. For example, for the
tagPane component, acme is the prefix, therefore, the string to enter is
acme.resources.
■ Append \src\META-INF\sevlets\resources\ to the end of the
Directory entry.
■ Short Name: A name. For example, for the tagPane component, you would
enter acme.
■ Tag Library URI: A URI for the tag library. For example, for the tagPane
component, you would enter http://oracle.adfdemo.acme.
6. Click Next and optionally enter additional tag library information, then click
Finish.
30-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Client-Side Development
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
<namespace>http://xmlns.oracle.adfdemo/acme</namespace>
<tag>
<tag-name>tagPane</tag-name>
<handler-class>
oracle.adfinternal.view.faces.facelets.rich.RichComponentHandler
</handler-class>
</tag>
</facelet-taglib>
6. Replace the namespace and tag-name code shown in bold with code appropriate
for your application.
Client components hold state for properties that are not defined within the
corresponding DOM element. These properties are bound to an associated DOM
element using the clientId. The clientId uniquely defines a server-side
component within the component tree representing a page. The DOM element holds
the clientId within the Id attribute.
Note: Place each JavaScript object in its own separate source file for
best practice and consistency.
Developing the client-side component requires creating a JavaScript file for the
component, the peer, and the component event.
In addition to the client component, client-side events must be defined. The tagPane
component’s client-side event is fired and propagated to the server when the user
clicks one of the three file types. The client event passed to the server is queued so that
the target server-side component can take the appropriate action.
Finally, the custom component requires a client peer. The peer is the component
presenter. Peers act as the links between a client component and an associated DOM
element. Client peers add client behaviors. A peer must be bound to a component
through a registration method.
As with the client component, the associated peer is bound to a DOM element using
the component's clientId. There are two types of peers, statefull and stateless.
■ Some complex client components require the peer to hold state and thereby need
to use a statefull peer. This type of peer is always bound to a DOM element.
Statefull peers are less common than stateless peers.
■ Stateless peers do not hold state and one peer can be bound to multiple
components. Stateless peers are the best performance option because they reduce
the client footprint. This type of peer performs lazy content delivery to the
component.
Peers add behavior to the component by dynamically registering and listening for
DOM events. Conceptually, a peer’s function is similar to the role of a managed bean.
However, the client component is not bound to the peer using EL like the server-side
component is bound to a view model (#{backingbean.callback}). The peer
registers client component events in the InitSubclass
(AdfRichUIPeer.addComponentEventHandlers("click")) callback method.
The callback is assumed by using a naming convention of
(<Peer>.prototype.HandleComponent<Event>). The peer manages DOM event
callbacks where the server-side component handles the linking using EL bindings to
managed beans. For more information about client-side architecture, including peers,
see Section 3.1, "Introduction to Using ADF Faces Architecture."
The following section assumes you have already set up a custom component
development template environment. This development environment includes the
setting up of application workspace, projects, deployment profiles, and registering
schemas. If you have not done so, see Section 30.2, "Setting Up the Workspace and
Starter Files."
30-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Client-Side Development
"AcmeTagPane",
{
componentType:"oracle.adfdemo.acme.TagPane",superclass:AdfUIObject
}
);
■ Directory: Enter the directory path of the event in a subdirectory under the
src directory. For example, for the tagPane component, you might enter
adf-richclient-demo-acme\src\oracle\adfdemo\acme\js\event.
5. Open the JavaScript File in the editor and add the event code. Example 30–6 shows
the event code that might be added for the tagPane component.
/**
* Fires a select type event to the server for the source component
* when a tag is clicked.
*/
function AcmeTagSelectEvent(source, tag)
{
AdfAssert.assertPrototype(source, AdfUIComponent);
AdfAssert.assertString(tag); this.Init(source, tag);
}
// make AcmeTagSelectEvent a subclass of AdfComponentEvent
AdfObject.createSubclass(AcmeTagSelectEvent, AdfComponentEvent);
/**
* The event type
*/
AcmeTagSelectEvent.SELECT_EVENT_TYPE = "tagSelect";
/**
* Event Object constructor
*/
AcmeTagSelectEvent.prototype.Init = function(source, tag)
{
AdfAssert.assertPrototype(source, AdfUIComponent);
AdfAssert.assertString(tag);
this._tag = tag;
AcmeTagSelectEvent.superclass.Init.call(this, source, AcmeTagSelectEvent.SELECT_
EVENT_TYPE);}
/**
* Indicates this event should be sent to the server
*/
AcmeTagSelectEvent.prototype.propagatesToServer = function()
{
return true;
}
/**
* Override of AddMarshalledProperties to add parameters * sent server side.
*/
AcmeTagSelectEvent.prototype.AddMarshalledProperties = function( properties)
{
properties.tag = this._tag;
}
/**
* Convenient method for queue a AcmeTagSelectEvent.
*/
AcmeTagSelectEvent.queue = function(component, tag)
{
AdfAssert.assertPrototype(component, AdfUIComponent);
AdfAssert.assertString(tag);
AdfLogger.LOGGER.logMessage(AdfLogger.FINEST,
"AcmeTagSelectEvent.queue(component, tag)");
new AcmeTagSelectEvent(component, tag).queue(true);
}
/**
* returns the selected file type
*/
AcmeTagSelectEvent.prototype.getTag = function()
{
return this._tag;}
/**
* returns a debug string
*/
AcmeTagSelectEvent.prototype.toDebugString = function()
{
var superString = AcmeTagSelectEvent.superclass.toDebugString.call(this);
return superString.substring(0, superString.length - 1)
+ ", tag="
+ this._tag + "]";
}
/*
*
* Make sure that this event only invokes immediate validators
* on the client.
*/
AcmeTagSelectEvent.prototype.isImmediate = function()
{
return true;
}
30-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Client-Side Development
■ Directory: Enter the directory path of the event in a subdirectory under the
src directory. For example, for the tagPane component, you might enter
adf-richclient-demo-acme\src\oracle\adfdemo\acme\js\compon
ent.
5. Open the JavaScript file in the editor and add code for the peer. In this code, you
must create the peer, add event handling with respect to the DOM, and register the
peer with the component. Example 30–7 shows the code that might be added for
the tagPane component.
AcmeTagPanePeer.prototype.HandleComponentClick = function(componentEvent)
{
AdfLogger.LOGGER.logMessage(AdfLogger.FINEST,
"AcmeTagPanePeer.HandleComponentClick(componentEvent)");
// if the left mouse button was pressed
if (componentEvent.isLeftButtonPressed())
{
// find component for the peer
var component = this.getComponent();
AdfAssert.assertPrototype(component, AcmeTagPane);
// find the native dom element for the click event
var target = componentEvent.getNativeEventTarget();
if (target && target.tagName == "A")
{
AdfLogger.LOGGER.logMessage(AdfLogger.FINEST, "File type element (A)
found: " + componentEvent.toString());
var tag = target.firstChild.nodeValue;
AdfAssert.assertString(tag);
30-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
■ Component: This class holds the properties that define behavior for the
component.
■ Resource bundle: This class holds text strings for the component.
■ Renderer: This class determines how the component will be displayed in the
client.
■ Resource loader: This class is required only if your component contains images
needed for skinning.
After you have created the classes, add the component class and the renderer class to
the faces-config.xml file. Then, complete the configuration files started in
Section 30.2, "Setting Up the Workspace and Starter Files."
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesListener;
30-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
/**
* <p>Returns <code>true</code> if the <code>facesListener</code> is a
* {@link TagSelectListener}.</p>
*
* @param facesListener listener to be evaluated
* @return <code>true</code>
* if <code>facesListener</code> instancof {@link TagSelectListener}
*/
public boolean isAppropriateListener(FacesListener facesListener)
{
return (facesListener instanceof TagSelectListener);
}
/**
* <p>Delegates to the <code>processTagSelect</code>
* method of a <code>FacesListener</code>
* implementing the {@link TagSelectListener} interface.
*
* @param facesListener target listener realizing {@link TagSelectListener}
*/
public void processListener(FacesListener facesListener)
{
((TagSelectListener) facesListener).processTagSelect(this);
}
/**
* @return the tag that was selected triggering this event
*/
public String getTag()
{
return tag;
}
}
For example, the tagPane component has the properties shown in Table 30–4.
ADF Faces and MyFaces Trinidad component libraries are defined differently from
other libraries. A JSF component has a collection called attributes that provides
access to component properties (using the Java simple beans specification) through a
MAP interface. The collection also holds value pairs that do not correspond to a
component's properties. This concept is called attribute transparency. The JSF runtimes
(both MyFaces Trinidad and the JSF reference implementation) implement this concept
using the Java reflection API.
My Faces Trinidad defines its own internal collection, which does not use the Java
reflection API. This difference means that it is more efficient than the base
implementation. The solution in MyFaces Trinidad collects more metadata about the
component properties. This metadata declares state properties, which allows the base
class to fully implement the StateHolder interface in a base class.
30-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
Note: Do not have your custom component extend from any ADF
Faces implementation packages. These implementations are private
and might change.
6. For each property, define a static PropertyKey that is used to access the
properties state. Use the TYPE reference to register a new attribute. Specify the
property type using the class reference. The component data type should
correspond to the component property. There is another overload of the
registerKey method that allows you to specify state information. The default
8. You may need to override any methods to perform specific functions in the
component. For example, to allow your component to participate in partial page
rendering (PPR), you must override the getBeanType method, as shown in
Example 30–13.
Example 30–13
/**
* <p>Exposes the <code>FacesBean.Type</code> for this class through a protected
* method. This method is called but the <code>UIComponentBase</code> superclass
* to setup the components <code>ValueMap</code> which is the container for the
* <code>attributes</code> collection.</p>
*
* @return <code>TagPane.TYPE</code> static property
*/
@Override
protected FacesBean.Type getBeanType()
30-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
{
return TYPE;
}
Refer to the ADF Faces JavaDoc for more information about the class your
component extends, and the methods you may need to override.
For the tagPane component, the component must act on the event fired from the
client component. A reference to the source component is passed as a parameter to
the event’s constructor.
For the tagPane component, the broadcast method checks if the event passed
in using the formal parameter is a TagSelectEvent. If it is, the broadcast
method invokes the method expression held by the tagSelectListener
attribute.
Most events have an immediate boolean property that specifies the lifecycle
phase in which the event should be invoked. If the immediate attribute is true,
the event is processed in the Apply Values phase; otherwise, the event is processed
in the Invoke Application phase. For more information, see Chapter 4, "Using the
JSF Lifecycle with ADF Faces."
Example 30–14 shows the overwritten broadcast method for the tagPane
component.
2. Click the Overview tab and click the Components navigation tab.
3. Click the Add icon and enter the type and class for the component.
4. Optionally, add any attributes, properties, or facets.
Example 30–15 shows the tagPane component defined within a faces-config.xml
file.
<component>
<component-type>oracle.adfdemo.acme.TagPane</component-type>
<component-class>oracle.adfdemo.acme.faces.component.TagPane
</component-class>
</component>
Tip: You can also use a properties file for your resources.
30-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
5. Add any keys and define the text as needed. For more information about creating
resource bundles for skins, see Section 20.3.1, "How to Apply Skins to Text."
Example 30–16 shows the resource bundle code for the tagPane component.
6. To register the resource bundle for the simple desktop skin and any other desired
skins, double-click the /META-INF/trinidad-skins.xml file to open it and do the
following:
a. In the Structure window, select skin-addition.
b. In the Property Inspector, enter a skin ID. For the simple skin ID, enter
simple.desktop.
c. In the Structure window, right-click skin-addition and choose Insert inside
skin-addition > bundle-name.
d. In the Property Inspector, enter the fully qualified name of the resource bundle
just created.
Example 30–17 shows the code for registering the tagPane resource bundle with
the simple skin (you will add the style-sheet-name element value in a later
step).
30-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
Tip: The most granular level that JSF allows for defining a render kit
is at the view root.
In JSF 1.2, the target for Java EE 5 (Servlet 2.5, JSP 2.1), most of the JSP problems were
fixed. The JSF/JSP component acts as a component factory that is responsible only for
creating components. This means that the rendering response phase is divided into
two steps. First the component tree is created, and then the tree is rendered, instead of
rendering the components as the component tree was being built. This functionality
was made possible by insisting that the entire view be represented by JSF components.
The non-JSF/JSP generates markup that implicitly becomes a JSF verbatim component.
As a result of changing these mechanics, in JSF 1.2, custom JSP tags extend the
javax.faces.webapp.UIComponentELTag class. The encodeBegin,
encodeChildren, and encodeEnd methods in the JSP tag have been deprecated.
These methods once made corresponding calls to the component. Because the view
root in JSF 1.2 does the rendering, all the work can be done in the doStartTag and
doEndTag methods. MyFaces Trinidad has its own version of this base class that you
will use. The org.apache.myfaces.Trinidad.webapp.UIComponentELTag
hooks into the components property bag and makes coding JSPs simpler.
The tag class includes the creation of the component’s properties. You must choose tag
properties carefully. There are some properties that you can ignore for tag
implementation, but they may be required as TLD attributes.
The following three attributes are implemented by superclasses and shared by many
components through Java inheritance:
■ id
■ binding
■ rendered
Do not implement the id attribute because the id attribute is implemented by the
superclass javax.faces.webapp.UIComponentTagBase. The superclass
javax.faces.webapp.UIComponentELTag implements the other two attributes,
binding and rendered. Therefore, you do not need to add these to your tag class.
30-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
6. To declaratively generate the accessor methods for the attributes, right-click the
file in the source editor and choose Generate Accessors.
7. In the Generate Accessors dialog, click Select All, set the Scope to public and
click OK.
8. Add the render type and component type to the class. The component type will be
used by the superclass to instantiate the component using the application's factory
method, createComponent(componentType).
Example 30–20 shows the code for the TagPaneTag class, where both the
component type and render type are oracle.adfdemo.acme.TagPane.
Example 30–20 Component Type and Render Type for the TagPaneTag Class
public String getComponentType()
{
return COMPONENT_TYPE;
}
public String getRendererType()
{
return RENDERER_TYPE;
}
/**
* <p>This component's type, <code>oracle.adfdemo.acme.TagPane</code></p>
*/
static public final String COMPONENT_TYPE =
"oracle.adfdemo.acme.TagPane";
/**
* <p>Logical name given to the registered renderer for this component.</p>
*/
static public final String RENDERER_TYPE = "oracle.adfdemo.acme.TagPane";
9. Override the setProperties method from the superclass that has a single
formal parameter of type FacesBean. This is a MyFaces Trinidad version on the
base UIComponentELTag, but it is passed the components state holder instead of
the component reference. The job of the setProperties method is to push the
JSP tag attribute values to the component.
Example 30–21 shows the overridden method for the tagPaneTag class.
setStringArrayProperty(facesBean, TagPane.PARTIAL_TRIGGERS_KEY,
_partialTriggers);
setProperty(facesBean, TagPane.VISIBLE_KEY, _visible);
setProperty(facesBean, TagPane.INLINE_STYLE_KEY, _inlineStyle);
setProperty(facesBean, TagPane.STYLE_CLASS_KEY, _styleClass);
setProperty(facesBean, TagPane.TAGS_KEY, _tags);
setProperty(facesBean, TagPane.ORDER_BY_KEY, _orderBy);
facesBean.setProperty(TagPane.TAG_SELECT_LISTENER_KEY,
_tagSelectListener);
30-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
<deferred-value/>
</attribute>
<attribute>
<name>orderBy</name>
<deferred-value/>
</attribute>
</tag>
</taglib>
30-36 Web User Interface Developer's Guide for Oracle Application Development Framework
Server-Side Development
public AcmeResourceLoader()
{
// any resource in "/acme/" with the following suffixes will be
// loaded from the base folder of "META-INF".
// The servlet pattern match "/acme/*" should exist under "META-INF".
// For example URL : context-root/acme/images/type1.gif
// map to: META-INF/acme/images/type1.gif
register("(/.*\\.(jpg|gif|png|jpeg))",
new ClassLoaderResourceLoader("META-INF"));
your custom resource bundle, you register it with the skin. Coupling resource bundles
with your CSS provides a method to make your components support multiple locales.
The /META-INF/trinidad-skins.xml file you created is used to register your CSS
file and your resource bundle with an ADF Faces skin.
For more information about creating CSS for components to be used by skins, see
Section 20.3, "Defining Skin Style Properties."
4. Create any needed resource bundle for your component.
5. To register your CSS with an ADF Faces skin, open the
/META-INF/trinidad-skins.xml file.
6. In the Structure window, select the skin-addition element, and in the Property
Inspector, do the following:
■ skin-id: Enter the ADF Faces skin to which you want to add the custom
component selectors. You must register the selectors at least to the
simple.desktop skin in order for them to be compatible with ADF Faces
components.
30-38 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding the Custom Component to an Application
</bundle-name>
</skin-addition>
</skins>
8. Add an image folder for the images used for the custom component. This folder
should be under the META-INF directory. Place any images used by the custom
component into this folder.
For tagPane, the image folder is /META-INF/acme/images.
Note: Some file types, such as .css and .js are not included by
default. You will need to add these.
2. In the overview editor, select the Servlets navigation tab, and click the Add icon to
add a new servlet.
3. In the Servlets table, do the following:
■ Name: Enter resources.
■ Servlet Class: Enter
org.apache.myfaces.trinidad.webapp.ResourceServlet.
4. Below the table, click the Servlet Mappings tab, then click the Add icon.
5. Enter a URI prefix. Resources beginning with this prefix will be handled by the
servlet. For example, for the tagPane component, you might enter the prefix
/acme/*.
6. To disable compression of the style sheet:
a. Select Application.
b. Click the Add icon for Context Initialization Parameters.
c. For Name, enter org.apache.myfaces.trinidad.DISABLE_CONTENT_
COMPRESSION and for Value enter true.
30-40 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding the Custom Component to an Application
■ Name: org.apache.myfaces.trinidad.resource.DEBUG
■ Value: true
This setting prevents MyFaces Trinidad from setting the cache headers for
resources like JavaScript. It prevents the browser from caching resources.
5. Add the following parameter to set the debug level for client side JavaScript.
■ Name: oracle.adf.view.rich.LOGGER_LEVEL
■ Value: ALL
The valid values are OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER,
FINEST and ALL. The default is OFF.
6. Add the following parameter to turn on client-side script assertions:
■ Name: oracle.adf.view.rich.ASSERT_ENABLED
■ Value: true
This setting works together with logging. Toggling this switch to on will make
debug information available to the browser. The assertions and logging are
displayed differently, depending on the browser. For Internet Explorer, a child
browser window will appear beside the active window. For FireFox with the Fire
Bug plugin, the debug information will be available through the Fire Bug console.
3. Use the Component Palette to add the component to the page. Use the Property
Inspector to set any attributes.
30.6.4 What You May Need to Know About Using the tagPane Custom Component
If you wish to create the tagPane component as described in this chapter, and use it
in an application, you will need to use backing beans to bind the custom component to
the application components.
Example 30–26 shows the backing bean code that is used to bind the tagPane
component to the File Explorer application.
Example 30–26 Backing Bean Logic for the tagPane Custom Component
public Map<String, Number> getTags()
{
if (_tags == null)
{
_tags = new TreeMap<String, Number>();
List<FileItem> nameToFileItems = feBean.getDataFactory().getFileItemList();
_doDeepTagCollection(_tags, nameToFileItems);
}
return _tags;
}
public void onTagSelect(TagSelectEvent event)
{
_selectedTag = event.getTag();
CriteriaFileItemFilter criteria = new CriteriaFileItemFilter(_selectedTag);
List<FileItem> nameToFileItems = _feBean.getDataFactory().getFileItemList();
if (_selectedTagFileItemList == null) {
_selectedTagFileItemList = new ArrayList<FileItem>();
else {
_selectedTagFileItemList.clear();
}
_doDeepTagSearch(criteria, _selectedTagFileItemList, nameToFileItems);
_selectedTagResultsTableModel = new SortableModel(_selectedTagFileItemList);
30-42 Web User Interface Developer's Guide for Oracle Application Development Framework
31
31 Allowing User Customization on JSF Pages
This chapter describes how changes to certain UI components that the user makes at
runtime can persist for the duration of the session.
Alternatively, you can configure your application so that changes persist in a
permanent data repository. Doing so means that the changes remain whenever the
user reenters the application. To allow this permanent persistence, you need to use the
Oracle Metadata Service (MDS), which is part of the full Fusion technology stack.
Using MDS and the full Fusion stack also provides the following additional
persistence functionality:
■ Persisting additional attribute values
■ Persisting search criteria
■ Persisting the results of drag and drop gestures in the UI
■ Reordering components on a page at runtime
■ Adding and removing components and facets from the page at runtime
For information and procedures for using Oracle MDS, see the "Allowing User
Customizations at Runtime" chapter of the Oracle Fusion Middleware Fusion Developer's
Guide for Oracle Application Development Framework.
This chapter includes the following sections:
■ Section 31.1, "Introduction to User Customization"
■ Section 31.2, "Implementing Session Change Persistence"
31-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to User Customization
31.2.2 What Happens When You Configure Your Application to Use Change Persistence
When you elect to save changes to the session, JDeveloper adds the CHANGE_
PERSISTENCE context parameter to the web.xml file, and sets the value to session.
This context parameter registers the ChangeManager class that will be used to handle
persistence. Example 31–1 shows the context parameter in the web.xml file.
31-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Implementing Session Change Persistence
31.2.4 What You May Need to Know About Using Change Persistence on Templates
and Regions
When you use session persistence, changes are recorded and restored on components
against the viewId for the given session. As a result, when the change is applied on a
component that belongs to a fragment or page template, it is applicable only in scope
of the page that uses the fragment or template. It does not span all pages that consume
the fragment or template.
For example, say your project has the pageOne.jspx and pageTwo.jspx JSF pages,
and they both contain the fragment defined in the region.jsff page fragment,
which in turn contains a showDetail component. When the pageOne.jspx JSF
page is rendered and the disclosed attribute on the showDetail component
changes, the implicit attribute change is recorded and will be applied only for the
pageOne.jspx page. If the user navigates to the pageTwo.jspx page, no attribute
change is applied.
31-6 Web User Interface Developer's Guide for Oracle Application Development Framework
32
Adding Drag and Drop Functionality
32
This chapter describes how to add drag and drop functionality to your pages, which
allows users to drag the values of attributes or objects from one component to another,
or allows users to drag and drop components.
This chapter includes the following sections:
■ Section 32.1, "Introduction to Drag and Drop Functionality"
■ Section 32.2, "Adding Drag and Drop Functionality for Attributes"
■ Section 32.3, "Adding Drag and Drop Functionality for Objects"
■ Section 32.4, "Adding Drag and Drop Functionality for Collections"
■ Section 32.5, "Adding Drag and Drop Functionality for Components"
■ Section 32.6, "Adding Drag and Drop Functionality Into and Out of a
panelDashboard Component"
■ Section 32.7, "Adding Drag and Drop Functionality to a Calendar"
■ Section 32.8, "Adding Drag and Drop Functionality for DVT Graphs"
■ Section 32.9, "Adding Drag and Drop Functionality for DVT Gantt Charts"
In this scenario, you are actually dragging an object from one collection (Folder0) and
dropping it into another collection (Folder3). This is one of the many supported drag
and drop scenarios. ADF Faces supports the following scenarios:
■ Dragging an attribute value from one component instance and copying it to
another. For example, a user might be able to drag an outputText component
onto an inputText component, which would result in the value of the text
attribute of the outputText component becoming the value of the text attribute
on the inputText component.
■ Dragging the value of one object and dropping it so that it becomes the value of
another object. For example, a user might be able to drag an outputText
component onto another outputText component, which would result in an array
of String objects populating the text attribute of the second outputText
component.
■ Dragging an object from one collection and dropping it into another, as shown in
Figure 32–1.
■ Dragging a component from one place on a page to another. For example, a user
might be able to drag an existing panelBox component to a new place within a
panelGrid component.
■ Dragging an activity in a calendar from one start time or date to another.
■ Dragging a component into or out of a panelDashboard component.
■ Dragging a marker in a DVT scatter or bubble graph to change its value.
■ Dragging an object from a DVT Gantt chart to another component.
When users click on a source and begin to drag, the browser displays the element
being dragged as a ghost element attached to the mouse pointer. Once the ghost
element hovers over a valid target, the target component shows some feedback (for
example, it becomes highlighted). If the user drags the ghost element over an invalid
target, the cursor changes to indicate that the target is not valid.
When dragging attribute values, the user can only copy the value to the target. For all
other drag and drop scenarios, on the drop, the element can be copied (copy and
paste), moved (cut and paste), or linked (copy and paste as a link, for example,
copying text and pasting the text as an actual URL).
The component that will be dragged and that contains the value is called the source.
The component that will accept the drop is called the target. You use a specific tag as a
child to the source and target components that tells the framework to allow the drop.
Table 32–1 shows the different drag and drop scenarios, the valid source(s) and
target(s), and the associated tags to be used for that scenario.
32-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Introduction to Drag and Drop Functionality
You can restrict the type of the object that can be dropped on a target by adding a
dataFlavor tag. This helps when the target can accept only one object type, but the
source may be one of a number of different types. The dataFlavor tag also allows
you to set multiple types so that the target can accept objects from more than one
source or from a source that may contain more than one type. Both the target and the
source must contain the dataFlavor tag, and the values must be the same in order
for the drop to be successful.
Note: The target and source attribute values must both be the same
data type.
The following procedure assumes you have your target and source components
already on the JSF page.
32-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for Objects
use a dataFlavor tag to ensure that only an array object will be accepted on the
target.
You can also define a discriminant value for the dataFlavor tag. This is helpful if
you have two targets and two sources, all with the same object type. By creating a
discriminant value, you can be sure that each target will accept only valid sources. For
example, suppose you have two targets that both accept an EMPLOYEE object,
TargetA and TargetB. Suppose you also have two sources, both of which are
EMPLOYEE objects. By setting a discriminant value on TargetA with a value of
alpha, only the EMPLOYEE source that provides the discriminant value of alpha
will be accepted.
You also must implement a listener for the drop event. The object of the drop event is
called the transferable, which contains the payload of the drop. Your listener must
access the transferable object, and from there, use the DataFlavor object to
verify that the object can be dropped. You then use the drop event to get the target
component and update the property with the dropped object. More details about this
listener are covered in the procedure in Section 32.9.1, "How to Add Drag and Drop
Functionality for a DVT Component".
32.3.1 How to Add Drag and Drop Functionality for a Single Object
To add drag and drop functionality, first add tags to a component that define it as a
target for a drag and drop action. Then implement the event handler method that will
handle the logic for the drag and drop action. Last, you define the sources for the drag
and drop.
This procedure assumes the source and target components already exist on the page.
Tip: You can also intercept the drop on the client by populating the
clientDropListener attribute. For more information, see
Section 32.3.3, "What You May Need to Know About Using the
ClientDropListener".
3. In the Insert Data Flavor dialog, enter the class for the object that can be dropped
onto the target, for example java.lang.Object. This selection will be used to
create a dataFlavor tag, which determines the type of object that can be dropped
onto the target, for example a String or a Date. Multiple dataFlavor tags are
allowed under a single drop target to allow the drop target to accept any of those
types.
4. In the Structure window, select the dropTarget tag. In the Property inspector,
select a value for the actions attribute. This defines what actions are supported
by the drop target. Valid values can be COPY (copy and paste), MOVE (cut and
paste), and LINK (copy and paste as a link), for example:.
MOVE COPY
5. In the managed bean referenced in the EL expression created in Step 2, create the
event handler method (using the same name as in the EL expression) that will
handle the drag and drop functionality.
This method must take a DropEvent event as a parameter and returns a
DnDAction object, which is the action that will be performed when the source is
dropped. Valid return values are DnDAction.COPY, DnDAction.MOVE, and
DnDAction.LINK, and were set when you defined the target attribute in Step 5.
This method should check the DropEvent event to determine whether or not it
will accept the drop. If the method accepts the drop, it should perform the drop
and return the DnDAction object it performed. Otherwise, it should return
DnDAction.NONE to indicate that the drop was rejected.
The method must also check for the presence for each dataFlavor object in
preference order.
Tip: If your target has more than one defined dataFlavor object,
then you can use the
Transferable.getSuitableTransferData() method, which
returns a List of TransferData objects available in the
Transferable object in order, from highest suitability to lowest.
The DataFlavor object defines the type of data being dropped, for example
java.lang.Object, and must be as defined in the DataFlavor tag on the JSP,
as created in Step 3.
Example 32–2 shows a private method that the event handler method calls (the
event handler itself does nothing but call this method; it is needed because this
method also needs a String parameter that will become the value of the
32-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for Objects
if (drinks != null)
{
UIComponent dropComponent = dropEvent.getDropComponent();
// Update the specified property of the drop component with the Object[] dropped
dropComponent.getAttributes().put("value", Arrays.toString(drinks));
return DnDAction.COPY;
}
else
{
return DnDAction.NONE;
}
}
■ CTRL: COPY
■ CTRL+SHIFT: LINK
When a user executes the drag and drop operation, the drop target first determines
that it can accept the drag source’s data flavor value. Next, if the source and target are
collections, the framework intersects the actions allowed between the drag source and
drop target and executes the action (one of COPY, MOVE, or LINK) in that order from
the intersection. When there is only one valid action, that action is executed. When
there is more than one possible action and the user's keyboard modifier matches that
choice, then that is the one that is executed. If either no keyboard modifier is used, or
the keyboard modifier used does not match an allowed action, then the framework
chooses COPY, MOVE, LINK in that order, from the set of allowed actions.
For example, suppose you have a drop target that supports COPY and MOVE. First
the drop target determines that drag source is a valid data flavor. Next, it determines
which action to perform when the user performs the drop. In this example, the set is
COPY and MOVE. If the user holds down the SHIFT key while dragging (the
keyboard modifier for MOVE), the framework would choose the MOVE action. If the
user is doing anything other than holding down the SHIFT key when dragging, the
action will be COPY because COPY is the default when no modifier key is chosen (it is
first in the order). If the user is pressing the CTRL key, that modifier matches COPY, so
COPY would be performed. If the user was pressing the CTRL+SHIFT keys, the action
would still be COPY because that modifier matches the LINK action which is not in
the intersected set of allowed actions.
32.3.3 What You May Need to Know About Using the ClientDropListener
The dropTarget tag contains the clientDropListner attribute where you can
reference JavaScript that will handle the drop event on the client. The client handler
should not take any parameters and returns an AdfDnDContext action. For example,
if the method returns AdfDnDContext.ACTION_NONE the drop operation will be
canceled and no server call will be made; if the method returns
AdfDnDContext.ACTION_COPY, a copy operation will be allowed and a server call
will be made which will execute the dropListener method if it exists.
For example, suppose you want to log a message when the drop event is invoked. You
might create a client handler to handle logging that message and then returning the
correct action so that the server listener is invoked. Example 32–4 shows a client
handler that uses the logger to print a message.
32-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for Collections
Figure 32–3 Drag and Drop Functionality in the File Explorer Application
As with dragging and dropping single objects, you can have a drop on a collection
cause a copy, move, or copy and paste as a link (or a combination of the three), and use
dataFlavor tags to limit what a target will accept.
When the target source is a collection and it supports the move operation, you may
also want to also implement a method for the dragDropEndListener attribute,
which is referenced from the source component and is used to clean up the collection
after the drag and drop operation. For more information, see Section 32.4.2, "What You
May Need to Know About the dragDropEndListener".
2. In the Insert Collection Drop Target dialog, enter an expression for the
dropListener attribute that evaluates to a method on a managed bean that will
handle the event (you will create this code in Step 4).
3. In the Property Inspector, set the following:
■ actions: Select the actions that can be performed on the source during the
drag and drop operation.
If no actions are specified, the default is COPY.
■ modelName: Define the model for the collection.
The value of the modelName attribute is a String object used to identify the
drag source for compatibility purposes. The value of this attribute must match
the value of the discriminant attribute of the dragSource tag you will use
in a Step 6. In other words, this is an arbitrary name and works when the
target and the source share the same modelName value or discriminant value.
4. In the managed bean inserted into the EL expression in Step 2, implement the
handler for the drop event.
This method must take a DropEvent event as a parameter and return a
DnDAction. This method should use the DropEvent to get the Transferable
object and from there get the RowKeySet (the rows that were selected for the
drag). Using the CollectionModel obtained through the Transferable object,
the actual rowData can be obtained to complete the drop. The method should
then check the DropEvent to determine whether it will accept the drop or not. If
the method accepts the drop, it should perform the drop and return the
DnDAction it performed -- DnDAction.COPY, DnDAction.MOVE or
DnDAction.LINK, otherwise it should return DnDAction.NONE to indicate that
the drop was rejected.
Example 32–5 shows the event handler method on the CollectionDnd.java
managed bean used in the collectionDropTarget demo that handles the copy
of the row between two tables.
// The data in the transferable is the row key for the dragged component.
DataFlavor<RowKeySet> rowKeySetFlavor =
DataFlavor.getDataFlavor(RowKeySet.class, "DnDDemoModel");
RowKeySet rowKeySet = transferable.getData(rowKeySetFlavor);
if (rowKeySet != null)
{
// Get the model for the dragged component.
CollectionModel dragModel = transferable.getData(CollectionModel.class);
if (dragModel != null)
{
// Set the row key for this model using the row key from the transferable.
Object currKey = rowKeySet.iterator().next();
dragModel.setRowKey(currKey);
// And now get the actual data from the dragged model.
// Note this won't work in a region.
DnDDemoData dnDDemoData = (DnDDemoData)dragModel.getRowData();
32-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for Components
5. In the Component Palette, from the Operations panel, drag and drop a Drag
Source as a child to the source component.
6. With the dragSource tag selected, in the Property Inspector set the allowed
Actions and any needed discriminant, as configured for the target.
// The data in the transferrable is the row key for the dragged component.
DataFlavor<RowKeySet> rowKeySetFlavor =
DataFlavor.getDataFlavor(RowKeySet.class, "DnDDemoModel");
RowKeySet rowKeySet = transferable.getData(rowKeySetFlavor);
if (rowKeySet != null)
{
Integer currKey = (Integer)rowKeySet.iterator().next();
AdfFacesContext.getCurrentInstance().addPartialTarget(dropEvent.getDragComponent()
);
shows the darker panelBox component being moved from being the first child
component of the panelGrid component to the last.
32-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for Components
4. In the managed bean referenced in the EL expression created in Step 2 for the
dropListener attribute, create the event handler method (using the same name
as in the EL expression) that will handle the drag and drop functionality.
This method must take a DropEvent event as a parameter and return a
DnDAction, which is the action that will be performed when the source is
dropped. Valid return values are DnDAction.COPY, DnDAction.MOVE, and
DnDAction.LINK, and were set when you defined the target attribute in Step 2.
This handler method should use the DropEvent event to get the transferable
object and its data and then complete the move or copy, and reorder the
components as needed. Once the method completes the drop, it should return the
DnDAction it performed. Otherwise, it should return DnDAction.NONE to
indicate that the drop was rejected.
Example 32–7 shows the handleComponentMove event handler on the
DemoDropHandler.java managed bean used by the componentDragSource
JSF page in the demo application.
Example 32–7 Event Handler Code for a dropListener That Handles a Component Move
public DnDAction handleComponentMove(DropEvent dropEvent)
{
Transferable dropTransferable = dropEvent.getTransferable();
UIComponent movedComponent = dropTransferable.getData
(DataFlavor.UICOMPONENT_FLAVOR);
if ((movedComponent != null) &&
DnDAction.MOVE.equals(dropEvent.getProposedAction()))
{
UIComponent dropComponent = dropEvent.getDropComponent();
UIComponent dropParent = dropComponent.getParent();
UIComponent movedParent = movedComponent.getParent();
UIComponent rootParent;
ComponentChange change;
// Build the new list of IDs, placing the moved component after the dropped
//component.
String movedLayoutId = movedParent.getId();
String dropLayoutId = dropComponent.getId();
if (!currId.equals(movedLayoutId))
{
reorderedIdList.add(currId);
if (currId.equals(dropLayoutId))
{
reorderedIdList.add(movedLayoutId);
}
}
}
// change.changeComponent(rootParent);
return DnDAction.MOVE;
}
else
{
return DnDAction.NONE;
}
}
32.6.1 How to Add Drag and Drop Functionality Into a panelDashboard Component
Because the panelDashboard component has built-in drag and drop functionality
used to reorder panelBox components within the dashboard, you cannot use a
dropTarget tag, but you do need to use a dataFlavor tag with a discriminant and
implement the dropListener. In that implementation, you need to handle the
reorder of the components.
32-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality Into and Out of a panelDashboard Component
// Move the already rendered child and redraw the side bar since the insert indexes have
// changed and because the side bar minimized states are out of date:
_moveDashboardChild(insertIndex, panelKey);
// Let the dashboard know that only the one child should be encoded during the render phase:
_dashboard.prepareOptimizedEncodingOfInsertedChild(
FacesContext.getCurrentInstance(),
insertIndex);
}
}
if (!currId.equals(movedId))
{
reorderedIdList.add(currId);
}
index++;
}
}
if (!added)
{
// Added to the very end:
reorderedIdList.add(movedId);
}
// Add the side bar as a partial target since we need to redraw the state of the side bar items
32-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality Into and Out of a panelDashboard Component
// since their insert indexes are changed and possibly because the side bar minimized states
// are out of date:
RequestContext rc = RequestContext.getCurrentInstance();
rc.addPartialTarget(_sideBarContainer);
}
7. In the Component Palette, from the Operations panel, drag a Component Drag
Source and drop it as a child to the panelBox component that will be the source
component.
8. In the Property Inspector, set Discriminant to be the same value as entered for the
Discriminant on the panelDashboard in Step 5.
32.6.2 How to Add Drag and Drop Functionality Out of a panelDashboard Component
Implementing drag and drop functionality out of a panelDashboard component is
similar to standard drag and drop functionality for other components, except that you
must use a dataFlavor tag with a discriminant.
Example 32–9 Event Handler Code for a dropListener That Handles a panelBox Move Out of a panelDash-
board Component
public DnDAction handleSideBarDrop(DropEvent e)
{
UIComponent movedComponent = e.getTransferable().getData(DataFlavor.UICOMPONENT_FLAVOR);
UIComponent movedParent = movedComponent.getParent();
// Ensure that the drag source is one of the items from the dashboard:
if (movedParent.equals(_dashboard))
{
_minimize(movedComponent);
}
// If the dashboard is showing, let's perform an optimized render so the whole dashboard
doesn't
// have to be re-encoded.
// If the dashboard is hidden (because the panelBox is maximized), we will not do an optimized
// encode since we need to draw the whole thing.
if (_maximizedPanelKey == null)
{
int deleteIndex = 0;
List<UIComponent> children = _dashboard.getChildren();
for (UIComponent child : children)
{
if (child.equals(panelBoxToMinimize))
{
_dashboard.prepareOptimizedEncodingOfDeletedChild(
FacesContext.getCurrentInstance(),
deleteIndex);
break;
}
if (child.isRendered())
{
// Only count rendered children since that's all that the panelDashboard can see:
deleteIndex++;
}
}
}
RequestContext rc = RequestContext.getCurrentInstance();
if (_maximizedPanelKey != null)
{
// Exit maximized mode:
_maximizedPanelKey = null;
_switcher.setFacetName("restored");
rc.addPartialTarget(_switcher);
}
// Redraw the side bar so that we can update the colors of the opened items:
rc.addPartialTarget(_sideBarContainer);
}
6. In the Component Palette, from the Operations panel, drag and drop a
Component Drag Source as a child of the source panelBox component within
the panelDashboard component.
7. In the Property Inspector, set Discriminant to be the same value as entered for the
Discriminant on the dataFlavor tag for the target component in Step 4.
32-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality to a Calendar
object. Multiple dataFlavor tags are allowed under a single drop target to allow
the drop target to accept any of those types.
6. In the Insert Data Flavor dialog, enter the class for the object that can be dropped
onto the target, for example java.lang.Object.
32.7.2 What You May Need to Know About Dragging and Dropping in a Calendar
For dragging and dropping activities within a calendar, users can drag and drop only
within a view. That is, users can drag an activity from one time slot to another in the
day view, but cannot cut an activity from a day view and paste it into a month view.
When the user is dragging and dropping activities in the day or week view, the
calendar marks the drop site by half-hour increments. The user cannot move any
all-day or multi-day activities in the day view.
In the week view, users can move all-day and multi-day activities, however, they can
be dropped only within other all-day slots. That is, the user cannot change an all-day
activity to an activity with start and end times. In the month view, users can move
all-day and multi-day activities to any other day.
32-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for DVT Gantt Charts
verify that the object can be dropped. You then use the drop event to get the target
component and update the property with the dropped object.
32.8.1 How to Add Drag and Drop Functionality for a DVT Graph
To add drag and drop functionality, first add source and target tags to the graph. Then
implement the event handler method that will handle the logic for the drag and drop
action. For information about what happens at runtime, see Section 32.3.2, "What
Happens at Runtime."
32.9 Adding Drag and Drop Functionality for DVT Gantt Charts
When you want users to be able to drag and drop between Gantt charts and other
components, you use the dragSource and dropTarget tags. Additionally, you use
the DataFlavor object to determine the valid Java types of sources for the drop
target. You also must implement any required functionality in response to the drag
and drop action. Both the projectGantt and schedulingGantt components
support drag and drop functionality.
For example, suppose you have an projectGantt component and you want the user
to be able to drag one timeline to a treeTable component and have that component
display information about the timeline, as shown in Figure 32–6.
The projectGantt component contains a dragSource tag. And because the user
will drag the whole object and not just the String value of the output text that is
displayed, you use the dropTarget tag instead of the attributeDropTarget tag.
You also use a dataFlavor tag to determine the type of object being dropped. On this
tag, you can define a discriminant value. This is helpful if you have two targets and
two sources, all with the same object type. By creating a discriminant value, you can be
sure that each target will accept only valid sources. For example, suppose you have
two targets that both accept an TaskDragInfo object, TargetA and TargetB. Suppose
you also have two sources, both of which are TaskDragInfo objects. By setting a
discriminant value on TargetA with a value of alpha, only the TaskDragInfo source
that provides the discriminant value of alpha will be accepted.
You also must implement a listener for the drop event. The object of the drop event is
called the transferable, which contains the payload of the drop. Your listener must
access the transferable object, and from there, use the DataFlavor object to
verify that the object can be dropped. You then use the drop event to get the target
component and update the property with the dropped object.
32-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for DVT Gantt Charts
32.9.1 How to Add Drag and Drop Functionality for a DVT Component
To add drag and drop functionality, first add tags to a component that define it as a
target for a drag and drop action. Then implement the event handler method that will
handle the logic for the drag and drop action. Last, you define the sources for the drag
and drop. For information about what happens at runtime, see Section 32.3.2, "What
Happens at Runtime." For information about using the clientDropListener
attribute, see Section 32.3.3, "What You May Need to Know About Using the
ClientDropListener."
Tip: You can also intercept the drop on the client by populating the
clientDropListener attribute. For more information, see
Section 32.3.3, "What You May Need to Know About Using the
ClientDropListener".
3. In the Insert Data Flavor dialog, enter the class for the object that can be dropped
onto the target, for example java.lang.Object. This selection will be used to
create a dataFlavor tag, which determines the type of object that can be dropped
onto the target. Multiple dataFlavor tags are allowed under a single drop target
to allow the drop target to accept any of those types.
</af:column>
<af:column headerText="Start Date">
<af:outputText value="#{task.startTime}"/>
</af:column>
<af:column headerText="End Date">
<af:outputText value="#{task.endTime}"/>
</af:column>
<af:dropTarget actions="COPY"
dropListener="#{projectGanttDragSource.onTableDrop}">
<af:dataFlavor flavorClass=
"oracle.adf.view.faces.bi.component.gantt.TaskDragInfo"/>
</af:dropTarget>
</af:treeTable>
6. In the managed bean referenced in the EL expression created in Step 2, create the
event handler method (using the same name as in the EL expression) that will
handle the drag and drop functionality.
This method must take a DropEvent event as a parameter and return a
DnDAction object, which is the action that will be performed when the source is
dropped. Valid return values are DnDAction.COPY, DnDAction.MOVE, and
DnDAction.LINK, and were set when you defined the target attribute in Step 5.
This method should check the DropEvent event to determine whether or not it
will accept the drop. If the method accepts the drop, it should perform the drop
and return the DnDAction object it performed. Otherwise, it should return
DnDAction.NONE to indicate that the drop was rejected.
The method must also check for the presence for each dataFlavor object in
preference order.
Tip: If your target has more than one defined dataFlavor object,
then you can use the
Transferable.getSuitableTransferData() method, which
returns a List of TransferData objects available in the
Transferable object in order, from highest suitability to lowest.
The DataFlavor object defines the type of data being dropped, for example
java.lang.Object, and must be as defined in the DataFlavor tag on the JSP,
as created in Step 3.
Example 32–11 shows a handler method that copies a TaskDragInfo object from
the event payload and assigns it to the component that initiated the event.
32-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Adding Drag and Drop Functionality for DVT Gantt Charts
{
// retrieve the information about the task dragged
DataFlavor<TaskDragInfo> _flv = DataFlavor.getDataFlavor(TaskDragInfo.class, null);
Transferable _transferable = evt.getTransferable();
7. In the Component Palette, from the Operations panel, drag and drop a Drag
Source as a child to the source component.
8. With the dragSource tag selected, in the Property Inspector set the allowed
Actions and any needed discriminant, as configured for the target.
32-26 Web User Interface Developer's Guide for Oracle Application Development Framework
33
Using Different Output Modes
33
This chapter describes how you can have your pages display in modes suitable for
printing and emailing.
This chapter includes the following sections:
■ Section 33.1, "Introduction to Using Different Output Modes"
■ Section 33.2, "Displaying a Page for Print"
■ Section 33.3, "Creating Emailable Pages"
the component that is the parent to the printableBehavior tag, until it reaches a
panelSplitter or a panelAccordion or the root of the tree (whichever comes
first). The tree is rendered from there. Additionally, certain components that are not
needed in print version (such as buttons, tabs, and scrollbars) are omitted.
For example, in the File Explorer application, you could place a commandButton
component inside the toolbar of the panelCollection component that contains the
table, as shown in Figure 33–1.
When the user clicks the button, the page is displayed in a new browser window (or
tab, depending on the browser) in a simplified form, as shown in Figure 33–2.
Only the contents of the table are displayed for printing. All extraneous components,
such as the tabs, the toolbar, and the scroll bars, are not rendered.
When the button is clicked, the action event is canceled. Instead, a request is made to
the server for the printable version of the page.
33-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Emailable Pages
2. In the Component Palette, from the Operations panel, drag a Show Printable Page
Behavior and drop it as a child to the command component.
■ table
■ column
■ goLink (renders as text)
For example, say you have a page that displays a purchase order, as shown in
Figure 33–3.
When the user clicks the Emailable Page link at the top, an actionListener method
or another service appends
org.apache.myfaces.trinidad.agent.email=true to the current URL and
emails the page. Figure 33–4 shows the page as it appears in an email client.
33-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Creating Emailable Pages
3. Right-click the page and choose Run to run the page in the default browser.
4. Once the page displays in the browser, click the goButton you added to the page.
This will again display the page in the browser, but converted to a page that can
be handled by an email client.
5. In your browser, view the source of the page. For example, in Mozilla Firefox, you
would select View > Page Source. Select the entire source and copy it.
6. Create a new message in your email client. Paste the page source into the message
and send it to yourself.
Tip: Because you are pasting HTML code, you will probably need to
use an insert command to insert the HTML into the email body. For
example, in Thunderbird, you would choose Insert > HTML.
7. If needed, create a skin specifically for the email version of the page using an
agent. Example 33–1 shows how you might specify the border on a table rendered
in email.
@agent email {
af|table
{border:none}
}
af|table::column-resize-indicator {
border-right: 2px dashed #979991;
}
For more information about creating skins, see Chapter 20, "Customizing the
Appearance Using Styles and Skins."
33.3.3 What Happens at Runtime: How ADF Faces Converts JSF Pages to Emailable
Pages
When the ADF Faces framework receives the request parameter
org.apache.myfaces.trinidad.agent.email=true in the Render Response
phase, the associated phase listener sets an internal flag that notifies the framework to
do the following:
■ Remove any JavaScript from the HTML.
■ Add all CSS to the page, but only for components included on the page.
■ Remove the CSS link from the HTML.
■ Convert all relative links to absolute links.
■ Render images with absolute URLs.
33-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Part VI
Part VI Appendixes
This appendix describes how to configure JSF and ADF Faces features in various XML
configuration files, as well as how to retrieve ADF Faces configuration values using
the RequestContext API and how to use JavaScript partitioning.
This chapter includes the following sections:
■ Section A.1, "Introduction to Configuring ADF Faces"
■ Section A.2, "Configuration in web.xml"
■ Section A.3, "Configuration in faces-config.xml"
■ Section A.4, "Configuration in adf-config.xml"
■ Section A.5, "Configuration in adf-settings.xml"
■ Section A.6, "Configuration in trinidad-config.xml"
■ Section A.7, "Configuration in trinidad-skins.xml"
■ Section A.8, "Using the RequestContext EL Implicit Object"
■ Section A.9, "Using JavaScript Library Partitioning"
For more information about the required elements, see Section A.2.2, "What You May
Need to Know About Required Elements in web.xml."
For information about optional configuration elements in web.xml related to
ADF Faces, see Section A.2.3, "What You May Need to Know About ADF Faces
Context Parameters in web.xml."
For information about configuring web.xml outside of ADF Faces, see Developing Web
Applications, Servlets, and JSPs for Oracle.
A-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in web.xml
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>35</session-timeout>
</session-config>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
</web-app>
Note: When you use ADF data controls to build databound web
pages, the ADF binding filter and a servlet context parameter for the
application binding container are added to the web.xml file.
Configuration options for ADF Faces are set in the web.xml file using
<context-param> elements.
A.2.2 What You May Need to Know About Required Elements in web.xml
The required, application-wide configuration elements for JSF and ADF Faces in the
web.xml file are:
■ Context parameter javax.faces.STATE_SAVING_METHOD: Specifies where to
store the application’s view state. By default this value is server, which stores the
application's view state on the server. It is recommended that you set
javax.faces.STATE_SAVING_METHOD to client when you use ADF Faces, to
store the view state on the browser client. When set to client, ADF Faces then
automatically uses token-based, client-side state saving. You can specify the
number of tokens to use instead of using the default number of 15. For more
information about state-saving context parameters, see Section A.2.3, "What You
May Need to Know About ADF Faces Context Parameters in web.xml."
■ MyFaces Trinidad filter and mapping: Installs the MyFaces Trinidad filter
org.apache.myfaces.trinidad.webapp.TrinidadFilter, which is a
servlet filter that ensures ADF Faces is properly initialized, in part by establishing
a RequestContext object. TrinidadFilter also processes file uploads. The
filter mapping maps the JSF servlet’s symbolic name to the MyFaces Trinidad
filter. The forward and request dispatchers are needed for any other filter that is
forwarding to the MyFaces Trinidad filter.
Tip: If you use multiple filters in your application, ensure that they
are listed in the web.xml file in the order in which you want to run
them. At runtime, the filters are called in the sequence listed in that
file.
■ MyFaces Trinidad resource servlet and mapping: Installs the MyFaces Trinidad
resource servlet
org.apache.myfaces.trinidad.webapp.ResourceServlet, which serves
up web application resources (images, style sheets, JavaScript libraries) by
delegating to a resource loader. The servlet mapping maps the MyFaces Trinidad
resource servlet’s symbolic name to the URL pattern. By default, JDeveloper uses
/adf/* for MyFaces Trinidad Core, and /afr/* for ADF Faces.
■ JSF servlet and mapping (added when creating a JSF page or using a template
with ADF Faces components): The JSF servlet servlet
javax.faces.webapp.FacesServlet manages the request processing
lifecycle for web applications that utilize JSF to construct the user interface. The
mapping maps the JSF servlet’s symbolic name to the URL pattern, which can use
either a path prefix or an extension suffix pattern.
By default JDeveloper uses the path prefix /faces/*, as shown in the following
code:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
For example, if your web page is index.jspx, this means that when the URL
http://localhost:8080/MyDemo/faces/index.jspx is issued, the URL
activates the JSF servlet, which strips off the faces prefix and loads the file
/MyDemo/index.jspx.
A.2.3 What You May Need to Know About ADF Faces Context Parameters in web.xml
ADF Faces configuration options are defined in the web.xml file using
<context-param> elements. For example:
<context-param>
<param-name>oracle.adf.view.rich.LOGGER_LEVEL</param-name>
<param-value>ALL</param-value>
</context-param>
A-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in web.xml
■ org.apache.myfaces.trinidad.CLIENT_STATE_MAX_TOKENS: Specifies
how many tokens should be stored at any one time per user, when token-based
client-side state saving is enabled. The default is 15. When the number of tokens is
exceeded, the state is lost for the least recently viewed pages, which affects users
who actively use the Back button or who have multiple windows opened at the
same time. If you are building HTML applications that rely heavily on frames, you
would want to increase this value.
■ org.apache.myfaces.trinidad.USE_APPLICATION_VIEW_CACHE: Enables
the Application View Cache (AVC), which can improve scalability by caching the
state for the initial renders of the page’s UI at an application scope. However,
every page in the application must by analyzed for support in the AVC to avoid
potential problems with debugging in an unexpected state and information
leakage between users. Additionally, development is more difficult since page
updates are not noticed until the server is restarted, and although initial render
performance is enhanced, session size is not.
A.2.3.2 Debugging
You can specify the following debugging context parameters:
■ org.apache.myfaces.trinidad.DEBUG_JAVASCRIPT: ADF Faces, by
default, obfuscates the JavaScript it delivers to the client, stripping comments and
whitespace at the same time. This dramatically reduces the size of the ADF Faces
JavaScript download, but it also makes it tricky to debug the JavaScript. Set to
true to turn off the obfuscation during application development. Set to false for
application deployment.
■ org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION: By default
this parameter is false. If it is set to true, ADF Faces will automatically check
the modification date of your JSPs and CSS files, and discard the saved state when
the files change.
A-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in web.xml
A.2.3.6 Assertions
You can specify whether or not assertions are used within ADF Faces using the
oracle.adf.view.rich.ASSERT_ENABLED parameter. The default is false. Set
to true to turn on assertions.
A.2.3.7 Profiling
You can specify the following JavaScript profiling context parameters:
■ oracle.adf.view.rich.profiler.ENABLED: Specifies whether or not to use
the automated profiler instrumentation code provided with the JavaScript Profiler.
The default is false. Set to true to enable the JavaScript profile. When the
profiler is enabled, an extra roundtrip is needed on each page to fetch the profiler
data. By default, JDeveloper uses the /WEB-INF/profiler.xml configuration
file. To override the location of the profiler.xml file, use the ROOT_FILE
context parameter, as described next. You may also want to set DEBUG_
JAVASCRIPT to true, to turn off JavaScript obfuscation. You also must set the
LOGGER_LEVEL to at least INFO.
■ oracle.adf.view.rich.profiler.ROOT_FILE: Specifies the initial
profiler.xml file to load, if automated profiler instrumentation code is turned
on. By default, JDeveloper uses the /WEB-INF/profiler.xml file if ROOT_FILE
is not specified.
is used during automated testing to ensure that the ID is not null. The testId is an
attribute only on the tag. It is not part of the Java component API.
Note: This type of caching is known to interfere with some other JSF
technologies. In particular, the Apache MyFaces Tomahawk
saveState component does not work, and template text in Facelets
may appear in duplicate.
A-8 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in web.xml
Note: If you set the parameter to on, then you need to set the
partialSubmit attribute to true for any command components
involved in navigation. For more information about partialSubmit,
see Section 5.1.1, "Events and Partial Page Rendering."
A.2.3.16 Framebusting
Use the oracle.adf.view.rich.security.FRAME_BUSTING context parameter
to use framebusting in your application. Framebusting is a way to prevent clickjacking,
which occurs when a malicious web site pulls a page originating from another domain
into a frame and overlays it with a counterfeit page, allowing only portions of the
original, or clickjacked, page (for example, a button) to display. When users click the
button, they in fact are clicking a button on the clickjacked page, causing unexpected
results.
For example, say your application is a web-based email application that resides in
DomainA, and a web site in DomainB clickjacks your page by creating a page with an
IFrame that points to a page in your email application at DomainA. When the two
pages are combined, the page from DomainB covers most of your page in the IFrame,
and exposes only a button on your page that deletes all email for the account. Users,
not realizing they are actually in the email application, may click the button and
inadvertently delete all their email.
Framebusting prevents clickjacking by using the following JavaScript to block the
application’s pages from running in frames:
top.location.href = location.href;
If your application needs to use frames, you can set the parameter value to
differentDomain. This setting causes framebusting to occur only if the frame is in a
page that originates from a different domain than your application. This is the default
setting.
For example, say you have a page named DomainApage1 in your application that
uses a frame to include the page DomainApage2. Say the external DomainBpage1
tries to clickjack the page DomainApage1. The result would be the following window
hierarchy:
■ DomainBpage1
– DomainApage1
* DomainApage2
If the application has framebusting set to be differentDomain, then the framework
walks the parent window hierarchy to determine whether any ancestor windows
originate from a different domain. Because DoaminBpage1 originates from a different
domain, the framebusting JavaScript code will run for the DomainApage1 page,
causing it to become the top-level window. And because DomainApage2 originates
from the same domain as DomainApage1, it will be allowed to run in the frame.
Valid values are:
■ always: The page will show an error and redirect whenever it attempts to run in a
frame.
■ differentDomain: The page will show an error and redirect only when it
attempts to run in a frame on a page that originates in a different domain (the
default).
■ never: The page can run in any frame on any originating domain.
A-10 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in web.xml
Note: The ACF servlet filter must be the first filter in the chain of
filters defined for the application.
A.2.4 What You May Need to Know About Other Context Parameters in web.xml
Other optional, application-wide context parameters are:
■ javax.faces.CONFIG_FILE: Specifies paths to JSF application configuration
resource files. Use a comma-separated list of application-context relative paths for
the value, as shown in the following code. Set this parameter if you use more than
one JSF configuration file in your application.
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>
/WEB-INF/faces-config1.xml,/WEB-INF/faces-config2.xml
</param-value>
</context-param>
Note: This parameter value is ignored when you use prefix mapping
for the JSF servlet (for example, /faces), which is done by default for
you.
■ org.apache.myfaces.trinidad.CHECK_FILE_MODIFICATION: Specifies
whether JSP and CSS files require a restart in order to see changes at runtime. By
default, set to false. Set to true if you want to be able to view changes without
restarting the server.
A-12 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in faces-config.xml
In JDeveloper, you can use the declarative overview editor to modify the
faces-config.xml file. If you are familiar with the JSF configuration elements, you
can use the XML editor to edit the code directly.
To edit faces-config.xml:
1. In the Application Navigator, double-click faces-config.xml to open the file.
By default, JDeveloper opens the faces-config.xml file in the overview editor,
as indicated by the active Overview tab at the bottom of the editor window.
When you use the overview editor to add for example, managed beans and
validators declaratively, JDeveloper automatically updates the
faces-config.xml file for you.
2. To edit the XML code directly in the faces-config.xml file, click Source at the
bottom of the editor window.
When you edit elements in the XML editor, JDeveloper automatically reflects the
changes in the overview editor.
Tip: If you don’t see the General node, click the All Technologies
tab at the top of the Gallery.
4. Enter adf-config.xml as the file name and save it in the META-INF directory.
5. In the source editor, replace the generated code with the code shown in
Example A–4.
</adf-config>
A-14 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in adf-config.xml
6. You can now add the elements needed for the configuration of features you wish
to use.
A-16 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in adf-settings.xml
2. Right-click the META-INF directory, and choose New from the context menu.
3. In the New Gallery, expand General, select XML and then XML Document, and
click OK.
Tip: If you don’t see the General node, click the All Technologies
tab at the top of the Gallery.
4. In the source editor, replace the generated code with the code shown in
Example A–6, with the correct settings for your web application root.
5. You can now add the elements needed for the configuration of features you wish
to use. For more information, see Section A.5.2, "What You May Need to Know
About Elements in adf-settings.xml."
</adf-settings>
A-18 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in trinidad-config.xml
<compress>true</compress>
<duration>99999</duration>
<agent-caching>true</agent-caching>
<cache-key-pattern>*.html</cache-key-pattern>
</caching-rule>
</caching-rules>
</adf-faces-settings>
</adf-settings>
<skin-family>blafplus-rich</skin-family>
</trinidad-config>
To edit trinidad-config.xml:
1. In the Application Navigator, double-click trinidad-config.xml to open the file in
the XML editor.
2. If you are familiar with the element names, enter them in the editor. Otherwise use
the Structure window to help you insert them.
3. In the Structure window:
a. Right-click an element to choose from the Insert before or Insert after menu,
and click the element you wish to insert.
b. Double-click the newly inserted element in the Structure window to open it in
the Property Inspector. Enter a value or select one from a dropdown list (if
available).
In most cases you can enter either a JSF EL expression (such as
#{view.locale.language=='en' ? 'minimal' :
'blafplus-rich'}) or a static value (for example.,
<debug-output>true</debug-output>). EL expressions are dynamically
reevaluated on each request, and must return an appropriate object (for
example, a boolean object).
For a list of the configuration elements you can use, see Section A.6.2, "What You May
Need to Know About Elements in trinidad-config.xml."
Once you have configured the trinidad-config.xml file, you can retrieve the
property values programmatically or by using JSF EL expressions. For more
information, see Section A.8, "Using the RequestContext EL Implicit Object."
A-20 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in trinidad-config.xml
Note: Screen reader mode may have a negative effect on other users.
For example, access keys are not displayed if the accessibility mode is
set to screen reader mode.
Use <accessibility-profile> to configure the color contrast and font size used
in the application. The supported values are:
■ high-contrast: Application displays using high-contrast instead of the default
contrast.
■ large-fonts: Application displays using large fonts instead of the default size
fonts.
To use more than one setting, separate the values with a space.
A.6.2.7 Currency Code and Separators for Number Groups and Decimal Points
To set the currency code to use for formatting currency fields, and define the separator
to use for groups of numbers and the decimal point, use the following elements:
■ <currency-code>: Defines the default ISO 4217 currency code used by the
org.apache.myfaces.trinidad.converter.NumberConverter class to
format currency fields that do not specify an explicit currency code in their own
converter. Use a static value or an EL expression that evaluates to a String object.
For example:
<!-- Set the currency code to US dollars. -->
<currency-code>USD</currency-code>
A-22 Web User Interface Developer's Guide for Oracle Application Development Framework
Configuration in trinidad-config.xml
A-24 Web User Interface Developer's Guide for Oracle Application Development Framework
Using the RequestContext EL Implicit Object
A-26 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript Library Partitioning
component, the features for these two components are grouped together in the stretch
partition, along with the other ADF Faces layout components that can stretch their
children. At runtime, when a page is loaded, the framework determines the
components used on the page, and then from that, determines which features are
needed (feature names are the same as the components’ constructor name). Only the
partitions that contain those features are downloaded. For more information about
JavaScript partitioning, see Section 1.2.1.2, "JavaScript Library Partitioning."
Features and partitions are defined using configuration files. ADF Faces ships with a
default features and partitions configuration file. You can overwrite the default
partitions file by creating your own implementation. When you create custom ADF
Faces components, you can create your own features and partition configuration files
for those components.
By default, JavaScript partitioning is turned on. Whether or not your application uses
JavaScript partitioning is determined by a context parameter in the web.xml file. For
more information about enabling or disabling JavaScript partitioning, see
Section A.2.3.15, "JavaScript Partitioning."
Note: You create JavaScript features when you create custom ADF
Faces components. All existing ADF Faces components already have
features created for them, and these cannot be changed.
2. Right-click the META-INF directory, and choose New from the context menu.
3. In the New Gallery, expand General, select XML and then XML Document, and
click OK.
Tip: If you don’t see the General node, click the All Technologies
tab at the top of the Gallery.
</adf-js-features>
6. Add the following elements to populate a feature with the relevant component
files and dependencies.
■ features: The root element of the configuration file.
</feature>
A-28 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript Library Partitioning
2. In the New Gallery, expand General, select XML and then XML Document, and
click OK.
Tip: If you don’t see the General node, click the All Technologies
tab at the top of the Gallery.
</adf-js-partitions>
5. Add the following elements to populate a partition with the relevant features.
■ partitions: The root element of the configuration file.
■ partition: Create as a child to the partitions element. This element must
contain one partition-name child element and one or more feature
elements.
■ partition-name: Create as a child to the partition element. Specifies the
name of the partition. This value will be used to produce a unique URL for
this partition’s JavaScript library.
■ feature: Create as a child to the partition element. Specifies the feature to
be included in this partition. There can be multiple feature elements.
Example A–13 shows the partition element for the tree partition that contains
the AdfRichTree and AdfRichTreeTable features.
A.9.3 What You May Need to Know About the adf-js-partitions.xml File
The default ADF Faces adf-js-partitions.xml file has partitions that you can
override by creating your own partitions file. For more information, see Section A.9.2,
"How to Create JavaScript Partitions." Example A–14 shows the default ADF Faces
adf-js-partitions.xml file.
<partitions xmlns="http://xmlns.oracle.com/adf/faces/partition">
<partition>
<partition-name>boot</partition-name>
<feature>AdfBootstrap</feature>
</partition>
<partition>
<partition-name>core</partition-name>
<feature>AdfCore</feature>
<!-- These are all so common that we group them with core -->
<feature>AdfRichDocument</feature>
<feature>AdfRichForm</feature>
<feature>AdfRichPopup</feature>
<feature>AdfRichSubform</feature>
<feature>AdfRichCommandButton</feature>
<feature>AdfRichCommandLink</feature>
<!--
Dialog is currently on every page for messaging. No use
in putting these in a separate partition.
-->
<feature>AdfRichPanelWindow</feature>
<feature>AdfRichDialog</feature>
<partition>
<partition-name>accordion</partition-name>
<feature>AdfRichPanelAccordion</feature>
</partition>
A-30 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript Library Partitioning
<partition>
<partition-name>border</partition-name>
<feature>AdfRichPanelBorderLayout</feature>
</partition>
<partition>
<partition-name>box</partition-name>
<feature>AdfRichPanelBox</feature>
</partition>
<partition>
<partition-name>calendar</partition-name>
<feature>AdfUICalendar</feature>
<feature>AdfRichCalendar</feature>
<feature>AdfCalendarDragSource</feature>
<feature>AdfCalendarDropTarget</feature>
</partition>
<partition>
<partition-name>collection</partition-name>
<feature>AdfUIDecorateCollection</feature>
<feature>AdfRichPanelCollection</feature>
</partition>
<partition>
<partition-name>color</partition-name>
<feature>AdfRichChooseColor</feature>
<feature>AdfRichInputColor</feature>
</partition>
<partition>
<partition-name>date</partition-name>
<feature>AdfRichChooseDate</feature>
<feature>AdfRichInputDate</feature>
</partition>
<partition>
<partition-name>declarativeComponent</partition-name>
<feature>AdfUIInclude</feature>
<feature>AdfUIDeclarativeComponent</feature>
<feature>AdfRichDeclarativeComponent</feature>
</partition>
<partition>
<partition-name>detail</partition-name>
<feature>AdfRichShowDetail</feature>
</partition>
<partition>
<partition-name>dnd</partition-name>
<feature>AdfDragAndDrop</feature>
<feature>AdfCollectionDragSource</feature>
<feature>AdfStampedDropTarget</feature>
<feature>AdfCollectionDropTarget</feature>
<feature>AdfAttributeDragSource</feature>
<feature>AdfAttributeDropTarget</feature>
<feature>AdfComponentDragSource</feature>
<feature>AdfDropTarget</feature>
</partition>
<partition>
<partition-name>detailitem</partition-name>
<feature>AdfRichShowDetailItem</feature>
</partition>
<partition>
<partition-name>file</partition-name>
<feature>AdfRichInputFile</feature>
</partition>
<partition>
<partition-name>form</partition-name>
<feature>AdfRichPanelFormLayout</feature>
<feature>AdfRichPanelLabelAndMessage</feature>
</partition>
<partition>
<partition-name>format</partition-name>
<feature>AdfRichOutputFormatted</feature>
</partition>
<partition>
<partition-name>frame</partition-name>
<feature>AdfRichInlineFrame</feature>
</partition>
<partition>
<partition-name>header</partition-name>
<feature>AdfRichPanelHeader</feature>
<feature>AdfRichShowDetailHeader</feature>
</partition>
<partition>
<partition-name>imagelink</partition-name>
<feature>AdfRichCommandImageLink</feature>
</partition>
<partition>
<partition-name>iedit</partition-name>
<feature>AdfInlineEditing</feature>
</partition>
<partition>
<partition-name>input</partition-name>
<feature>AdfRichInputText</feature>
<feature>AdfInsertTextBehavior</feature>
</partition>
<partition>
<partition-name>label</partition-name>
<feature>AdfRichOutputLabel</feature>
</partition>
<partition>
<partition-name>list</partition-name>
<feature>AdfRichPanelList</feature>
</partition>
<partition>
A-32 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript Library Partitioning
<partition-name>lov</partition-name>
<feature>AdfUIInputPopup</feature>
<feature>AdfRichInputComboboxListOfValues</feature>
<feature>AdfRichInputListOfValues</feature>
</partition>
<partition>
<partition-name>media</partition-name>
<feature>AdfRichMedia</feature>
</partition>
<partition>
<partition-name>message</partition-name>
<feature>AdfUIMessage</feature>
<feature>AdfUIMessages</feature>
<feature>AdfRichMessage</feature>
<feature>AdfRichMessages</feature>
</partition>
<partition>
<partition-name>menu</partition-name>
<feature>AdfRichCommandMenuItem</feature>
<feature>AdfRichGoMenuItem</feature>
<feature>AdfRichMenuBar</feature>
<feature>AdfRichMenu</feature>
</partition>
<partition>
<partition-name>nav</partition-name>
<feature>AdfUINavigationPath</feature>
<feature>AdfUINavigationLevel</feature>
<feature>AdfRichBreadCrumbs</feature>
<feature>AdfRichCommandNavigationItem</feature>
<feature>AdfRichNavigationPane</feature>
</partition>
<partition>
<partition-name>note</partition-name>
<feature>AdfRichNoteWindow</feature>
</partition>
<partition>
<partition-name>poll</partition-name>
<feature>AdfUIPoll</feature>
<feature>AdfRichPoll</feature>
</partition>
<partition>
<partition-name>progress</partition-name>
<feature>AdfUIProgress</feature>
<feature>AdfRichProgressIndicator</feature>
</partition>
<partition>
<partition-name>print</partition-name>
<feature>AdfShowPrintablePageBehavior</feature>
</partition>
<partition>
<partition-name>scrollComponentIntoView</partition-name>
<feature>AdfScrollComponentIntoViewBehavior</feature>
</partition>
<partition>
<partition-name>query</partition-name>
<feature>AdfUIQuery</feature>
<feature>AdfRichQuery</feature>
<feature>AdfRichQuickQuery</feature>
</partition>
<partition>
<partition-name>region</partition-name>
<feature>AdfUIRegion</feature>
<feature>AdfRichRegion</feature>
</partition>
<partition>
<partition-name>reset</partition-name>
<feature>AdfUIReset</feature>
<feature>AdfRichResetButton</feature>
</partition>
<partition>
<partition-name>rte</partition-name>
<feature>AdfRichTextEditor</feature>
<feature>AdfRichTextEditorInsertBehavior</feature>
</partition>
<partition>
<partition-name>select</partition-name>
<feature>AdfRichSelectBooleanCheckbox</feature>
<feature>AdfRichSelectBooleanRadio</feature>
<feature>AdfRichSelectManyCheckbox</feature>
<feature>AdfRichSelectOneRadio</feature>
</partition>
<partition>
<partition-name>selectmanychoice</partition-name>
<feature>AdfRichSelectManyChoice</feature>
</partition>
<partition>
<partition-name>selectmanylistbox</partition-name>
<feature>AdfRichSelectManyListbox</feature>
</partition>
<partition>
<partition-name>selectonechoice</partition-name>
<feature>AdfRichSelectOneChoice</feature>
</partition>
<partition>
<partition-name>selectonelistbox</partition-name>
<feature>AdfRichSelectOneListbox</feature>
</partition>
<partition>
<partition-name>shuttle</partition-name>
<feature>AdfUISelectOrder</feature>
A-34 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript Library Partitioning
<feature>AdfRichSelectManyShuttle</feature>
<feature>AdfRichSelectOrderShuttle</feature>
</partition>
<partition>
<partition-name>slide</partition-name>
<feature>AdfRichInputNumberSlider</feature>
<feature>AdfRichInputRangeSlider</feature>
</partition>
<partition>
<partition-name>spin</partition-name>
<feature>AdfRichInputNumberSpinbox</feature>
</partition>
<partition>
<partition-name>status</partition-name>
<feature>AdfRichStatusIndicator</feature>
</partition>
<partition>
<partition-name>stretch</partition-name>
<feature>AdfRichDecorativeBox</feature>
<feature>AdfRichPanelSplitter</feature>
<feature>AdfRichPanelStretchLayout</feature>
<feature>AdfRichPanelDashboard</feature>
<feature>AdfPanelDashboardBehavior</feature>
<feature>AdfDashboardDropTarget</feature>
</partition>
<partition>
<partition-name>tabbed</partition-name>
<feature>AdfUIShowOne</feature>
<feature>AdfRichPanelTabbed</feature>
</partition>
<partition>
<partition-name>table</partition-name>
<feature>AdfUIIterator</feature>
<feature>AdfUITable</feature>
<feature>AdfUITable2</feature>
<feature>AdfUIColumn</feature>
<feature>AdfRichColumn</feature>
<feature>AdfRichTable</feature>
</partition>
<partition>
<partition-name>toolbar</partition-name>
<feature>AdfRichCommandToolbarButton</feature>
<feature>AdfRichToolbar</feature>
</partition>
<partition>
<partition-name>toolbox</partition-name>
<feature>AdfRichToolbox</feature>
</partition>
<partition>
<partition-name>train</partition-name>
<feature>AdfUIProcess</feature>
<feature>AdfRichCommandTrainStop</feature>
<feature>AdfRichTrainButtonBar</feature>
<feature>AdfRichTrain</feature>
</partition>
<partition>
<partition-name>tree</partition-name>
<feature>AdfUITree</feature>
<feature>AdfUITreeTable</feature>
<feature>AdfRichTree</feature>
<feature>AdfRichTreeTable</feature>
</partition>
<!--
Some components which typically do have client-side representation,
but small enough that we might as well download in a single partition
in the event that any of these are needed.
-->
<partition>
<partition-name>uncommon</partition-name>
<feature>AdfRichGoButton</feature>
<feature>AdfRichIcon</feature>
<feature>AdfRichImage</feature>
<feature>AdfRichOutputText</feature>
<feature>AdfRichPanelGroupLayout</feature>
<feature>AdfRichSeparator</feature>
<feature>AdfRichSpacer</feature>
<feature>AdfRichGoLink</feature>
</partition>
<partition>
<partition-name>eum</partition-name>
<feature>AdfEndUserMonitoring</feature>
</partition>
<partition>
<partition-name>ads</partition-name>
<feature>AdfActiveDataService</feature>
</partition>
<partition>
<partition-name>automation</partition-name>
<feature>AdfAutomationTest</feature>
</partition>
</partitions>
A-36 Web User Interface Developer's Guide for Oracle Application Development Framework
Using JavaScript Library Partitioning
JavaScript features required by the (rendered) page contents is known. Once the set of
required JavaScript features is known, ADF Faces uses the partition configuration file
to map this set of features to the set of required partitions. Given the set of required
partitions, the HTML <script> references to these partitions are rendered just before
the end of the HTML document.
A-38 Web User Interface Developer's Guide for Oracle Application Development Framework
B
B Message Keys for Converter and Validator
Messages
This appendix lists all the message keys and message setter methods for ADF Faces
converters and validators.
This chapter includes the following sections:
■ Section B.1, "Introduction to ADF Faces Default Messages"
■ Section B.2, "Message Keys and Setter Methods"
■ Section B.3, "Converter and Validator Message Keys and Setter Methods"
■ How placeholders can be used in the message to include details such as the input
values and patterns.
B.3.1 af:convertColor
Converts strings representing color values to and from java.awt.Color objects. The
set of patterns used for conversion can be overriden.
Convert color: Input value cannot be converted to a color based on the patterns set
Set method:
setMessageDetailConvertBoth(java.lang.String convertBothMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.ColorConverter.CONVERT_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} A date-time example, based on the dateStyle and timeStyle set in the
converter
B.3.2 af:convertDateTime
Converts a string to and from java.util.Date and the converse based on the
pattern and style set.
Convert date and time: Date-time value that cannot be converted to Date object
when type is set to both
Set method:
setMessageDetailConvertBoth(java.lang.String convertBothMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.DateTimeConverter.CONVERT_BOTH_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} Example of the format the converter is expecting
Convert date: Input value cannot be converted to a Date when the pattern or
secondary pattern is set or when type is set to date
Set method:
setMessageDetailConvertDate(java.lang.String convertDateMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.DateTimeConverter.CONVERT_DATE_detail
B-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Converter and Validator Message Keys and Setter Methods
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} Example of the format the converter is expecting
Convert date: Input value cannot be converted to a Date when the pattern or
secondary pattern is set or when type is set to date
Set method:
setMessageDetailConvertTime(java.lang.String convertTimeMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.DateTimeConverter.CONVERT_TIME_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} Example of the format the converter is expecting
B.3.3 af:convertNumber
Provides an extension of the standard JSF
javax.faces.convert.NumberConverter class. The converter provides all the
standard functionality of the default NumberConverter and is strict while converting
to an object.
Message key:
org.apache.myfaces.trinidad.convert.NumberConverter.CONVERT_PATTERN_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The specified conversion pattern
Convert number: Input value cannot be converted to a Number when type is set to
number and pattern is null or not set
Set method:
setMessageDetailConvertNumber(java.lang.String convertNumberMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.NumberConverter.CONVERT_NUMBER_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
Convert number: Input value cannot be converted to a Number when type is set to
currency and pattern is null or not set
Set method:
setMessageDetailConvertCurrency(java.lang.String convertCurrencyMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.NumberConverter.CONVERT_CURRENCY_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
Convert number: Input value cannot be converted to a Number when type is set to
percent and pattern is null or not set
Set method:
setMessageDetailConvertPercent(java.lang.String convertPercentMessageDetail)
Message key:
org.apache.myfaces.trinidad.convert.NumberConverter.CONVERT_PERCENT_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
B.3.4 af:validateByteLength
Validates the byte length of strings when encoded.
Validate byte length: The input value exceeds the maximum byte length
Set method:
setMessageDetailMaximum(java.lang.String maximumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.ByteLengthValidator.MAXIMUM_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} Maximum length
B.3.5 af:validateDateRestriction
Validates that the date is valid with some given restrictions.
Validate date restriction - Invalid Date: The input value is invalid when
invalidDate is set
Set method:
setMessageDetailInvalidDays(java.lang.String invalidDays)
Message key:
B-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Converter and Validator Message Keys and Setter Methods
org.apache.myfaces.trinidad.validator.DateRestrictionValidator.WEEKDAY_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The invalid date
Validate date restriction - Invalid day of the week: The input value is invalid when
invalidDaysOfWeek is set
Set method:
setMessageDetailInvalidDaysOfWeek(java.lang.String invalidDaysOfWeek)
Message key:
org.apache.myfaces.trinidad.validator.DateRestrictionValidator.DAY_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The invalid month
Validate date restriction - Invalid month: The input value is invalid when
invalidMonths is set
Set method:
setMessageDetailInvalidMonths(java.lang.String invalidMonths)
Message key:
org.apache.myfaces.trinidad.validator.DateRestrictionValidator.MONTH_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The invalid weekday
B.3.6 af:validateDateTimeRange
Validates that the date entered is within a given range.
Validate date-time range: The input value exceeds the maximum value set
Set method:
setMessageDetailMaximum(java.lang.String maximumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.DateTimeRangeValidator.MAXIMUM_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The maximum allowed date
Validate date-time range: The input value is less than the minimum value set
Set method:
setMessageDetailMinimum(java.lang.String minimumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.DateTimeRangeValidator.MINIMUM_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The minimum allowed date
Validate date-time range: The input value is not within the range, when minimum
and maximum are set
Set method:
setMessageDetailNotInRange(java.lang.String notInRangeMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.DateTimeRangeValidator.NOT_IN_RANGE_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The minimum allowed date
{3} The maximum allowed date
B.3.7 af:validateDoubleRange
Validates that the value entered is within a given range.
Validate double range: The input value exceeds the maximum value set
Set method:
setMessageDetailMaximum(java.lang.String maximumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.DoubleRangeValidator.MAXIMUM_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The maximum allowed value
Validate double range: The input value is less than the minimum value set
Set method:
setMessageDetailMinimum(java.lang.String minimumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.DoubleRangeValidator.MINIMUM_detail
Placeholders:
B-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Converter and Validator Message Keys and Setter Methods
Validate double range: The input value is not within the range, when minimum and
maximum are set
Set method:
setMessageDetailNotInRange(java.lang.String notInRangeMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.DoubleRangeValidator.NOT_IN_RANGE_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The minimum allowed value
{3} The maximum allowed value
B.3.8 af:validateLength
Validates that the value entered is within a given range.
Validate length: The input value exceeds the maximum value set
Set method:
setMessageDetailMaximum(java.lang.String maximumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.LengthValidator.MAXIMUM_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The maximum allowed length
Validate length: The input value is less than the minimum value set
Set method:
setMessageDetailMinimum(java.lang.String minimumMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.LengthValidator.MINIMUM_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The minimum allowed length
Validate length: The input value is not within the range, when minimum and
maximum are set
Set method:
setMessageDetailNotInRange(java.lang.String notInRangeMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.LengthValidator.NOT_IN_RANGE_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The minimum allowed length
{3} The maximum allowed length
B.3.9 af:validateRegExp
Validates an expression using Java regular expression syntax.
Validate regular expression: The input value does not match the specified pattern
Set method:
setMessageDetailNoMatch(java.lang.String noMatchMessageDetail)
Message key:
org.apache.myfaces.trinidad.validator.RegExpValidator.NO_MATCH_detail
Placeholders:
{0} The label that identifies the component
{1} Value entered by the user
{2} The expected pattern
B-8 Web User Interface Developer's Guide for Oracle Application Development Framework
C
CKeyboard Shortcuts
This appendix describes the keyboard shortcuts that can be used instead of pointing
devices.
This appendix includes the following sections:
■ Section C.1, "About Keyboard Shortcuts"
■ Section C.2, "Tab Traversal"
■ Section C.3, "Accelerator Keys"
■ Section C.4, "Access Keys"
■ Section C.5, "Default Cursor or Focus Placement"
■ Section C.6, "The Enter Key"
All active elements of the page are accessible by Tab traversal, that is, by using the Tab
key to move to the next control and Shift+Tab to move to the previous control. In most
cases, when a control has focus, the action can then be initiated by pressing Enter.
Some complex components use arrow keys to navigate after the component receives
focus using the Tab key.
Avoid using custom code to control the tab traversal sequence within a page, as the
resulting pages would be too difficult to manage and would create an inconsistent
user experience across pages in an application and across applications.
To improve keyboard navigation efficiency for users, you should include a skip
navigation link at the top of the page, which should navigate directly to the first
content-related tab stop.
C-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Tab Traversal
In Figure C–2, the user has navigated the rows in the following way:
1. The user clicks a cell in the inputText column, giving it focus and making it
editable.
Because the Tab key is used to navigate, the inputText column is recognized as the
starting column for the navigation pattern.
2. The user presses the Tab key and moves the focus in the same row to the cell of
the * Required field column.
3. The user presses the Tab key and moves the focus in the same row to the cell of
the inputComboListOf column.
4. The user presses the Enter key and the focus shifts to the inputText column in the
next row.
Pressing the Enter key sets a navigation pattern, based on the first set of Tab keys,
which is followed in subsequent rows.
C-4 Web User Interface Developer's Guide for Oracle Application Development Framework
Accelerator Keys
because Ctrl and Ctrl+Shift are commonly used by browsers. The execution key
must be a printable character (ASCII code range 33-126).
■ Custom menu accelerator keys must be global to the entire page. If a page were to
have different menus that used the same accelerator, it would be difficult for the
browser to predict which actions would be executed by the accelerator at any
given time.
Certain BLAF Plus components have built-in accelerator keys that apply when the
component has focus. Of these, some are reserved for page-level components, whereas
others may be assigned to menus when the component is not used on a page.
Table C–1 lists the accelerator keys that are already built into page-level BLAF Plus
components. You must not use these accelerator keys at all.
The menu commands take precedence if they are on the same page as page-level
components, and have the same accelerator keys. For this reason, you must not use the
accelerator keys listed in Table C–2 in menus when the related component also
appears on the same page.
C-6 Web User Interface Developer's Guide for Oracle Application Development Framework
Access Keys
■ You are responsible for assigning access keys to specific components. When
choosing a letter for the access key, there are a few important considerations:
– Ease of learning: Although the underlined letter in the label clearly indicates
to the user which letter is the access key, it is still recommended to pick a letter
that is easy for users to remember even without scanning the label. That is
often the first letter of the label, like Y in Yes, or a letter that has a strong
sound when the label is read aloud, such as x in Next.
– Consistency: It is good practice to use the same access key for the same
command on multiple pages. However, this may not always be possible if the
same command label appears multiple times on a page, or if another, more
frequently used command on the page uses the same access key.
– Translation: When a label is translated, the same letter that is used for the
access key in English might not be present in the translation. Developers
should work with their localization department to ensure that alternative
access keys are present in component labels after translation. For example, in
English, the button Next may be assigned the mnemonic letter x, but that letter
does not appear when the label is translated to Suivantes in French.
Depending on the pool of available letters, an alternative letter, such as S or v
(or any other unassigned letter in the term Suivantes), should be assigned to
the translated term.
Note: For translation reasons, you should specify access keys as part
of the label. For example, to render the label Cancel with the C access
key, it is recommended to use &Cancel in the textAndAccessKey
property (where the ampersand denotes the mnemonic) rather than C
in the accessKey property. Product suites must ensure that access
keys are not duplicated within each supported language and do not
override access keys within each supported browser unless explicitly
intended.
C-8 Web User Interface Developer's Guide for Oracle Application Development Framework
The Enter Key
default focus or cursor location so that users can start entering data without
excessive keyboard or mouse navigation. Otherwise, do not do this because it
makes it more difficult for keyboard users (particularly screen reader users) to
orient themselves after the page is loaded.
C-10 Web User Interface Developer's Guide for Oracle Application Development Framework
D
Quick Start Layout Themes
D
This appendix shows how each of the quick start layouts are affected when you choose
to apply themes to them. ADF Faces provides a number of components that you can
use to define the overall layout of a page. JDeveloper contains predefined quick start
layouts that use these components to provide you with a quick and easy way to
correctly build the layout. You can choose from one, two, or three column layouts.
When you choose to apply a theme to the chosen quick layout, color and styling are
added to some of the components used in the quick start layout.
Figure D–1 and Figure D–2 show each of the layouts with and without themes applied.
For more information about themes, see Section 20.3.4, "How to Apply Themes to
Components."
D-2 Web User Interface Developer's Guide for Oracle Application Development Framework
Figure D–2 Quick Start Layouts With and Without Them
Index-1
creating, A-14 versus clientAttribute tag, 5-12
editing, A-14 AttributeChangeEvent events
AdfCustomEvent class, 5-14 input components and, 9-2
AdfCustomEvent.queue() method, 5-14 selection components and, 9-17
AdfDisclosureEvent event, 8-48, 8-58 attributes
adf-js-features.xml file bonus attributes, 3-14
creating, A-27 setting using Property Inspector, 2-25
creating for custom component, 30-14 automatic component binding, 2-14
custom components, 30-20 autoSubmit attribute
adf-js-partitions.xml file described when set to true, 4-10
creating, A-28 partial page rendering and, 7-3
default ADF Faces configuration file, A-29 versus partialSubmit attribute, 7-4
AdfPage.PAGE global object, 3-7 auto-suggest behavior, 11-4
AdfPage.PAGE.findComponentByAbsoluteId
method, 3-7
B
adf-settings.xml file
caching rules configuration, A-18 back button and partial page rendering, 7-6
configuring, A-16 backing beans
creating, A-16 automatically creating, 2-14
editing, A-16 best practice for when to create, 2-9
help system configuration, A-17 See also managed beans
AdfUIComponent class, 1-4 backingBeanScope, 4-15
AdfUIComponent.findComponent method, 3-7 bar graphs
AdfUIInputEvent class clustered type, 24-9
best practice for using, 5-8 data requirements for, 24-9
AFAuxiliaryStretchWidth style class, 8-13 defined, 24-4
AFStretchWidth style class, 8-13 percentage type, 24-9
AJAX stacked type, 24-9
ADF Faces and, 1-2 tag, 24-4
described, 7-1 See also graph components
anchor node components barGraph tag, 24-4
ancestor nodes, specifying, 29-14 best practice tips
defined, 29-9 declarative components, 19-22
animation JSPX pages, using, 2-7
configuration in trinidad-config.xml templates and document and form tags, 19-13
file, A-20 best practices
gauges, 25-19 ADF Controller and JSF controller together, 2-5
graphs, 24-45 AdfBaseEvent class, 5-8
antonyms in commandMenuItem components, 14-5 AdfUIInputEvent class, 5-8
Apache MyFaces Trinidad. See MyFaces Trinidad backing beans, when to create, 2-9
application templates, 2-2 custom components
application workspaces JavaScript naming, 30-15
creating, 2-2 properties for, 30-24
data model project, 2-3 form tags and, 4-14
view project, 2-3 image components in a carousel, 16-8
applicationScope, 4-15 JSF and ADF controllers, 2-5
Apply Request Values phase, 4-2 managed beans, 2-30
area graphs page layout, 8-12
absolute type, 24-8 quick layouts, 8-12
data requirements for, 24-8 selectOneChoice and large number of list
defined, 24-4 items, 9-18
percentage type, 24-8 subform components, when to use, 4-14
stacked type, 24-8 XHTML page, using, 2-7
tag, 24-4 blafplus-medium skin, 20-2
See also graph components blafplus-rich skin, 20-2
areaGraph tag, 24-4 blocking UI input, 5-10
assertions bodyContextMenu facet, 10-8
configuration parameters, A-7 bonus attributes
performance tip for setting, A-7 adding to a component, 3-14
attribute tag defined, 3-14
Index-2
marshalling, 3-15 activityContextMenu facet, 15-9
breadCrumbs components activityDelete facet, 15-9
described, 18-35 activityDetail facet, 15-10
procedures for using, 18-35 activityHover facet, 15-10
XMLMenuModel and, 18-26 contextMenu facet, 15-10
broadcast() function, 5-13 create facet, 15-10
bubble graphs described, 15-3
data requirements for, 24-9 events and, 15-9
defined, 24-4 getTags method, 15-16
tag, 24-4 locale, 15-2
See also graph components popups
bubbleGraph tag, 24-4 creating, 15-10
using, 15-9
procedures for using, 15-5
C
provider for, 15-1
caching at runtime, 15-8
configuring, A-18 styling
caching filter, A-11 described, 15-15
browser caching, A-11 procedures for, 15-16
defining rules, A-15 toolbar
Oracle’s Web Cache, A-11 customizing, 15-12
caching rules described, 15-2
defining, A-15 toolboxLayout attribute, 9-30, 15-13
calendar components views, available
activities, styling, 15-15 described, 15-1
activityContextMenu facet, 15-9 procedures for setting, 15-7
activityDelete facet, 15-9 CalendarAcitivityRamp class, 15-16
activityDetail facet, 15-10 CalendarActivity class
activityHover facet, 15-10 described, 15-5
activityStyles attribute, 15-15 procedures for creating, 15-5
attributes, 15-6 CalendarActivityDurationChangeEvent, 15-
CalendarActivityDurationChangeEvent, 9
15-9 CalendarActivityDurationChangeListener,
CalendarActivityDurationChangeListene 15-8
r, 15-8 CalendarActivityEvent, 15-8, 15-9
CalendarActivityEvent, 15-8, 15-9 CalendarDisplayChangeEvent, 15-9
CalendarActivityRamp class, 15-16 CalendarEvent, 15-8, 15-10
CalendarDisplayChangeEvent, 15-9 CalendarModel class
CalendarEvent, 15-8, 15-10 defined, 15-2
CalendarModel class, 15-2 described, 15-4
CalendarProvider class, 15-5 procedures for creating, 15-5
color ramps, 15-16 CalendarProvider class
configuring, 15-6 defined, 15-5
contextMenu facet, 15-10 procedures for creating, 15-5
create facet, 15-10 carousel components
date customization, 15-17 attributes, 16-11
dateCustomizer attribute browsers and, 16-13
described, 15-15 CarouselSpinEvent, 16-11
using, 15-17 content delivery, 16-9
DateCustomizer class, 15-17 data model for, 16-10
described, 15-1 described, 16-7
drag and drop functionality, adding, 32-19 nodeStamp facet, 16-8
events performance tip for structuring, 16-12
CalendarActivityDurationChangeEvent, procedures for using, 16-9
15-9 stamping, 16-8
CalendarActivityEvent, 15-9 carouselItem components
CalendarDisplayChangeEvent, 15-9 described, 16-8
CalendarEvent, 15-10 procedures for using, 16-11
DropEvent, 32-19 CarouselSpinEvent, 16-11
facets cascading style sheets
Index-3
accessibilty and, 22-9 bonus attributes, 3-14
configuration for compression of class versus attribute tag, 5-12
names, A-7 clientComponent attribute
creating for custom components, 30-13, 30-37 described, 3-6
performance tip for compression of class performance tip for using, 3-6
names, A-7 clientDropListener attribute, 32-8
CellFormat object clientListener tag
constructing, 26-9 collection components, using with, 10-46
change persistence. See customization, user defined, 5-7
changed attribute, 9-3 procedures for using, 9-25
chartPopupMenu facet, 28-6 triggering event handler execution, 5-11
charts. See Gantt chart components client-side lifecycle, 4-13
CHECK_FILE_MODIFICATION context parameter client-side scripting for accessibility, 22-9
defined, A-5 client-side validation, 4-13
performance tip for usage, A-6 collection components
ChildPropertyTreeModel class, 10-30 accessing values from the client, 10-45
chooseColor components, 9-12 bodyContextMenu facet, 10-8
clickjacking, A-9 client components and, 10-45
client behavior tags exporting data
described, 5-20 described, 10-42
insertTextBehavior tag, 9-6, 9-9 procedures for, 10-44
panelDashboardBehavior tag, 8-35 formatting, 10-11
richTextEditorInsertBehavior tag, 9-29 panelCollection components, 10-40
scrollComponentIntoViewBehavior passing rows as a value, 10-39
tag, 5-20 row selection, 10-5
showPrintablePageBehavior tag, 33-1 stamping, 10-10
client components table components, 10-9
accessing properties on, 3-9 tree components, 10-29
accessing values in collection components, 10-45 treeTable components, 10-37
AdfPage.PAGE.findComponentByAbsoluteI See also table components; tree components;
d method, 3-7 treeTable components
AdfUIComponent.findComponent collectionDropTarget tag, 32-9
method, 3-7 CollectionModel class
behavior, 1-4 carousel components, 16-8
bonus attributes, 3-14 described, 10-9
clientComponent attribute, 3-6 color
defined, 3-1 changing in graph components, 24-19
described, 1-3 customizing map themes, 27-9
instantiating, 3-6 color ramps, 15-16
isShowing function, 3-17 column components
naming containers, finding components, 3-7 attributes, 10-19
at runtime, when created, 3-1 described, 10-11
setting property values on, 3-13 facets
triggering event handlers, 5-11 adding, 10-20
client events described, 10-11
AdfDisclosureEvent event, 8-48, 8-58 formatting, 10-13
clientListener tag, 5-7 performance tip for stretching, 10-12
described, 3-3, 5-5 combination graphs
event source, accessing, 3-5 data requirements for, 24-10
JavaScript and, 5-8 defined, 24-4
performance tip for server processing, 5-6 tag, 24-4
preventing from propagating to the server, 5-11 See also graph components
returning source of, 5-9 comboGraph tag, 24-4
at runtime, 5-12 command components
sending custom events to server action attribute, 18-4
described, 5-14 actionListener attribute, 18-4
procedures, 5-15 attributes, 18-3
table of, 5-6 described, 18-2
triggering handler execution, 5-11 downloadActionListener tag, 18-9
clientAttribute tag exporting data using, 10-44
Index-4
fileDownloadActionListener tag, 18-7 javax.faces.DEFAULT_SUFFIX
immediate attribute and, 4-4 parameter, A-7, A-12
overview, 18-1 javax.faces.LIFECYCLE_ID parameter, A-12
procedures for using, 18-3 javax.faces.STATE_SAVING_METHOD
resetActionListener tag, 18-9 parameter, A-3
versus go components, 18-2 JSF page changes, A-12
commandButton components JSP suffix, A-12
described, 18-2 lifecycle ID, A-12
procedures for using, 18-3 oracle.adfinternal.view.faces.caching
commandImageLink components .filter.AdfFacesCachingFilter
described, 18-2 class, A-11
procedures for using, 18-3 oracle.adf.view.rich.automation.ENABL
commandLink components ED parameter, A-7
described, 18-2 oracle.adf.view.rich.pprNavigation.OP
procedures for using, 18-3 TIONS parameter, A-8
commandMenuItem components oracle.adf.view.rich.security.FRAME_
action attribute, 14-6 BUSTING parameter, A-9
actionListener attribute, 14-6 oracle.adf.view.rich.SUPPRESS_IDS
antonyms, 14-5 parameter, A-10
attributes, 14-10 oracle.adf.view.rich.tonalstyles.ENAB
described, 14-2 LED parameter, A-8
types, 14-5 org.apache.myfaces.trinidad.CACHE_
commandNavigationItem components VIEW_ROOT parameter, A-8
described, 18-11 org.apache.myfaces.trinidad.CHECK_
procedures for using, 18-34 FILE_MODIFICATION parameter, A-5, A-12
commandToolbarButton components org.apache.myfaces.trinidad.CLIENT_
attributes, 14-17 STATE_MAX_TOKENS parameter, A-5
described, 14-14 org.apache.myfaces.trinidad.CLIENT_
procedures for using, 14-16 STATE_MEHTOD parameter, A-5
component class for custom components, 30-23 org.apache.myfaces.trinidad.DEBUG_
component IDs, A-10 JAVASCRIPT parameter, A-5
Component Palette, 2-21 org.apache.myfaces.trinidad.DISABLE_
component peers. See peers CONTENT_COMPRESSION
component tree parameter, A-7
declarative components and, 19-30 org.apache.myfaces.trinidad.LOGGER_
described, 1-4 LEVEL parameter, A-6
lifecycle and, 4-1 org.apache.myfaces.trinidad.MAX_DISK_
page fragments and, 19-7 SPACE parameter, A-6
page templates and, 19-2 org.apache.myfaces.trinidad.oracle.ad
panelDashboardBeahvior tag and, 8-35 f.view.rich.profiler.ENABLED
runtime, when established, 4-2 parameter, A-7
configuration org.apache.myfaces.trinidad.oracle.ad
adding to web.xml file, A-3 f.view.rich.profiler.ROOT_FILE
adf-config.xml file, A-14 parameter, A-7
adf-settings.xml file, A-16 org.apache.myfaces.trinidad.resource.
assertions, A-7 DEBUG parameter, A-6
caching, A-18 org.apache.myfaces.trinidad.UPLOAD_
compressing CSS class names, A-7 MAX_MEMORY parameter, A-6
debugging, A-5 org.apache.myfaces.trinidad.UPLOAD_
dialog prefix, A-7 TEMP_DIR parameter, A-6
Facelets, A-7 org.apache.myfaces.trinidad.webapp.Re
faces-config.xml file sourceServlet parameter, A-4
described, A-13 org.apache.myfaces.trinidad.webapp.Tr
editing, A-13 inidadFilter parameter, A-4
file upload output mode, A-23
context parameters for, A-6 pageFlowScope, A-23
custom processor, A-23 partial page navigation, A-8
framebusting, A-9 profiling, A-7
help system, A-17 resource files, A-12
javax.faces.CONFIG_FILE parameter, A-12 servlets, A-4
Index-5
state saving, A-4 best practice for properties, 30-24
suppressing component IDs, A-10 cascading style sheets, creating, 30-13, 30-37
test automation, A-7 class for, creating, 30-23
themes, A-8 client-side development, 30-15
tonal styles, A-8 debugging, 30-40
trinidad-config.xml file, A-19 deploying, 30-39
UIViewRoot caching, A-8 deployment descriptors, 30-40
web.xml file, A-1 development process, 30-2
content delivery event class, creating, 30-22
carousel components, 16-9 event JavaScript, creating, 30-17
collection components, 10-4 event listener, creating, 30-21
displayRow attribute, 10-5 faces-config.xml file
fetchSize attribute, 10-4, 16-9 adding components to, 30-27
lazy versus immediate for a carousel, 16-9 creating manually, 30-12
lazy versus immediate for tables, trees, and tree described, 30-3
tables, 10-4 JavaScript for, 30-16
menus, 14-6 JSP tags, creating, 30-31
table context menus, 10-7 overview, 30-1
context menus peer JavaScript, creating, 30-19
contentDelivery attribute for tables, 10-7 renderer, creating, 30-30
creating, 13-10 resource bundles, creating, 30-28
dynamic based on selected row, 10-8 resource kit loader, adding, 30-13
overview, 13-1 resource loader, creating, 30-36
contextInfo components server side development, 30-20
described, 13-16 skins and, 30-2
procedures for using, 13-17 tag libraries
showPopupBehavior components and, 13-17 configuring, 30-34
contextMenu facet creating, 30-13
calendar components, 15-10 trinidad-skins.xml file
collection components, 10-7 creating, 30-12
contextual information, displaying, 13-16 described, 30-3
control panel using in applications, 30-39
configure the display, 29-21 using in JSF pages, 30-41
elements in the hierarchy viewer component workspaces for, 30-9
control panel, 29-5 custom alias in skins, 20-20
hierarchy viewer component, 29-4 custom events
conversion procedures for, 5-15
adding, 6-2, 6-3 sending to server, 5-14
adding attributes, 6-4 custom shapes
convertColor tag, 6-3 gauges, described, 25-21
convertDateTime tag, 6-3 styles for gauges, 25-25
convertNumber tag, 6-3 using with gauges, 25-24
custom, creating, 6-5 customization, user
defined, 6-1 at runtime, 31-4
error messages, displaying, 17-5 implementing, 31-4
error messages, procedures for creating, 17-7 implicitly persisted attribute values, 31-1
hints for, 17-1 overview, 31-1
message queuing, 17-2 regions, 31-5
messages, displaying inline, 17-8 templates, 31-5
overview, 6-1 customPanel facet, 28-6
procedure for creating custom, 6-5
create facet, 15-10
D
cross-component refresh, 4-9
CSS. See cascading style sheets data cells
currency configuration, A-22 specifying custom images, 26-14
currency, establishing, 10-7 data filters
cursor, default, C-8 customizing in Gantt charts, 28-17
custom ADF Faces components data model project, 2-3
adf-js-features.xml file, 30-20 data object keys
best practice for JavaScript naming, 30-15 project Gantt charts, 28-9
Index-6
resource utilization Gantt chart, 28-11 queuing, 8-58
scheduling Gantt chart, 28-12 showDetail component, 8-48
data visualizaion. See ADF Data Visualization showDetailHeader component, 8-48
components showDetailItem, 8-58
dataFlavor tag, 32-3 disclosureListener attribute, 10-27
dateCustomizer attribute disconnected properties, 3-9, 3-13
defined, 15-15 DispatchComponentEvent, 5-13
using, 15-17 displayLevelsAncestor property, 29-9
DateCustomizer class, 15-17 displayRow attribute, 10-5
debugging document tag
configuration, A-5 best practice tip with templates, 19-13
enhanced output configuration in configuring, 8-13
trinidad-config.xml file, A-21 described, 8-5
performance tip for JavaScript logging, A-6 messages and, 17-2
performance tip for output, A-21 downloadActionListener tag, 18-9
declarative components downloading files
adding resources to, 19-30 described, 18-7
attributes, 19-19 procedures to implement, 18-9
best practice tip for creating, 19-22 drag and drop
component tree and, 19-30 clientDropListener attribute, 32-8
deploying, 19-27 collectionDropTarget tag, 32-9
described, 19-18 dataFlavor tag, 32-3
facetRef tags, 19-24 dragDropEndListener, 32-11
facets, 19-19 event handler code for collection
methods in, 19-19 dropListener, 32-10
overview, 19-2 event handler code for object
page fragments and, 19-21 dropListener, 32-7, 32-24
procedures for creating, 19-21 implementing
procedures for using, 19-28 for attributes, 32-4
at runtime, 19-30 for calendar components, 32-19
tag libraries, 19-20 for collection components, 32-9
declarativecomp-metadata.xml file, 19-27 for components, 32-11
decorativeBox components for single objects, 32-5, 32-21, 32-23
described, 18-11 in general, 32-4, 32-20, 32-21
procedures for using, 18-33 overview, 32-2
default cursor, C-8 at runtime, 32-7
definition help source, defined, 32-2
components supported, 17-12 target, defined, 32-2
defined, 17-3 dragDropEndListener, 32-11
described, 17-11 DropEvent
deploying dragDropEndListener, 32-11
custom ADF Faces components, 30-39 dropListener
declarative components, 19-27 for collections, 32-10
detailStamp facet for objects, 32-7, 32-24
described, 10-25 dvt:hierarchyViewer component. See hierarchy
overview, 10-10 viewer components
procedures for using, 10-26 dvt:link component. See link components, 29-2
RowDisclosureEvent, 10-27 dvt:node component. See node component
dialog framework, overview, 13-2 dvt:panelCard component. See panel card
dialogs component
configuring the prefix for, A-7
overview, 13-1
E
disabled property
making unsecure, described, 3-13 editing modes
procedures for making unsecure, 3-13 activeRowKey attribute, 10-6
disclosedRowKeys attribute, 10-36 described, 10-5
DisclosureEvent performance tip for, 10-7
described, 8-48 editingMode attribute, 10-6
immediate attribute and, 4-5 EL expressions
panelBox component, 8-48 expression builder, using, 2-27
Index-7
managed beans tree components, 10-35
resolving expressions within, 2-28 selection events
using in, 2-28 client listener, 9-24
method, adding, 2-14 collection components, 10-5
overview, 2-26 exported data and, 10-45
emailable pages listening for on tables, 10-23
described, 33-3 shuttle components and, 9-24
procedures for creating, 33-4 tables and, 10-23
at runtime, 33-6 sending custom to server
testing, 33-5 described, 5-14
enter key, C-9 procedures for, 5-15
enterContainer method, 10-31 server events
escape attribute, 16-2 listed, 5-3
establishing currency, 10-7 procedures for using, 5-4
event roots serverListener tag, 5-14
defined, 5-2 SortEvent, 10-22
partial page rendering and, 7-1 stopBubbling() function, 5-13
events unmarshalling data, 5-16
AdfActionEvent, 3-3 when processed, 4-2
AdfBaseEvent class, 3-3 exitContainer method, 10-31
AdfCustomEvent class, 5-14 exportCollectionActionListener tag, 10-42
AdfCustomEvent.queue() method, 5-14 exporting data
CalendarActivityDurationChangeEvent, described, 10-42
15-9 procedures for, 10-44
CalendarActivityEvent, 15-8 at runtime, 10-45
CalendarDisplayChangeEvent, 15-9 expression builder, 2-27
CalendarEvent, 15-8 ExtendedRenderKitService class, 5-18
CarouselSpinEvent event, 16-11 external URL help
class for custom components, 30-22 defined, 17-4
client events, 5-6 described, 17-13
client handlers, triggering, 5-11
custom components, creating for, 30-17
F
DisclosureEvent
described, 8-48 f:facet element
queuing, 8-58 See facet element
DispatchComponentEvent method, 5-13 Facelets
DropEvent configuration, A-7
dragDropEndListener, 32-11 creating pages with, 2-17
transferable object, 32-5, 32-20, 32-22 defined, 2-7
dropListener tag library configuration file for custom
for collections, 32-10 component, 30-14
for objects, 32-7, 32-24 See also JSF pages
event roots and partial page rendering, 7-1 See also XHTML pages
executing a script within a response, 5-18 faces-config.xml file, 21-12
isBubblingStopped() function, 5-13 configuration in, A-13
keyboard and mouse events, 5-7 creating manually, 30-12
listener for custom components, 30-21 creating page flows, 2-5
marshalling data custom components
defined, 5-16 adding, 30-27
from Java to JavaScript, 5-17 registering, 30-3
from JavaScript to Java, 5-16 diagrammer, using for, 2-4
naming containers and, 5-13 editing, A-13
overview, 5-1 generated code for page flows, 2-6
partial page rendering and, 5-2 generated for JSPX pages, 2-13
preventing client-side from propagating to the generated for XHTML files, 2-20
server, 5-11 renderer, adding, 30-31
returning source of, 5-9 XML menu model managed bean
root components, 5-2 configuration, 18-21
RowDisclosureEvent facet element
table components, 10-27 zoom levels, 29-10
Index-8
facetRef tags Flash images
declarative components, 19-24 custom fonts for, 23-11
page templates, 19-14 Flash player
facets hierarchy viewer component, requirement, 29-11
activityContextMenu, 15-9 flex attribute
activityDelete, 15-9 menuBar components, 14-7
activityDetail, 15-10 at runtime, 14-19
activityHover, 15-10 toolbar components, 14-16
adding to tables, 10-20 focus node, 18-13
bodyContextMenu facet, 10-8 focus placement, C-8
chartPopupMenu, 28-6 focusRowKey attribute, 10-31
column components forEach components, 10-24
adding to, 10-20 form components
described, 10-11 attributes, 9-5
contextMenu best practice tip with templates, 19-13
calendar components, 15-10 creating declaratively, 9-3
collection components, 10-7 defined, 9-3
tables, trees, 10-7 described, 8-6
create, 15-10 procedures for using, 9-5
customPanel, 28-6 forms
declarative components and, 19-19 best practice for using, 4-14
detailStamp facet, 10-10, 10-25 creating, 9-3
displaying in the visual editor, 8-17, 13-8, 13-18 fragments. See page fragments, 19-1
footer facet and the group component, 8-32 framebusting, A-9
menuBar, 28-6 funnel graphs
minor, 28-6 data requirements for, 24-10
nodeStamp, 28-6 defined, 24-4
breadCrumbs component, 18-26 tag, 24-4
carousel, 16-8 See also graph components
navigationPane components, 18-23 funnelGraph tag, 24-4
trees, 10-31 fusion-projector skin, 20-2
page templates, 19-8, 19-12
panelBorderLayout component, 8-23
G
panelCollection component, 10-40
panelHeader component, 8-59 Gantt chart components
panelLabelAndMessage components, 17-10 chart region, defined, 28-3
panelSplitter component, 8-20 context menus
panelStretchLayout component, 8-14 defined, 28-4
pathStamp, 10-32 procedures for customizing, 28-15
prompt facet in the showDetailItem creating, 28-13
component, 8-40 data filters
separator facet in panelGroupLayout procedures for customzing, 28-17
component, 8-66 data requirements for, 28-9
showDetailHeader component, 8-40 drag source, 28-24
tablePopupMenu, 28-6 drop target, 28-24
toolbar, 28-6 facets, 28-5, 28-6
features. See JavaScript features functional areas, 28-3
fetchSize attribute, 10-4, 16-9 information panel, defined, 28-3
File Explorer application legend
described, 1-15 procedures for customizing, 28-13
overview, 1-10 menu bar, defined, 28-3
file upload overview, 23-9, 28-1
configuration parameters, A-6 printing, 28-23
configuring custom, A-23 printing service, 28-4
described, 9-31 project, defined, 28-2
fileDownloadActionListener tags, 18-7 resource utilization, defined, 28-2
FilterableQueryDescriptor class, 10-28 scheduling, defined, 28-2
filtering tables table region, defined, 28-3
described, 10-27 tags, 28-5
procedures for, 10-29 task type, new, 28-16
Index-9
tasks, described, 28-4 getRemovedSet method, 10-31
time axis getRowData method, 10-31
procedures for customizing, 28-21 getSource method, 3-5, 5-9
toolbar getTags method, 15-16
buttons, defined, 28-4 global messages
defined, 28-3 displaying in popup, 17-2
procedures for customizing, 28-14 displaying inline, 17-9
types of, 23-9, 28-2 global selectors, 20-4
user interactivity, 28-6 go components
gauge components attributes, 18-5
animation, 25-19 procedures for using, 18-4
creating versus command components, 18-2
with data controls, 25-6 goButton components
with tabular data, 25-6 attributes, 18-5
custom fonts for Flash images, 23-11 described, 18-2
custom shapes, 25-21 procedures for using, 18-4
custom style class, 25-11 goImageLink components
data requirements for, 25-6 attributes, 18-5
dial, type, 25-3 described, 18-2
dynamic resizing, 25-11 procedures for using, 18-4
formatting goLink components
numbers, 25-12 attributes, 18-5
text, 25-13 described, 18-2
gauge set layout, 25-10 procedures for using, 16-6, 18-4
gradient special effects, 25-17 goMenuItem components
indicators, customizing, 25-15 described, 14-6
labels procedures for using, 14-12
changing colors and borders, 25-14 gradient
controlling position, 25-14 special effects in graph components, 24-40
customizing, 25-14 graph components
LED, type, 25-4 alerts, 24-43
overview, 23-6, 25-1 annotations, 24-43
size, changing, 25-10 area graph tag, 24-4
specifying degree of arc, 25-14 area graph, defined, 23-2
status meter, type, 25-3 areas, adding, 24-37
style, changing, 25-10 axes, defined, 24-27
thresholds background, changing, 24-25
adding, 25-11 bar graph tag, 24-4
static, 25-11 bar graph, defined, 23-2
tick labels, 25-16 bubble graph tag, 24-4
tick marks, customizing, 25-15 bubble graph, defined, 23-2
type, changing, 25-9 child tags
types of, 23-6, 25-3 common, 24-5
vertical status meter, type, 25-3 graph-specific, 24-6
Geocoder URL for map components, 27-6 set, 24-7
geographic map. See map components color, changing, 24-19
geometry management combination graph tag, 24-4
defined, 8-6 combination graph, defined, 23-2
maximized attribute, 8-13 creating with tabular data, 24-15
nesting components, 8-9 custom fonts for Flash images, 23-11
panelDashboard components, 8-38 customizations, common, 24-18
panelGroupLayout, 8-66 data requirements for, 24-7
panelSplitter component, 8-22 data sources for, creating, 24-15
panelStretchLayout component, 8-17 explicit time axis, 24-42
performance tip for child components, 8-8 footnotes, procedures to specify, 24-26
showDetailItem, 8-57 formatting
tips for, 8-12 numbers, 24-21
triggers, 8-6 text, 24-22
getAddedSet method, 10-31 funnel graph tag, 24-4
getContents() method, 21-10 funnel graph, defined, 23-2
Index-10
gradient special effects, 24-40 described, 17-11
horizontal bar graph tag, 24-4 described, 17-11
horizontal bar graph, defined, 23-2 external URL help, 17-13
labels, defined, 24-27 instruction help
legend components supported, 17-13
customzing, 24-30 described, 17-12
highlighting, 24-41 Java class help, procedures for creating, 17-21
line graph, defined, 23-2 launching in external window using
lineGraph tag, 24-5 JavaScript, 17-20
marker highlighting, 24-41 managed bean help, procedures for
overview, 23-2, 24-1 creating, 17-18
Pareto graph, defined, 23-2 overview, 17-3
pie graph tag, 24-5 provider types, 17-3
pie graph, defined, 23-2 resource bundle help, procedures for
plot area, changing, 24-25 creating, 17-14
polar graph tag, 24-5 ResourceBundleHelpProvider help
polar graph, defined, 23-3 provider, 17-13
radar graph, defined, 23-3 steps for creating, 17-13
radarGraph tag, 24-5 XLIFF help, procedures for creating, 17-16
reference lines, adding, 24-37 hierarchical menus
relative time axis, 24-42 binding XMLMenuModel class
scatter graph, defined, 23-3 to JSF pages, 18-22
scattter graph tag, 24-5 to managed beans, 18-24
scroll level, 24-42 breadcrumb links for, creating, 18-35
series breadCrumbs components
controlling number of colors, 24-20 procedures for using with a menu
procedures for changing color, 24-20 model, 18-26
procedures for changing style, 24-20 procedures for using without a model, 18-35
size, changing, 24-24 decorativeBox components and, 18-11
sparkchart, defined, 23-3 focus node, 18-13
stock graph tag, 24-5 nodeStamp facet, 18-23
stock graph, defined, 23-3 performance tip for navigation panes and
style, changing, 24-19, 24-24 breadcrumbs, 18-34
tags procedures for creating
defined, 24-3 simple, 18-32
graph-specific, 24-4 using menu model, 18-13
titles simple
changing, 24-25 described, 18-31
procedures to specify, 24-26 procedures for creating, 18-32
tooltips, customzing, 24-31 tree models, 18-13
type, changing, 24-17 XML menu model, 18-13
types of, 23-2 XMLMenuModel class, 18-12
zoom level, 24-42 XMLMenuModel metadata, procedures for
graphics creating, 18-15
custom shapes in gauges, 25-21 hierarchy viewer components
group attribute, 9-17 appearance, customizing, 29-20
group components data requirements, 29-8
described, 8-65 displayLevelsAncestor property, 29-9
footer facet and, 8-32 elements in, 29-1
panelFormLayout component, 8-30 Flash player, 29-11
images, display, 29-20
interactivity, adding, 29-16
H
menu
HandleBubbledEvent function, 5-13 invoking, 29-18
height attribute, 8-13 menus
help systems displaying, 29-16
accessing help from components, 17-23 navigating, 29-14
configuring, A-17 navigation, configure same-level, 29-15
definition help navigation, configure upward, 29-14
components supported, 17-12 node management, 29-8
Index-11
nodes, adding, 29-11 performance tips
overview, 23-10 for a carousel, 16-9
panel card for tables, trees, and tree tables, 10-4
defined, 29-4 in tables, rees, and tree tables, 10-4
elements in, 29-5 implicitly persisted attribute values, 31-1
popup window, invoking, 29-16 inlineStyle attribute, 20-22
size, adjusting, 29-20 inner node componenst, 29-10
terminology, 29-4 input components
zoom levels, 29-10 change indicator icon, 9-3
horizontal bar graphs changed attribute, 9-3
defined, 24-4 defined, 9-1
tag, 24-4 form components, 9-3
See also graph components immediate attribute and, 4-5
horizontalBarGraph tag, 24-4 inputColor components, 9-12
hot keys, C-4 inputDate components, 9-12
inputFile components, 9-31
inputNumberSlider components, 9-10
I
inputNumberSpinbox components, 9-11
icon components inputRangeSlider components, 9-10
described, 16-5 inputText components, 9-6
procedures for using outside of messages, 16-5 insertTextBehavior tag, 9-6
icon selectors, 20-4 JavaScript and, 9-19
icons panelFormLayout components and, 9-19
change indicator in input components, 9-3 required attribute, 4-13
help icons, 17-12 resetButton components, 9-4
messages, 17-3, 17-9 richTextEditor components, 9-26
overflow secret attribute, 9-6
navigationPane components, 18-34 selectBooleanCheckbox components, 9-17
panelAccordion component, 8-49 selectBooleanRadio components, 9-17
panelTabbed component, 8-51 selection components, 9-16
toolbar, 14-3, 14-14 selectItem components, 9-17
panelHeader component, 8-61 selectManyCheckbox components, 9-17
search forms, 12-5 selectManyChoice components, 9-18
selection in row header of table, 10-14 selectManyListbox components, 9-18
showDetailHeader component and, 8-44 selectOneChoice components, 9-18
skinning, 20-4, 20-18 selectOneListbox components, 9-17
status indicators, 16-13 selectOneRadio components, 9-17
trains, 18-37 simple attribute, 9-6
See also icon components subform components, 9-4
image components inputColor components
attributes, 16-6 attributes, 9-13
best practice for use in a carousel, 16-8 described, 9-12
carousel components and, 16-11 procedures for using, 9-13
described, 16-5 inputComboboxListOfValues components
overview, 16-1 described, 11-2
procedures for using, 16-6 PPR and, 4-11, 7-4
images. See image components procedures for using, 11-10
immediate attribute versus selectOneChoice components, 9-18
affects of, 4-4 inputDate components
command components, 4-4 atributes, 9-14
components with disclosure events, 4-5 described, 9-12
input components, 4-5 locale, 9-12
partial page rendering and, 4-10 performance tip for disabling weekdays, 9-15
performance tip, 4-6 procedures for using, 9-14
procedures for using, 4-8 inputFile components
validation described, 9-31
input components first, 4-6 file storage, 9-34
optimized lifecycle, 4-10 procedures for using, 9-34
immediate delivery inputListOfValues components
in carousel components, 16-9 described, 11-2
Index-12
PPR and, 4-11, 7-4 inline, using on a page, 3-4
procedures for using, 11-8 input components and, 9-19
inputNumberSlider components Java to JavaScript type map, 5-18
attributes, 9-11 JavaScript library partitioning
described, 9-10 JavaScript partitions, 1-4
procedures for using, 9-11 procedures for using, A-26
inputNumberSpinbox components JavaScript to Java type map, 5-17
attributes, 9-12 launching external help window with, 17-20
described, 9-11 marshalling data from Java to JavaScript, 5-17
procedures for using, 9-11 marshalling data from JavaScript to Java, 5-16
inputRangeSlider components output components and, 16-5
attributes, 9-11 peer, for custom components, 30-19
described, 9-10 performance tip for logging, A-6
procedures for using, 9-11 performance tip for when to include, 3-4
inputText components preventing client events from propagating to the
attributes, 9-7 server, 5-11
described, 9-6 selection components and, 9-19
insertTextBehavior tag, using, 9-9 selection events and, 9-24
procedures for using, 9-7 JavaScript features
secret attribute, 9-6 creating configuration file for, A-27
simple attribute, 9-6 creating configuration file for custom
versus richTextEditor components, 9-6 component, 30-14
insertTextBehavior tag defined, 1-4
attributes, 9-9 described, A-26
described, 9-6 JavaScript library partitioning
events and, 9-9 described, 1-4
procedures for using, 9-9 JavaScript features, 1-4
InstanceStyles class, 15-15 creating configuration file for, A-27
instruction help creating configuration file for custom
components supported, 17-13 component, 30-14
defined, 17-4 described, A-26
described, 17-12 JavaScript partitions, 1-4
internationalization, 21-1 creating configuration file for, A-28
Invoke Application phase, 4-3 described, A-26
isBubblingStopped function, 5-13 procedures for using, A-26
isCanceled function, 5-11 at runtime, A-36
isExpanded method, 8-48 JavaScript partitions
isVisible function, versus isShowing creating configuration file for, A-28
function, 3-17 defined, 1-4
iterator tags, 10-25 described, A-26
javax.faces.CONFIG_FILE parameter, A-12
javax.faces.DEFAULT_SUFFIX parameter, A-7,
J
A-12
Java javax.faces.LIFECYCLE_ID parameter, A-12
Java class help provider javax.faces.STATE_SAVING_METHOD
procedures for creating, 17-21 parameter, A-3
Java to JavaScript type map, 5-18 javax.faces.webapp.FacesServlet
marshalling data from Java to JavaScript, 5-17 parameter, A-4
marshalling data from JavaScript to Java, 5-16 JDeveloper
Javadoc, ADF Faces, 2-31 ADF Faces and, 2-1
JavaScript Component Palette, 2-21
adding to a JSF page, 3-4 creating
ADF Faces performance and, 1-3 application workspace, 2-2
blocking UI input, 5-10 JSPX pages, 2-9
client events and, 5-7 managed beans, 2-30
custom components, creating for, 30-16 page flows, 2-5
debugging in custom components, 30-40 XHTML pages, 2-17
events and, 5-8 generating backing beans automatically, 2-14
executing a script within an event response, 5-18 JavaDoc, viewing, 2-31
importing libraries on a JSF page, 3-5 overview, 1-3
Index-13
Property Inspector, 2-24 gauge, customizing, 25-14
JSF controller layout components
best practice for using with ADF Controller, 2-5 decorativeBox component, 18-11
JSF page lifecycle document tag, 8-5
conversion, 6-2 form component, 8-6
described, 4-1 group component, 8-65
example, 4-3 listed, 8-2
validation, 6-2 navigationPane components, 18-11
JSF pages nesting for geometry management, 8-9
adding JavaScript, 3-4 panelAccordion component, 8-48
best practice for layouts, 8-12 panelBorderLayout component, 8-23
configuring suffix, A-12 panelBox component, 8-46
configuring to see changes at runtime, A-12 panelCollection component, 10-3
creating panelDashboard component, 8-34
from page templates, 19-15 panelFormLayout component, 8-25
in JDeveloper, 2-7 panelGroupLayout component, 8-65
with page fragments, 19-4 panelHeader component, 8-59
custom components, using, 30-41 panelList, 8-62
document tag, 8-5 panelSplitter component, 8-18
fragments panelStretchLayout component, 8-14
described, 19-2 panelTabbed component, 8-51
procedures for using, 19-7 separator component, 8-70
generated code for, 8-6 showDetail component, 8-39
importing JavaScript libraries, 3-5 showDetailHeader component, 8-40
pageTemplateDef tags, 19-9 showDetailItem component, 8-51
quick layouts for, 2-7 spacer component, 8-69
templates tips for using, 8-12
described, 2-8 toolbar component, 14-14
user customizations and, 31-5 layouts. See page layouts
using declarative components, 19-28 lazy content delivery
versus page templates, 19-8 carousel, 16-9
See also JSPX pages menus, 14-6
See also XHTML pages performance tip for a carousel, 16-9
JSP tags, creating for custom components, 30-31 performance tip for tables, trees, and tree
JSPX pages tables, 10-4
best practice for why to use, 2-7 tables, trees, and tree tables, 10-4
faces-config.xml file generated for, 2-13 leaf node components, 29-10
generated code for, 2-10 libraries
libraries added for, 2-11 added for JSF pages, 2-11
procedures for creating, 2-9 added for XHTML pages, 2-18
trinidad-config.xml file generated for, 2-13 added when application created, 2-3
web.xml file generated for, 2-11 lifecycle
See also JSF pages autoSubmit attribute, 4-10
client-side, 4-13
configuring ID for, A-12
K
JSF page
key accelerators, C-4 described, 4-1
keyboard events, 5-7 example, 4-3
keyboard shortcuts optimized, 4-9
access keys, C-7 partial page rendering and, 4-9
for accessibility, 22-9 scopes
enter key, C-9 described, 4-15
key accelerators, C-4 illustration of, 4-16
tab traversals, C-1 line graphs
changing the appearance of, 24-34
L data requirements for, 24-10
defined, 24-5
labelAndAccessKey property, 22-4 tag, 24-5
labels See also graph components
defining in resource bundles, 22-7 lineGraph tag, 24-5
Index-14
link components selection values, totaling, 27-7
procedures for using, 29-21 specifying zoom control, 27-7
list-of-values components, 11-1 toolbar, 27-14
data model, 11-6 map themes
data model classes, 11-6 bar graph, 27-11
DemoComboboxLOVBean class example, 11-8 color, customizing, 27-9
DemoLOVBean class example, 11-8 color, defined, 27-2
inputComboboxListOfValues components customizing labels, 27-9
described, 11-2 customizing zoom levels, 27-8
procedures for using, 11-10 graph, defined, 27-2
inputListOfValues components point images, 27-10
described, 11-2 point, defined, 27-2
procedures for using, 11-8 types of, 27-1
ListOfValuesModelclass, 11-5 Map Viewer URL for map components, 27-6
Search and Select popup dialog, 11-1 marshalling data
ListOfValuesModel class defined, 5-16
creating, 11-6 from Java to JavaScript, 5-17
described, 11-5 from JavaScript to Java, 5-16
ListResourceBundle class, 21-7 Max Visited behavior, 18-39
locale maximized attribute, 8-13
calendar component and, 15-2 media
configurating in trinidad-config.xml displaying, 16-14
file, A-23 media components
defining, 21-7 attributes, 16-15
inputDate components and, 9-12 described, 16-14
registering, 21-12 overview, 16-1
resource bundles for, described, 21-2 playing media, 16-17
localization procedures for using, 16-15
described, 21-1 menu components
setting optional ADF Faces properties, 21-17 attributes, 14-8
trinidad-config.xml file options, 21-17 described, 14-2
LOV components. See list-of-values components hierarchy viewer component, invoking a
menu, 29-18
procedures for creating, 14-8
M
See also menus
managed bean help menu models
described, 17-13 performance tips with navigation panes, 18-13
procedures for creating, 17-18 steps for creating hierarchical menus, 18-13
managed beans train models, 18-38
best practice for logic to include, 2-30 menuBar components
binding to XMLMenuModel class, 18-24 attributes, 14-7
creating, 2-30 described, 14-2
described, 2-29 flex attribute, 14-7
EL expressions in, 2-28 performance tip for using in a toolbar
resolving EL expression within, 2-28 component, 14-8
train models, configuring for, 18-42 menuBar facet, 28-6
XML menu models, configuring for, 18-21 menus
See also backing beans components for, illustrated, 14-3
managed-bean element, 2-31 content delivery, 14-6
map components detachable, 14-4
bar graph theme, 27-11 overview, 14-1
base map, 27-6 procedures for creating, 14-7
data requirements for, 27-6 See also menu components
Geocoder URL, 27-6 message components
map themes, 27-1 overview, 17-2
Map Viewer URL, defined, 27-6 procedures for using, 17-8
overview, 23-8, 27-1 messages
pie graph theme, 27-12 accessing help from components, 17-23
point theme, customizing, 27-10 addMessage method, 17-2
procedures for adjusting size, 27-6 combining types, 17-23
Index-15
definition help in reusable components, 19-2
components supported, 17-12 navigation
defined, 17-3 command components, 18-2
described, 17-11 hierarchical menus using model, 18-13
displaying inline, 17-8 hierarchical menus, procedures for creating
document tag and, 17-2 simple, 18-32
external URL help hierarchical menus, procedures for creating using
defined, 17-4 model, 18-15
described, 17-13 outcomes, 18-4
global overview, 18-1
displaying, 17-2 partial page navigation, 7-7
displaying inline, 17-9 simple hierarchical menus, 18-31
versus component, 17-2 XMLMenuModel class and, 18-12
help systems navigation components
described, 17-11 commandButton components, 18-2
steps for creating, 17-13 commandImageLink components, 18-2
hints for validation and conversion, 17-1 commandLink components, 18-2
icons displayed for, 17-3, 17-9 commandNavigationItem components, 18-11
instruction help goButton components, 18-4
components supported, 17-13 goImageLink components, 18-2
defined, 17-4 goLink components, 18-4
described, 17-12 navigationPane components, 18-11
Java class help, procedures for creating, 17-21 navigation trains. See trains
JSF framework and, 17-2 navigationactionListener attribute, 18-4
managed bean help, procedures for navigationPane components
creating, 17-18 described, 18-11
overriding globally, 17-8 performance tip with menu models, 18-13
overview, 17-1 node components
panelLabelAndMessage components ancestor level for an anchor node,
described, 17-9 specifying, 29-14
overview, 17-3 anchor node component, 29-9
procedures for using, 17-10 associating with a set of data rows, 29-13
resource bundle help, creating, 17-14 content, specifying, 29-10, 29-12
ResourceBundleHelpProvider help, 17-13 controls
shortDesc, 17-1 configuring, 29-12
tips example, 29-9
displaying, 17-5 hide, 29-9
procedures for creating, 17-5 restore, 29-9
validation and conversion messages show, 29-9
displaying, 17-5 hierarchy viewer components, adding to, 29-11
displaying inline, 17-8 inner node component, 29-10
message queuing, 17-2 leaf node component, 29-10
procedures for creating, 17-7 menu, invoking, 29-18
XLIFF help, creating, 17-16 rendered property, 29-13
messages components root node component, 29-9
overview, 17-3 supported components, 29-10
procedures for using, 17-9 nodeStamp facet
method binding expressions, 2-14 breadCrumbs component, 18-26
Microsoft Excel spreadsheet, exporting data carousel components, 16-8
to, 10-42 Gantt chart components, 28-6
minor facet, 28-6 hierarchical menus, 18-23
mouse events, 5-7 navigationPane components, 18-23
MyFaces Trinidad, 1-2 tree components, 10-31
treeTable components, 10-38
numbers
N
formatting gauge metric label, 25-12
naming containers formatting in graphs, 24-21
events and, 5-13
finding components, 3-7
page templates and, 19-18
Index-16
O JavaScript and, 16-5
media components, 16-14
optimized lifecycle
outputFormatted components, 16-2
defined, 4-9
outputText components, 16-2
immediate attribute and, 4-10
statusIndicator components, 16-13
list-of-value components and, 4-11
output modes
oracle.adfinternal.view.faces.caching.fi
EL expressions and, 33-1
lter.AdfFacesCachingFilter class, A-11
email, 33-3
oracle.adf.view.rich.automation.ENABLED
print, 33-1
parameter, A-7
outputFormatted components
oracle.adf.view.rich.pprNavigation.OPTIO
attributes, 16-3
NS parameter, A-8
character codes for, 16-4
oracle.adf.view.rich.profiler.ENABLED defined, 16-2
parameter, A-7 formatting codes, 16-4
oracle.adf.view.rich.profiler.ROOT_FILE overview, 16-1
parameter, A-7 procedures for using, 16-3
oracle.adf.view.rich.security.FRAME_ styleUsage attribute, values for, 16-3
BUSTING parameter, A-9 outputText components
oracle.adf.view.rich.SUPPRESS_IDS attributes, 16-3
parameter, A-10 defined, 16-2
oracle.adf.view.rich.tonalstyles.ENABLED overview, 16-1
parameter, A-8 procedures for using, 16-3
org.apache.myfaces.trinidad.agent.email=
true parameter, 33-4
org.apache.myfaces.trinidad.CACHE_VIEW_ P
ROOT parameter, A-8 page flows
org.apache.myfaces.trinidad.CHECK_FILE_ code generated for, 2-6
MODIFICATION parameter, A-5, A-12 creating, using diagrammer, 2-5
org.apache.myfaces.trinidad.CLIENT_ page fragments
STATE_MAX_TOKENS parameter, A-5 component tree and, 19-7
org.apache.myfaces.trinidad.CLIENT_ declarative components and, 19-21
STATE_METHOD parameter, A-5 described, 19-2
org.apache.myfaces.trinidad.DEBUG_ including in JSF pages, 19-4
JAVASCRIPT parameter, A-5 overview, 19-1
org.apache.myfaces.trinidad.DIALOG_ procedures for creating, 19-5
NAVIGATION_PREFIX parameter, A-7 procedures for using in JSF pages, 19-7
org.apache.myfaces.trinidad.DISABLE_ at runtime, 19-7
CONTENT_COMPRESSION parameter, A-7 in templates, 19-14
org.apache.myfaces.trinidad.LOGGER_LEVEL web.xml file, 19-6
parameter, A-6 page layouts
org.apache.myfaces.trinidad.MAX_DISK_ best practice for acheiving correct design, 8-12
SPACE parameter, A-6 geometry management and, 8-6
org.apache.myfaces.trinidad.resource.DEB overview, 8-5
UG table of layout components, 8-2
performance tip, A-6 See also layout components
org.apache.myfaces.trinidad.resource.DEB page lifecycle. See lifecycle
UG parameter, A-6 page navigation. See navigation
org.apache.myfaces.trinidad.UPLOAD_MAX_ page templates
MEMORY parameter, A-6 adding resources to, 19-30
org.apache.myfaces.trinidad.UPLOAD_TEMP_ attributes in, 19-10
DIR parameter, A-6 component tree and, 19-2
org.apache.myfaces.trinidad.webapp.Resou creating JSF pages with, 19-15
rceServlet parameter, A-4 described, 2-8, 19-7
org.apache.myfaces.trinidad.webapp.Trini facetRef tags, 19-14
dadFilter parameter, A-4 facets, 19-8, 19-12
ouput mode configuration, A-23 fragments in, 19-14
output components naming containers and, 19-18
defined, 16-1 overview, 19-2
escape attribute, 16-2 pageTemplateDef tags, 19-9
icon components, 16-5 pagetemplate-metadata.xml file, 19-11
image components, 16-5
Index-17
performance tip for naming, 19-12 input components and, 9-19
procedures for creating, 19-11 procedures for using, 8-27
resource bundles in, 19-11 panelGroupLayout components
at runtime, 19-18 attributes, 8-67
versus JSF pages, 19-8 described, 8-65
pageFlowScope geometry management, 8-66
accessing values, 4-18 panelLabelAndMessage components
configuration, A-23 and, 17-10
defined, 4-15 procedures for using, 8-67
passing values with, 4-16 panelHeader components
using, 4-16 to 4-17 attributes, 8-61
using declaratively, 4-18 described, 8-59
in Java code facets, 8-59
pages. See JSF pages, 19-1 icons displayed in, 8-61
pageTemplateDef tags, 19-9 procedures for using, 8-61
pagetemplate-metadata.xml file, 19-11 panelLabelAndMessage components
panel card components attributes, 17-10
procedures for using, 29-18 described, 17-9
showDetailItem tag, 29-18 facets, 17-10
panel windows overview, 17-3
creating, 13-8 panelGroupLayout components and, 17-10
overview, 13-1 procedures for using, 17-10
panelAccordion components panelList components
attributes, 8-52 attributes, 8-63
described, 8-48 described, 8-62
overflow icons, 8-49 nesting, 8-64
performance tip, 8-52 procedures for using, 8-63
procedures for using, 8-52 panelSplitter components
panelBorderLayout components attributes, 8-20
described, 8-23 described, 8-18
facets, 8-23 facets, 8-20
procedures for using, 8-25 geometry management, 8-22
panelBox components procedures for using, 8-20
attributes, 8-46 panelStretchLayout components
background color, 8-42 attributes, 8-16
disclosed attribute, 8-48 facets, 8-15
disclosureEvent events, 8-48 geometry management and, 8-17
panelDashboard components and, 8-34 performance tip, 8-15
procedures for using, 8-46 procedures for using, 8-16
showDetailHeader component and, 8-41 when to use, 8-14
toolbar component, 8-47 panelTabbed components
panelCollection components attributes, 8-53
described, 10-40 described, 8-51
facets, 10-40 performance tip, 8-52
menu and toolbar items, 10-41 procedures for using, 8-53
overview, 10-3 Pareto graphs
procedures for using, 10-42 customzing, 24-35
panelDashboard components data requirements for, 24-11
attributes, 8-37 defined, 24-5
described, 8-34 tag, 24-5
geometry management, 8-38 See also graph components
procedures for using, 8-36 paretoGraph tag, 24-5
panelDashboardBehavior tag partial page navigation
component tree and, 8-35 configuration, A-8
described, 8-35 described, 7-7
procedures for using, 8-38 turning on, 7-7
panelFormLayout components partial page rendering
attributes, 8-27 accessibility and, 22-8
described, 8-25 addPartialTarget() method, 7-6
group component and, 8-30 autoSubmit attribute, 7-3
Index-18
back button and, 7-6 breadcrumbs, 18-34
connecting pivot table components, 26-7 panelAccordion components, 8-52
defined, 1-5, 4-9, 7-1 panelStretchLayout components, 8-15
enabling declaratively, 7-4 panelTabbed components, 8-52
enabling pivot table, 26-7 rendered attribute, 3-15
events and, 5-2 state saving, A-5
immediateattribute and, 4-10 template naming, 19-12
lifecycle and, 4-9 toolbox components, 14-16
partial page navigation, 7-7 visible attribute, 3-15
partialSubmit attribute, 7-3 personalization. See customization, user
programmatic pie graph theme
how to use, 7-6 slices, 27-12
when to use, 7-6 pie graphs
screen readers and, 7-6 changing the appearance, 24-33
selectBooleanRadio components, 7-5 data requirements for, 24-11
target component, 7-2 defined, 24-5
trigger component, 7-2 exploding slice, specifying, 24-33
valueChangeEvent, 7-3 ring type, 24-11
partialSubmit attribute tag, 24-5
partial page rendering and, 7-3 See also graph components
versus autoSubmit attribute, 7-4 pieGraph tag, 24-5
partialTriggers attribute, 7-4, 26-7 pivot table components
partitions. See JavaScript partitions column edges, 26-2
pathStamp facet, 10-32 customizing cell content, 26-9
peers data cell
defined, 1-4, 3-1 defined, 26-3
DispatchComponentEvent method, 5-13 editing, 26-13
JavaScript for custom components, 30-19 stamping, 26-13
updating property values, 3-9 data requirements for, 26-3
performance tips formatting
assertions, A-7 styles, 26-10
carousel components, 16-12 text, 26-10
CHECK_FILE_MODIFICATION context header cells, 26-3
parameter, A-6 layers, 26-3
child components and geometry overview, 23-8, 26-1
management, 8-8 pivoting layers, 26-3
client events, propagating to server, 5-6 procedure for customizing pivoting, 26-4
clientComponent attribute, 3-6 Qualified Data Reference, defined, 26-3
column stretching, 10-12 row edges, 26-2
compression of CSS class names, A-7 selection in, 26-5
editing modes, 10-7 sizing, 26-6
enhanced debugging in trinidad-config.xml sorting in, 26-6
file, A-21 specifying custom images for data cells, 26-14
file modification, checking for, A-6 stoplighting and conditional formatting, 26-12
geometry management and child Plus One behavior, 18-39
components, 8-8 polar graphs
immediate attribute, 4-6 data requirements for, 24-11
inputDate components, 9-15 defined, 24-5
JavaScript, when to include, 3-4 tag, 24-5
lazy delivery versus immediate delivery for a See also graph components
carousel, 16-9 polarGraph tag, 24-5
lazy delivery versus immediate delivery for tables, popups
trees, and tree tables, 10-4 automatic dismissal, 13-18
logging, A-6 calendar components, creating for, 15-10
menuBar components, 14-8 in collection components, 10-7
navigation panes and menu models, 18-13 creating, 13-2
nested components, 8-8 overview, 13-1
org.apache.myfaces.trinidad.resource. preventUserInput function, 5-10
DEBUG parameter, A-6 printable pages
overflow with navigation panes and creating, 33-2
Index-19
described, 33-1 using, 8-11
Gantt charts, 28-23
showPrintablePageBehavior tag, 33-1
R
Process Validations phase, 4-2
ProcessMenuModel class, 18-41 radar graphs
profiling, configuration, A-7 data requirements for, 24-12
programmatic partial page rendering, 7-6 defined, 24-5
project Gantt charts tag, 24-5
data object keys, 28-9 See also graph components
data requirements, 28-9 radarGraph tag, 24-5
See also Gantt chart components ramps
properties calendar component, 15-16
disconnected, defined, 3-9, 3-13 defined, 8-42
secured, defined, 3-9 panelBox component, 8-42
setting values on client components, 3-13 reading direction, configuration, A-22
Property Inspector regions, 4-14
described, 2-24 registering event handlers, 5-7
procedures for using, 2-25 removeAll method, 10-36
provider, calendar RemovedSet objects, 10-35
defined, 15-1 Render Response phase, 4-3
overview, 15-4 rendered attribute
procedures for creating, 15-6 defined, 3-15
pseudo-elements, 20-4 performance tip for when to use, 3-15
versus visible attribute, 3-15
rendered property
Q node components, 29-13
query components renderers
adding components to a page, 12-17 custom components, 30-30
advanced mode, 12-3, 12-16 faces-config.xml file, 30-31
basic mode, 12-3, 12-16 RequestContext EL implicit object, A-24
compact mode, 12-17 requestScope, 4-15
creating query model classes, 12-4 required attribute
described, 12-14 defined, 4-13
LOV components usage in, 12-15 Process Validations phase, 4-2
procedures for using, 12-17 resetActionListener tags, 18-9
query model for, 12-3 resetButton components
QueryEvent eventQueryEvent event, 12-4 described, 9-4
QueryListener handler, 12-4 procedures for using, 9-6
QueryOperationEvent event, 12-3 resetting values, 18-9
QueryOperationListener handler, 12-3 resource bundle help
resultComponentId attribute, 12-1 described, 17-13
saved searches, 12-2 procedures for creating, 17-14
search criteria rendered components, 12-14 resource bundles
seeded searches, 12-2 automatic integration in JDeveloper, 21-3
simple mode, 12-17 custom components, 30-28
QueryDescriptor class, 12-4 defined, 21-7
QueryListener handler, 12-4 defining base bundle, 21-8
QueryModel class, 12-3 defining labels and access keys, 22-7
QueryModel class diagram, 12-4 Java class, 21-9
QueryOperationEvent event, 12-3 in page templates, 19-11
QueryOperationListener handler, 12-3 property file, 21-8
quick query components, 12-10 registering in faces-config.xml file, 21-12
creating the component using a model, 12-11 search algorithm, 21-7
creating the component without a model, 12-12 setting options, 21-4
using managed bean to switch to query in skins, 20-16
components, 12-11 XLIFF file, 21-9
quick start layouts resource debugging
described, 2-7 configuration parameters, A-6
generated code for, 2-10 performance tip for, A-6
themes, shown with, D-1 resource files, configuration, A-12
Index-20
resource kit loader, 30-13 scheduling Gantt chart
resource loader, 30-36 data object keys, 28-12
resource strings, 20-5 data requirements, 28-12
resource utilization Gantt charts See also Gantt chart components
data object keys, 28-11 scopes, 4-15
data requirements, 28-11 screen readers
See also Gantt chart components partial page rendering and, 7-6
ResourceBundle class, 21-7 scroll levels
ResourceBundleHelpProvider help in graphs, 24-42
provider, 17-13 scrollComponentIntoViewBehavior tag, 5-20
resources Search and Select popup dialog, 11-1
adding to declarative components, 19-30 secret attribute, 9-6
adding to templates, 19-30 secured properties, 3-9
Restore View phase, 4-2 seeded searches, 12-2
resultComponentId attribute, 12-1 selectBooleanCheckbox components
ReturnPopupEvent, list-of-value components attributes, 9-20
and, 4-12 described, 9-17
richTextEditor components procedures for using, 9-20
adding insert behavior, 9-29 selectBooleanRadio components
attributes, 9-28 attributes, 9-20
described, 9-26 described, 9-17
overview, 9-2 group attribute and, 9-17
procedures for using, 9-28 partial page rendering and, 7-5
toolbar procedures for using, 9-20
customizing, about, 9-27 selection components
customizing, procedures for, 9-30 described, 9-16
versus inputText components, 9-6 JavaScript and, 9-19
richTextEditorInsertBehavior tag overview, 9-2
described, 9-27 procedures for using, 9-20
procedures for using, 9-29 tables and, 10-24
right-to-left pseudo-class, 20-6 selection events
root components client listener for, 9-24
described, 5-2 clientListener tag, 9-25
partial page rendering and, 7-1 collection components, 10-5
See also visual root components exported data and, 10-45
root node component, 29-9 listening for on tables, 10-23
row selection shuttle components and, 9-24
collection components, 10-5 tables and, 10-23
context menu based on, 10-8 selectItem components
RowDisclosureEvent event defined, 9-2
table components, 10-27 described, 9-17
tree components, 10-35 shuttle components and, 9-22
rowDisclosureListener method, 10-35 selectManyCheckbox components
RowKeySet object attributes, 9-20
table components, 10-23 described, 9-17
tree components, 10-36 procedures for using, 9-20
rowSelection attribute, 10-5 selectManyChoice components
attributes, 9-20
described, 9-18
S
procedures for using, 9-20
saved searches, 12-2 selectManyListbox components
Scalable Vector Graphics attributes, 9-20
gauge custom shapes file, 25-21 described, 9-18
supported features in gauge, 25-24 procedures for using, 9-20
scatter graphs selectManyShuttle components
data requirements for, 24-12 attributes, 9-23
defined, 24-5 described, 9-21
tag, 24-5 procedures for using, 9-23
See also graph components selectOneChoice
scatterGraph tag, 24-5 best practice for large number of items, 9-18
Index-21
selectOneChoice components contextInfo components and, 13-17
attributes, 9-20 hierarchy viewer components, invoking a popup
compact mode, 9-18 window, 29-16
described, 9-18 triggerType property, 29-16
procedures for using, 9-20 showPrintablePageBehavior tag, 33-1
selectOneListbox components procedures for using, 33-2
attributes, 9-20 shuttle components
described, 9-17 attributes, 9-23
procedures for using, 9-20 described, 9-21
selectOneRadio components procedures for using, 9-23
attributes, 9-20 selection events, 9-24
described, 9-17 selectItem components and, 9-22
procedures for using, 9-20 simple attribute, 9-6
selectOrderShuttle components simple skin, 20-2
attributes, 9-23 sizing
described, 9-21 in a pivot table, 26-6
procedures for using, 9-23 procedure for resizing pivot table rows and
separator components columns, 26-7
described, 8-70 procedure for setting pivot table overall size, 26-6
procedures for using, 8-70 skins
server events accessibility profile, 20-7
listed, 5-3 adding, 20-10
procedures for using, 5-4 applying
serverListener tag, 5-14 to icons, 20-18
servlet mapping configuration, A-4 to messages, 20-18
sessionScope, 4-15 to text, 20-16
setPropertyListener tags blafplus-medium, 20-2
rows, passing as a value, 10-39 blafplus-rich, 20-2
setting values with, 4-18 cascading style sheets, 20-1
setRowIndex method, 10-31 changing dynamically, 20-21
setRowKey method, 10-31 configuration in trinidad-config.xml
shortDesc attribute, 17-1 file, 20-7, A-21
showDetail components configuration in web.xml file, 20-14
attributes, 8-43 custom alias, 20-20
described, 8-39 custom components, 30-2
disclosed attribute, 8-48 deploying to a JAR, 20-24
disclosureEvent events, 8-48 fusion-projector, 20-2
facets, 8-40 global selectors, 20-4
procedures for using, 8-43 icon selectors, 20-4
showDetailHeader components icons, 20-18
attributes, 8-44 inlineStyle attributes, 20-22
described, 8-40 pseudo-elements, 20-4
disclosed attribute, 8-48 registering, 20-11
disclosureEvent events, 8-48 resource bundle, 20-16
facets, 8-41 resource strings, 20-5
icons displayed in, 8-44 right-to-left pseudo-class, 20-6
nesting, 8-41 simple, 20-2
panelBox component and, 8-41 style classes, 20-23
panelHeader component and, 8-41 style properties, 20-1
procedures for using, 8-44 style selectors, 20-1
showDetailItem components themes, 20-19
attributes, 8-54 SortEvent, 10-22
configuring flexibility, 8-55 sorting
described, 8-51 column component, 10-13
disclosureEvent, 8-58 data in pivot tables, 26-6
geometry management, 8-57 table component, 10-13
procedures for using, 8-54 source, in drag and drop, 32-2
showDetailItem element spacer components
panel card components, using in, 29-18 described, 8-69
showPopupBehavior tag procedures for using, 8-70
Index-22
stamping exporting data
carousel components, 16-8 described, 10-42
table components, 10-10 procedures for, 10-44
tree components, 10-31 facets, adding, 10-20
state saving FilterableQueryDescriptor class, 10-28
configuration, A-4 filtering
performance tips, A-5 described, 10-27
status indicators. See statusIndicator components procedures for, 10-29
statusIndicator components forEach components and, 10-24
described, 16-13 formatting, 10-11
procedures for using, 16-14 iterator tags and, 10-25
stock graphs menus and toolbars, 10-41
data requirements for, 24-13 overview, 10-1
defined, 24-5 performance tip for column stretching, 10-12
high-low-close type, 24-13 procedures for using, 10-14
high-low-close with volume type, 24-13 row selection
open-close candle type, 24-14 configuring, 10-14
open-close with volume candle type, 24-14 described, 10-5
open-high-low-close candle type, 24-15 rowDisclosureEvent event, 10-27
open-high-low-close type, 24-13, 24-14 RowKeySet object, 10-23
open-high-low-close with volume candle rows, passing as a value, 10-39
type, 24-15 at runtime, 10-22
open-high-low-close with volume type, 24-14 selected rows, performing action on, 10-23
tag, 24-5 selection components and, 10-24
See also graph components sorting programmatically, 10-22
stockGraph tag, 24-5 stamping, 10-10
stopBubbling() function, 5-13 tablePopupMenu facet, 28-6
stoplighting tabular data
in pivot table components, 26-12 creating gauges with, 25-7
style classes creating graphs with, 24-15
custom gauge component, 25-11 tag libraries
procedures for defining, 20-23 custom components
style properties configuration, 30-34
changing in graph components, 24-19 creating for, 30-13
defined, 20-1 declarative components, 19-20
style selectors, 20-1 target component
styleUsage attribute, 16-3 in drag and drop, 32-2
subform components in partial page rendering, 7-2
attributes, 9-5 templates
best practice for using, 4-14 application templates, 2-2
default attribute, 4-14 quick start layouts, 2-7
defined, 9-4 See also page templates
procedures for using, 9-5 test automation, configuration parameters, A-7
text
formatting in gauge, 25-13
T
formatting in graph components, 24-22
tab traversals, C-1 themes
table components configuration parameters, A-8
addselectionListener method, 10-23 described, 20-19
attributes, 10-14 quick start layouts and, D-1
column components, 10-11 tick labels
content delivery, 10-4 gauges, 25-16
context menus, 10-7 time axis in Gantt charts, 28-21
defined, 10-2 time zones
described, 10-9 calendar components, 15-2, 15-7
detailStamp facet configuration in trinidad-config.xml
described, 10-25 file, A-21
procedures for using, 10-26 tips
dialogs in, 10-7 displaying for components, 17-5
editing mode, 10-5 procedures for creating, 17-5
Index-23
tonal styles transferable objects
configuration parameters, A-8 calendar components, 32-19
toolbar buttons drop events for other components, 32-5, 32-20,
described, 14-13 32-22
See also commandToolbarButton components tree components
toolbar components addAll method, 10-36
attributes, 14-16 AddedSet objects, 10-35
described, 14-14 attributes, 10-32
flex attribute, 14-16, 14-19 child components allowed, 10-31
in headers, 14-20 ChildPropertyTreeModel class, 10-30
procedures for using, 14-15 content delivery, 10-4
runtime, determining size, 14-19 context menus, 10-7
See also toolbars described, 10-29
toolbar facet, 28-6 dialogs in, 10-7
toolbars editing mode, 10-5
calendar components enterContainer method, 10-31
customizing, 15-12 exitContainer method, 10-31
described, 15-2 exporting data
described, 14-13 described, 10-42
overview, 14-1 procedures for, 10-44
panelCollection component, 10-40 focusRowKey attribute, 10-31
richTextEditor components formatting, 10-11
customizing, 9-27 getAddedSet method, 10-31
tables, 10-40 getRemovedSet method, 10-31
See also toolbar components getRowData method, 10-31
toolbox components menus and toolbars, 10-41
described, 14-3, 14-14 nodes
performance tip, 14-16 accessing, 10-31
procedures for using, 14-15 expanding and collapsing
toolboxLayout attribute, 9-30, 15-13 programmatically, 10-35
train components making current, 10-31
described, 18-37 manipulating, 10-31
menu models, 18-38 selecting programmatically, 10-37
procedures for using, 18-46 nodeStamp facet, 10-31
train stop, 18-37 overview, 10-2
trainButtonBar component, 18-37 pathStamp facet, 10-32
See also trains procedures for using, 10-32
train models removeAll method, 10-36
binding to JSF pages, 18-46 RemovedSet objects, 10-35
described, 18-38 row selection
managed beans, configuring for, 18-42 described, 10-5
procedures for creating, 18-40 RowDisclosureEvent, 10-35
train stops, 18-37 rowDisclosureListener method, 10-35
trainButtonBar components, 18-37 RowKeySet class, 10-36
trains rows, passing as a value, 10-39
binding train model to JSF page, 18-46 runtime, 10-35
described, 18-37 setRowIndex method, 10-31
managed beans, configuring for, 18-42 setRowKey method, 10-31
Max Visited, 18-39 stamping, 10-10, 10-31
Plus One behavior, 18-39 TreeModel class, 10-30
ProcessMenuModel class, 18-41 tree models
simplified binding, explained, 18-39 defined, 18-13
steps for creating, 18-39 menu models, 18-13
train model, procecdures for creating, 18-40 trains and, 18-38
train stop, 18-37 TreeModel class, 10-30
trainButtonBar component, 18-37 treeTable components
TrainStopModel class, 18-38 column components, 10-11
tree models and, 18-38 content delivery, 10-4
See also train components context menus, 10-7
TrainStopModel class, 18-38 described, 10-37
Index-24
dialogs in, 10-7 creating a backing bean method, 6-13
editing mode, 10-5 custom, creating, 6-12
exporting data defined, 6-1
described, 10-42 error messages
procedures for, 10-44 displaying, 17-5
formatting, 10-11 procedures for creating, 17-7
menus and toolbars, 10-41 hints for, 17-1
nodeStamp facet, 10-38 message queuing, 17-2
overview, 10-3 messages, displaying inline, 17-8
procedures for using, 10-39 overview, 6-1
row selection validateByteLength tag, 6-10
described, 10-5 validateDateRestriction tag, 6-10
rows, passing as a value, 10-39 validateDateTimeRange tag, 6-11
stamping, 10-10 validateDoubleRange tag, 6-11
trigger component, 7-2 validateLength tag, 6-11
triggerType property validateLongRange tag, 6-11
showPopupBehavior tag, 29-16 validateRegExp tag, 6-11
trinidad-config.xml file ValueChangeEvent
accessibility, A-21 list-of-value components and, 4-12
accessibility profile, defining, 20-7 partial page rendering and, 7-3
animation, A-20 selection components and, 9-17
configuration, A-19 view project, 2-3
configuring for accessibility, 22-2 viewScope, 4-15
currency configuration, A-22 visible attribute
editing, A-19 defined, 3-15
enhanced debugging configuration, A-21 isShowing function, 3-17
file upload processor, A-23 performance tip for when to use, 3-15
generated for JSPX pages, 2-13 using, 3-16
generated for XHTML files, 2-21 versus rendered attribute, 3-15
locale configuration, A-23 visual root components, 8-5
localization properties, 21-17
output mode, A-23
W
pageFlowScope, A-23
reading direction, A-22 WAI-ARIA accessibility standards. See accessbility
RequestContext EL implicit object, A-24 web pages. See JSF pages, 19-1
skin family conifguration, A-21 web.xml file
time zone configuration, A-21 adding configuration elements to, A-3
trinidad-skins.xml file automatic configuration for, A-2
configuration in, A-24 configuring, A-1
creating manually, 30-12 generated, 2-3
custom components, 30-3 generated for JSPX pages, 2-11
generated for XHTML files, 2-18
javax.faces.CONFIG_FILE parameter, A-12
U javax.faces.DEFAULT_SUFFIX
UIViewRoot caching configuration parameters, A-8 parameter, A-7, A-12
unmarshalling data, 5-16 javax.faces.LIFECYCLE_ID parameter, A-12
unsecuring the disabled property javax.faces.STATE_SAVING_METHOD
described, 3-13 parameter, A-3
procedures, 3-13 javax.faces.webapp.FacesServlet
Update Model Values phase, 4-3 parameter, A-4
UploadedFile class, 9-32 oracle.adf.view.rich.automation.ENABL
UploadedFileProcessor class, 9-35 ED parameter, A-7
uploaded-file-processor element, 9-35 oracle.adf.view.rich.pprNavigation.OP
user customization. See customization, user TIONS parameter, A-8
oracle.adf.view.rich.profiler.ENABLED
parameter, A-7
V
oracle.adf.view.rich.profiler.ROOT_
validation FILE parameter, A-7
adding, 6-9 oracle.adf.view.rich.tonalstyles.ENAB
client-side and lifecycle, 4-13 LED parameter, A-8
Index-25
org.apache.myfaces.trinidad.CACHE_ procedures for creating, 18-15
VIEW_ROOT parameter, A-8
org.apache.myfaces.trinidad.CHECK_
Z
FILE_MODIFICATION parameter, A-5, A-12
org.apache.myfaces.trinidad.CLIENT_ zoom levels
STATE_MAX_TOKENS parameter, A-5 facet element, 29-10
org.apache.myfaces.trinidad.CLIENT_ in graphs, 24-42
STATE_METHOD parameter, A-5 hierarchy viewer components, 29-10
org.apache.myfaces.trinidad.DEBUG_ map components, 27-7
JAVASCRIPT parameter, A-5 map theme, 27-8
org.apache.myfaces.trinidad.DIALOG_
NAVIGATION_PREFIX parameter, A-7
org.apache.myfaces.trinidadinternal.D
ISABLE_CONTENT_COMPRESSION
parameter, A-7
org.apache.myfaces.trinidad.LOGGER_
LEVEL parameter, A-6
org.apache.myfaces.trinidad.MAX_DISK_
SPACE parameter, A-6
org.apache.myfaces.trinidad.resource.
DEBUG parameter, A-6
org.apache.myfaces.trinidad.UPLOAD_
MAX_MEMORY parameter, A-6
org.apache.myfaces.trinidad.UPLOAD_
TEMP_DIR parameter, A-6
org.apache.myfaces.trinidad.webapp.Re
sourceServlet parameter, A-4
org.apache.myfaces.trinidad.webapp.Tr
inidadFilter parameter, A-4
page fragments and, 19-6
workspaces
application workspace, 2-2
custom components, 30-9
X
XHTML pages
best practice for why to use, 2-7
generated code for, 2-18
libraries added for, 2-18
procedures for creating, 2-17
trinidad-config.xml file generated for, 2-21
web.xml file generated for, 2-18
See also Facelets
See also JSF pages
XLIFF format, 21-7, 21-9
XLIFF help
described, 17-13
procedures for creating, 17-16
XML menu models
binding components to, 18-23
described, 18-13
XMLMenuModel class
binding to JSF pages, 18-22
binding to managed bean, 18-24
custom attributes for, 18-29
described, 18-12, 18-13
XMLMenuModel metadata file
described, 18-14
elements, 18-18
Index-26