Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,831 @@ +/* + 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.TreeBasicControllerV3"); + +dojo.require("dojo.event.*"); +dojo.require("dojo.json") +dojo.require("dojo.io.*"); +dojo.require("dojo.widget.TreeCommon"); +dojo.require("dojo.widget.TreeNodeV3"); +dojo.require("dojo.widget.TreeV3"); + +dojo.widget.defineWidget( + "dojo.widget.TreeBasicControllerV3", + [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], + function(){ + this.listenedTrees = {}; + }, +{ + // TODO: do something with addChild / setChild, so that RpcController become able + // to hook on this and report to server + + // TODO: make sure keyboard control stuff works when node is moved between trees + // node should be unfocus()'ed when it its ancestor is moved and tree,lastFocus - cleared + + /** + * TreeCommon.listenTree will attach listeners to these events + * + * The logic behind the naming: + * 1. (after|before) + * 2. if an event refers to tree, then add "Tree" + * 3. add action + */ + listenTreeEvents: ["afterSetFolder", "afterTreeCreate", "beforeTreeDestroy"], + listenNodeFilter: function(elem) { return elem instanceof dojo.widget.Widget}, + + + editor: null, + + + initialize: function(args) { + if (args.editor) { + this.editor = dojo.widget.byId(args.editor); + this.editor.controller = this; + } + + }, + + + getInfo: function(elem) { + return elem.getInfo(); + }, + + onBeforeTreeDestroy: function(message) { + this.unlistenTree(message.source); + }, + + onAfterSetFolder: function(message) { + + //dojo.profile.start("onTreeChange"); + + if (message.source.expandLevel > 0) { + this.expandToLevel(message.source, message.source.expandLevel); + } + if (message.source.loadLevel > 0) { + this.loadToLevel(message.source, message.source.loadLevel); + } + + + //dojo.profile.end("onTreeChange"); + }, + + + // down arrow + _focusNextVisible: function(nodeWidget) { + + // if this is an expanded folder, get the first child + if (nodeWidget.isFolder && nodeWidget.isExpanded && nodeWidget.children.length > 0) { + returnWidget = nodeWidget.children[0]; + } else { + // find a parent node with a sibling + while (nodeWidget.isTreeNode && nodeWidget.isLastChild()) { + nodeWidget = nodeWidget.parent; + } + + if (nodeWidget.isTreeNode) { + var returnWidget = nodeWidget.parent.children[nodeWidget.getParentIndex()+1]; + } + + } + + if (returnWidget && returnWidget.isTreeNode) { + this._focusLabel(returnWidget); + return returnWidget; + } + + }, + + // up arrow + _focusPreviousVisible: function(nodeWidget) { + var returnWidget = nodeWidget; + + // if younger siblings + if (!nodeWidget.isFirstChild()) { + var previousSibling = nodeWidget.parent.children[nodeWidget.getParentIndex()-1] + + nodeWidget = previousSibling; + // if the previous nodeWidget is expanded, dive in deep + while (nodeWidget.isFolder && nodeWidget.isExpanded && nodeWidget.children.length > 0) { + returnWidget = nodeWidget; + // move to the last child + nodeWidget = nodeWidget.children[nodeWidget.children.length-1]; + } + } else { + // if this is the first child, return the parent + nodeWidget = nodeWidget.parent; + } + + if (nodeWidget && nodeWidget.isTreeNode) { + returnWidget = nodeWidget; + } + + if (returnWidget && returnWidget.isTreeNode) { + this._focusLabel(returnWidget); + return returnWidget; + } + + }, + + // right arrow + _focusZoomIn: function(nodeWidget) { + var returnWidget = nodeWidget; + + // if not expanded, expand, else move to 1st child + if (nodeWidget.isFolder && !nodeWidget.isExpanded) { + this.expand(nodeWidget); + }else if (nodeWidget.children.length > 0) { + nodeWidget = nodeWidget.children[0]; + } + + if (nodeWidget && nodeWidget.isTreeNode) { + returnWidget = nodeWidget; + } + + if (returnWidget && returnWidget.isTreeNode) { + this._focusLabel(returnWidget); + return returnWidget; + } + + }, + + // left arrow + _focusZoomOut: function(node) { + + var returnWidget = node; + + // if not expanded, expand, else move to 1st child + if (node.isFolder && node.isExpanded) { + this.collapse(node); + } else { + node = node.parent; + } + if (node && node.isTreeNode) { + returnWidget = node; + } + + if (returnWidget && returnWidget.isTreeNode) { + this._focusLabel(returnWidget); + return returnWidget; + } + + }, + + onFocusNode: function(e) { + var node = this.domElement2TreeNode(e.target); + + if (node) { + node.viewFocus(); + dojo.event.browser.stopEvent(e); + } + }, + + onBlurNode: function(e) { + var node = this.domElement2TreeNode(e.target); + + if (!node) { + return; + } + + var labelNode = node.labelNode; + + labelNode.setAttribute("tabIndex", "-1"); + node.viewUnfocus(); + dojo.event.browser.stopEvent(e); + + // this could have been set to -1 by the shift+TAB processing + node.tree.domNode.setAttribute("tabIndex", "0"); + + }, + + + _focusLabel: function(node) { + //dojo.debug((new Error()).stack) + var lastFocused = node.tree.lastFocused; + var labelNode; + + if (lastFocused && lastFocused.labelNode) { + labelNode = lastFocused.labelNode; + // help Opera out with blur events + dojo.event.disconnect(labelNode, "onblur", this, "onBlurNode"); + labelNode.setAttribute("tabIndex", "-1"); + dojo.html.removeClass(labelNode, "TreeLabelFocused"); + } + + // set tabIndex so that the tab key can find this node + labelNode = node.labelNode; + labelNode.setAttribute("tabIndex", "0"); + node.tree.lastFocused = node; + + // add an outline - this helps opera a lot + dojo.html.addClass(labelNode, "TreeLabelFocused"); + dojo.event.connectOnce(labelNode, "onblur", this, "onBlurNode"); + // prevent the domNode from seeing the focus event + dojo.event.connectOnce(labelNode, "onfocus", this, "onFocusNode"); + // set focus so that the label wil be voiced using screen readers + labelNode.focus(); + + }, + + onKey: function(e) { + if (!e.key || e.ctrkKey || e.altKey) { return; } + // pretend the key was directed toward the current focused node (helps opera out) + + var nodeWidget = this.domElement2TreeNode(e.target); + if (!nodeWidget) { + return; + } + + var treeWidget = nodeWidget.tree; + + if (treeWidget.lastFocused && treeWidget.lastFocused.labelNode) { + nodeWidget = treeWidget.lastFocused; + } + + switch(e.key) { + case e.KEY_TAB: + if (e.shiftKey) { + // we're moving backwards so don't tab to the domNode + // it'll be added back in onBlurNode + treeWidget.domNode.setAttribute("tabIndex", "-1"); + } + break; + case e.KEY_RIGHT_ARROW: + this._focusZoomIn(nodeWidget); + dojo.event.browser.stopEvent(e); + break; + case e.KEY_LEFT_ARROW: + this._focusZoomOut(nodeWidget); + dojo.event.browser.stopEvent(e); + break; + case e.KEY_UP_ARROW: + this._focusPreviousVisible(nodeWidget); + dojo.event.browser.stopEvent(e); + break; + case e.KEY_DOWN_ARROW: + this._focusNextVisible(nodeWidget); + dojo.event.browser.stopEvent(e); + break; + } + }, + + + onFocusTree: function(e) { + if (!e.currentTarget) { return; } + try { + var treeWidget = this.getWidgetByNode(e.currentTarget); + if (!treeWidget || !treeWidget.isTree) { return; } + // on first focus, choose the root node + var nodeWidget = this.getWidgetByNode(treeWidget.domNode.firstChild); + if (nodeWidget && nodeWidget.isTreeNode) { + if (treeWidget.lastFocused && treeWidget.lastFocused.isTreeNode) { // onClick could have chosen a non-root node + nodeWidget = treeWidget.lastFocused; + } + this._focusLabel(nodeWidget); + } + } + catch(e) {} + }, + + // perform actions-initializers for tree + onAfterTreeCreate: function(message) { + var tree = message.source; + dojo.event.browser.addListener(tree.domNode, "onKey", dojo.lang.hitch(this, this.onKey)); + dojo.event.browser.addListener(tree.domNode, "onmousedown", dojo.lang.hitch(this, this.onTreeMouseDown)); + dojo.event.browser.addListener(tree.domNode, "onclick", dojo.lang.hitch(this, this.onTreeClick)); + dojo.event.browser.addListener(tree.domNode, "onfocus", dojo.lang.hitch(this, this.onFocusTree)); + tree.domNode.setAttribute("tabIndex", "0"); + + if (tree.expandLevel) { + this.expandToLevel(tree, tree.expandLevel) + } + if (tree.loadLevel) { + this.loadToLevel(tree, tree.loadLevel); + } + }, + + onTreeMouseDown: function(e) { + }, + + onTreeClick: function(e){ + //dojo.profile.start("onTreeClick"); + + var domElement = e.target; + //dojo.debug('click') + // find node + var node = this.domElement2TreeNode(domElement); + if (!node || !node.isTreeNode) { + return; + } + + + var checkExpandClick = function(el) { + return el === node.expandNode; + } + + if (this.checkPathCondition(domElement, checkExpandClick)) { + this.processExpandClick(node); + } + + this._focusLabel(node); + + //dojo.profile.end("onTreeClick"); + + }, + + processExpandClick: function(node){ + + //dojo.profile.start("processExpandClick"); + + if (node.isExpanded){ + this.collapse(node); + } else { + this.expand(node); + } + + //dojo.profile.end("processExpandClick"); + }, + + + + /** + * time between expand calls for batch operations + * @see expandToLevel + */ + batchExpandTimeout: 20, + + + expandAll: function(nodeOrTree) { + return this.expandToLevel(nodeOrTree, Number.POSITIVE_INFINITY); + + }, + + + collapseAll: function(nodeOrTree) { + var _this = this; + + var filter = function(elem) { + return (elem instanceof dojo.widget.Widget) && elem.isFolder && elem.isExpanded; + } + + if (nodeOrTree.isTreeNode) { + this.processDescendants(nodeOrTree, filter, this.collapse); + } else if (nodeOrTree.isTree) { + dojo.lang.forEach(nodeOrTree.children,function(c) { _this.processDescendants(c, filter, _this.collapse) }); + } + }, + + /** + * expand tree to specific node + */ + expandToNode: function(node, withSelected) { + n = withSelected ? node : node.parent + s = [] + while (!n.isExpanded) { + s.push(n) + n = n.parent + } + + dojo.lang.forEach(s, function(n) { n.expand() }) + }, + + /** + * walk a node in time, forward order, with pauses between expansions + */ + expandToLevel: function(nodeOrTree, level) { + dojo.require("dojo.widget.TreeTimeoutIterator"); + + var _this = this; + var filterFunc = function(elem) { + var res = elem.isFolder || elem.children && elem.children.length; + //dojo.debug("Filter "+elem+ " result:"+res); + return res; + }; + var callFunc = function(node, iterator) { + _this.expand(node, true); + iterator.forward(); + } + + var iterator = new dojo.widget.TreeTimeoutIterator(nodeOrTree, callFunc, this); + iterator.setFilter(filterFunc); + + + iterator.timeout = this.batchExpandTimeout; + + //dojo.debug("here "+nodeOrTree+" level "+level); + + iterator.setMaxLevel(nodeOrTree.isTreeNode ? level-1 : level); + + + return iterator.start(nodeOrTree.isTreeNode); + }, + + + getWidgetByNode: function(node) { + var widgetId; + var newNode = node; + while (! (widgetId = newNode.widgetId) ) { + newNode = newNode.parentNode; + if (newNode == null) { break; } + } + if (widgetId) { return dojo.widget.byId(widgetId); } + else if (node == null) { return null; } + else{ return dojo.widget.manager.byNode(node); } + }, + + + + /** + * callout activated even if node is expanded already + */ + expand: function(node) { + + //dojo.profile.start("expand"); + + //dojo.debug("Expand "+node.isFolder); + + if (node.isFolder) { + node.expand(); // skip trees or non-folders + } + + //dojo.profile.end("expand"); + + }, + + /** + * safe to call on tree and non-folder + */ + collapse: function(node) { + if (node.isFolder) { + node.collapse(); + } + }, + + + // -------------------------- TODO: Inline edit node --------------------- + canEditLabel: function(node) { + if (node.actionIsDisabledNow(node.actions.EDIT)) return false; + + return true; + }, + + + editLabelStart: function(node) { + if (!this.canEditLabel(node)) { + return false; + } + + if (!this.editor.isClosed()) { + //dojo.debug("editLabelStart editor open"); + this.editLabelFinish(this.editor.saveOnBlur); + } + + this.doEditLabelStart(node); + + + }, + + + editLabelFinish: function(save) { + this.doEditLabelFinish(save); + }, + + + doEditLabelStart: function(node) { + if (!this.editor) { + dojo.raise(this.widgetType+": no editor specified"); + } + + //dojo.debug("editLabelStart editor open "+node); + + this.editor.open(node); + }, + + doEditLabelFinish: function(save, server_data) { + //dojo.debug("Finish "+save); + //dojo.debug((new Error()).stack) + if (!this.editor) { + dojo.raise(this.widgetType+": no editor specified"); + } + + var node = this.editor.node; + var editorTitle = this.editor.getContents(); + + this.editor.close(save); + + if (save) { + var data = {title:editorTitle}; + + if (server_data) { // may be undefined + dojo.lang.mixin(data, server_data); + } + + + if (node.isPhantom) { + // I can't just set node phantom's title, because widgetId/objectId/widgetName... + // may be provided by server + var parent = node.parent; + var index = node.getParentIndex(); + node.destroy(); + // new node was added! + dojo.widget.TreeBasicControllerV3.prototype.doCreateChild.call(this, parent, index, data); + } else { + var title = server_data && server_data.title ? server_data.title : editorTitle; + // use special method to make sure everything updated and event sent + node.setTitle(title); + } + } else { + //dojo.debug("Kill phantom on cancel"); + if (node.isPhantom) { + node.destroy(); + } + } + }, + + + + makeDefaultNode: function(parent, index) { + var data = {title:parent.tree.defaultChildTitle}; + return dojo.widget.TreeBasicControllerV3.prototype.doCreateChild.call(this,parent,index,data); + }, + + /** + * check that something is possible + * run maker to do it + * run exposer to expose result to visitor immediatelly + * exposer does not affect result + */ + runStages: function(check, prepare, make, finalize, expose, args) { + + if (check && !check.apply(this, args)) { + return false; + } + + if (prepare && !prepare.apply(this, args)) { + return false; + } + + var result = make.apply(this, args); + + + if (finalize) { + finalize.apply(this,args); + } + + if (!result) { + return result; + } + + + if (expose) { + expose.apply(this, args); + } + + return result; + } +}); + + +// create and edit +dojo.lang.extend(dojo.widget.TreeBasicControllerV3, { + + createAndEdit: function(parent, index) { + var data = {title:parent.tree.defaultChildTitle}; + + if (!this.canCreateChild(parent, index, data)) { + return false; + } + + var child = this.doCreateChild(parent, index, data); + if (!child) return false; + this.exposeCreateChild(parent, index, data); + + child.isPhantom = true; + + if (!this.editor.isClosed()) { + //dojo.debug("editLabelStart editor open"); + this.editLabelFinish(this.editor.saveOnBlur); + } + + + + this.doEditLabelStart(child); + + } + +}); + + +// =============================== clone ============================ +dojo.lang.extend(dojo.widget.TreeBasicControllerV3, { + + canClone: function(child, newParent, index, deep){ + return true; + }, + + + clone: function(child, newParent, index, deep) { + return this.runStages( + this.canClone, this.prepareClone, this.doClone, this.finalizeClone, this.exposeClone, arguments + ); + }, + + exposeClone: function(child, newParent) { + if (newParent.isTreeNode) { + this.expand(newParent); + } + }, + + doClone: function(child, newParent, index, deep) { + //dojo.debug("Clone "+child); + var cloned = child.clone(deep); + newParent.addChild(cloned, index); + + return cloned; + } + + +}); + +// =============================== detach ============================ + +dojo.lang.extend(dojo.widget.TreeBasicControllerV3, { + canDetach: function(child) { + if (child.actionIsDisabledNow(child.actions.DETACH)) { + return false; + } + + return true; + }, + + + detach: function(node) { + return this.runStages( + this.canDetach, this.prepareDetach, this.doDetach, this.finalizeDetach, this.exposeDetach, arguments + ); + }, + + + doDetach: function(node, callObj, callFunc) { + node.detach(); + } + +}); + + +// =============================== destroy ============================ +dojo.lang.extend(dojo.widget.TreeBasicControllerV3, { + + canDestroyChild: function(child) { + + if (child.parent && !this.canDetach(child)) { + return false; + } + return true; + }, + + + destroyChild: function(node) { + return this.runStages( + this.canDestroyChild, this.prepareDestroyChild, this.doDestroyChild, this.finalizeDestroyChild, this.exposeDestroyChild, arguments + ); + }, + + + doDestroyChild: function(node) { + node.destroy(); + } + +}); + + + +// =============================== move ============================ + +dojo.lang.extend(dojo.widget.TreeBasicControllerV3, { + + /** + * check for non-treenodes + */ + canMoveNotANode: function(child, parent) { + if (child.treeCanMove) { + return child.treeCanMove(parent); + } + + return true; + }, + + /** + * Checks whether it is ok to change parent of child to newParent + * May incur type checks etc + * + * It should check only hierarchical possibility w/o index, etc + * because in onDragOver event for Between Dnd mode we can't calculate index at once on onDragOVer. + * index changes as client moves mouse up-down over the node + */ + canMove: function(child, newParent){ + if (!child.isTreeNode) { + return this.canMoveNotANode(child, newParent); + } + + if (child.actionIsDisabledNow(child.actions.MOVE)) { + return false; + } + + // if we move under same parent then no matter if ADDCHILD disabled for him + // but if we move to NEW parent then check if action is disabled for him + // also covers case for newParent being a non-folder in strict mode etc + if (child.parent !== newParent && newParent.actionIsDisabledNow(newParent.actions.ADDCHILD)) { + return false; + } + + // Can't move parent under child. check whether new parent is child of "child". + var node = newParent; + while(node.isTreeNode) { + //dojo.debugShallow(node.title) + if (node === child) { + // parent of newParent is child + return false; + } + node = node.parent; + } + + return true; + }, + + + move: function(child, newParent, index/*,...*/) { + return this.runStages(this.canMove, this.prepareMove, this.doMove, this.finalizeMove, this.exposeMove, arguments); + }, + + doMove: function(child, newParent, index) { + //dojo.debug("MOVE "+child); + child.tree.move(child, newParent, index); + + return true; + }, + + exposeMove: function(child, newParent) { + if (newParent.isTreeNode) { + this.expand(newParent); + } + } + + +}); + +dojo.lang.extend(dojo.widget.TreeBasicControllerV3, { + + // ----------------------------------------------------------------------------- + // Create node stuff + // ----------------------------------------------------------------------------- + + + canCreateChild: function(parent, index, data) { + if (parent.actionIsDisabledNow(parent.actions.ADDCHILD)) { + return false; + } + + return true; + }, + + + /* send data to server and add child from server */ + /* data may contain an almost ready child, or anything else, suggested to server */ + /*in Rpc controllers server responds with child data to be inserted */ + createChild: function(parent, index, data) { + if(!data) { + data = {title:parent.tree.defaultChildTitle}; + } + return this.runStages(this.canCreateChild, this.prepareCreateChild, this.doCreateChild, this.finalizeCreateChild, this.exposeCreateChild, + [parent, index, data]); + }, + + prepareCreateChild: function() { return true; }, + finalizeCreateChild: function() {}, + + doCreateChild: function(parent, index, data) { + //dojo.debug("doCreateChild parent "+parent+" index "+index+" data "+data); + + var newChild = parent.tree.createNode(data); + //var newChild = dojo.widget.createWidget(widgetType, data); + + parent.addChild(newChild, index); + + return newChild; + }, + + exposeCreateChild: function(parent) { + return this.expand(parent); + } + + +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeBasicControllerV3.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,150 @@ +/* + 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.TreeCommon"); +dojo.require("dojo.widget.*"); // for dojo.widget.manager + +dojo.declare( + "dojo.widget.TreeCommon", + null, +{ + listenTreeEvents: [], + listenedTrees: {}, + + /** + * evaluates to false => skip unlistening nodes + * provided => use it + */ + listenNodeFilter: null, + + listenTree: function(tree) { + + //dojo.debug("listenTree in "+this+" tree "+tree); + + var _this = this; + + if (this.listenedTrees[tree.widgetId]) { + return; // already listening + } + + dojo.lang.forEach(this.listenTreeEvents, function(event) { + var eventHandler = "on" + event.charAt(0).toUpperCase() + event.substr(1); + //dojo.debug("subscribe: event "+tree.eventNames[event]+" widget "+_this+" handler "+eventHandler); + dojo.event.topic.subscribe(tree.eventNames[event], _this, eventHandler); + }); + + + var filter; + + if (this.listenNodeFilter) { + this.processDescendants(tree, this.listenNodeFilter, this.listenNode, true); + } + + /** + * remember that I listen to this tree. No unbinding/binding/deselection + * needed when transfer between listened trees + */ + this.listenedTrees[tree.widgetId] = true; + + }, + + // interface functions + listenNode: function() {}, + unlistenNode: function() {}, + + unlistenTree: function(tree, nodeFilter) { + + var _this = this; + + if (!this.listenedTrees[tree.widgetId]) { + return; + } + + dojo.lang.forEach(this.listenTreeEvents, function(event) { + var eventHandler = "on" + event.charAt(0).toUpperCase() + event.substr(1); + dojo.event.topic.unsubscribe(tree.eventNames[event], _this, eventHandler); + }); + + + if (this.listenNodeFilter) { + this.processDescendants(tree, this.listenNodeFilter, this.unlistenNode, true); + } + + delete this.listenedTrees[tree.widgetId]; + + }, + + + /** + * check condition for node.domNode -> .. -> any node chain + */ + checkPathCondition: function(domElement, condition) { + + while (domElement && !domElement.widgetId) { + if (condition.call(null, domElement)) { + return true; + } + + domElement = domElement.parentNode; + } + + return false; + }, + + + /** + * get node widget id by its descendant dom node + */ + domElement2TreeNode: function(domElement) { + + while (domElement && !domElement.widgetId) { + domElement = domElement.parentNode; + } + + if (!domElement) { + return null; + } + + var widget = dojo.widget.byId(domElement.widgetId); + + if (!widget.isTreeNode) { + return null; + } + + return widget; + }, + + /** + * it is here, not in Widget, because mostly tree needs it + */ + processDescendants: function(elem, filter, func, skipFirst) { + + var _this = this; + + if (!skipFirst) { + if (!filter.call(_this,elem)) { + return; + } + func.call(_this,elem); + } + + + var stack = [elem]; + while (elem = stack.pop()) { + dojo.lang.forEach(elem.children, function(elem) { + if (filter.call(_this, elem)) { + func.call(_this, elem); + stack.push(elem); + } + }); + } + } +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeCommon.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,181 @@ +/* + 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.TreeContextMenu"); + +dojo.require("dojo.event.*"); +dojo.require("dojo.io.*"); +dojo.require("dojo.widget.Menu2"); + + +dojo.widget.defineWidget("dojo.widget.TreeContextMenu", dojo.widget.PopupMenu2, function() { + this.listenedTrees = []; +}, +{ + open: function(x, y, parentMenu, explodeSrc){ + + var result = dojo.widget.PopupMenu2.prototype.open.apply(this, arguments); + + /* publish many events here about structural changes */ + dojo.event.topic.publish(this.eventNames.open, { menu:this }); + + return result; + }, + + listenTree: function(tree) { + /* add context menu to all nodes that exist already */ + var nodes = tree.getDescendants(); + + for(var i=0; i<nodes.length; i++) { + if (!nodes[i].isTreeNode) continue; + this.bindDomNode(nodes[i].labelNode); + } + + + /* bind context menu to all nodes that will be created in the future (e.g loaded from server)*/ + var _this = this; + dojo.event.topic.subscribe(tree.eventNames.createDOMNode, this, "onCreateDOMNode"); + dojo.event.topic.subscribe(tree.eventNames.moveFrom, this, "onMoveFrom"); + dojo.event.topic.subscribe(tree.eventNames.moveTo, this, "onMoveTo"); + dojo.event.topic.subscribe(tree.eventNames.removeNode, this, "onRemoveNode"); + dojo.event.topic.subscribe(tree.eventNames.addChild, this, "onAddChild"); + dojo.event.topic.subscribe(tree.eventNames.treeDestroy, this, "onTreeDestroy"); + + this.listenedTrees.push(tree); + + }, + + unlistenTree: function(tree) { + /* clear event listeners */ + + dojo.event.topic.unsubscribe(tree.eventNames.createDOMNode, this, "onCreateDOMNode"); + dojo.event.topic.unsubscribe(tree.eventNames.moveFrom, this, "onMoveFrom"); + dojo.event.topic.unsubscribe(tree.eventNames.moveTo, this, "onMoveTo"); + dojo.event.topic.unsubscribe(tree.eventNames.removeNode, this, "onRemoveNode"); + dojo.event.topic.unsubscribe(tree.eventNames.addChild, this, "onAddChild"); + dojo.event.topic.unsubscribe(tree.eventNames.treeDestroy, this, "onTreeDestroy"); + + for(var i=0; i<this.listenedTrees.length; i++){ + if(this.listenedTrees[i] === tree){ + this.listenedTrees.splice(i, 1); + break; + } + } + }, + + onTreeDestroy: function(message) { + this.unlistenTree(message.source); + }, + + bindTreeNode: function(node) { + var _this = this; + //dojo.debug("bind to "+node); + dojo.lang.forEach(node.getDescendants(), + function(e) {_this.bindDomNode(e.labelNode); } + ); + }, + + + unBindTreeNode: function(node) { + var _this = this; + //dojo.debug("Unbind from "+node); + dojo.lang.forEach(node.getDescendants(), + function(e) {_this.unBindDomNode(e.labelNode); } + ); + }, + + onCreateDOMNode: function(message) { + this.bindTreeNode(message.source); + }, + + + onMoveFrom: function(message) { + if (!dojo.lang.inArray(this.listenedTrees, message.newTree)) { + this.unBindTreeNode(message.child); + } + }, + + onMoveTo: function(message) { + if (dojo.lang.inArray(this.listenedTrees, message.newTree)) { + this.bindTreeNode(message.child); + } + }, + + onRemoveNode: function(message) { + this.unBindTreeNode(message.child); + }, + + onAddChild: function(message) { + if (message.domNodeInitialized) { + // dom node was there already => I did not process onNodeDomCreate + this.bindTreeNode(message.child); + } + } + + +}); + +dojo.widget.defineWidget("dojo.widget.TreeMenuItem", dojo.widget.MenuItem2, { + // treeActions menu item performs following actions (to be checked for permissions) + treeActions: "", + + initialize: function(args, frag) { + + this.treeActions = this.treeActions.split(","); + for(var i=0; i<this.treeActions.length; i++) { + this.treeActions[i] = this.treeActions[i].toUpperCase(); + } + + }, + + getTreeNode: function() { + var menu = this; + + while (! (menu instanceof dojo.widget.TreeContextMenu) ) { + menu = menu.parent; + } + + var source = menu.getTopOpenEvent().target; + + while (!source.getAttribute('treeNode') && source.tagName != 'body') { + source = source.parentNode; + } + if (source.tagName == 'body') { + dojo.raise("treeNode not detected"); + } + var treeNode = dojo.widget.manager.getWidgetById(source.getAttribute('treeNode')); + + return treeNode; + }, + + + menuOpen: function(message) { + var treeNode = this.getTreeNode(); + + this.setDisabled(false); // enable by default + + var _this = this; + dojo.lang.forEach(_this.treeActions, + function(action) { + _this.setDisabled( treeNode.actionIsDisabled(action) ); + } + ); + + }, + + toString: function() { + return "["+this.widgetType+" node "+this.getTreeNode()+"]"; + } + +}); + + Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenu.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,132 @@ +/* + 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.TreeContextMenuV3"); + +dojo.require("dojo.event.*"); +dojo.require("dojo.io.*"); +dojo.require("dojo.widget.*"); +dojo.require("dojo.widget.Menu2"); +dojo.require("dojo.widget.TreeCommon"); + +dojo.widget.defineWidget( + "dojo.widget.TreeContextMenuV3", + [dojo.widget.PopupMenu2, dojo.widget.TreeCommon], + function() { + this.listenedTrees = {}; + + }, +{ + + listenTreeEvents: ["afterTreeCreate","beforeTreeDestroy"], + listenNodeFilter: function(elem) { return elem instanceof dojo.widget.Widget}, + + onAfterTreeCreate: function(message) { + var tree = message.source; + this.bindDomNode(tree.domNode); + }, + + onBeforeTreeDestroy: function(message) { + this.unBindDomNode(message.source.domNode); + }, + + + getTreeNode: function() { + + var source = this.getTopOpenEvent().target; + var treeNode = this.domElement2TreeNode(source); + return treeNode; + + }, + + open: function() { + var result = dojo.widget.PopupMenu2.prototype.open.apply(this, arguments); + + for(var i=0; i< this.children.length; i++) { + /* notify children */ + if (this.children[i].menuOpen) { + this.children[i].menuOpen(this.getTreeNode()); + } + } + return result; + }, + + close: function(){ + + for(var i=0; i< this.children.length; i++) { + /* notify menu entries */ + if (this.children[i].menuClose) { + this.children[i].menuClose(this.getTreeNode()); + } + } + + + var result = dojo.widget.PopupMenu2.prototype.close.apply(this, arguments); + + return result + } + +}); + + +dojo.widget.defineWidget( + "dojo.widget.TreeMenuItemV3", + [dojo.widget.MenuItem2, dojo.widget.TreeCommon], + function() { + this.treeActions = []; + }, +{ + // treeActions menu item performs following actions (to be checked for permissions) + treeActions: "", + + initialize: function(args, frag) { + for(var i=0; i<this.treeActions.length; i++) { + this.treeActions[i] = this.treeActions[i].toUpperCase(); + } + }, + + + getTreeNode: function() { + var menu = this; + + // FIXME: change to dojo.widget[this.widgetType] + while (! (menu instanceof dojo.widget.TreeContextMenuV3) ) { + menu = menu.parent; + } + + var treeNode = menu.getTreeNode() + + return treeNode; + }, + + + menuOpen: function(treeNode) { + + treeNode.viewEmphasize() + this.setDisabled(false); // enable by default + + var _this = this; + dojo.lang.forEach(_this.treeActions, + function(action) { + _this.setDisabled( treeNode.actionIsDisabledNow(action) ); + } + ); + + }, + + menuClose: function(treeNode) { + + treeNode.viewUnemphasize() + }, + + toString: function() { + return "["+this.widgetType+" node "+this.getTreeNode()+"]"; + } +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeContextMenuV3.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,94 @@ +/* + 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 +*/ + +/** + * Additional tree utils + * + */ +dojo.provide("dojo.widget.TreeControllerExtension"); + +dojo.declare( + "dojo.widget.TreeControllerExtension", + null, +{ + saveExpandedIndices: function(node, field) { + var obj = {}; + + for(var i=0; i<node.children.length; i++) { + if (node.children[i].isExpanded) { + var key = dojo.lang.isUndefined(field) ? i : node.children[i][field]; + obj[key] = this.saveExpandedIndices(node.children[i], field); + } + } + + return obj; + }, + + + restoreExpandedIndices: function(node, savedIndices, field) { + var _this = this; + + var handler = function(node, savedIndices) { + this.node = node; //.children[i]; + this.savedIndices = savedIndices; //[i]; + // recursively read next savedIndices level and apply to opened node + this.process = function() { + //dojo.debug("Callback applied for "+this.node); + _this.restoreExpandedIndices(this.node, this.savedIndices, field); + }; + } + + + for(var i=0; i<node.children.length; i++) { + var child = node.children[i]; + + var found = false; + var key = -1; + + //dojo.debug("Check "+child) + // process field set case + if (dojo.lang.isUndefined(field) && savedIndices[i]) { + found = true; + key = i; + } + + // process case when field is not set + if (field) { + for(var key in savedIndices) { + //dojo.debug("Compare "+key+" "+child[field]) + if (key == child[field]) { + found = true; + break; + } + } + } + + // if we found anything - expand it + if (found) { + //dojo.debug("Found at "+key) + var h = new handler(child, savedIndices[key]); + _this.expand(child, false, h, h.process); + } else if (child.isExpanded) { // not found, so collapse + //dojo.debug("Collapsing all descendants "+node.children[i]) + dojo.lang.forEach(child.getDescendants(), function(elem) { _this.collapse(elem); }); + //this.collapse(node.children[i]); + } + + } + + + } + +}); + + + + + Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeControllerExtension.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,130 @@ +/* + 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.TreeDemo"); +dojo.require("dojo.Deferred"); + +dojo.widget.TreeDemo = { + + reportIfDefered: function(res) { + if (res instanceof dojo.Deferred) { + res.addCallbacks( + function(res) { /* dojo.debug("OK " + (res ? res: '')); */ return res }, + function(err) { dojo.debug("Error"); dojo.debugShallow(err); } + ); + } + }, + + resetRandomChildren: function(maxCount) { + this.randomChildrenMaxCount = maxCount; + this.randomChildrenCount = 0; + this.randomChildrenDepth = 0; + }, + + + makeRandomChildren: function(title) { + + this.randomChildrenDepth++; + + var children = []; + for (var i=1; i<=5; i++) { + + var t = title+(this.randomChildrenDepth==1 ? '' : '.')+i; + var node = {title: t}; + + children.push(node); + this.randomChildrenCount++ + if (this.randomChildrenCount >= this.randomChildrenMaxCount) { + break; + } + } + + var i=1; + var _this = this; + dojo.lang.forEach(children, function(child) { + var t = title+(_this.randomChildrenDepth==1 ? '' : '.')+i; + i++; + + // first node is always folder for tests + if (_this.randomChildrenCount<_this.randomChildrenMaxCount && ( + _this.randomChildrenDepth==1 && child === children[0] || _this.randomChildrenDepth<5 && Math.random()>0.3 ) + ) { + //dojo.debug("add child "+t); + child.children = _this.makeRandomChildren(t); + } + }); + + + //dojo.debug("out "+nodeOrTree); + + this.randomChildrenDepth--; + + return children; + }, + + bindDemoMenu: function(controller) { + var _t = this; + + dojo.event.topic.subscribe('treeContextMenuDestroy/engage', + function (menuItem) { + var node = menuItem.getTreeNode(); + //if (confirm("Delete node with descendants: "+node.title.replace(/(<([^>]+)>)/ig," ") +" ?")) { + _t.reportIfDefered(controller.destroyChild(node)); + + } + ); + + dojo.event.topic.subscribe('treeContextMenuRefresh/engage', + function (menuItem) { + var node = menuItem.getTreeNode(); + _t.reportIfDefered(controller.refreshChildren(node)); + } + ); + + dojo.event.topic.subscribe('treeContextMenuCreate/engage', + function (menuItem) { + var node = menuItem.getTreeNode(); + var d = controller.createAndEdit(node, 0); + _t.reportIfDefered(d); + } + ); + + + dojo.event.topic.subscribe('treeContextMenuUp/engage', + function (menuItem) { + var node = menuItem.getTreeNode(); + if (node.isFirstChild()) return; + _t.reportIfDefered(controller.move(node, node.parent, node.getParentIndex()-1)); + } + ); + + + dojo.event.topic.subscribe('treeContextMenuDown/engage', + function (menuItem) { + var node = menuItem.getTreeNode(); + if (node.isLastChild()) return; + _t.reportIfDefered(controller.move(node, node.parent, node.getParentIndex()+1)); + } + ); + + dojo.event.topic.subscribe('treeContextMenuEdit/engage', + function (menuItem) { + var node = menuItem.getTreeNode(); + _t.reportIfDefered(controller.editLabelStart(node)); + } + ); + + + } + + + +} Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDemo.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,37 @@ +/* + 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.TreeDeselectOnDblselect"); + +dojo.require("dojo.widget.HtmlWidget"); +dojo.require("dojo.widget.TreeSelectorV3"); + +dojo.deprecated("Does anyone still need this extension? (TreeDeselectOnDblselect)"); +// selector extension to emphasize node + +dojo.widget.defineWidget( + "dojo.widget.TreeDeselectOnDblselect", + [dojo.widget.HtmlWidget], +{ + selector: "", + + initialize: function() { + this.selector = dojo.widget.byId(this.selector); + //dojo.debug("OK "+this.selector); + dojo.event.topic.subscribe(this.selector.eventNames.dblselect, this, "onDblselect"); + }, + + onDblselect: function(message) { + //dojo.debug("happen "+this.selector); + //dojo.debug(message.node); + this.selector.deselect(message.node); + } +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDeselectOnDblselect.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,55 @@ +/* + 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.TreeDisableWrapExtension" ); + +dojo.require( "dojo.widget.HtmlWidget" ); +dojo.require( "dojo.widget.TreeExtension" ); + +// selector extension to emphasize node +dojo.widget.defineWidget( + "dojo.widget.TreeDisableWrapExtension", + dojo.widget.TreeExtension, +{ + /** + * can't unlisten + */ + templateCssPath: dojo.uri.dojoUri( "src/widget/templates/TreeDisableWrap.css" ), + + listenTree: function(tree) { + + var wrappingDiv = document.createElement( "div" ); + var clazz = tree.classPrefix+"DisableWrap"; + if (dojo.render.html.ie) { + clazz = clazz+' '+ tree.classPrefix+"IEDisableWrap"; + } + dojo.html.setClass(wrappingDiv, clazz); + + var table = document.createElement( "table" ); + wrappingDiv.appendChild( table ); + + var tbody = document.createElement( "tbody" ); + table.appendChild( tbody ); + + var tr = document.createElement( "tr" ); + tbody.appendChild( tr ); + + var td = document.createElement( "td" ); + tr.appendChild( td ); + + if( tree.domNode.parentNode ) { + tree.domNode.parentNode.replaceChild( wrappingDiv, tree.domNode ); + } + + td.appendChild( tree.domNode ); + tree.domNode = wrappingDiv; + } +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDisableWrapExtension.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,140 @@ +/* + 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.TreeDndControllerV3"); + +dojo.require("dojo.dnd.TreeDragAndDropV3"); +dojo.require("dojo.experimental"); + +dojo.experimental("Tree drag'n'drop' has lots of problems/bugs, it requires dojo drag'n'drop overhaul to work, probably in 0.5"); + +dojo.widget.defineWidget( + "dojo.widget.TreeDndControllerV3", + [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], + function() { + this.dragSources = {}; + this.dropTargets = {}; + this.listenedTrees = {}; + }, +{ + listenTreeEvents: ["afterChangeTree","beforeTreeDestroy", "afterAddChild"], + listenNodeFilter: function(elem) { return elem instanceof dojo.widget.Widget}, + + initialize: function(args) { + this.treeController = dojo.lang.isString(args.controller) ? dojo.widget.byId(args.controller) : args.controller; + + if (!this.treeController) { + dojo.raise("treeController must be declared"); + } + + }, + + onBeforeTreeDestroy: function(message) { + this.unlistenTree(message.source); + }, + + // first Dnd registration happens in addChild + // because I have information about parent on this stage and can use it + // to check locking or other things + onAfterAddChild: function(message) { + //dojo.debug("Dnd addChild "+message.child); + this.listenNode(message.child); + }, + + + onAfterChangeTree: function(message) { + /* catch new nodes on afterAddChild, because I need parent */ + if (!message.oldTree) return; + + //dojo.debug("HERE"); + + if (!message.newTree || !this.listenedTrees[message.newTree.widgetId]) { + this.processDescendants(message.node, this.listenNodeFilter, this.unlistenNode); + } + + if (!this.listenedTrees[message.oldTree.widgetId]) { + // we have new node + this.processDescendants(message.node, this.listenNodeFilter, this.listenNode); + } + //dojo.profile.end("onTreeChange"); + }, + + + /** + * Controller(node model) creates DndNodes because it passes itself to node for synchroneous drops processing + * I can't process DnD with events cause an event can't return result success/false + */ + listenNode: function(node) { + + //dojo.debug("listen dnd "+node); + //dojo.debug((new Error()).stack) + //dojo.profile.start("Dnd listenNode "+node); + if (!node.tree.DndMode) return; + if (this.dragSources[node.widgetId] || this.dropTargets[node.widgetId]) return; + + + /* I drag label, not domNode, because large domNodes are very slow to copy and large to drag */ + + var source = null; + var target = null; + + + if (!node.actionIsDisabled(node.actions.MOVE)) { + //dojo.debug("reg source") + + //dojo.profile.start("Dnd source "+node); + var source = this.makeDragSource(node); + //dojo.profile.end("Dnd source "+node); + + this.dragSources[node.widgetId] = source; + } + + //dojo.profile.start("Dnd target "+node); + //dojo.debug("reg target"); + var target = this.makeDropTarget(node); + //dojo.profile.end("Dnd target "+node); + + this.dropTargets[node.widgetId] = target; + + //dojo.profile.end("Dnd listenNode "+node); + + + }, + + /** + * Factory method, override it to create special source + */ + makeDragSource: function(node) { + return new dojo.dnd.TreeDragSourceV3(node.contentNode, this, node.tree.widgetId, node); + }, + + + /** + * Factory method, override it to create special target + */ + makeDropTarget: function(node) { + return new dojo.dnd.TreeDropTargetV3(node.contentNode, this.treeController, node.tree.DndAcceptTypes, node); + }, + + unlistenNode: function(node) { + + if (this.dragSources[node.widgetId]) { + dojo.dnd.dragManager.unregisterDragSource(this.dragSources[node.widgetId]); + delete this.dragSources[node.widgetId]; + } + + if (this.dropTargets[node.widgetId]) { + dojo.dnd.dragManager.unregisterDropTarget(this.dropTargets[node.widgetId]); + delete this.dropTargets[node.widgetId]; + } + } + +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDndControllerV3.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,117 @@ +/* + 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.TreeDocIconExtension"); + +dojo.require("dojo.widget.HtmlWidget"); +dojo.require("dojo.widget.TreeExtension"); + +// selector extension to emphasize node + +dojo.widget.defineWidget( + "dojo.widget.TreeDocIconExtension", + [dojo.widget.TreeExtension], +{ + /** + * can't unlisten + */ + + templateCssPath: dojo.uri.dojoUri("src/widget/templates/TreeDocIcon.css"), + + + listenTreeEvents: ["afterChangeTree","afterSetFolder","afterUnsetFolder"], + + listenNodeFilter: function(elem) { return elem instanceof dojo.widget.Widget }, + + getnodeDocType: function(node) { + var nodeDocType = node.getnodeDocType(); + if (!nodeDocType) { // set default type + nodeDocType = node.isFolder ? "Folder" : "Document"; + } + return nodeDocType; + }, + + setnodeDocTypeClass: function(node) { + + var reg = new RegExp("(^|\\s)"+node.tree.classPrefix+"Icon\\w+",'g'); + + var clazz = dojo.html.getClass(node.iconNode).replace(reg,'') + ' ' + node.tree.classPrefix+'Icon'+this.getnodeDocType(node); + dojo.html.setClass(node.iconNode, clazz); + }, + + + onAfterSetFolder: function(message) { + //dojo.debug("FOLDER"); + if (message.source.iconNode) { + // on node-initialize time when folder is set there is no iconNode + // this case will be processed in treeChange anyway + this.setnodeDocTypeClass(message.source); + } + }, + + + onAfterUnsetFolder: function(message) { + this.setnodeDocTypeClass(message.source); + }, + + + listenNode: function(node) { + /** + * add node with document type icon to node template and Tree.iconNodeTemplate + * it will be set to TreeNode.iconNode on node creation + * we do not assign document type yet, its node specific + */ + //dojo.debug("listenNode in "+node); + + node.contentIconNode = document.createElement("div"); + var clazz = node.tree.classPrefix+"IconContent"; + if (dojo.render.html.ie) { + clazz = clazz+' '+ node.tree.classPrefix+"IEIconContent"; + } + dojo.html.setClass(node.contentIconNode, clazz); + + node.contentNode.parentNode.replaceChild(node.contentIconNode, node.expandNode); + + node.iconNode = document.createElement("div"); + dojo.html.setClass(node.iconNode, node.tree.classPrefix+"Icon"+' '+node.tree.classPrefix+'Icon'+this.getnodeDocType(node)); + + node.contentIconNode.appendChild(node.expandNode); + node.contentIconNode.appendChild(node.iconNode); + + dojo.dom.removeNode(node.contentNode); + node.contentIconNode.appendChild(node.contentNode); + + + + //dojo.html.insertAfter(node.iconNode, node.expandNode); + + //dojo.debug("listenNode out "+node); + + }, + + + onAfterChangeTree: function(message) { + var _this = this; + + //dojo.debug(message.node) + + if (!message.oldTree || !this.listenedTrees[message.oldTree.widgetId]) { + // moving from old tree to our tree + this.processDescendants(message.node, + this.listenNodeFilter, + this.listenNode + ); + } + + } + + +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeDocIconExtension.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeEditor.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeEditor.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeEditor.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/TreeEditor.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,111 @@ +/* + 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.require("dojo.widget.*"); +dojo.require("dojo.widget.HtmlWidget"); +dojo.require("dojo.widget.RichText"); + +dojo.provide("dojo.widget.TreeEditor"); + +dojo.widget.defineWidget( + "dojo.widget.TreeEditor", + dojo.widget.HtmlWidget, +{ + singleLineMode: false, // enter saves + saveOnBlur: true, // blur or new edit saves current + sync: false, // finish editing in sync/async mode + selectOnOpen: true, + + controller: null, + + node: null, + + richTextParams: {styleSheets: 'src/widget/templates/TreeEditor.css'}, + + getContents: function() { + return this.richText.getEditorContent(); + }, + + open: function(node) { + + if (!this.richText) { + this.richText = dojo.widget.createWidget("RichText", this.richTextParams, node.labelNode); + + dojo.event.connect("around", this.richText, "onKeyDown", this, "richText_onKeyDown" ); + dojo.event.connect(this.richText, "onBlur", this, "richText_onBlur" ); + + var self = this; + dojo.event.connect(this.richText, "onLoad", function(){ + if (self.selectOnOpen) { + self.richText.execCommand("selectall"); + } + }); + } else { + this.richText.open(node.labelNode); + } + + this.node = node; + }, + + close: function(save) { + + this.richText.close(save); + + + this.node = null; + }, + + isClosed: function( |
Free forum by Nabble | Edit this page |