UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

201 lines (182 loc) 6.58 kB
/* ************************************************************************ 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 : function(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, 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 : function() { return { label : "<virtual root>", nodeId : 0, bOpened : true, children : [] }; } } });