Rev 1422 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.TreeNodeV3");dojo.require("dojo.html.*");dojo.require("dojo.event.*");dojo.require("dojo.io.*");dojo.require("dojo.widget.TreeWithNode");dojo.widget.defineWidget("dojo.widget.TreeNodeV3", [dojo.widget.HtmlWidget, dojo.widget.TreeWithNode], function () {this.actionsDisabled = [];this.object = {};}, {tryLazyInit:true, actions:{MOVE:"MOVE", DETACH:"DETACH", EDIT:"EDIT", ADDCHILD:"ADDCHILD", SELECT:"SELECT"}, labelClass:"", contentClass:"", expandNode:null, labelNode:null, nodeDocType:"", selected:false, getnodeDocType:function () {return this.nodeDocType;}, cloneProperties:["actionsDisabled", "tryLazyInit", "nodeDocType", "objectId", "object", "title", "isFolder", "isExpanded", "state"], clone:function (deep) {var ret = new this.constructor();for (var i = 0; i < this.cloneProperties.length; i++) {var prop = this.cloneProperties[i];ret[prop] = dojo.lang.shallowCopy(this[prop], true);}if (this.tree.unsetFolderOnEmpty && !deep && this.isFolder) {ret.isFolder = false;}ret.toggleObj = this.toggleObj;dojo.widget.manager.add(ret);ret.tree = this.tree;ret.buildRendering({}, {});ret.initialize({}, {});if (deep && this.children.length) {for (var i = 0; i < this.children.length; i++) {var child = this.children[i];if (child.clone) {ret.children.push(child.clone(deep));} else {ret.children.push(dojo.lang.shallowCopy(child, deep));}}ret.setChildren();}return ret;}, markProcessing:function () {this.markProcessingSavedClass = dojo.html.getClass(this.expandNode);dojo.html.setClass(this.expandNode, this.tree.classPrefix + "ExpandLoading");}, unmarkProcessing:function () {dojo.html.setClass(this.expandNode, this.markProcessingSavedClass);}, buildRendering:function (args, fragment, parent) {if (args.tree) {this.tree = dojo.lang.isString(args.tree) ? dojo.widget.manager.getWidgetById(args.tree) : args.tree;} else {if (parent && parent.tree) {this.tree = parent.tree;}}if (!this.tree) {dojo.raise("Can't evaluate tree from arguments or parent");}this.domNode = this.tree.nodeTemplate.cloneNode(true);this.expandNode = this.domNode.firstChild;this.contentNode = this.domNode.childNodes[1];this.labelNode = this.contentNode.firstChild;if (this.labelClass) {dojo.html.addClass(this.labelNode, this.labelClass);}if (this.contentClass) {dojo.html.addClass(this.contentNode, this.contentClass);}this.domNode.widgetId = this.widgetId;this.labelNode.innerHTML = this.title;}, isTreeNode:true, object:{}, title:"", isFolder:null, contentNode:null, expandClass:"", isExpanded:false, containerNode:null, getInfo:function () {var info = {widgetId:this.widgetId, objectId:this.objectId, index:this.getParentIndex()};return info;}, setFolder:function () {this.isFolder = true;this.viewSetExpand();if (!this.containerNode) {this.viewAddContainer();}dojo.event.topic.publish(this.tree.eventNames.afterSetFolder, {source:this});}, initialize:function (args, frag, parent) {if (args.isFolder) {this.isFolder = true;}if (this.children.length || this.isFolder) {this.setFolder();} else {this.viewSetExpand();}for (var i = 0; i < this.actionsDisabled.length; i++) {this.actionsDisabled[i] = this.actionsDisabled[i].toUpperCase();}dojo.event.topic.publish(this.tree.eventNames.afterChangeTree, {oldTree:null, newTree:this.tree, node:this});}, unsetFolder:function () {this.isFolder = false;this.viewSetExpand();dojo.event.topic.publish(this.tree.eventNames.afterUnsetFolder, {source:this});}, insertNode:function (parent, index) {if (!index) {index = 0;}if (index == 0) {dojo.html.prependChild(this.domNode, parent.containerNode);} else {dojo.html.insertAfter(this.domNode, parent.children[index - 1].domNode);}}, updateTree:function (newTree) {if (this.tree === newTree) {return;}var oldTree = this.tree;dojo.lang.forEach(this.getDescendants(), function (elem) {elem.tree = newTree;});if (oldTree.classPrefix != newTree.classPrefix) {var stack = [this.domNode];var elem;var reg = new RegExp("(^|\\s)" + oldTree.classPrefix, "g");while (elem = stack.pop()) {for (var i = 0; i < elem.childNodes.length; i++) {var childNode = elem.childNodes[i];if (childNode.nodeDocType != 1) {continue;}dojo.html.setClass(childNode, dojo.html.getClass(childNode).replace(reg, "$1" + newTree.classPrefix));stack.push(childNode);}}}var message = {oldTree:oldTree, newTree:newTree, node:this};dojo.event.topic.publish(this.tree.eventNames.afterChangeTree, message);dojo.event.topic.publish(newTree.eventNames.afterChangeTree, message);}, addedTo:function (parent, index, dontPublishEvent) {if (this.tree !== parent.tree) {this.updateTree(parent.tree);}if (parent.isTreeNode) {if (!parent.isFolder) {parent.setFolder();parent.state = parent.loadStates.LOADED;}}var siblingsCount = parent.children.length;this.insertNode(parent, index);this.viewAddLayout();if (siblingsCount > 1) {if (index == 0 && parent.children[1] instanceof dojo.widget.Widget) {parent.children[1].viewUpdateLayout();}if (index == siblingsCount - 1 && parent.children[siblingsCount - 2] instanceof dojo.widget.Widget) {parent.children[siblingsCount - 2].viewUpdateLayout();}} else {if (parent.isTreeNode) {parent.viewSetHasChildren();}}if (!dontPublishEvent) {var message = {child:this, index:index, parent:parent};dojo.event.topic.publish(this.tree.eventNames.afterAddChild, message);}}, createSimple:function (args, parent) {if (args.tree) {var tree = args.tree;} else {if (parent) {var tree = parent.tree;} else {dojo.raise("createSimple: can't evaluate tree");}}tree = dojo.widget.byId(tree);var treeNode = new tree.defaultChildWidget();for (var x in args) {treeNode[x] = args[x];}treeNode.toggleObj = dojo.lfx.toggle[treeNode.toggle.toLowerCase()] || dojo.lfx.toggle.plain;dojo.widget.manager.add(treeNode);treeNode.buildRendering(args, {}, parent);treeNode.initialize(args, {}, parent);if (treeNode.parent) {delete dojo.widget.manager.topWidgets[treeNode.widgetId];}return treeNode;}, viewUpdateLayout:function () {this.viewRemoveLayout();this.viewAddLayout();}, viewAddContainer:function () {this.containerNode = this.tree.containerNodeTemplate.cloneNode(true);this.domNode.appendChild(this.containerNode);}, viewAddLayout:function () {if (this.parent["isTree"]) {dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode) + " " + this.tree.classPrefix + "IsRoot");}if (this.isLastChild()) {dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode) + " " + this.tree.classPrefix + "IsLast");}}, viewRemoveLayout:function () {dojo.html.removeClass(this.domNode, this.tree.classPrefix + "IsRoot");dojo.html.removeClass(this.domNode, this.tree.classPrefix + "IsLast");}, viewGetExpandClass:function () {if (this.isFolder) {return this.isExpanded ? "ExpandOpen" : "ExpandClosed";} else {return "ExpandLeaf";}}, viewSetExpand:function () {var expand = this.tree.classPrefix + this.viewGetExpandClass();var reg = new RegExp("(^|\\s)" + this.tree.classPrefix + "Expand\\w+", "g");dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode).replace(reg, "") + " " + expand);this.viewSetHasChildrenAndExpand();}, viewGetChildrenClass:function () {return "Children" + (this.children.length ? "Yes" : "No");}, viewSetHasChildren:function () {var clazz = this.tree.classPrefix + this.viewGetChildrenClass();var reg = new RegExp("(^|\\s)" + this.tree.classPrefix + "Children\\w+", "g");dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode).replace(reg, "") + " " + clazz);this.viewSetHasChildrenAndExpand();}, viewSetHasChildrenAndExpand:function () {var clazz = this.tree.classPrefix + "State" + this.viewGetChildrenClass() + "-" + this.viewGetExpandClass();var reg = new RegExp("(^|\\s)" + this.tree.classPrefix + "State[\\w-]+", "g");dojo.html.setClass(this.domNode, dojo.html.getClass(this.domNode).replace(reg, "") + " " + clazz);}, viewUnfocus:function () {dojo.html.removeClass(this.labelNode, this.tree.classPrefix + "LabelFocused");}, viewFocus:function () {dojo.html.addClass(this.labelNode, this.tree.classPrefix + "LabelFocused");}, viewEmphasize:function () {dojo.html.clearSelection(this.labelNode);dojo.html.addClass(this.labelNode, this.tree.classPrefix + "NodeEmphasized");}, viewUnemphasize:function () {dojo.html.removeClass(this.labelNode, this.tree.classPrefix + "NodeEmphasized");}, detach:function () {if (!this.parent) {return;}var parent = this.parent;var index = this.getParentIndex();this.doDetach.apply(this, arguments);dojo.event.topic.publish(this.tree.eventNames.afterDetach, {child:this, parent:parent, index:index});}, doDetach:function () {var parent = this.parent;if (!parent) {return;}var index = this.getParentIndex();this.viewRemoveLayout();dojo.widget.DomWidget.prototype.removeChild.call(parent, this);var siblingsCount = parent.children.length;if (siblingsCount > 0) {if (index == 0) {parent.children[0].viewUpdateLayout();}if (index == siblingsCount) {parent.children[siblingsCount - 1].viewUpdateLayout();}} else {if (parent.isTreeNode) {parent.viewSetHasChildren();}}if (this.tree.unsetFolderOnEmpty && !parent.children.length && parent.isTreeNode) {parent.unsetFolder();}this.parent = null;}, destroy:function () {dojo.event.topic.publish(this.tree.eventNames.beforeNodeDestroy, {source:this});this.detach();return dojo.widget.HtmlWidget.prototype.destroy.apply(this, arguments);}, expand:function () {if (this.isExpanded) {return;}if (this.tryLazyInit) {this.setChildren();this.tryLazyInit = false;}this.isExpanded = true;this.viewSetExpand();this.showChildren();}, collapse:function () {if (!this.isExpanded) {return;}this.isExpanded = false;this.hideChildren();}, hideChildren:function () {this.tree.toggleObj.hide(this.containerNode, this.tree.toggleDuration, this.explodeSrc, dojo.lang.hitch(this, "onHideChildren"));}, showChildren:function () {this.tree.toggleObj.show(this.containerNode, this.tree.toggleDuration, this.explodeSrc, dojo.lang.hitch(this, "onShowChildren"));}, onShowChildren:function () {this.onShow();dojo.event.topic.publish(this.tree.eventNames.afterExpand, {source:this});}, onHideChildren:function () {this.viewSetExpand();this.onHide();dojo.event.topic.publish(this.tree.eventNames.afterCollapse, {source:this});}, setTitle:function (title) {var oldTitle = this.title;this.labelNode.innerHTML = this.title = title;dojo.event.topic.publish(this.tree.eventNames.afterSetTitle, {source:this, oldTitle:oldTitle});}, toString:function () {return "[" + this.widgetType + ", " + this.title + "]";}});