You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2008/02/04 23:08:37 UTC

svn commit: r618461 [43/43] - in /tapestry/tapestry4/trunk/tapestry-framework/src/js: dojo-0.4.3-custom-4.1.5/ dojo-0.4.3-custom-4.1.5/nls/ dojo-0.4.3-custom-4.1.5/src/ dojo-0.4.3-custom-4.1.5/src/animation/ dojo-0.4.3-custom-4.1.5/src/cal/ dojo-0.4.3-...

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js?rev=618461&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js Mon Feb  4 14:07:13 2008
@@ -0,0 +1,102 @@
+dojo.provide("tapestry.widget.AlertDialog");
+
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.Dialog");
+dojo.require("dojo.event.common");
+dojo.require("dojo.html.common");
+
+/**
+ * Script:  tapestry.widget.AlertDialog
+ * 
+ * The modal dialog used to display client side validation errors / informational
+ * messages.
+ * 
+ * Inherits from:
+ * 		<dojo.widget.Dialog>
+ * 
+ */
+dojo.widget.defineWidget(
+	"tapestry.widget.AlertDialog",
+	dojo.widget.Dialog,
+	{
+		bgColor: "white",
+		bgOpacity: 0.6,
+		okButton:null,
+		messageNode:null,
+		message:"",
+		
+		dialogClass:"alertDialog",
+		contentClass:"alertContent",
+		buttonClass:"alertButton",
+		buttonText:"OK",
+		
+		/**
+		 * Function: postCreate
+		 * 
+		 * Called after widget constructed.
+		 */
+		postCreate: function(args, frag, parentComp) {
+			dojo.widget.Dialog.prototype.postCreate.call(this, args, frag, parentComp);
+			
+			var content=document.createElement("div");
+			dojo.html.setClass(content, this.contentClass);
+			this.containerNode.appendChild(content);
+			dojo.html.addClass(this.containerNode, this.dialogClass);
+			
+			this.messageNode=document.createElement("div");
+			this.messageNode.innerHTML=this.message;
+			content.appendChild(this.messageNode);
+			
+			var buttNode=document.createElement("button");
+			dojo.html.setClass(buttNode, this.buttonClass);
+			buttNode.setAttribute("id", "alertButton");
+			buttNode.innerHTML = this.buttonText;
+			content.appendChild(buttNode);
+			
+			this.okButton=buttNode;
+			this.tabStart=this.okButton;
+			this.tabEnd=this.okButton;
+			this.show();
+			dojo.event.connect(this.okButton, "onclick", this, "hideDialog");
+			this.okButton.focus();
+			dojo.event.connect(this.wrapper, 'onkeyup', this, 'dialogKeys');
+			dojo.event.connect(document.body, 'onkeyup', this, 'bodyKeys'); 
+		},
+		
+		dialogKeys:function(e) {
+			if (e.keyCode == e.KEY_ESCAPE) {
+				this.hideDialog(e);
+			}
+			// allow default behavior, but don't let the event keep bubbling/propagating
+			if (e.stopPropagation) {
+				e.stopPropagation();
+			} else { 
+				e.cancelBubble = true; 
+			}
+		},
+		
+		bodyKeys:function(e) {
+			if (e.keyCode == e.KEY_ESCAPE) {
+				this.hideDialog(e);
+			} else if ( ! dojo.dom.isDescendantOf(e.target, this.wrapper, true) ) {
+				dojo.event.browser.stopEvent(e);
+				this.tabStart.focus();
+			}
+		},
+		
+		setMessage:function(str){
+			this.messageNode.innerHTML=str;
+		},
+		
+		hideDialog:function(e){
+			dojo.event.disconnect(this.wrapper, 'onkeyup', this, 'dialogKeys');
+			dojo.event.disconnect(document.body, 'onkeyup', this, 'bodyKeys');
+			this.hideModalDialog();
+			dojo.dom.removeNode(this.okButton);
+			tapestry.widget.AlertDialog.prototype.destroy.call(this);
+			dojo.dom.removeNode(this.bg); 
+			tapestry.form._focusCurrentField();
+		}
+	},
+	"html"
+);

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/AlertDialog.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js?rev=618461&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js Mon Feb  4 14:07:13 2008
@@ -0,0 +1,61 @@
+dojo.provide("tapestry.widget.TDebugConsole");
+
+dojo.require("dojo.widget.*");
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.widget.Menu2");
+dojo.require("dojo.lang");
+dojo.require("dojo.html");
+dojo.require("dojo.event.*");
+dojo.widget.tags.addParseTreeHandler("dojo:tdebugConsole");
+
+tapestry.widget.TDebugConsole=function(){
+	dojo.widget.HtmlWidget.call(this);
+	this.widgetType="TDebugConsole";
+	this.isContainer=false;
+};
+
+dojo.inherits(tapestry.widget.TDebugConsole, dojo.widget.HtmlWidget);
+
+/**
+ * Script: tapestry.widget.TDebugConsole
+ * 
+ * The modal dialog used to display client side validation errors / informational
+ * messages.
+ * 
+ * Inherits from:
+ * 		<dojo.widget.HtmlWidget>
+ */
+dojo.lang.extend(tapestry.widget.TDebugConsole, {
+	templatePath:dojo.uri.dojoUri("../tapestry/widget/templates/TDebugConsole.html"),
+	templateCssPath:null,
+	
+	/**
+	 * Function: fillInTemplate
+	 * 
+	 * Remarks:
+	 * Called during widget creation.
+	 */
+	fillInTemplate:function(){
+		document.getElementById("debug").appendChild(this.domNode);
+		
+		var mbar = dojo.widget.createWidget("MenuBar2", 
+											{widgetId:"mbar"}, 
+											this.menuBar);
+		var mbaritem1 = dojo.widget.createWidget("MenuBarItem2", 
+												{submenuId:"submenu1",
+												caption:"View",widgetId:"mainFile"}, 
+												this.menuBarItem1);
+		mbar.addChild(mbaritem1);
+		
+		var popup = dojo.widget.createWidget("PopupMenu2", 
+											{widgetId:"submenu1"}, 
+											this.popupMenu2);
+		var mitem = dojo.widget.createWidget("MenuItem2", 
+											{widgetId:"mitem1",
+											caption:"INFO"}, 
+											this.popupMenuItem1);
+		popup.addChild(mitem);
+		
+		dojo.event.connect(mitem, "onClick", function(e){alert('hello world');});
+	}
+});

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TDebugConsole.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js?rev=618461&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js Mon Feb  4 14:07:13 2008
@@ -0,0 +1,370 @@
+dojo.provide("tapestry.widget.TimePicker");
+
+dojo.require("dojo.widget.HtmlWidget");
+dojo.require("dojo.html.style");
+dojo.require("dojo.html.util");
+dojo.require("dojo.html.metrics");
+dojo.require("dojo.html.iframe");
+
+tapestry.widget.currentTimePicker=null;
+
+dojo.widget.defineWidget(
+        "tapestry.widget.TimePicker",
+        dojo.widget.HtmlWidget,
+{
+    inputNodeId:null, // unique element id of form input text field
+    optionValues:[], // param of 12 hour clock selection values
+    selectedIndex:null, // param of what the default selected index should be
+    dropdownClass:"dropdownCombobox",
+    dropdownOptionClass:"dropdownOption",
+    optionHoverClass:"optionHover",
+
+    inputNode:null, // form input text node
+    selectedNode:null, // currently selected node
+    hoveredNode:null, // current node being hovered over with mouse - ie has background color changed
+    dropdownNode:null, // drop down div container
+    bgIframe:null,
+    options:[], // option div nodes
+    showing:false,
+    preventBlur:false,
+    hasFocus:false,
+    hideTimeout:-1,
+    dropdownDim:{height:0, width:0},
+
+    postCreate: function() {
+        this.inputNode = dojo.byId(this.inputNodeId);
+
+        this.dropdownNode = document.createElement("div");
+        this.domNode = this.dropdownNode;
+        this.dropdownNode.setAttribute("id", this.widgetId + "dropdown");
+        this.dropdownNode.style["display"] = "none";
+        dojo.html.setClass(this.dropdownNode, this.dropdownClass);
+
+        var contDiv = document.createElement("div");
+        this.dropdownNode.appendChild(contDiv);
+        
+        for (var i=0; i < this.optionValues.length; i++){
+            var option = document.createElement("div");
+            option.setAttribute("id", "combooption-" + i);
+            dojo.html.setClass(option, this.dropdownOptionClass);
+            option.appendChild(document.createTextNode(this.optionValues[i]));
+            
+            contDiv.appendChild(option);
+            this.options.push(option);
+
+            if (this.selectedIndex && i == this.selectedIndex){
+                this.selectedNode = option;
+
+                if (!this.inputNode.value || this.inputNode.value.length < 1){
+                    this.inputNode.value=this.optionValues[i];
+                }
+            }
+
+            dojo.event.connect(option, "onmouseover", this, "onOptionMouseOver");
+            dojo.event.connect(option, "onmouseout", this, "onOptionMouseOut");
+            dojo.event.connect(option, "onmousedown", this, "onOptionClicked");
+        }
+
+        var m = dojo.html.getCachedFontMeasurements();
+        this.dropdownDim.width = m["1em"] * 6;
+        this.dropdownDim.height = m["1em"] * 11;
+
+        var st=this.dropdownNode.style;
+        st["overflow"]="auto";
+        st["zIndex"]=9000;
+        st["position"]="absolute";
+        st["width"]=this.dropdownDim.width + "px"
+        st["height"]=this.dropdownDim.height + "px";
+
+        dojo.body().appendChild(this.dropdownNode);
+
+        if(dojo.render.html.ie55 || dojo.render.html.ie60){
+            this.bgIframe = new dojo.html.BackgroundIframe();
+            this.bgIframe.setZIndex(this.dropdownNode);
+        }
+        
+        dojo.event.connect(this.inputNode, "onclick", this, "onInputClick");
+        dojo.event.connect(this.inputNode, "onblur", this, "onInputBlur");
+        dojo.event.connect(this.inputNode, "onkeyup", this, "onInputKeyUp");
+        dojo.event.connect(this.inputNode, "onkeydown", this, "onInputKeyDown");
+        dojo.event.connect(this.inputNode, "onchange", this, "onChange");
+        
+        dojo.event.connect(this.dropdownNode, "onmouseover", this, "onDropdownMouseOver");
+        dojo.event.connect(this.dropdownNode, "onmouseout", this, "onDropdownMouseOut");
+        
+        dojo.event.connect(document, "onkeyup", this, "onKeyUp");
+        dojo.event.connect(document, "onclick", this, "onDocumentClick");
+    },
+
+    onOptionMouseOver: function(evt) {
+        this._clearTimeout();
+        var target = evt.target;
+        if (target.nodeType == 3){ // get around safari bug
+            target = target.parentNode;
+        }
+        this._selectOption(target);
+    },
+
+    onOptionMouseOut: function(evt) {
+        var target = evt.target;
+        if (target.nodeType == 3){ // get around safari bug
+            target = target.parentNode;
+        }
+        this._clearOptionSelection(target);
+        
+        if (this.hideTimeout > -1
+                || (evt["relatedTarget"] && this.isWidgetNode(evt.relatedTarget))){return;}
+        this.hideTimeout = setTimeout(dojo.lang.hitch(this, "_hide"), 1500);
+    },
+
+    onChange:function() {},
+
+    onOptionClicked: function(evt) {
+        this.selectedNode=evt.target;
+        
+        this.inputNode.value=tapestry.html.getContentAsString(this.selectedNode);
+        this.hide(evt);
+        dojo.html.removeClass(this.selectedNode, this.optionHoverClass);
+
+        this.onChange(evt);
+    },
+
+    onInputClick: function() {
+        if (this.showing){
+            this.hide();
+            return;
+        }
+
+        this.show();
+    },
+
+    onInputBlur: function(evt) {
+        this.hasFocus=false;
+        if (this.preventBlur){
+            return;
+        }
+
+        this.hide();
+    },
+
+    onDropdownMouseOver: function(evt) {
+        this._clearTimeout();
+        this.preventBlur=true;
+    },
+
+    onDropdownMouseOut: function(evt) {
+        if (!this.showing){return;}
+        this.preventBlur=false;
+
+        if (this.isWidgetNode(evt["relatedTarget"])){
+            return;
+        }
+        
+        if (this.hideTimeout > -1
+                || (evt["relatedTarget"] && this.isWidgetNode(evt.relatedTarget))){return;}
+        this.hideTimeout = setTimeout(dojo.lang.hitch(this, "_hide"), 1500);
+        
+        if (!this.hasFocus){
+            this.hide(evt);
+        }
+    },
+
+    onKeyUp: function(evt) {
+        if (!this.showing){return;}
+        if (evt.keyCode == evt.KEY_ESCAPE) {
+            this.hide(evt);
+        }
+    },
+
+    onDocumentClick: function(evt) {
+        if(!this.showing){return;}
+        if (evt["target"]
+                && evt.target != this.inputNode && evt.target != this.dropdownNode){
+            this.hide();
+        }
+    },
+
+    onInputKeyUp: function(evt) {
+        switch(evt.keyCode){
+            case evt.KEY_TAB:
+                this.show();
+                break;
+           /* case evt.KEY_UP_ARROW:
+                this.inputNode.focus();
+                this._selectPreviousOption();
+                break;
+            case evt.KEY_DOWN_ARROW:
+                this.inputNode.focus();
+                this._selectNextOption();
+                break;
+                */
+        }
+    },
+
+    onInputKeyDown: function(evt) {
+        switch(evt.keyCode){
+            case evt.KEY_TAB:
+                if (this.showing){this.hide();}
+        }
+    },
+
+    hide: function() {
+        dojo.html.hide(this.dropdownNode);
+
+        if (this.bgIframe){
+            this.bgIframe.hide();
+        }
+
+        this.hasFocus=false;
+        this.preventBlur=false;
+        this.showing=false;
+        this.hoveredNode=null;
+    },
+
+    show: function() {
+        this._clearTimeout();
+        if (tapestry.widget.currentTimePicker &&
+                tapestry.widget.currentTimePicker.widgetId != this.widgetId){
+            tapestry.widget.currentTimePicker.hide();
+        }
+
+        var oldDisplay = this.inputNode.style.display;
+        var mb = dojo.html.getElementBox(this.inputNode, dojo.html.boxSizing.BORDER_BOX);
+        var inputPos = dojo.html.getAbsolutePosition(this.inputNode, true, dojo.html.boxSizing.BORDER_BOX);
+	    this.inputNode.style.display=oldDisplay;
+
+        var view=dojo.html.getViewport();
+
+        var ddX = inputPos.x + mb.width - this.dropdownDim.width;
+        if (ddX < 0){
+            ddX = inputPos.x;
+        }
+
+        var ddY;
+        if ((inputPos.y + mb.height + this.dropdownDim.height) > view.height){
+            ddY = inputPos.y - this.dropdownDim.height - 1;
+        } else {
+            ddY = inputPos.y + mb.height;
+        }
+        
+        this.dropdownNode.style["top"]=ddY+'px';
+        this.dropdownNode.style["left"]=ddX+'px';
+
+        dojo.html.show(this.dropdownNode);
+        
+        if (this.bgIframe){
+            this.bgIframe.size(this.dropdownNode);
+            this.bgIframe.show();
+        }
+
+        this.showing=true;
+        this.hasFocus=true;
+        this.preventBlur=true;
+        tapestry.widget.currentTimePicker=this;
+
+        if (this.selectedNode){
+            this.selectedNode.scrollIntoView(true);
+        }
+    },
+
+    getValue:function(){
+        return this.inputNode.value;
+    },
+
+    isWidgetNode: function(node){
+        if (!node){return false;}
+
+        try {
+            return dojo.html.hasClass(node, this.dropdownOptionClass);
+        } catch (e){return false;}
+    },
+
+    uninitialize: function(){
+        try{
+            if (this.showing){
+                this.hide();
+            }
+            if (tapestry.widget.currentTimePicker == this) {
+                delete tapestry.widget.currentTimePicker;
+            }
+            
+            dojo.event.disconnect(this.inputNode, "onclick", this, "onInputClick");
+            dojo.event.disconnect(this.inputNode, "onblur", this, "onInputBlur");
+            dojo.event.disconnect(this.inputNode, "onkeyup", this, "onInputKeyUp");
+            dojo.event.disconnect(this.inputNode, "onkeydown", this, "onInputKeyDown");
+            dojo.event.disconnect(this.inputNode, "onchange", this, "onChange");
+
+            dojo.event.disconnect(this.dropdownNode, "onmouseover", this, "onDropdownMouseOver");
+            dojo.event.disconnect(this.dropdownNode, "onmouseout", this, "onDropdownMouseOut");
+            dojo.dom.destroyNode(this.dropdownNode);
+
+            dojo.event.disconnect(document, "onkeyup", this, "onKeyUp");
+            dojo.event.disconnect(document, "onclick", this, "onDocumentClick");
+
+             if (this.bgIframe){
+                this.bgIframe.remove();
+            }
+        } catch (e) {}
+    },
+
+    destroyRendering: function(){},
+
+    _hide: function() {
+        if (!this.showing || this.preventBlur){
+            this.hideTimeout=-1;
+            return;
+        }
+        this.hide();
+        this.hideTimeout=-1;
+    },
+
+    _clearTimeout: function() {
+        if (this.hideTimeout > -1){
+            window.clearTimeout(this.hideTimeout);
+            this.hideTimeout = -1;
+        }
+    },
+
+    _selectOption:function(node){
+        if (!node) { return; }
+        
+        this.preventBlur=true;
+        if (!dojo.html.hasClass(node, this.optionHoverClass)) {
+            dojo.html.addClass(node, this.optionHoverClass);
+        }
+
+        this.hoveredNode=node;
+    },
+
+    _clearOptionSelection:function(node){
+        dojo.html.removeClass(node, this.optionHoverClass);
+    },
+
+    _selectPreviousOption:function(){
+        var prevNode;
+        if (!this.hoveredNode){
+            this.hoveredNode=this.options[0];
+            prevNode = this.hoveredNode;
+        } else {
+            prevNode = this.hoveredNode.previousSibling;
+        }
+
+        prevNode.scrollIntoView(true);
+        this._clearOptionSelection(this.hoveredNode);
+        this._selectOption(prevNode);
+    },
+
+    _selectNextOption:function() {
+        var nextNode;
+        if (!this.hoveredNode){
+            this.hoveredNode=this.options[0];
+            nextNode = this.hoveredNode;
+        } else {
+            nextNode = this.hoveredNode.nextSibling;
+        }
+
+        nextNode.scrollIntoView(true);
+        this._clearOptionSelection(this.hoveredNode);
+        this._selectOption(nextNode);
+    }
+});

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/TimePicker.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js?rev=618461&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js Mon Feb  4 14:07:13 2008
@@ -0,0 +1,80 @@
+// Copyright 2006 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+dojo.provide("tapestry.widget");
+dojo.provide("tapestry.widget.Widget");
+dojo.require("dojo.widget.*");
+
+// Define core widget management methods
+tapestry.widget = {
+	
+	/**
+	 * Ensures that the widget specified currently exists, 
+	 * and if not creates a new widget via dojo.widget.createWidget().
+	 * 
+	 * @param widgetId 
+	 * 			The unique widgetId to search for, will also be
+	 * 			used to locate and create the widget via the corresponding
+	 * 			dom node id if the widget doesn't already exist.
+	 * @param type 
+	 * 			The dojo widget type string. Ie "dialog" / "combobox" / etc..
+	 * @param props 
+	 * 			The js properties object to create the widget with.
+	 * @param destroy
+	 * 			If true causes the current widget(if any) to be destroyed and re-created.
+	 * @param position
+	 * 			The position to insert this widget's node relative to the
+	 *			dom node specified by widgetId (optional)
+	 */
+	synchronizeWidgetState : function(widgetId, type, props, destroy, position){
+		if(typeof destroy == "undefined"){
+			destroy=true;
+		}
+		var widget = dojo.widget.byId(widgetId);
+		
+		if (!widget) {
+			this.createWidget(widgetId, type, props, position);
+		} else if (destroy){
+			widget.destroy();
+            this.createWidget(widgetId, type, props, position);
+		} else {
+			this.setWidgetProperties(widget, props);
+		}
+	},
+	
+	/**
+	 * Creates a new widget (if possible) via dojo.widget.createWidget()
+	 */
+	createWidget : function(widgetId, type, props, position) {
+		var node = dojo.byId(widgetId);
+		if (!node) {
+			dojo.raise("createWidget() Node not found with specified id of '" + widgetId + "'.");
+			return;
+		}
+		
+		if (!props["widgetId"]) {
+			props["widgetId"]=widgetId;
+		}
+		
+		// handle disabling widgets
+		var w = dojo.widget.createWidget(type, props, node, position);
+		this.setWidgetProperties(w, props);
+	},
+	
+	setWidgetProperties: function(w, props){
+		if (!dj_undef("disabled",props) && props.disabled
+			&& dojo.lang.isFunction(w["disable"])){
+			w.disable();
+		}
+	}
+}

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/Widget.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html?rev=618461&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html Mon Feb  4 14:07:13 2008
@@ -0,0 +1,9 @@
+<div dojoAttachPoint="menuBar" >
+	<div dojoAttachPoint="menuBarItem1" ></div>
+	<div dojoAttachPoint="menuBarItem2" ></div>
+	<div dojoAttachPoint="menuBarItem3" ></div>
+</div>
+
+<div dojoAttachPoint="popupMenu2" >
+	<div dojoAttachPoint="popupMenuItem1" ></div>
+</div>

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/TDebugConsole.html
------------------------------------------------------------------------------
    svn:mime-type = text/html

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/dateIcon.gif
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/dateIcon.gif?rev=618461&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/dateIcon.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/domain_down.gif
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/domain_down.gif?rev=618461&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/domain_down.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/domain_up.gif
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/domain_up.gif?rev=618461&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/domain_up.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/timeIcon.gif
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/timeIcon.gif?rev=618461&view=auto
==============================================================================
Binary file - no diff available.

Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry-4.1.5/widget/templates/images/timeIcon.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif