@qooxdoo/framework
Version:
The JS Framework for Coders
191 lines (172 loc) • 6.25 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2010 Derrell Lipman
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Derrell Lipman (derrell)
************************************************************************ */
/**
* Primitives for building trees and tree nodes.
*
* The methods in this mixin are included directly in the SimpleTreeDataModel
* but are also useful for other types of trees (not TreeVirtual) that need
* similar tree and node creation.
*/
qx.Mixin.define("qx.ui.treevirtual.MTreePrimitive", {
statics: {
/** Primitive types of tree nodes */
Type: {
LEAF: 1,
BRANCH: 2
},
/**
* Add a node to the tree.
*
* NOTE: This method is for <b>internal use</b> and should not be called by
* users of this class. There is no guarantee that the interface to this
* method will remain unchanged over time.
*
* @param nodeArr {Array|Map}
* The array to which new nodes are to be added. See, however, the
* nodeId parameter. If nodeId values will be provided, then nodeArr can
* be a map. The traditional TreeVirtual does not provide node ids, and
* passes an array for this parameter.
*
* @param parentNodeId {Integer}
* The node id of the parent of the node being added
*
* @param label {String}
* The string to display as the label for this node
*
* @param bOpened {Boolean}
* <i>true</i> if the tree should be rendered in its opened state;
* <i>false</i> otherwise.
*
* @param bHideOpenCloseButton {Boolean}
* <i>true</i> if the open/close button should be hidden (not displayed);
* </i>false</i> to display the open/close button for this node.
*
* @param type {Integer}
* The type of node being added. The type determines whether children
* may be added, and determines the default icons to use. This
* parameter must be one of the following values:
* <dl>
* <dt>qx.ui.treevirtual.MTreePrimitive.Type.BRANCH</dt>
* <dd>
* This node is a branch. A branch node may have children.
* </dd>
* <dt>qx.ui.treevirtual.MTreePrimitive.Type.LEAF</dt>
* <dd>
* This node is a leaf, and may not have children
* </dd>
* </dl>
*
* @param icon {String}
* The relative (subject to alias expansion) or full path of the icon to
* display for this node when it is not a selected node.
*
* @param iconSelected {String}
* The relative (subject to alias expansion) or full path of the icon to
* display for this node when it is a selected node.
* <p>
* NOTE: As of 13 Mar 2009, this feature is disabled by default, by
* virtue of the fact that the tree's "alwaysUpdateCells" property
* has a setting of 'false' now instead of 'true'. Setting this
* property to true allows the icon to change upon selection, but
* causes problems such as single clicks not always selecting a
* row, and, in IE, double click operations failing
* completely. (For more information, see bugs 605 and 2021.) To
* re-enable the option to have an unique icon that is displayed
* when the node is selected, issue
* <code>tree.setAlwaysUpdateCells(true);</code>
*
* @param nodeId {Integer?}
* The requested node id for this new node. If not provided, nodeArr
* will be assumed to be an array, not a map, and the next available
* index of the array will be used. If it is provided, then nodeArr may
* be either an array or a map.
*
* @return {Integer} The node id of the newly-added node.
*
* @throws {Error} If one tries to add a child to a non-existent parent.
* @throws {Error} If one tries to add a node to a leaf.
*/
_addNode(
nodeArr,
parentNodeId,
label,
bOpened,
bHideOpenCloseButton,
type,
icon,
iconSelected,
nodeId
) {
var parentNode;
// Ensure that if parent was specified, it exists
if (parentNodeId) {
parentNode = nodeArr[parentNodeId];
if (!parentNode) {
throw new Error("Request to add a child to a non-existent parent");
}
// Ensure parent isn't a leaf
if (parentNode.type == qx.ui.treevirtual.MTreePrimitive.Type.LEAF) {
throw new Error("Sorry, a LEAF may not have children.");
}
} else {
// This is a child of the root
parentNode = nodeArr[0];
parentNodeId = 0;
}
// If this is a leaf, we don't present open/close icon
if (type == qx.ui.treevirtual.MTreePrimitive.Type.LEAF) {
// mask off the opened bit but retain the hide open/close button bit
bOpened = false;
bHideOpenCloseButton = false;
}
// Determine the node id of this new node
if (nodeId === undefined) {
nodeId = nodeArr.length;
}
// Set the data for this node.
var node = {
type: type,
nodeId: nodeId,
parentNodeId: parentNodeId,
label: label,
bSelected: false,
bOpened: bOpened,
bHideOpenClose: bHideOpenCloseButton,
bCanEdit: true,
icon: icon,
iconSelected: iconSelected,
children: [],
columnData: []
};
// Add this node to the array
nodeArr[nodeId] = node;
// Add this node to its parent's child array.
parentNode.children.push(nodeId);
// Return the node id we just added
return nodeId;
},
/**
* An empty tree contains only this one node
*
* @return {Map}
* Returns a root node with all relevant fields filled.
*/
_getEmptyTree() {
return {
label: "<virtual root>",
nodeId: 0,
bOpened: true,
children: []
};
}
}
});