Class: cWebTreeView

Properties  Events  Methods    Index of Classes

The Web Framework treeview control

Hierarchy

cObject
---cWebObject
------cWebBaseUIObject
---------cWebBaseDEOServer
------------cWebBaseControl
---------------cWebTreeView

Library: Web Application Class Library

Package: cWebTreeView.pkg

Description

Use the cWebTreeView class to display a hierarchical list of items, such as the headings in a document, the entries in an index, or the files and folders on a disk. Each item consists of a label and an image, and each item can have a list of sub-items associated with it. By clicking an item, users can expand and collapse the associated list of sub-items.



Sample

This example demonstrates a treeview object that is populated with two root items (labeled "Environment" and "Editor"). Each root item also contains multiple child items.

The OnLoadChildNodes event is used to populate the treeview. This event will pass back an array of tree items. Each member of the array describes a single item in the treeview. See Creating the Tree Items (below) for more information.

Object oCategoryTree is a cWebTreeView
    Set pbServerOnSelect to True

    Function OnLoadChildNodes String sId String sValue ;
                              Integer iLevel Returns tWebTreeItem[]
        tWebTreeItem[] aItems
        
        // Populate Root Level Items
        // ~~~~~~~~~~~~~~~~~~~~~~~~~
        If (iLevel = 0) Begin
            Move 10             to aItems[1].sId
            Move sId            to aItems[1].sParentId
            Move "Environment"  to aItems[1].sName
            Move True           to aItems[1].bLoadChildren
            Move True           to aItems[1].bFolder
            Move (WebObjectName(oGeneral)) to aItems[1].sValue
            
            Move 20             to aItems[2].sId
            Move sId            to aItems[2].sParentId
            Move "Editor"       to aItems[2].sName
            Move True           to aItems[2].bLoadChildren
            Move True           to aItems[2].bFolder
            Move (WebObjectName(oEditor)) to aItems[2].sValue
        End
        Else Begin
            // Populate Sub-pages
            // ~~~~~~~~~~~~~~~~~~
            Case Begin
                Case (sID = 10)
                    Move 11        to aItems[0].sId
                    Move sId       to aItems[0].sParentId
                    Move "General" to aItems[0].sName
                    Move False     to aItems[0].bLoadChildren
                    Move False     to aItems[0].bFolder
                    Move (WebObjectName(oGeneral)) to aItems[0].sValue

                    Move 12        to aItems[1].sId
                    Move sId       to aItems[1].sParentId
                    Move "Layout"  to aItems[1].sName
                    Move False     to aItems[1].bLoadChildren
                    Move False     to aItems[1].bFolder
                    Move (WebObjectName(oLayout)) to aItems[1].sValue
                    Case Break
                    
                Case (sID = 20)
                    Move 21        to aItems[0].sId
                    Move sId       to aItems[0].sParentId
                    Move "Editor"  to aItems[0].sName
                    Move False     to aItems[0].bLoadChildren
                    Move False     to aItems[0].bFolder
                    Move (WebObjectName(oEditor)) to aItems[0].sValue

                    Move 22        to aItems[1].sId
                    Move sId       to aItems[1].sParentId
                    Move "Misc"    to aItems[1].sName
                    Move False     to aItems[1].bLoadChildren
                    Move False     to aItems[1].bFolder
                    Move (WebObjectName(oMisc)) to aItems[1].sValue
                    Case Break
            Case End
        End
        
        Function_Return aItems
    End_Function

    Procedure OnSelect String sId String sValue Integer iLevel
        Handle hoCard
        
        Forward Send OnSelect sId sValue iLevel
        
        If (sValue <> "") Begin
            // Show the object pointed to by sValue
            Get WebObjectByName sValue to hoCard
            
            If (hoCard <> 0) Begin
                Send Show to hoCard
            End
        End
    End_Procedure
End_Object


Object Name

The Web Framework uniquely identifies each web object via a combination of the object hierarchy (object nesting), and object name. This means that web object names must be unique within their parent (i.e. each sibling web object must have a unique name).

Object Placement

