docs: function(setting, zTreeTools) {
  		zTreeTools.cancelEditName = function(newName) {
  			var root = data.getRoot(this.setting);
  			if (!root.curEditNode) return;
  			view.cancelCurEditNode(this.setting, newName?newName:null, true);
  		}
  		zTreeTools.copyNode = function(targetNode, node, moveType, isSilent) {
  			if (!node) return null;
  			if (targetNode && !targetNode.isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null;
  			var _this = this,
  				newNode = tools.clone(node);
  			if (!targetNode) {
  				targetNode = null;
  				moveType = consts.move.TYPE_INNER;
  			}
  			if (moveType == consts.move.TYPE_INNER) {
  				function copyCallback() {
  					view.addNodes(_this.setting, targetNode, [newNode], isSilent);
  				}
  
  				if (tools.canAsync(this.setting, targetNode)) {
  					view.asyncNode(this.setting, targetNode, isSilent, copyCallback);
  				} else {
  					copyCallback();
  				}
  			} else {
  				view.addNodes(this.setting, targetNode.parentNode, [newNode], isSilent);
  				view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent);
  			}
  			return newNode;
  		}
  		zTreeTools.editName = function(node) {
  			if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return;
  			if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true);
  			view.editNode(this.setting, node)
  		}
  		zTreeTools.moveNode = function(targetNode, node, moveType, isSilent) {
  			if (!node) return node;
  			if (targetNode && !targetNode.isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) {
  				return null;
  			} else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) {
  				return null;
  			} else if (!targetNode) {
  				targetNode = null;
  			}
  			var _this = this;
  			function moveCallback() {
  				view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent);
  			}
  			if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) {
  				view.asyncNode(this.setting, targetNode, isSilent, moveCallback);
  			} else {
  				moveCallback();
  			}
  			return node;
  		}
  		zTreeTools.setEditable = function(editable) {
  			this.setting.edit.enable = editable;
  			return this.refresh();
  		}
  	}