| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified 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 + "]"; |
| }}); |
| |