Treeview controls must be placed within a web container (e.g. cWebPanel, cWebView or cWebModalDialog).

Treeview controls may not be nested inside other web controls. You may not mix web panels and web controls as sibling objects.

WebContextMenu Support

cWebContextMenu support is provided through the
C_WebUIContextTreeviewFolder and C_WebUIContextTreeviewItem Contexts, then the psContextValue
property will be filled with a comma separated list of items.

Creating the Tree Items

The OnLoadChildNodes event is used to populate the treeview. This event will pass back an array of tree items. Each member of the array describes a single item in the treeview.

Each item is assigned a unique ID. This can be any value and is used to identify each individual tree item.

The OnLoadChildNodes event works in two phases:
- The first phase is when the treeview object is first loaded to the client. The OnLoadChildNodes event is called and will load the treeview's root items. In this phase, the passed iLevel parameter is 0. This value is tested to determine which tree items to send back to the client.
- The second phase is called each time a tree item is expanded. In this case the passed iLevel parameter represents tree level that is being expanded and the passed sID value is the item ID of the parent tree item that is being expanded. This information is used at the server to determine which tree items should be passed back to the client when a particular item is expanded.

Each tree item can be assigned the following information:
- sID - This can be any string or numeric value that uniquely identifies the tree item. This must be assigned during OnLoadChildNodes.
- sParentID - This is the ID of the parent tree item, or 0 if it is a root item. You should set this to the sID parameter passed into OnLoadChildNodes.
- sName - This is the label that will be displayed in the treeview for each tree item.
- sAltText - This is displayed as a tooltip when the mouse is hovered over a tree item.
- sValue - This is an optional piece of data pertaining to the tree item. This can be used to store application specific data.
- sCSSClass - This is an optional CSS class that can be applied to the tree item. The CSS class should be defined somewhere in your Web Application CSS (usually in your application.css file).
- sIcon - This is the name of an image file that can be displayed for a tree item. If you leave this blank then a pre-defined image will be shown. The pre-defined image is based on the current theme CSS (psTheme) and whether the item represents a folder or not.
- bFolder - Set this value to True or False: True indicates that the tree item represents a folder (or branch), False indicates that the tree item represents a leaf. This is used to determine which icon will be used from the current CSS theme to represent the item (assuming the sIcon member is not specified).
- bLoadChildren - Set this to True to indicate that the tree item can be expanded to reveal child tree items (i.e. the item is expandable).
- bExpanded - Do not set this member directly. This will be assigned by the framework. If True, it indicates that the tree item is currently in the expanded state.

Inserting Tree Items

Send InsertNode to add a new node to a treeview.

Object oTree is a cWebTreeView
    { WebProperty=True }
    Property Integer piNextID 100
    // ...
End_Object

Object oAddChildBtn is a cWebButton
    Set piColumnSpan to 1
    Set piColumnIndex to 1
    Set psCaption to "Add Child"                

    Procedure OnClick
        tWebTreeItem TreeNode
        Integer iID
        String sID sParentID

        WebGet psSelectedId of oTree to sParentID
        WebGet piNextID of oTree to iID
        WebSet piNextID of oTree to (iID + 1)
        Move iID to sID

        Move sID to TreeNode.sId
        Move sParentID to TreeNode.sParentId
        Move ("Root " + sID) to TreeNode.sName
        Move False to TreeNode.bFolder

        Send InsertNode of oTree TreeNode
    End_Procedure
End_Object

In the above example, the OnClick event of the button object creates a new tree item in the cWebTreeView object as a child of the currently selected tree item. The web property psSelectedID is retrieved to get the item ID of the currently selected tree item. A custom web property (piNextID) has been created to maintain the next sequential ID to use when creating a new item.

Removing Tree Items

Send RemoveNode to remove a tree item and all of its child items.

Object oRemoveBtn is a cWebButton
    Set piColumnIndex to 2
    Set psCaption to "Remove"

    Procedure OnClick
        String sID
        WebGet psSelectedId of oTree to sID
        Send RemoveNode of oTree sID
   End_Procedure
End_Object

