Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,265 @@ +/* + 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.Toaster"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.lfx.*"); +dojo.require("dojo.html.iframe"); + +// This is mostly taken from Jesse Kuhnert's MessageNotifier. +// Modified by Bryan Forbes to support topics and a variable delay. + +dojo.widget.defineWidget( + "dojo.widget.Toaster", + dojo.widget.HtmlWidget, + { + // summary + // Message that slides in from the corner of the screen, used for notifications + // like "new email". + + templateString: '<div dojoAttachPoint="clipNode"><div dojoAttachPoint="containerNode" dojoAttachEvent="onClick:onSelect"><div dojoAttachPoint="contentNode"></div></div></div>', + templateCssPath: dojo.uri.dojoUri("src/widget/templates/Toaster.css"), + + // messageTopic: String + // Name of topic; anything published to this topic will be displayed as a message. + // Message format is either String or an object like + // {message: "hello word", type: "ERROR", delay: 500} + messageTopic: "", + + // messageTypes: Enumeration + // Possible message types. + messageTypes: { + MESSAGE: "MESSAGE", + WARNING: "WARNING", + ERROR: "ERROR", + FATAL: "FATAL" + }, + + // defaultType: String + // If message type isn't specified (see "messageTopic" parameter), + // then display message as this type. + // Possible values in messageTypes enumeration ("MESSAGE", "WARNING", "ERROR", "FATAL") + defaultType: "MESSAGE", + + // css classes + clipCssClass: "dojoToasterClip", + containerCssClass: "dojoToasterContainer", + contentCssClass: "dojoToasterContent", + messageCssClass: "dojoToasterMessage", + warningCssClass: "dojoToasterWarning", + errorCssClass: "dojoToasterError", + fatalCssClass: "dojoToasterFatal", + + // positionDirection: String + // Position from which message slides into screen, one of + // ["br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"] + positionDirection: "br-up", + + // positionDirectionTypes: Enumeration + // Possible values for positionDirection parameter + positionDirectionTypes: ["br-up", "br-left", "bl-up", "bl-right", "tr-down", "tr-left", "tl-down", "tl-right"], + + // showDelay: Integer + // Number of milliseconds to show message + // TODO: this is a strange name. "duration" makes more sense + showDelay: 2000, + + postCreate: function(){ + this.hide(); + dojo.html.setClass(this.clipNode, this.clipCssClass); + dojo.html.addClass(this.containerNode, this.containerCssClass); + dojo.html.setClass(this.contentNode, this.contentCssClass); + if(this.messageTopic){ + dojo.event.topic.subscribe(this.messageTopic, this, "_handleMessage"); + } + if(!this.positionDirection || !dojo.lang.inArray(this.positionDirectionTypes, this.positionDirection)){ + this.positionDirection = this.positionDirectionTypes.BRU; + } + }, + + _handleMessage: function(msg){ + if(dojo.lang.isString(msg)){ + this.setContent(msg); + }else{ + this.setContent(msg["message"], msg["type"], msg["delay"]); + } + }, + + setContent: function(msg, messageType, delay){ + // summary + // sets and displays the given message and show duration + // msg: String + // the message + // messageType: Enumeration + // type of message; possible values in messageTypes array ("MESSAGE", "WARNING", "ERROR", "FATAL") + // delay: Integer + // number of milliseconds to display message + + var delay = delay||this.showDelay; + // sync animations so there are no ghosted fades and such + if(this.slideAnim && this.slideAnim.status() == "playing"){ + dojo.lang.setTimeout(50, dojo.lang.hitch(this, function(){ + this.setContent(msg, messageType); + })); + return; + }else if(this.slideAnim){ + this.slideAnim.stop(); + if(this.fadeAnim) this.fadeAnim.stop(); + } + if(!msg){ + dojo.debug(this.widgetId + ".setContent() incoming content was null, ignoring."); + return; + } + if(!this.positionDirection || !dojo.lang.inArray(this.positionDirectionTypes, this.positionDirection)){ + dojo.raise(this.widgetId + ".positionDirection is an invalid value: " + this.positionDirection); + } + + // determine type of content and apply appropriately + dojo.html.removeClass(this.containerNode, this.messageCssClass); + dojo.html.removeClass(this.containerNode, this.warningCssClass); + dojo.html.removeClass(this.containerNode, this.errorCssClass); + dojo.html.removeClass(this.containerNode, this.fatalCssClass); + + dojo.html.clearOpacity(this.containerNode); + + if(msg instanceof String || typeof msg == "string"){ + this.contentNode.innerHTML = msg; + }else if(dojo.html.isNode(msg)){ + this.contentNode.innerHTML = dojo.html.getContentAsString(msg); + }else{ + dojo.raise("Toaster.setContent(): msg is of unknown type:" + msg); + } + + switch(messageType){ + case this.messageTypes.WARNING: + dojo.html.addClass(this.containerNode, this.warningCssClass); + break; + case this.messageTypes.ERROR: + dojo.html.addClass(this.containerNode, this.errorCssClass); + break + case this.messageTypes.FATAL: + dojo.html.addClass(this.containerNode, this.fatalCssClass); + break; + case this.messageTypes.MESSAGE: + default: + dojo.html.addClass(this.containerNode, this.messageCssClass); + break; + } + + // now do funky animation of widget appearing from + // bottom right of page and up + this.show(); + + var nodeSize = dojo.html.getMarginBox(this.containerNode); + + // sets up initial position of container node and slide-out direction + if(this.positionDirection.indexOf("-up") >= 0){ + this.containerNode.style.left=0+"px"; + this.containerNode.style.top=nodeSize.height + 10 + "px"; + }else if(this.positionDirection.indexOf("-left") >= 0){ + this.containerNode.style.left=nodeSize.width + 10 +"px"; + this.containerNode.style.top=0+"px"; + }else if(this.positionDirection.indexOf("-right") >= 0){ + this.containerNode.style.left = 0 - nodeSize.width - 10 + "px"; + this.containerNode.style.top = 0+"px"; + }else if(this.positionDirection.indexOf("-down") >= 0){ + this.containerNode.style.left = 0+"px"; + this.containerNode.style.top = 0 - nodeSize.height - 10 + "px"; + }else{ + dojo.raise(this.widgetId + ".positionDirection is an invalid value: " + this.positionDirection); + } + + this.slideAnim = dojo.lfx.html.slideTo( + this.containerNode, + { top: 0, left: 0 }, + 450, + null, + dojo.lang.hitch(this, function(nodes, anim){ + dojo.lang.setTimeout(dojo.lang.hitch(this, function(evt){ + // we must hide the iframe in order to fade + // TODO: figure out how to fade with a BackgroundIframe + if(this.bgIframe){ + this.bgIframe.hide(); + } + // can't do a fadeHide because we're fading the + // inner node rather than the clipping node + this.fadeAnim = dojo.lfx.html.fadeOut( + this.containerNode, + 1000, + null, + dojo.lang.hitch(this, function(evt){ + this.hide(); + })).play(); + }), delay); + })).play(); + }, + + _placeClip: function(){ + var scroll = dojo.html.getScroll(); + var view = dojo.html.getViewport(); + + var nodeSize = dojo.html.getMarginBox(this.containerNode); + + // sets up the size of the clipping node + this.clipNode.style.height = nodeSize.height+"px"; + this.clipNode.style.width = nodeSize.width+"px"; + + // sets up the position of the clipping node + if(this.positionDirection.match(/^t/)){ + this.clipNode.style.top = scroll.top+"px"; + }else if(this.positionDirection.match(/^b/)){ + this.clipNode.style.top = (view.height - nodeSize.height - 2 + scroll.top)+"px"; + } + if(this.positionDirection.match(/^[tb]r-/)){ + this.clipNode.style.left = (view.width - nodeSize.width - 1 - scroll.left)+"px"; + }else if(this.positionDirection.match(/^[tb]l-/)){ + this.clipNode.style.left = 0 + "px"; + } + + this.clipNode.style.clip = "rect(0px, " + nodeSize.width + "px, " + nodeSize.height + "px, 0px)"; + + if(dojo.render.html.ie){ + if(!this.bgIframe){ + this.bgIframe = new dojo.html.BackgroundIframe(this.containerNode); + this.bgIframe.setZIndex(this.containerNode); + } + this.bgIframe.onResized(); + this.bgIframe.show(); + } + }, + + onSelect: function(e) { + // summary: callback for when user clicks the message + }, + + show: function(){ + dojo.widget.Toaster.superclass.show.call(this); + + this._placeClip(); + + if(!this._scrollConnected){ + this._scrollConnected = true; + dojo.event.connect(window, "onscroll", this, "_placeClip"); + } + }, + + hide: function(){ + dojo.widget.Toaster.superclass.hide.call(this); + + if(this._scrollConnected){ + this._scrollConnected = false; + dojo.event.disconnect(window, "onscroll", this, "_placeClip"); + } + + dojo.html.setOpacity(this.containerNode, 1.0); + } + } +); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toaster.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,36 @@ +/* + 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.Toggler"); +dojo.require("dojo.widget.*"); +dojo.require("dojo.event.*"); + +dojo.widget.defineWidget( + "dojo.widget.Toggler", + dojo.widget.HtmlWidget, +{ + // summary: + // clicking on this widget shows/hides another widget + + // targetId: String + // Id of widget to show/hide when this widget is clicked + targetId: '', + + fillInTemplate: function() { + dojo.event.connect(this.domNode, "onclick", this, "onClick"); + }, + + onClick: function() { + var pane = dojo.widget.byId(this.targetId); + if(!pane){ return; } + pane.explodeSrc = this.domNode; + pane.toggleShowing(); + } +}); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toggler.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,944 @@ +/* + 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.Toolbar"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.html.style"); + +/* ToolbarContainer + *******************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarContainer", + dojo.widget.HtmlWidget, +{ + isContainer: true, + + templateString: '<div class="toolbarContainer" dojoAttachPoint="containerNode"></div>', + templateCssPath: dojo.uri.dojoUri("src/widget/templates/Toolbar.css"), + + getItem: function(name) { + if(name instanceof dojo.widget.ToolbarItem) { return name; } + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + var item = child.getItem(name); + if(item) { return item; } + } + } + return null; + }, + + getItems: function() { + var items = []; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + items = items.concat(child.getItems()); + } + } + return items; + }, + + enable: function() { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + child.enable.apply(child, arguments); + } + } + }, + + disable: function() { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + child.disable.apply(child, arguments); + } + } + }, + + select: function(name) { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + child.select(arguments); + } + } + }, + + deselect: function(name) { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + child.deselect(arguments); + } + } + }, + + getItemsState: function() { + var values = {}; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + dojo.lang.mixin(values, child.getItemsState()); + } + } + return values; + }, + + getItemsActiveState: function() { + var values = {}; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + dojo.lang.mixin(values, child.getItemsActiveState()); + } + } + return values; + }, + + getItemsSelectedState: function() { + var values = {}; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.Toolbar) { + dojo.lang.mixin(values, child.getItemsSelectedState()); + } + } + return values; + } +}); + +/* Toolbar + **********/ + +dojo.widget.defineWidget( + "dojo.widget.Toolbar", + dojo.widget.HtmlWidget, +{ + isContainer: true, + + templateString: '<div class="toolbar" dojoAttachPoint="containerNode" unselectable="on" dojoOnMouseover="_onmouseover" dojoOnMouseout="_onmouseout" dojoOnClick="_onclick" dojoOnMousedown="_onmousedown" dojoOnMouseup="_onmouseup"></div>', + + // given a node, tries to find it's toolbar item + _getItem: function(node) { + var start = new Date(); + var widget = null; + while(node && node != this.domNode) { + if(dojo.html.hasClass(node, "toolbarItem")) { + var widgets = dojo.widget.manager.getWidgetsByFilter(function(w) { return w.domNode == node; }); + if(widgets.length == 1) { + widget = widgets[0]; + break; + } else if(widgets.length > 1) { + dojo.raise("Toolbar._getItem: More than one widget matches the node"); + } + } + node = node.parentNode; + } + return widget; + }, + + _onmouseover: function(e) { + var widget = this._getItem(e.target); + if(widget && widget._onmouseover) { widget._onmouseover(e); } + }, + + _onmouseout: function(e) { + var widget = this._getItem(e.target); + if(widget && widget._onmouseout) { widget._onmouseout(e); } + }, + + _onclick: function(e) { + var widget = this._getItem(e.target); + if(widget && widget._onclick){ + widget._onclick(e); + } + }, + + _onmousedown: function(e) { + var widget = this._getItem(e.target); + if(widget && widget._onmousedown) { widget._onmousedown(e); } + }, + + _onmouseup: function(e) { + var widget = this._getItem(e.target); + if(widget && widget._onmouseup) { widget._onmouseup(e); } + }, + + addChild: function(item, pos, props) { + var widget = dojo.widget.ToolbarItem.make(item, null, props); + var ret = dojo.widget.Toolbar.superclass.addChild.call(this, widget, null, pos, null); + return ret; + }, + + push: function() { + for(var i = 0; i < arguments.length; i++) { + this.addChild(arguments[i]); + } + }, + + getItem: function(name) { + if(name instanceof dojo.widget.ToolbarItem) { return name; } + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem + && child._name == name) { return child; } + } + return null; + }, + + getItems: function() { + var items = []; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem) { + items.push(child); + } + } + return items; + }, + + getItemsState: function() { + var values = {}; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem) { + values[child._name] = { + selected: child._selected, + enabled: !child.disabled + }; + } + } + return values; + }, + + getItemsActiveState: function() { + var values = this.getItemsState(); + for(var item in values) { + values[item] = values[item].enabled; + } + return values; + }, + + getItemsSelectedState: function() { + var values = this.getItemsState(); + for(var item in values) { + values[item] = values[item].selected; + } + return values; + }, + + enable: function() { + var items = arguments.length ? arguments : this.children; + for(var i = 0; i < items.length; i++) { + var child = this.getItem(items[i]); + if(child instanceof dojo.widget.ToolbarItem) { + child.enable(false, true); + } + } + }, + + disable: function() { + var items = arguments.length ? arguments : this.children; + for(var i = 0; i < items.length; i++) { + var child = this.getItem(items[i]); + if(child instanceof dojo.widget.ToolbarItem) { + child.disable(); + } + } + }, + + select: function() { + for(var i = 0; i < arguments.length; i++) { + var name = arguments[i]; + var item = this.getItem(name); + if(item) { item.select(); } + } + }, + + deselect: function() { + for(var i = 0; i < arguments.length; i++) { + var name = arguments[i]; + var item = this.getItem(name); + if(item) { item.disable(); } + } + }, + + setValue: function() { + for(var i = 0; i < arguments.length; i += 2) { + var name = arguments[i], value = arguments[i+1]; + var item = this.getItem(name); + if(item) { + if(item instanceof dojo.widget.ToolbarItem) { + item.setValue(value); + } + } + } + } +}); + +/* ToolbarItem hierarchy: + - ToolbarItem + - ToolbarButton + - ToolbarDialog + - ToolbarMenu + - ToolbarSeparator + - ToolbarSpace + - ToolbarFlexibleSpace +*/ + + +/* ToolbarItem + **************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarItem", + dojo.widget.HtmlWidget, +{ + templateString: '<span unselectable="on" class="toolbarItem"></span>', + + _name: null, + getName: function() { return this._name; }, + setName: function(value) { return (this._name = value); }, + getValue: function() { return this.getName(); }, + setValue: function(value) { return this.setName(value); }, + + _selected: false, + isSelected: function() { return this._selected; }, + setSelected: function(is, force, preventEvent) { + if(!this._toggleItem && !force) { return; } + is = Boolean(is); + if(force || !this.disabled && this._selected != is) { + this._selected = is; + this.update(); + if(!preventEvent) { + this._fireEvent(is ? "onSelect" : "onDeselect"); + this._fireEvent("onChangeSelect"); + } + } + }, + select: function(force, preventEvent) { + return this.setSelected(true, force, preventEvent); + }, + deselect: function(force, preventEvent) { + return this.setSelected(false, force, preventEvent); + }, + + _toggleItem: false, + isToggleItem: function() { return this._toggleItem; }, + setToggleItem: function(value) { this._toggleItem = Boolean(value); }, + + toggleSelected: function(force) { + return this.setSelected(!this._selected, force); + }, + + isEnabled: function() { return !this.disabled; }, + setEnabled: function(is, force, preventEvent) { + is = Boolean(is); + if(force || this.disabled == is) { + this.disabled = !is; + this.update(); + if(!preventEvent) { + this._fireEvent(this.disabled ? "onDisable" : "onEnable"); + this._fireEvent("onChangeEnabled"); + } + } + return !this.disabled; + }, + enable: function(force, preventEvent) { + return this.setEnabled(true, force, preventEvent); + }, + disable: function(force, preventEvent) { + return this.setEnabled(false, force, preventEvent); + }, + toggleEnabled: function(force, preventEvent) { + return this.setEnabled(this.disabled, force, preventEvent); + }, + + _icon: null, + getIcon: function() { return this._icon; }, + setIcon: function(value) { + var icon = dojo.widget.Icon.make(value); + if(this._icon) { + this._icon.setIcon(icon); + } else { + this._icon = icon; + } + var iconNode = this._icon.getNode(); + if(iconNode.parentNode != this.domNode) { + if(this.domNode.hasChildNodes()) { + this.domNode.insertBefore(iconNode, this.domNode.firstChild); + } else { + this.domNode.appendChild(iconNode); + } + } + return this._icon; + }, + + // TODO: update the label node (this.labelNode?) + _label: "", + getLabel: function() { return this._label; }, + setLabel: function(value) { + var ret = (this._label = value); + if(!this.labelNode) { + this.labelNode = document.createElement("span"); + this.domNode.appendChild(this.labelNode); + } + this.labelNode.innerHTML = ""; + this.labelNode.appendChild(document.createTextNode(this._label)); + this.update(); + return ret; + }, + + // fired from: setSelected, setEnabled, setLabel + update: function() { + if(this.disabled) { + this._selected = false; + dojo.html.addClass(this.domNode, "disabled"); + dojo.html.removeClass(this.domNode, "down"); + dojo.html.removeClass(this.domNode, "hover"); + } else { + dojo.html.removeClass(this.domNode, "disabled"); + if(this._selected) { + dojo.html.addClass(this.domNode, "selected"); + } else { + dojo.html.removeClass(this.domNode, "selected"); + } + } + this._updateIcon(); + }, + + _updateIcon: function() { + if(this._icon) { + if(this.disabled) { + this._icon.disable(); + } else { + if(this._cssHover) { + this._icon.hover(); + } else if(this._selected) { + this._icon.select(); + } else { + this._icon.enable(); + } + } + } + }, + + _fireEvent: function(evt) { + if(typeof this[evt] == "function") { + var args = [this]; + for(var i = 1; i < arguments.length; i++) { + args.push(arguments[i]); + } + this[evt].apply(this, args); + } + }, + + _onmouseover: function(e) { + if(this.disabled) { return; } + dojo.html.addClass(this.domNode, "hover"); + this._fireEvent("onMouseOver"); + }, + + _onmouseout: function(e) { + dojo.html.removeClass(this.domNode, "hover"); + dojo.html.removeClass(this.domNode, "down"); + if(!this._selected) { + dojo.html.removeClass(this.domNode, "selected"); + } + this._fireEvent("onMouseOut"); + }, + + _onclick: function(e) { + // dojo.debug("widget:", this.widgetType, ":", this.getName(), ", disabled:", this.disabled); + if(!this.disabled && !this._toggleItem) { + this._fireEvent("onClick"); + } + }, + + _onmousedown: function(e) { + if(e.preventDefault) { e.preventDefault(); } + if(this.disabled) { return; } + dojo.html.addClass(this.domNode, "down"); + if(this._toggleItem) { + if(this.parent.preventDeselect && this._selected) { + return; + } + this.toggleSelected(); + } + this._fireEvent("onMouseDown"); + }, + + _onmouseup: function(e) { + dojo.html.removeClass(this.domNode, "down"); + this._fireEvent("onMouseUp"); + }, + + onClick: function() { }, + onMouseOver: function() { }, + onMouseOut: function() { }, + onMouseDown: function() { }, + onMouseUp: function() { }, + + fillInTemplate: function(args, frag) { + if(args.name) { this._name = args.name; } + if(args.selected) { this.select(); } + if(args.disabled) { this.disable(); } + if(args.label) { this.setLabel(args.label); } + if(args.icon) { this.setIcon(args.icon); } + if(args.toggleitem||args.toggleItem) { this.setToggleItem(true); } + } +}); + +dojo.widget.ToolbarItem.make = function(wh, whIsType, props) { + var item = null; + + if(wh instanceof Array) { + item = dojo.widget.createWidget("ToolbarButtonGroup", props); + item.setName(wh[0]); + for(var i = 1; i < wh.length; i++) { + item.addChild(wh[i]); + } + } else if(wh instanceof dojo.widget.ToolbarItem) { + item = wh; + } else if(wh instanceof dojo.uri.Uri) { + item = dojo.widget.createWidget("ToolbarButton", + dojo.lang.mixin(props||{}, {icon: new dojo.widget.Icon(wh.toString())})); + } else if(whIsType) { + item = dojo.widget.createWidget(wh, props); + } else if(typeof wh == "string" || wh instanceof String) { + switch(wh.charAt(0)) { + case "|": + case "-": + case "/": + item = dojo.widget.createWidget("ToolbarSeparator", props); + break; + case " ": + if(wh.length == 1) { + item = dojo.widget.createWidget("ToolbarSpace", props); + } else { + item = dojo.widget.createWidget("ToolbarFlexibleSpace", props); + } + break; + default: + if(/\.(gif|jpg|jpeg|png)$/i.test(wh)) { + item = dojo.widget.createWidget("ToolbarButton", + dojo.lang.mixin(props||{}, {icon: new dojo.widget.Icon(wh.toString())})); + } else { + item = dojo.widget.createWidget("ToolbarButton", + dojo.lang.mixin(props||{}, {label: wh.toString()})); + } + } + } else if(wh && wh.tagName && /^img$/i.test(wh.tagName)) { + item = dojo.widget.createWidget("ToolbarButton", + dojo.lang.mixin(props||{}, {icon: wh})); + } else { + item = dojo.widget.createWidget("ToolbarButton", + dojo.lang.mixin(props||{}, {label: wh.toString()})); + } + return item; +} + +/* ToolbarButtonGroup + *********************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarButtonGroup", + dojo.widget.ToolbarItem, +{ + isContainer: true, + + templateString: '<span unselectable="on" class="toolbarButtonGroup" dojoAttachPoint="containerNode"></span>', + + // if a button has the same name, it will be selected + // if this is set to a number, the button at that index will be selected + defaultButton: "", + + postCreate: function() { + for (var i = 0; i < this.children.length; i++) { + this._injectChild(this.children[i]); + } + }, + + addChild: function(item, pos, props) { + var widget = dojo.widget.ToolbarItem.make(item, null, dojo.lang.mixin(props||{}, {toggleItem:true})); + var ret = dojo.widget.ToolbarButtonGroup.superclass.addChild.call(this, widget, null, pos, null); + this._injectChild(widget); + return ret; + }, + + _injectChild: function(widget) { + dojo.event.connect(widget, "onSelect", this, "onChildSelected"); + dojo.event.connect(widget, "onDeselect", this, "onChildDeSelected"); + if(widget._name == this.defaultButton + || (typeof this.defaultButton == "number" + && this.children.length-1 == this.defaultButton)) { + widget.select(false, true); + } + }, + + getItem: function(name) { + if(name instanceof dojo.widget.ToolbarItem) { return name; } + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem + && child._name == name) { return child; } + } + return null; + }, + + getItems: function() { + var items = []; + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem) { + items.push(child); + } + } + return items; + }, + + onChildSelected: function(e) { + this.select(e._name); + }, + + onChildDeSelected: function(e) { + this._fireEvent("onChangeSelect", this._value); + }, + + enable: function(force, preventEvent) { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem) { + child.enable(force, preventEvent); + if(child._name == this._value) { + child.select(force, preventEvent); + } + } + } + }, + + disable: function(force, preventEvent) { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem) { + child.disable(force, preventEvent); + } + } + }, + + _value: "", + getValue: function() { return this._value; }, + + select: function(name, force, preventEvent) { + for(var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + if(child instanceof dojo.widget.ToolbarItem) { + if(child._name == name) { + child.select(force, preventEvent); + this._value = name; + } else { + child.deselect(true, true); + } + } + } + if(!preventEvent) { + this._fireEvent("onSelect", this._value); + this._fireEvent("onChangeSelect", this._value); + } + }, + setValue: this.select, + + preventDeselect: false // if true, once you select one, you can't have none selected +}); + +/* ToolbarButton + ***********************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarButton", + dojo.widget.ToolbarItem, +{ + fillInTemplate: function(args, frag) { + dojo.widget.ToolbarButton.superclass.fillInTemplate.call(this, args, frag); + dojo.html.addClass(this.domNode, "toolbarButton"); + if(this._icon) { + this.setIcon(this._icon); + } + if(this._label) { + this.setLabel(this._label); + } + + if(!this._name) { + if(this._label) { + this.setName(this._label); + } else if(this._icon) { + var src = this._icon.getSrc("enabled").match(/[\/^]([^\.\/]+)\.(gif|jpg|jpeg|png)$/i); + if(src) { this.setName(src[1]); } + } else { + this._name = this._widgetId; + } + } + } +}); + +/* ToolbarDialog + **********************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarDialog", + dojo.widget.ToolbarButton, +{ + fillInTemplate: function (args, frag) { + dojo.widget.ToolbarDialog.superclass.fillInTemplate.call(this, args, frag); + dojo.event.connect(this, "onSelect", this, "showDialog"); + dojo.event.connect(this, "onDeselect", this, "hideDialog"); + }, + + showDialog: function (e) { + dojo.lang.setTimeout(dojo.event.connect, 1, document, "onmousedown", this, "deselect"); + }, + + hideDialog: function (e) { + dojo.event.disconnect(document, "onmousedown", this, "deselect"); + } + +}); + +/* ToolbarMenu + **********************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarMenu", + dojo.widget.ToolbarDialog, + {} +); + +/* ToolbarMenuItem + ******************/ +dojo.widget.ToolbarMenuItem = function() { +} + +/* ToolbarSeparator + **********************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarSeparator", + dojo.widget.ToolbarItem, +{ + templateString: '<span unselectable="on" class="toolbarItem toolbarSeparator"></span>', + + defaultIconPath: new dojo.uri.dojoUri("src/widget/templates/buttons/sep.gif"), + + fillInTemplate: function(args, frag, skip) { + dojo.widget.ToolbarSeparator.superclass.fillInTemplate.call(this, args, frag); + this._name = this.widgetId; + if(!skip) { + if(!this._icon) { + this.setIcon(this.defaultIconPath); + } + this.domNode.appendChild(this._icon.getNode()); + } + }, + + // don't want events! + _onmouseover: null, + _onmouseout: null, + _onclick: null, + _onmousedown: null, + _onmouseup: null +}); + +/* ToolbarSpace + **********************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarSpace", + dojo.widget.ToolbarSeparator, +{ + fillInTemplate: function(args, frag, skip) { + dojo.widget.ToolbarSpace.superclass.fillInTemplate.call(this, args, frag, true); + if(!skip) { + dojo.html.addClass(this.domNode, "toolbarSpace"); + } + } +}); + +/* ToolbarSelect + ******************/ + +dojo.widget.defineWidget( + "dojo.widget.ToolbarSelect", + dojo.widget.ToolbarItem, +{ + templateString: '<span class="toolbarItem toolbarSelect" unselectable="on"><select dojoAttachPoint="selectBox" dojoOnChange="changed"></select></span>', + + fillInTemplate: function(args, frag) { + dojo.widget.ToolbarSelect.superclass.fillInTemplate.call(this, args, frag, true); + var keys = args.values; + var i = 0; + for(var val in keys) { + var opt = document.createElement("option"); + opt.setAttribute("value", keys[val]); + opt.innerHTML = val; + this.selectBox.appendChild(opt); + } + }, + + changed: function(e) { + this._fireEvent("onSetValue", this.selectBox.value); + }, + + setEnabled: function(is, force, preventEvent) { + var ret = dojo.widget.ToolbarSelect.superclass.setEnabled.call(this, is, force, preventEvent); + this.selectBox.disabled = this.disabled; + return ret; + }, + + // don't want events! + _onmouseover: null, + _onmouseout: null, + _onclick: null, + _onmousedown: null, + _onmouseup: null +}); + +/* Icon + *********/ +// arguments can be IMG nodes, Image() instances or URLs -- enabled is the only one required +dojo.widget.Icon = function(enabled, disabled, hovered, selected){ + if(!arguments.length){ + // FIXME: should this be dojo.raise? + throw new Error("Icon must have at least an enabled state"); + } + var states = ["enabled", "disabled", "hovered", "selected"]; + var currentState = "enabled"; + var domNode = document.createElement("img"); + + this.getState = function(){ return currentState; } + this.setState = function(value){ + if(dojo.lang.inArray(states, value)){ + if(this[value]){ + currentState = value; + var img = this[currentState]; + if ((dojo.render.html.ie55 || dojo.render.html.ie60) && img.src && img.src.match(/[.]png$/i) ) { + domNode.width = img.width||img.offsetWidth; + domNode.height = img.height||img.offsetHeight; + domNode.setAttribute("src", dojo.uri.dojoUri("src/widget/templates/images/blank.gif").uri); + domNode.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img.src+"',sizingMethod='image')"; + } else { + domNode.setAttribute("src", img.src); + } + } + }else{ + throw new Error("Invalid state set on Icon (state: " + value + ")"); + } + } + + this.setSrc = function(state, value){ + if(/^img$/i.test(value.tagName)){ + this[state] = value; + }else if(typeof value == "string" || value instanceof String + || value instanceof dojo.uri.Uri){ + this[state] = new Image(); + this[state].src = value.toString(); + } + return this[state]; + } + + this.setIcon = function(icon){ + for(var i = 0; i < states.length; i++){ + if(icon[states[i]]){ + this.setSrc(states[i], icon[states[i]]); + } + } + this.update(); + } + + this.enable = function(){ this.setState("enabled"); } + this.disable = function(){ this.setState("disabled"); } + this.hover = function(){ this.setState("hovered"); } + this.select = function(){ this.setState("selected"); } + + this.getSize = function(){ + return { + width: domNode.width||domNode.offsetWidth, + height: domNode.height||domNode.offsetHeight + }; + } + + this.setSize = function(w, h){ + domNode.width = w; + domNode.height = h; + return { width: w, height: h }; + } + + this.getNode = function(){ + return domNode; + } + + this.getSrc = function(state){ + if(state){ return this[state].src; } + return domNode.src||""; + } + + this.update = function(){ + this.setState(currentState); + } + + for(var i = 0; i < states.length; i++){ + var arg = arguments[i]; + var state = states[i]; + this[state] = null; + if(!arg){ continue; } + this.setSrc(state, arg); + } + + this.enable(); +} + +dojo.widget.Icon.make = function(a,b,c,d){ + for(var i = 0; i < arguments.length; i++){ + if(arguments[i] instanceof dojo.widget.Icon){ + return arguments[i]; + } + } + + return new dojo.widget.Icon(a,b,c,d); +} + +/* ToolbarColorDialog + ******************/ +dojo.widget.defineWidget( + "dojo.widget.ToolbarColorDialog", + dojo.widget.ToolbarDialog, +{ + palette: "7x10", + + fillInTemplate: function (args, frag) { + dojo.widget.ToolbarColorDialog.superclass.fillInTemplate.call(this, args, frag); + this.dialog = dojo.widget.createWidget("ColorPalette", {palette: this.palette}); + this.dialog.domNode.style.position = "absolute"; + + dojo.event.connect(this.dialog, "onColorSelect", this, "_setValue"); + }, + + _setValue: function(color) { + this._value = color; + this._fireEvent("onSetValue", color); + }, + + showDialog: function (e) { + dojo.widget.ToolbarColorDialog.superclass.showDialog.call(this, e); + var abs = dojo.html.getAbsolutePosition(this.domNode, true); + var y = abs.y + dojo.html.getBorderBox(this.domNode).height; + this.dialog.showAt(abs.x, y); + }, + + hideDialog: function (e) { + dojo.widget.ToolbarColorDialog.superclass.hideDialog.call(this, e); + this.dialog.hide(); + } +}); \ No newline at end of file Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Toolbar.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,183 @@ +/* + 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.Tooltip"); + +dojo.require("dojo.widget.ContentPane"); +dojo.require("dojo.widget.PopupContainer"); +dojo.require("dojo.uri.Uri"); +dojo.require("dojo.widget.*"); +dojo.require("dojo.event.*"); +dojo.require("dojo.html.style"); +dojo.require("dojo.html.util"); + +dojo.widget.defineWidget( + "dojo.widget.Tooltip", + [dojo.widget.ContentPane, dojo.widget.PopupContainerBase], + { + // summary + // Pops up a tooltip (a help message) when you hover over a node + + // caption: String + // Text to display in the tooltip. + // Can also be specified as innerHTML (when creating the widget from markup). + caption: "", + + // showDelay: Integer + // Number of milliseconds to wait after hovering over the object, before + // the tooltip is displayed. + showDelay: 500, + + // hideDelay: Integer + // Number of milliseconds to wait after moving mouse off of the object (or + // off of the tooltip itself), before erasing the tooltip + hideDelay: 100, + + // connectId: String + // Id of domNode to attach the tooltip to. + // (When user hovers over specified dom node, the tooltip will appear.) + connectId: "", + + templateCssPath: dojo.uri.dojoUri("src/widget/templates/TooltipTemplate.css"), + + fillInTemplate: function(args, frag){ + if(this.caption != ""){ + this.domNode.appendChild(document.createTextNode(this.caption)); + } + this._connectNode = dojo.byId(this.connectId); + dojo.widget.Tooltip.superclass.fillInTemplate.call(this, args, frag); + + this.addOnLoad(this, "_loadedContent"); + dojo.html.addClass(this.domNode, "dojoTooltip"); + + //copy style from input node to output node + var source = this.getFragNodeRef(frag); + dojo.html.copyStyle(this.domNode, source); + + //apply the necessary css rules to the node so that it can popup + this.applyPopupBasicStyle(); + }, + + postCreate: function(args, frag){ + dojo.event.connect(this._connectNode, "onmouseover", this, "_onMouseOver"); + dojo.widget.Tooltip.superclass.postCreate.call(this, args, frag); + }, + + _onMouseOver: function(e){ + this._mouse = {x: e.pageX, y: e.pageY}; + + // Start tracking mouse movements, so we know when to cancel timers or erase the tooltip + if(!this._tracking){ + dojo.event.connect(document.documentElement, "onmousemove", this, "_onMouseMove"); + this._tracking=true; + } + + this._onHover(e); + }, + + _onMouseMove: function(e) { + this._mouse = {x: e.pageX, y: e.pageY}; + + if(dojo.html.overElement(this._connectNode, e) || dojo.html.overElement(this.domNode, e)){ + this._onHover(e); + } else { + // mouse has been moved off the element/tooltip + // note: can't use onMouseOut to detect this because the "explode" effect causes + // spurious onMouseOut events (due to interference from outline), w/out corresponding _onMouseOver + this._onUnHover(e); + } + }, + + _onHover: function(e) { + if(this._hover){ return; } + this._hover=true; + + // If the tooltip has been scheduled to be erased, cancel that timer + // since we are hovering over element/tooltip again + if(this._hideTimer) { + clearTimeout(this._hideTimer); + delete this._hideTimer; + } + + // If tooltip not showing yet then set a timer to show it shortly + if(!this.isShowingNow && !this._showTimer){ + this._showTimer = setTimeout(dojo.lang.hitch(this, "open"), this.showDelay); + } + }, + + _onUnHover: function(e){ + if(!this._hover){ return; } + this._hover=false; + + if(this._showTimer){ + clearTimeout(this._showTimer); + delete this._showTimer; + } + if(this.isShowingNow && !this._hideTimer){ + this._hideTimer = setTimeout(dojo.lang.hitch(this, "close"), this.hideDelay); + } + + // If we aren't showing the tooltip, then we can stop tracking the mouse now; + // otherwise must track the mouse until tooltip disappears + if(!this.isShowingNow){ + dojo.event.disconnect(document.documentElement, "onmousemove", this, "_onMouseMove"); + this._tracking=false; + } + }, + + open: function() { + // summary: display the tooltip; usually not called directly. + + if (this.isShowingNow) { return; } + dojo.widget.PopupContainerBase.prototype.open.call(this, this._mouse.x, this._mouse.y, null, [this._mouse.x, this._mouse.y], "TL,TR,BL,BR", [10,15]); + }, + + close: function() { + // summary: hide the tooltip; usually not called directly. + if (this.isShowingNow) { + if ( this._showTimer ) { + clearTimeout(this._showTimer); + delete this._showTimer; + } + if ( this._hideTimer ) { + clearTimeout(this._hideTimer); + delete this._hideTimer; + } + dojo.event.disconnect(document.documentElement, "onmousemove", this, "_onMouseMove"); + this._tracking=false; + dojo.widget.PopupContainerBase.prototype.close.call(this); + } + }, + + _position: function(){ + this.move(this._mouse.x, this._mouse.y, [10,15], "TL,TR,BL,BR"); + }, + + _loadedContent: function(){ + if(this.isShowingNow){ + // the tooltip has changed size due to downloaded contents, so reposition it + this._position(); + } + }, + + checkSize: function(){ + // Override checkSize() in HtmlWidget. + // checkSize() is called when the user has resized the browser window, + // but that doesn't affect this widget (or this widget's children) + // so it can be safely ignored + }, + + uninitialize: function(){ + this.close(); + dojo.event.disconnect(this._connectNode, "onmouseover", this, "_onMouseOver"); + } + + } +); Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tooltip.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js?view=auto&rev=509273 ============================================================================== --- ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js (added) +++ ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js Mon Feb 19 09:56:06 2007 @@ -0,0 +1,563 @@ +/* + 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 +*/ + +/** + * Tree model does all the drawing, visual node management etc. + * Throws events about clicks on it, so someone may catch them and process + * Tree knows nothing about DnD stuff, covered in TreeDragAndDrop and (if enabled) attached by controller +*/ + +/** + * TODO: use domNode.cloneNode instead of createElement for grid + * Should be faster (lyxsus) + */ +dojo.provide("dojo.widget.Tree"); + +dojo.require("dojo.widget.*"); +dojo.require("dojo.event.*"); +dojo.require("dojo.io.*"); +dojo.require("dojo.widget.HtmlWidget"); +dojo.require("dojo.widget.TreeNode"); +dojo.require("dojo.html.common"); +dojo.require("dojo.html.selection"); + + +dojo.widget.defineWidget("dojo.widget.Tree", dojo.widget.HtmlWidget, function() { + this.eventNames = {}; + + this.tree = this; + this.DNDAcceptTypes = []; + this.actionsDisabled = []; + +}, +{ + widgetType: "Tree", + + eventNamesDefault: { + // new child does not get domNode filled in (only template draft) + // until addChild->createDOMNode is called(program way) OR createDOMNode (html-way) + // hook events to operate on new DOMNode, create dropTargets etc + createDOMNode: "createDOMNode", + // tree created.. Perform tree-wide actions if needed + treeCreate: "treeCreate", + treeDestroy: "treeDestroy", + // expand icon clicked + treeClick: "treeClick", + // node icon clicked + iconClick: "iconClick", + // node title clicked + titleClick: "titleClick", + + moveFrom: "moveFrom", + moveTo: "moveTo", + addChild: "addChild", + removeNode: "removeNode", + expand: "expand", + collapse: "collapse" + }, + + isContainer: true, + + DNDMode: "off", + + lockLevel: 0, // lock ++ unlock --, so nested locking works fine + + strictFolders: true, + + DNDModes: { + BETWEEN: 1, + ONTO: 2 + }, + + DNDAcceptTypes: "", + + templateCssPath: dojo.uri.dojoUri("src/widget/templates/images/Tree/Tree.css"), + + templateString: '<div class="dojoTree"></div>', + + isExpanded: true, // consider this "root node" to be always expanded + + isTree: true, + + objectId: "", + + // autoCreate if not "off" + // used to get the autocreated controller ONLY. + // generally, tree DOES NOT KNOW about its CONTROLLER, it just doesn't care + // controller gets messages via dojo.event + controller: "", + + // autoCreate if not "off" + // used to get the autocreated selector ONLY. + // generally, tree DOES NOT KNOW its SELECTOR + // binding is made with dojo.event + selector: "", + + // used ONLY at initialization time + menu: "", // autobind menu if menu's widgetId is set here + + expandLevel: "", // expand to level automatically + + // + // these icons control the grid and expando buttons for the whole tree + // + + blankIconSrc: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_blank.gif"), + + gridIconSrcT: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_t.gif"), // for non-last child grid + gridIconSrcL: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_l.gif"), // for last child grid + gridIconSrcV: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_v.gif"), // vertical line + gridIconSrcP: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_p.gif"), // for under parent item child icons + gridIconSrcC: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_c.gif"), // for under child item child icons + gridIconSrcX: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_x.gif"), // grid for sole root item + gridIconSrcY: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_y.gif"), // grid for last rrot item + gridIconSrcZ: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_grid_z.gif"), // for under root parent item child icon + + expandIconSrcPlus: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_expand_plus.gif"), + expandIconSrcMinus: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_expand_minus.gif"), + expandIconSrcLoading: dojo.uri.dojoUri("src/widget/templates/images/Tree/treenode_loading.gif"), + + + iconWidth: 18, + iconHeight: 18, + + + // + // tree options + // + + showGrid: true, + showRootGrid: true, + + actionIsDisabled: function(action) { + var _this = this; + return dojo.lang.inArray(_this.actionsDisabled, action) + }, + + + actions: { + ADDCHILD: "ADDCHILD" + }, + + + getInfo: function() { + var info = { + widgetId: this.widgetId, + objectId: this.objectId + } + + return info; + }, + + initializeController: function() { + if (this.controller != "off") { + if (this.controller) { + this.controller = dojo.widget.byId(this.controller); + } + else { + // create default controller here + dojo.require("dojo.widget.TreeBasicController"); + this.controller = dojo.widget.createWidget("TreeBasicController", + { DNDController: (this.DNDMode ? "create" : ""), dieWithTree: true } + ); + + } + this.controller.listenTree(this); // controller listens to my events + + } else { + this.controller = null; + } + }, + + initializeSelector: function() { + + if (this.selector != "off") { + if (this.selector) { + this.selector = dojo.widget.byId(this.selector); + } + else { + // create default controller here + dojo.require("dojo.widget.TreeSelector"); + this.selector = dojo.widget.createWidget("TreeSelector", {dieWithTree: true}); + } + + this.selector.listenTree(this); + + } else { + this.selector = null; + } + }, + + initialize: function(args, frag){ + + var _this = this; + + for(name in this.eventNamesDefault) { + if (dojo.lang.isUndefined(this.eventNames[name])) { + this.eventNames[name] = this.widgetId+"/"+this.eventNamesDefault[name]; + } + } + + for(var i=0; i<this.actionsDisabled.length; i++) { + this.actionsDisabled[i] = this.actionsDisabled[i].toUpperCase(); + } + + if (this.DNDMode == "off") { + this.DNDMode = 0; + } else if (this.DNDMode == "between") { + this.DNDMode = this.DNDModes.ONTO | this.DNDModes.BETWEEN; + } else if (this.DNDMode == "onto") { + this.DNDMode = this.DNDModes.ONTO; + } + + this.expandLevel = parseInt(this.expandLevel); + + this.initializeSelector(); + this.initializeController(); + + if (this.menu) { + this.menu = dojo.widget.byId(this.menu); + this.menu.listenTree(this); + } + + + this.containerNode = this.domNode; + + }, + + + postCreate: function() { + this.createDOMNode(); + }, + + + createDOMNode: function() { + + dojo.html.disableSelection(this.domNode); + + for(var i=0; i<this.children.length; i++){ + this.children[i].parent = this; // root nodes have tree as parent + + var node = this.children[i].createDOMNode(this, 0); + + + this.domNode.appendChild(node); + } + + + if (!this.showRootGrid){ + for(var i=0; i<this.children.length; i++){ + this.children[i].expand(); + } + } + + dojo.event.topic.publish(this.eventNames.treeCreate, { source: this } ); + + }, + + + destroy: function() { + dojo.event.topic.publish(this.tree.eventNames.treeDestroy, { source: this } ); + + return dojo.widget.HtmlWidget.prototype.destroy.apply(this, arguments); + }, + + + addChild: function(child, index) { + +// dojo.debug("doAddChild "+index+" called for "+child); + + var message = { + child: child, + index: index, + parent: this, + // remember if dom was already initialized + // initialized => no createDOMNode => no createDOMNode event + domNodeInitialized: child.domNodeInitialized + } + + this.doAddChild.apply(this, arguments); + + dojo.event.topic.publish(this.tree.eventNames.addChild, message); + }, + + + // not called for initial tree building. See createDOMNode instead. + // builds child html node if needed + // index is "last node" by default + /** + * FIXME: Is it possible that removeNode from the tree will cause leaks cause of attached events ? + * if yes, then only attach events in addChild and detach in remove.. Seems all ok yet. + */ + doAddChild: function(child, index){ + + if (dojo.lang.isUndefined(index)) { + index = this.children.length; + } + + if (!child.isTreeNode){ + dojo.raise("You can only add TreeNode widgets to a "+this.widgetType+" widget!"); + return; + } + + // usually it is impossible to change "isFolder" state, but if anyone wants to add a child to leaf, + // it is possible program-way. + if (this.isTreeNode){ + if (!this.isFolder) { // just became a folder. + //dojo.debug("becoming folder "+this); + this.setFolder(); + } + } + + // adjust tree + var _this = this; + dojo.lang.forEach(child.getDescendants(), function(elem) { elem.tree = _this.tree; }); + + // fix parent + child.parent = this; + + + // no dynamic loading for those who become parents + if (this.isTreeNode) { + this.state = this.loadStates.LOADED; + } + + // add new child into DOM after it was added into children + if (index < this.children.length) { // children[] already has child + //dojo.debug("Inserting before "+this.children[index].title); + dojo.html.insertBefore(child.domNode, this.children[index].domNode); + } else { + this.containerNode.appendChild(child.domNode); + if (this.isExpanded && this.isTreeNode) { + /* When I add children to hidden containerNode => show container w/ them */ + this.showChildren(); + } + } + + + this.children.splice(index, 0, child); + + //dojo.debugShallow(this.children); + + + // if node exists - adjust its depth, otherwise build it + if (child.domNodeInitialized) { + var d = this.isTreeNode ? this.depth : -1; + child.adjustDepth( d - child.depth + 1 ); + + + // update icons to link generated dom with Tree => updateParentGrid + // if I moved child from LastNode inside the tree => need to link it up'n'down => + // updateExpandGridColumn + // if I change depth => need to update all grid.. + child.updateIconTree(); + } else { + //dojo.debug("Create domnode "); + child.depth = this.isTreeNode ? this.depth+1 : 0; + child.createDOMNode(child.tree, child.depth); + } + + + + // Use-case: + // When previous sibling was created => it was last, no children after it + // so it did not create link down => let's add it for all descendants + // Use-case: + // a child was moved down under the last node so last node should be updated + var prevSibling = child.getPreviousSibling(); + if (child.isLastChild() && prevSibling) { + prevSibling.updateExpandGridColumn(); + } + + + //dojo.debug("Added child "+child); + + + + }, + + + + + makeBlankImg: function() { + var img = document.createElement('img'); + + img.style.width = this.iconWidth + 'px'; + img.style.height = this.iconHeight + 'px'; + img.src = this.blankIconSrc; + img.style.verticalAlign = 'middle'; + + return img; + }, + + + updateIconTree: function(){ + + //dojo.debug("Update icons for "+this) + if (!this.isTree) { + this.updateIcons(); + } + + for(var i=0; i<this.children.length; i++){ + this.children[i].updateIconTree(); + } + + }, + + toString: function() { + return "["+this.widgetType+" ID:"+this.widgetId+"]" + }, + + + + + /** + * Move child to newParent as last child + * redraw tree and update icons. + * + * Called by target, saves source in event. + * events are published for BOTH trees AFTER update. + */ + move: function(child, newParent, index) { + + //dojo.debug(child+" "+newParent+" at "+index); + + var oldParent = child.parent; + var oldTree = child.tree; + + this.doMove.apply(this, arguments); + + var newParent = child.parent; + var newTree = child.tree; + + var message = { + oldParent: oldParent, oldTree: oldTree, + newParent: newParent, newTree: newTree, + child: child + }; + + /* publish events here about structural changes for both source and target trees */ + dojo.event.topic.publish(oldTree.eventNames.moveFrom, message); + dojo.event.topic.publish(newTree.eventNames.moveTo, message); + + }, + + + /* do actual parent change here. Write remove child first */ + doMove: function(child, newParent, index) { + //var parent = child.parent; + child.parent.doRemoveNode(child); + + newParent.doAddChild(child, index); + }, + + + +// ================================ removeNode =================================== + + removeNode: function(child) { + if (!child.parent) return; + + var oldTree = child.tree; + var oldParent = child.parent; + + var removedChild = this.doRemoveNode.apply(this, arguments); + + + dojo.event.topic.publish(this.tree.eventNames.removeNode, + { child: removedChild, tree: oldTree, parent: oldParent } + ); + + return removedChild; + }, + + + doRemoveNode: function(child) { + if (!child.parent) return; + + var parent = child.parent; + + var children = parent.children; + + + var index = child.getParentIndex(); + if (index < 0) { + dojo.raise("Couldn't find node "+child+" for removal"); + } + + + children.splice(index,1); + dojo.html.removeNode(child.domNode); + + if (parent.children.length == 0 && !parent.isTree) { + parent.containerNode.style.display = "none"; + } + + // if WAS last node (children.length decreased already) and has prevSibling + if (index == children.length && index>0) { + children[index-1].updateExpandGridColumn(); + } + // if it WAS first node in WHOLE TREE - + // update link up of its former lower neighbour(if exists still) + if (parent instanceof dojo.widget.Tree && index == 0 && children.length>0) { + children[0].updateExpandGrid(); + } + + //parent.updateIconTree(); + + + child.parent = child.tree = null; + + return child; + }, + + markLoading: function() { + // no way to mark tree loading + }, + + unMarkLoading: function() { + // no way to show that tree finished loading + }, + + + lock: function() { + !this.lockLevel && this.markLoading(); + this.lockLevel++; + }, + unlock: function() { + if (!this.lockLevel) { + dojo.raise("unlock: not locked"); + } + this.lockLevel--; + !this.lockLevel && this.unMarkLoading(); + }, + + isLocked: function() { + var node = this; + while (true) { + if (node.lockLevel) { + return true; + } + if (node instanceof dojo.widget.Tree) { + break; + } + node = node.parent; + } + + return false; + }, + + flushLock: function() { + this.lockLevel = 0; + this.unMarkLoading(); + } +}); + + Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tree.js ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/images/webapp/images/dojo/src/widget/Tr |
Free forum by Nabble | Edit this page |