diff options
Diffstat (limited to 'webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js')
-rw-r--r-- | webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js | 752 |
1 files changed, 0 insertions, 752 deletions
diff --git a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js deleted file mode 100644 index 90e8ef5c80..0000000000 --- a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/treevirtual/SimpleTreeDataModel.js +++ /dev/null @@ -1,752 +0,0 @@ -/* ************************************************************************ - - qooxdoo - the new era of web development - - http://qooxdoo.org - - Copyright: - 2007 Derrell Lipman - - License: - LGPL: http://www.gnu.org/licenses/lgpl.html - EPL: http://www.eclipse.org/org/documents/epl-v10.php - See the LICENSE file in the project's top-level directory for details. - - Authors: - * Derrell Lipman (derrell) - -************************************************************************ */ - -/* ************************************************************************ - -#module(treevirtual) - -************************************************************************ */ - - - -/* - * A simple tree data model used as the table model - * - * The object structure of a single node of the tree is: - * - * <pre> - * { - * // USER-PROVIDED ATTRIBUTES - * // ------------------------ - * type : qx.ui.treevirtual.Type.LEAF, - * parentNodeId : 23, // index in _nodeArr of the parent node - * label : "My Documents", - * bSelected : true, // true if node is selected; false otherwise - * bOpened : true, // true (-), false (+) - * bHideOpenClose : false, // whether to hide the open/close button - * icon : "images/folder.gif", - * iconSelected : "images/folder_selected.gif", - * children : [ ], // each value is an index into _nodeArr - * - * cellStyle : "background-color:cyan" - * labelStyle : "background-color:red;color:white" - * - * // INTERNALLY-CALCULATED ATTRIBUTES - * // -------------------------------- - * // The following properties need not (and should not) be set by the - * // caller, but are automatically calculated. Some are used internally, - * // while others may be of use to event listeners. - * - * nodeId : 42, // The index in _nodeArr, useful to event listeners - * - * level : 2, // The indentation level of this tree node - * - * bFirstChild : true, - * lastChild : [ false ], // Array where the index is the column of - * // indentation, and the value is a boolean. - * // These are used to locate the - * // appropriate "tree line" icon. - * } - * </pre> - */ -qx.OO.defineClass("qx.ui.treevirtual.SimpleTreeDataModel", - qx.ui.table.AbstractTableModel, -function() -{ - qx.ui.table.AbstractTableModel.call(this); - - this._rowArr = [ ]; // rows, resorted into tree order as necessary - this._nodeArr = [ ]; // tree nodes, organized with hierarchy - - this._nodeRowMap = [ ]; // map nodeArr index to rowArr index. The - // index of this array is the index of - // _nodeArr, and the values in this array are - // the indexes into _rowArr. - - - this._treeColumn = 0; // default column for tree nodes - - this._selections = { }; // list of indexes of selected nodes - - this._nodeArr.push( // the root node, needed to store its children - { - label : "<virtual root>", - bOpened : true, - children : [ ] - }); -}); - - -// overridden -qx.Proto.setEditable = function(editable) -{ - throw new Error("Tree columns can not be made editable"); -}; - - -// overridden -qx.Proto.setColumnEditable = function(columnIndex, editable) -{ - throw new Error("Tree columns can not be made editable"); -}; - - -// overridden -qx.Proto.isColumnEditable = function(columnIndex) -{ - return false; -}; - - -// overridden -qx.Proto.isColumnSortable = function(columnIndex) -{ - return false; -}; - - -// overridden -qx.Proto.sortByColumn = function(columnIndex, ascending) -{ - throw new Error("Trees can not be sorted by column"); -}; - - -/** - * Returns the column index the model is sorted by. This model is never - * sorted, so -1 is returned. - * - * @return {Integer} - * -1, to indicate that the model is not sorted. - */ -qx.Proto.getSortColumnIndex = function() -{ - return -1; -}; - - -/** - * Specifies which column the tree is to be displayed in. The tree is - * displayed using the SimpleTreeDataCellRenderer. Other columns may be - * provided which use different cell renderers. - * - * @param columnIndex {Integer} - * The index of the column in which the tree should be displayed. - */ -qx.Proto.setTreeColumn = function(columnIndex) -{ - this._treeColumn = columnIndex; -}; - - -/** - * Get the column in which the tree is to be displayed. - * - * @return {Integer} - * The column in whcih the tree is to be displayed - */ -qx.Proto.getTreeColumn = function() -{ - return this._treeColumn; -}; - - -// overridden -qx.Proto.getRowCount = function() -{ - return this._rowArr.length; -}; - - -// overridden -qx.Proto.getRowData = function(rowIndex) -{ - return this._rowArr[rowIndex]; -}; - - -// overridden -qx.Proto.getValue = function(columnIndex, rowIndex) -{ - if (rowIndex < 0 || rowIndex >= this._rowArr.length) - { - throw new Error ("this._rowArr row " + - "(" + rowIndex + ") out of bounds: " + - this._rowArr + - " (0.." + - (this._rowArr.length - 1) + ")");b - } - - if (columnIndex < 0 || columnIndex >= this._rowArr[rowIndex].length) - { - throw new Error ("this._rowArr column " + - "(" + columnIndex + ") out of bounds: " + - this._rowArr[rowIndex] + - " (0.." + - (this._rowArr[rowIndex].length - 1) + ")"); - } - - return this._rowArr[rowIndex][columnIndex]; -}; - - -/** - * 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. Instead, call {@link #addBranch} or {@link - * #addLeaf}. There is no guarantee that the interface to this method - * will remain unchanged over time. - * - * @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 {Integer} - * <i>true</i> if the tree should be rendered in its opened state; - * <i>false</i> otherwise. - * - * @param bHideOpenCloseButton - * <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.SimpleTreeDataModel.Type.BRANCH</dt> - * <dd> - * This node is a branch. A branch node may have children. - * </dd> - * <dt>qx.ui.treevirtual.SimpleTreeDataModel.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. - * - * @return {Integer} - * The node id of the newly-added node. - */ -qx.Proto._addNode = function(parentNodeId, - label, - bOpened, - bHideOpenCloseButton, - type, - icon, - iconSelected) -{ - var parentNode; - - // Ensure that if parent was specified, it exists - if (parentNodeId) - { - parentNode = this._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.SimpleTreeDataModel.Type.LEAF) - { - throw new Error("Sorry, a LEAF may not have children."); - } - } - else - { - // This is a child of the root - parentNode = this._nodeArr[0]; - parentNodeId = 0; - } - - // If this is a leaf, we don't present open/close icon - if (type == qx.ui.treevirtual.SimpleTreeDataModel.Type.LEAF) - { - // mask off the opened bit but retain the hide open/close button bit - bOpened = false; - bHideOpenClose = false; - } - - // Determine the node id of this new node - var nodeId = this._nodeArr.length; - - // Set the data for this node. - var node = - { - type : type, - parentNodeId : parentNodeId, - label : label, - bSelected : false, - bOpened : bOpened, - bHideOpenClose : bHideOpenCloseButton, - icon : icon, - iconSelected : iconSelected, - children : [ ], - columnData : [ ] - }; - - // Add this node to the array - this._nodeArr.push(node); - - // Add this node to its parent's child array. - parentNode.children.push(nodeId); - - // Return the node id we just added - return nodeId; -}; - - - -/** - * Add a branch to the tree. - * - * @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 branch should be rendered in its opened state; - * <i>false</i> otherwise. - * - * @param bHideOpenCloseButton {Boolean} - * <i>True</i> if the open/close button should not be displayed; - * <i>false</i> if the open/close button should be displayed - * - * @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. - * - * @return {Integer} - * The node id of the newly-added branch. - */ -qx.Proto.addBranch = function(parentNodeId, - label, - bOpened, - bHideOpenCloseButton, - icon, - iconSelected) -{ - return this._addNode(parentNodeId, - label, - bOpened, - bHideOpenCloseButton, - qx.ui.treevirtual.SimpleTreeDataModel.Type.BRANCH, - icon, - iconSelected); -}; - - -/** - * Add a leaf to the tree. - * - * @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 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. - * - * @return {Integer} - * The node id of the newly-added leaf. - */ -qx.Proto.addLeaf = function(parentNodeId, - label, - icon, - iconSelected) -{ - return this._addNode(parentNodeId, - label, - false, - false, - qx.ui.treevirtual.SimpleTreeDataModel.Type.LEAF, - icon, - iconSelected); -}; - - -/** - * Prune the tree by removing, recursively, all of a node's children. If - * requested, also remove the node itself. - * - * @param nodeId {Integer} - * The node id, previously returned by {@link #addLeaf} or {@link - * #addBranch}, of the node (and its children) to be pruned from the tree. - * - * @param bSelfAlso {Boolean} - * If <i>true</i> then remove the node identified by <i>nodeId</i> as well - * as all of the children. - */ -qx.Proto.prune = function(nodeId, bSelfAlso) -{ - // First, recursively remove all children - for (var i = this._nodeArr[nodeId].children.length - 1; i >= 0; i--) - { - this.prune(this._nodeArr[nodeId].children[i], true); - } - - if (bSelfAlso) - { - // Delete ourself from our parent's children list - var node = this._nodeArr[nodeId]; - qx.lang.Array.remove(this._nodeArr[node.parentNodeId].children, nodeId); - - // Delete ourself from the selections list, if we're in it. - if (this._selections[nodeId]) - { - delete this._selections[nodeId]; - } - - // We can't splice the node itself out, because that would muck up the - // nodeId == index correspondence. Instead, just replace the node with - // null so its index just becomes unused. - this._nodeArr[nodeId] = null; - } -}; - - - -/** - * Sets the whole data en bulk, or notifies the data model that node - * modifications are complete. - * - * @param nodeArr {Array | null} - * Pass either an Array of node objects, or null. - * </p><p> - * If non-null, nodeArr is an array of node objects containing the entire - * tree to be displayed. If loading the whole data en bulk in this way, it - * is assumed that the data is correct! No error checking or validation is - * done. You'd better know what you're doing! Caveat emptor. - * </p><p> - * If nodeArr is null, then this call is a notification that the user has - * completed building or modifying a tree by issuing a series of calls to - * {@link #addBranch} and/or {@link #addLeaf}. - * <p> - */ -qx.Proto.setData = function(nodeArr) -{ - var _this = this; - - function render() - { - var inorder = function(nodeId, level) - { - var child = null; - var childNodeId; - - // For each child of the specified node... - var numChildren = _this._nodeArr[nodeId].children.length; - for (var i = 0; i < numChildren; i++) - { - // Determine the node id of this child - childNodeId = _this._nodeArr[nodeId].children[i]; - - // Get the child node - child = _this._nodeArr[childNodeId]; - - // Skip deleted nodes - if (child == null) - { - continue; - } - - // Listeners will need to know a node's id when they receive an event - child.nodeId = childNodeId; - - // (Re-)assign this node's level - child.level = level; - - // Determine if we're the first child of our parent - child.bFirstChild = (i == 0); - - // Determine if we're the last child of our parent - child.lastChild = [ i == numChildren - 1 ]; - - // Get our parent. - var parent = _this._nodeArr[child.parentNodeId]; - - // For each parent node, determine if it is a last child - while (parent.nodeId) - { - var bLast = parent.lastChild[parent.lastChild.length - 1]; - child.lastChild.unshift(bLast); - parent = _this._nodeArr[parent.parentNodeId]; - } - - // Ensure there's an entry in the columnData array for each column - if (! child.columnData) - { - child.columnData = [ ]; - } - - if (child.columnData.length < _this.getColumnCount()) - { - child.columnData[_this.getColumnCount() - 1] = null; - } - - // Add this node to the row array. Initialize a row data array. - var rowData = [ ]; - - // If additional column data is provided... - if (child.columnData) - { - // ... then add each column data. - for (var j = 0; j < child.columnData.length; j++) - { - // Is this the tree column? - if (j == _this._treeColumn) - { - // Yup. Add the tree node data - rowData.push(child); - } - else - { - // Otherwise, add the column data verbatim. - rowData.push(child.columnData[j]); - } - } - } - else - { - // No column data. Just add the tree node. - rowData.push(child); - } - - // If this node is selected, ... - if (child.bSelected) - { - // ... indicate so for the row. - rowData.selected = true; - } - - // Track the _rowArr index for each node so we can handle selections - _this._nodeRowMap[child.nodeId] = _this._rowArr.length; - - // Add the row data to the row array - _this._rowArr.push(rowData) - - // If this child is opened, ... - if (child.bOpened) - { - // ... then add its children too. - inorder(childNodeId, level + 1); - } - } - } - - // Reset the row array - _this._rowArr = []; - - // Reset the _nodeArr -> _rowArr map - _this._nodeRowMap = [ ]; - - // Begin in-order traversal of the tree from the root to regenerate _rowArr - inorder(0, 1); - - // Inform the listeners - if (_this.hasEventListeners(qx.ui.table.TableModel.EVENT_TYPE_DATA_CHANGED)) - { - var data = - { - firstRow : 0, - lastRow : _this._rowArr.length - 1, - firstColumn : 0, - lastColumn : _this.getColumnCount() - 1 - }; - - _this.dispatchEvent(new qx.event.type.DataEvent( - qx.ui.table.TableModel.EVENT_TYPE_DATA_CHANGED, - data), - true); - } - } - - if (nodeArr instanceof Array) - { - // Determine the set of selected nodes - for (i = 0; i < nodeArr.length; i++) - { - if (nodeArr[i].selected) - { - this._selections[i] = true; - } - } - - // Save the user-supplied data. - this._nodeArr = nodeArr; - } - else if (nodeArr !== null && nodeArr !== undefined) - { - throw new Error("Expected array of node objects or null/undefined; got " + - typeof(nodeArr)); - } - - // Re-render the row array - render(); -}; - - -/** - * Return the array of node data. - * - * @return {Array} - * Array of node objects. See {@link qx.ui.treevirtual.SimpleTreeDataModel} - * for a description nodes in this array. - */ -qx.Proto.getData = function() -{ - return this._nodeArr; -}; - - - -/** - * Add data to an additional column (a column other than the tree column) of - * the tree. - * - * @param nodeId - * A node identifier, as previously returned by {@link #addBranch} or {@link - * addLeaf}. - * - * @param columnIndex - * The column number to which the provided data applies - * - * @param data - * The cell data for the specified column - */ -qx.Proto.setColumnData = function(nodeId, columnIndex, data) -{ - this._nodeArr[nodeId].columnData[columnIndex] = data; -} - - -/** - * Set state attributes of a node. - * - * @param nodeId {Integer} - * A node identifier, as previously returned by {@link #addBranch} or {@link - * addLeaf}. - * - * @param attributes {Map} - * Each property name in the map may correspond to the property names of a - * node which are specified as <i>USER-PROVIDED ATTRIBUTES</i> in {@link - * #SimpleTreeDataModel}. Each property value will be assigned to the - * corresponding property of the node specified by nodeId. - */ -qx.Proto.setState = function(nodeId, attributes) -{ - for (var attribute in attributes) - { - // If the selected state is changing... - if (attribute == "bSelected") - { - // ... then keep track of what is selected - if (attributes[attribute]) - { - this._selections[nodeId] = true; - } - else - { - delete this._selections[nodeId]; - } - } - - this._nodeArr[nodeId][attribute] = attributes[attribute]; - } -}; - - -/** - * Return the mapping of nodes to rendered rows. This function is intended - * for use by the cell renderer, not by users of this class. - * - * @return {Array} - * The array containing mappings of nodes to rendered rows. - */ -qx.Proto.getNodeRowMap = function() -{ - return this._nodeRowMap; -}; - - -/* - * Clear all selections in the data model. This method does not clear - * selections displayed in the widget, and is intended for internal use, not - * by users of this class. - */ -qx.Proto._clearSelections = function() -{ - // Clear selected state for any selected nodes. - for (var selection in this._selections) - { - this._nodeArr[selection].bSelected = false; - } - - // Reinitialize selections array. - this._selections = { }; -}; - - -/** - * Return the nodes that are currently selected. - * - * @return {Array} - * An array containing the nodes that are currently selected. - */ -qx.Proto.getSelectedNodes = function() -{ - var nodes = [ ]; - - for (var nodeId in this._selections) - { - nodes.push(this._nodeArr[nodeId]); - } - - return nodes; -}; - - -// We currently support these types of tree nodes -qx.Class.Type = {}; -qx.Class.Type.LEAF = 1; -qx.Class.Type.BRANCH = 2; - |