In the above example the button object's OnClick event has been coded to remove the currently selected item of the tree view object (oTree).

Updating Tree Items

Send UpdateNode to modify a single tree item.

Send UpdateSubNodes to replace all children of a given tree item with a new set of child items.

Send FullRefresh to replace all items in the treeview. This will first remove all tree items, then call the OnLoadChildNodes event to re-populate the root items.

Accessing the Selected Items

Item selection can be handled on the server by writing DataFlex code. Item selection can also be handled on the client (browser) by writing JavaScript code. Writing a server-side DataFlex handler is the simplest way to handle item selection events.

Set pbServerOnSelect to True to enable the OnSelect event at the server. By default, this property is False, which disables the server OnSelect event. Write an OnSelect event handler in your treeview object to perform some action whenever a new tree item is selected. The OnSelect event is passed the ID, value and tree level of the selected item.

To write a client-side button click handler using JavaScript, set the psClientOnSelect property to the name of the JavaScript function that will execute when a new tree item is selected.

Manipulating the Tree Items

Send Expand to expand a single tree item and display its child items (if any).

Send Collapse to collapse a single tree item.

Send CollapseAll to collapse all parent tree items. Only the root items will be shown.

Send Select to programmatically select a tree item.

Size and Location

Web controls are positioned by HTML flow layout (left to right, top to bottom). The relative position of the control in this flow is determined by the location of the object declaration in your code.

In addition to the flow layout, each web container is divided into a fixed number of equal-width columns (piColumnCount). Child controls are aligned to these columns to determine their horizontal position and width.

Set piColumnIndex to position a treeview control in a particular column of the parent container.

Set piColumnSpan to determine the width of the treeview control i.e., the number of columns occupied by the control. The actual width is determined by the number of columns and the width of the parent container.

For more information, see Positioning and Layout of Controls.

Each treeview control has a pre-determined height according to the web application's CSS theme (psTheme). Set piHeight to override the default treeview height. You can also configure a treeview control to occupy all available vertical height in its parent container by setting pbFillHeight to True.

Label Support

By default a portion of the control's width is reserved to display a descriptive label. By default, the label is displayed to the left of the control and consumes approximately 120px of the total width.

Set psLabel to the text string you want to display as a label.

Set peLabelAlign to position the label text to the left, right or center of the space allocated to the control's label (alignLeft, alignRight, alignCenter).

Set peLabelPosition to change the position of the space allocated to the control's label. By default, the label is positioned to the left of the control (lpLeft). The label can also be positioned above or to the right of the control (lpTop, lpRight).

Set piLabelOffset to change the amount of space that is consumed by the control's label. By default, the label consumes approximately 120px.

The label's text color is determined by the web application's CSS theme (psTheme). Set psLabelColor to directly override the label's CSS themed color.

Set pbShowLabel to False to hide the label and remove space used the control's label. By default pbShowLabel is True.

Drag and Drop Support

Drag Support

This control allows parts of itself to be picked up and dragged to other places in your interface. To do this, register it as a drag source in a cWebDragDropHelper.

Supported drag actions for this control are:
- C_WebDragTreeviewFolder, C_WebDragTreeviewItem

Drop Support

This control can be used as a valid drop target by registering it as such in a cWebDragDropHelper object.

The supported drop actions for this control are:
- C_WebDropOnControl, C_WebDropTreeviewRoot, C_WebDropTreeviewFolder, C_WebDropTreeviewItem

File Drop Support

This allows the control to accept data dragged from elsewhere in the control (if configured that way) and can also be used to accept files when registered within a cWebDragDropFileHelper.

Color and Styling

The color of a treeview control is determined by the web application's CSS theme (psTheme). You can define additional or replacement CSS styles in your web application's application.css file. Set psCSSClass to the CSS class name you would like to be applied to a treeview control. Additionally you can apply an individual CSS style to each item in the treeview (see OnLoadChildNodes).

Set psBackgroundColor to directly override the control's CSS themed color.

You can use pbAllowHtml to apply embedded HTML to the tWebTreeItem.

See Also

tWebTreeItem | Styling Web Applications