Ticket #3058: 3058.2.patch
| File 3058.2.patch, 26.9 kB (added by peller, 16 months ago) |
|---|
-
Users/peller/workspace/trunk/dijit/changes.txt
25 25 26 26 createWidget() call removed since multiple renderers are no longer supported (see next section). 27 27 28 At least for the dijit widgets, all widgets are guaranteed to work program atically, which in28 At least for the dijit widgets, all widgets are guaranteed to work programmatically, which in 29 29 effect means that all widgets must have templates, unless the default <div> works. 30 30 31 31 Renderers … … 58 58 lists within dojoAttachPoint, dojoAttachEvent, waiRole, and waiState are now comma-separated 59 59 (not separated by semi-colons) 60 60 61 Standard HTML attributes like 'id', 'name', 'lang', etc. are carried over programmatically 62 by the _Widget constructor and do not need to be declared in the template (see _Widget.genericMap) 63 61 64 Parent/Child relationships 62 65 -------------------------- 63 66 By default widgets exist as islands, not knowing about their parent widget or children widgets. -
Users/peller/workspace/trunk/dijit/_Templated.js
40 40 // method over-ride 41 41 buildRendering: function(){ 42 42 // summary: 43 // Construct the UI for this widget from a template .44 // description: 43 // Construct the UI for this widget from a template, setting this.domNode. 44 45 45 // Lookup cached version of template, and download to cache if it 46 46 // isn't there already. Returns either a DomNode or a string, depending on 47 47 // whether or not the template contains ${foo} replacement parameters. 48 49 48 var cached = dijit._Templated.getCachedTemplate(this.templatePath, this.templateString); 50 49 51 50 var node; … … 74 73 // recurse through the node, looking for, and attaching to, our 75 74 // attachment points which should be defined on the template node. 76 75 this._attachTemplateNodes(node); 77 if(this.srcNodeRef){ 78 dojo.style(node, "cssText", this.srcNodeRef.style.cssText); 79 if(this.srcNodeRef.className){ 80 node.className += " " + this.srcNodeRef.className; 81 } 76 77 var source = this.srcNodeRef; 78 if(source && source.parentNode){ 79 source.parentNode.replaceChild(node, source); 82 80 } 83 81 84 82 this.domNode = node; 85 if(this.srcNodeRef && this.srcNodeRef.parentNode){86 this.srcNodeRef.parentNode.replaceChild(this.domNode, this.srcNodeRef);87 }88 83 if(this.widgetsInTemplate){ 89 var childWidgets = dojo.parser.parse( this.domNode);84 var childWidgets = dojo.parser.parse(node); 90 85 this._attachTemplateNodes(childWidgets, function(n,p){ 91 86 return n[p]; 92 87 }); 93 88 } 94 89 95 this._fillContent( this.srcNodeRef);90 this._fillContent(source); 96 91 }, 97 92 98 93 _fillContent: function(/*DomNode*/ source){ -
Users/peller/workspace/trunk/dijit/_Widget.js
41 41 dojo.mixin(this,params); 42 42 } 43 43 this.postMixInProperties(); 44 44 45 45 // generate an id for the widget if one wasn't specified 46 46 // (be sure to do this before buildRendering() because that function might 47 47 // expect the id to be there. 48 48 if(!this.id){ 49 this.id =dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));49 this.id = dijit.getUniqueId(this.declaredClass.replace(/\./g,"_")); 50 50 } 51 51 dijit.registry.add(this); 52 52 53 53 this.buildRendering(); 54 for(var attr in this.genericMap){ 55 if(this.domNode){ 56 var node = this[this.genericMap[attr] || "domNode"]; 57 var value = this[attr]; 58 if(value !== "" || (params && params[attr])){ 59 var domValue = node.getAttribute(attr); 60 if(domValue){ 61 var delim = {style: ";", class: " "}[attr]; 62 if(delim){ 63 // combine values 64 value += delim + domValue; 65 domValue = null; 66 } 67 } 68 if(domValue === null){ 69 node.setAttribute(attr, value); 70 } 71 } 72 } 73 } 54 74 if(this.domNode){ 55 75 this.domNode.setAttribute("widgetId", this.id); 56 if(this.srcNodeRef && this.srcNodeRef.dir){57 this.domNode.dir = this.srcNodeRef.dir;58 }59 76 } 60 77 this.postCreate(); 61 78 … … 81 98 // Bi-directional support, as defined by the HTML DIR attribute. Either left-to-right "ltr" or right-to-left "rtl". 82 99 dir: "", 83 100 101 // class: String 102 // HTML class attribute 103 "class": "", 104 105 // style: String 106 // HTML style attribute 107 style: "", 108 109 // title: String 110 // HTML title attribute 111 title: "", 112 84 113 // srcNodeRef: DomNode 85 114 // pointer to original dom node 86 115 srcNodeRef: null, … … 92 121 // property is the canonical "top level" node in widget UI. 93 122 domNode: null, 94 123 124 // genericMap Object: 125 // A map of attributes -- typically standard HTML attributes -- to transfer 126 // from the parsed node into the new dom, at the widget's domNode, by default. 127 // Other node references can be specified as properties of 'this' 128 genericMap: {id:"", dir:"", lang:"", "class":"", style:"", title:""}, // TODO: add on* handlers? 129 95 130 //////////// INITIALIZATION METHODS /////////////////////////////////////// 96 131 97 132 postMixInProperties: function(){ … … 276 311 // See HTML spec, DIR attribute for more information. 277 312 278 313 if(typeof this._ltr == "undefined"){ 314 //FIXME: don't need to check this.dir anymore, since it's mixed into domNode? 315 //FIXME: is it even worth having this method anymore? 279 316 this._ltr = (this.dir || dojo.getComputedStyle(this.domNode).direction) != "rtl"; 280 317 } 281 318 return this._ltr; //Boolean -
Users/peller/workspace/trunk/dijit/templates/Dialog.html
1 1 <div class="dijitDialog"> 2 <div dojoAttachPoint="titleBar" class="dijitDialogTitleBar" tabindex="0" waiRole="dialog" title="${title}">3 <span dojoAttachPoint="titleNode" class="dijitDialogTitle">${title}</span>4 <span dojoAttachPoint="closeButtonNode" class="dijitDialogCloseIcon" dojoAttachEvent="onclick: hide">5 <span dojoAttachPoint="closeText" class="closeText">x</span>6 </span>2 <div dojoAttachPoint="titleBar" class="dijitDialogTitleBar" tabindex="0" waiRole="dialog"> 3 <span dojoAttachPoint="titleNode" class="dijitDialogTitle">${title}</span> 4 <span dojoAttachPoint="closeButtonNode" class="dijitDialogCloseIcon" dojoAttachEvent="onclick: hide"> 5 <span dojoAttachPoint="closeText" class="closeText">x</span> 6 </span> 7 7 </div> 8 8 <div dojoAttachPoint="containerNode" class="dijitDialogPaneContent"></div> 9 9 <span dojoAttachPoint="tabEnd" dojoAttachEvent="onfocus:_cycleFocus" tabindex="0"></span> -
Users/peller/workspace/trunk/dijit/templates/Tooltip.html
1 <div class="dijitTooltip dijitTooltipLeft" id="dojoTooltip">1 <div class="dijitTooltip dijitTooltipLeft"> 2 2 <div class="dijitTooltipContainer dijitTooltipContents" dojoAttachPoint="containerNode" waiRole='alert'></div> 3 3 <div class="dijitTooltipConnector"></div> 4 4 </div> -
Users/peller/workspace/trunk/dijit/form/_FormWidget.js
174 174 // summary: callback when value is changed 175 175 }, 176 176 177 postMixInProperties: function(){ 178 // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are. 179 // Don't attempt to mixin the 'type' attribute here programatically -- it must be declared 180 // directly in the template as read by the parser in order to function 181 this.genericMap = dojo.mixin(dojo.clone(this.genericMap), {id:"focusNode", name:"focusNode", tabIndex:"focusNode", alt:"focusNode"});//TODO: check on alt. Should these be moved down to subclasses? 182 }, 183 177 184 postCreate: function(){ 178 185 this.setDisabled(this.disabled); 179 186 this._setStateClass(); -
Users/peller/workspace/trunk/dijit/form/Textarea.js
16 16 // usage: 17 17 // <textarea dojoType="dijit.form.TextArea">...</textarea> 18 18 19 templateString: (dojo.isIE || dojo.isSafari || dojo.isMozilla) ? '<fieldset id="${id}"class="dijitInlineBox dijitInputField dijitTextArea">'20 + ((dojo.isIE || dojo.isSafari) ? '<div dojoAttachPoint="editNode" waiRole="textarea" tabIndex="${tabIndex}"style="text-decoration:none;_padding-bottom:16px;display:block;overflow:auto;" contentEditable="true"></div>'19 templateString: (dojo.isIE || dojo.isSafari || dojo.isMozilla) ? '<fieldset class="dijitInlineBox dijitInputField dijitTextArea">' 20 + ((dojo.isIE || dojo.isSafari) ? '<div dojoAttachPoint="editNode" waiRole="textarea" style="text-decoration:none;_padding-bottom:16px;display:block;overflow:auto;" contentEditable="true"></div>' 21 21 : '<iframe dojoAttachPoint="iframe" dojoAttachEvent="onblur:_onIframeBlur" src="javascript:void(0)" style="border:0px;margin:0px;padding:0px;display:block;width:100%;height:100%;overflow-x:auto;overflow-y:hidden;"></iframe>') 22 + '<textarea name="${name}" value="${value}"dojoAttachPoint="formValueNode" style="display:none;"></textarea>'22 + '<textarea dojoAttachPoint="formValueNode" style="display:none;"></textarea>' 23 23 + '</fieldset>' 24 : '<textarea id="${id}" name="${name}" value="${value}"dojoAttachPoint="formValueNode,editNode" class="dijitInputField dijitTextArea"></textarea>',24 : '<textarea dojoAttachPoint="formValueNode,editNode" class="dijitInputField dijitTextArea"></textarea>', 25 25 26 26 _nlsResources: null, // Needed for screen readers on FF2 27 27 28 postMixInProperties: function(){ 29 this.inherited('postMixInProperties', arguments); 30 this.genericMap = dojo.mixin(dojo.clone(this.genericMap), {id:"", name:"formValueNode", tabIndex:"editNode", value:"formValueNode"}); 31 }, 32 28 33 focus: function(){ 29 34 // summary: Received focus, needed for the InlineEditBox widget 30 35 if(!this.disabled){ … … 86 91 if(!this.value){ this.value = ""; } 87 92 }, 88 93 89 postCreate: function(){ 94 //TODO: ok to change this form postCreate to buildRendering? Need attachpoints defined earlier 95 buildRendering: function(){ 96 this.inherited('buildRendering', arguments); 90 97 if(dojo.isIE || dojo.isSafari){ 91 98 this.domNode.style.overflowY = 'hidden'; 92 99 this.eventNode = this.focusNode = this.editNode; … … 102 109 // 103 110 // An additional problem is that the browser gives the document object a 104 111 // very cryptic accessible name, e.g. 105 // wy ciwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html112 // wysiwyg://13/http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_InlineEditBox.html 106 113 // When focus is fired from the document object, the screen reader speaks 107 // the accessible name. The c yptic accessile name is confusing.114 // the accessible name. The cryptic accessible name is confusing. 108 115 // 109 116 // A workaround for both of these problems is to give the iframe's 110 117 // document a title, the name of which is similar to a role name, i.e. … … 135 142 if(this.editNode){ 136 143 this.connect(this.editNode, "change", this._changed); // needed for mouse paste events per #3479 137 144 } 138 this.inherited('postCreate', arguments);139 145 }, 140 146 141 147 // event handlers, you can over-ride these in your own subclasses -
Users/peller/workspace/trunk/dijit/form/Slider.js
49 49 _progressPixelSize: "width", 50 50 _upsideDown: false, 51 51 52 setDisabled: function(/*Boolean*/ disabled){52 setDisabled: function(/*Boolean*/ disabled){ 53 53 if(this.showButtons){ 54 54 this.incrementButton.disabled = disabled; 55 55 this.decrementButton.disabled = disabled; … … 167 167 dijit.form.HorizontalSlider.superclass.setValue.call(this, this.value, true); 168 168 }, 169 169 170 postMixInProperties: function(){ 171 this.inherited('postMixInProperties', arguments); 172 this.genericMap = dojo.mixin(dojo.clone(this.genericMap), {id:"", name:"valueNode"}); 173 }, 174 170 175 postCreate: function(){ 171 176 if(this.showButtons){ 172 177 this.incrementButton.domNode.style.display=""; -
Users/peller/workspace/trunk/dijit/form/templates/HorizontalSlider.html
1 <table class="dijit dijitReset dijitSlider" cellspacing= 0 cellpadding=0 border=0 rules=none id="${id}"1 <table class="dijit dijitReset dijitSlider" cellspacing="0" cellpadding="0" border="0" rules="none" 2 2 ><tr class="dijitReset" 3 ><td class="dijitReset" colspan= 2></td3 ><td class="dijitReset" colspan="2"></td 4 4 ><td dojoAttachPoint="containerNode,topDecoration" class="dijitReset" style="text-align:center;width:100%;"></td 5 ><td class="dijitReset" colspan= 2></td5 ><td class="dijitReset" colspan="2"></td 6 6 ></tr 7 7 ><tr class="dijitReset" 8 8 ><td class="dijitReset dijitSliderButtonContainer dijitHorizontalSliderButtonContainer" … … 12 12 ><div class="dijitSliderBar dijitSliderBumper dijitHorizontalSliderBumper dijitSliderLeftBumper dijitHorizontalSliderLeftBumper"></div 13 13 ></td 14 14 ><td class="dijitReset" 15 ><input dojoAttachPoint="valueNode" name="${name}"type="hidden"15 ><input dojoAttachPoint="valueNode" type="hidden" 16 16 ><div style="position:relative;" dojoAttachPoint="sliderBarContainer" 17 17 ><div dojoAttachPoint="progressBar" class="dijitSliderBar dijitHorizontalSliderBar dijitSliderProgressBar dijitHorizontalSliderProgressBar" dojoAttachEvent="onclick:_onBarClick" 18 ><div tabIndex="${tabIndex}"dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable dijitHorizontalSliderMoveable" dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onHandleClick" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}"18 ><div dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable dijitHorizontalSliderMoveable" dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onHandleClick" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}" 19 19 ><div class="dijitSliderImageHandle dijitHorizontalSliderImageHandle"></div 20 20 ></div 21 21 ></div … … 30 30 ></td 31 31 ></tr 32 32 ><tr class="dijitReset" 33 ><td class="dijitReset" colspan= 2></td33 ><td class="dijitReset" colspan="2"></td 34 34 ><td dojoAttachPoint="containerNode,bottomDecoration" class="dijitReset" style="text-align:center;"></td 35 ><td class="dijitReset" colspan= 2></td35 ><td class="dijitReset" colspan="2"></td 36 36 ></tr 37 37 ></table> -
Users/peller/workspace/trunk/dijit/form/templates/TimePicker.html
1 <fieldset id="widget_${id}"baseClass="dijitTimePicker" class="dijitMenu"1 <fieldset baseClass="dijitTimePicker" class="dijitMenu" 2 2 ><div dojoAttachPoint="upArrow" class="dijitButtonNode">▲</div 3 3 ><div dojoAttachPoint="timeMenu" dojoAttachEvent="onclick:_onOptionSelected,onmouseover,onmouseout" 4 4 ></div -
Users/peller/workspace/trunk/dijit/form/templates/VerticalSlider.html
1 <table class="dijitReset dijitSlider" cellspacing= 0 cellpadding=0 border=0 rules=none id="${id}"1 <table class="dijitReset dijitSlider" cellspacing="0" cellpadding="0" border="0" rules="none" 2 2 ><tbody class="dijitReset" 3 3 ><tr class="dijitReset" 4 4 ><td class="dijitReset"></td 5 5 ><td class="dijitReset dijitSliderButtonContainer dijitVerticalSliderButtonContainer" 6 ><button dojoType="dijit.form.Button" tabIndex= -1alt="+" style="display:none" dojoAttachPoint="incrementButton" dojoAttachEvent="onClick: increment">+</button6 ><button dojoType="dijit.form.Button" tabIndex="-1" alt="+" style="display:none" dojoAttachPoint="incrementButton" dojoAttachEvent="onClick: increment">+</button 7 7 ></td 8 8 ><td class="dijitReset"></td 9 9 ></tr … … 17 17 ><tr class="dijitReset" 18 18 ><td dojoAttachPoint="leftDecoration" class="dijitReset" style="text-align:center;height:100%;"></td 19 19 ><td class="dijitReset" style="height:100%;" 20 ><input dojoAttachPoint="valueNode" type="hidden" name="${name}"20 ><input dojoAttachPoint="valueNode" type="hidden" 21 21 ><center style="position:relative;height:100%;" dojoAttachPoint="sliderBarContainer" 22 22 ><div dojoAttachPoint="remainingBar" class="dijitSliderBar dijitVerticalSliderBar dijitSliderRemainingBar dijitVerticalSliderRemainingBar" dojoAttachEvent="onclick:_onBarClick"></div 23 23 ><div dojoAttachPoint="progressBar" class="dijitSliderBar dijitVerticalSliderBar dijitSliderProgressBar dijitVerticalSliderProgressBar" dojoAttachEvent="onclick:_onBarClick" 24 ><div tabIndex="${tabIndex}"dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable" dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onHandleClick" style="vertical-align:top;" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}"24 ><div dojoAttachPoint="sliderHandle,focusNode" class="dijitSliderMoveable" dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onHandleClick" style="vertical-align:top;" waiRole="slider" valuemin="${minimum}" valuemax="${maximum}" 25 25 ><div class="dijitSliderImageHandle dijitVerticalSliderImageHandle"></div 26 26 ></div 27 27 ></div … … 39 39 ><tr class="dijitReset" 40 40 ><td class="dijitReset"></td 41 41 ><td class="dijitReset dijitSliderButtonContainer dijitVerticalSliderButtonContainer" 42 ><button dojoType="dijit.form.Button" tabIndex= -1alt="-" style="display:none" dojoAttachPoint="decrementButton" dojoAttachEvent="onClick: decrement">-</button42 ><button dojoType="dijit.form.Button" tabIndex="-1" alt="-" style="display:none" dojoAttachPoint="decrementButton" dojoAttachEvent="onClick: decrement">-</button 43 43 ></td 44 44 ><td class="dijitReset"></td 45 45 ></tr -
Users/peller/workspace/trunk/dijit/form/templates/InlineEditBox.html
1 1 <span> 2 <!-- fixme: ok to put id, name, tabIndex on focusNode? --> 2 3 <span class='dijitInlineValue' tabIndex="0" dojoAttachPoint="editable,focusNode" style="" waiRole="button" 3 4 dojoAttachEvent="onkeypress:_onKeyPress,onclick:_onClick,onmouseout:_onMouseOut,onmouseover:_onMouseOver,onfocus:_onMouseOver,onblur:_onMouseOut"></span> 4 5 <fieldset style="display:none;" dojoAttachPoint="editNode" class="dijitInlineEditor"> -
Users/peller/workspace/trunk/dijit/form/templates/Textbox.html
1 <input dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus,onkeyup,onkeypress:_onKeyPress' autocomplete="off"2 id='${id}' name='${name}' class="dijitInputField" type='${type}' size='${size}' maxlength='${maxlength}' tabIndex='${tabIndex}'>1 <input dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus,onkeyup,onkeypress:_onKeyPress' 2 class="dijitInputField" type='${type}'> -
Users/peller/workspace/trunk/dijit/form/templates/Button.html
2 2 dojoAttachEvent="onclick:_onButtonClick,onmouseover:_onMouse,onmouseout:_onMouse,onmousedown:_onMouse" 3 3 ><div class='dijitRight' 4 4 ><button class="dijitStretch dijitButtonNode dijitButtonContents" dojoAttachPoint="focusNode,titleNode" 5 t abIndex="${tabIndex}" type="${type}" id="${id}" name="${name}" waiRole="button" waiState="labelledby-${id}_label"5 type="${type}" waiRole="button" waiState="labelledby-${id}_label" 6 6 ><div class="dijitInline ${iconClass}"></div 7 7 ><span class="dijitButtonText" id="${id}_label" dojoAttachPoint="containerNode">${label}</span 8 8 ></button -
Users/peller/workspace/trunk/dijit/form/Textbox.js
28 28 29 29 // size: String 30 30 // HTML INPUT tag size declaration. 31 size: " 20",31 size: "", 32 32 33 33 // maxlength: String 34 34 // HTML INPUT tag maxlength declaration. 35 maxlength: " 999999",35 maxlength: "", 36 36 37 37 templatePath: dojo.moduleUrl("dijit.form", "templates/Textbox.html"), 38 38 … … 46 46 47 47 setValue: function(value, /*Boolean, optional*/ priorityChange, /*String, optional*/ formattedValue){ 48 48 value = this.filter(value); 49 if(typeof formattedValue == "undefined" ){49 if(typeof formattedValue == "undefined"){ 50 50 formattedValue = (typeof value == "undefined" || value == null || value == NaN) ? null : this.format(value, this.constraints); 51 51 } 52 if(formattedValue != null){52 if(formattedValue){ 53 53 var _this = this; 54 54 // synchronous value set needed for InlineEditBox 55 55 this.textbox.value = formattedValue; … … 71 71 return value; 72 72 }, 73 73 74 postMixInProperties: function(){ 75 this.inherited('postMixInProperties', arguments); 76 this.genericMap = dojo.mixin(dojo.clone(this.genericMap), {size:"focusNode", maxlength:"focusNode"}); 77 }, 78 74 79 postCreate: function(){ 75 80 // get the node for which the background color will be updated 76 81 if(typeof this.nodeWithBorder != "object"){ -
Users/peller/workspace/trunk/dijit/form/InlineEditBox.js
157 157 var _this=this; 158 158 var isFirst = true; 159 159 dojo.forEach(value.split("\n"), function(line){ 160 if(isFirst){ isFirst = false; } 161 else { 160 if(isFirst){ 161 isFirst = false; 162 }else{ 162 163 _this.editable.appendChild(document.createElement("BR")); // preserve line breaks 163 164 } 164 165 _this.editable.appendChild(document.createTextNode(line)); // use text nodes so that imbedded tags can be edited -
Users/peller/workspace/trunk/dijit/Dialog.js
83 83 templateString: null, 84 84 templatePath: dojo.moduleUrl("dijit", "templates/Dialog.html"), 85 85 86 // title: String 87 // Title of the dialog 88 title: "", 86 duration: 400, 89 87 90 duration: 400,91 92 88 _lastFocusItem:null, 93 89 90 postMixInProperties: function(){ 91 this.genericMap = dojo.mixin(dojo.clone(this.genericMap), {title: "titleBar"}); 92 }, 93 94 94 postCreate: function(){ 95 95 dojo.body().appendChild(this.domNode); 96 96 dijit.Dialog.superclass.postCreate.apply(this, arguments); … … 188 188 var node = evt.target; 189 189 // see if we are shift-tabbing from titleBar 190 190 if(node == this.titleBar && evt.shiftKey && evt.keyCode == dojo.keys.TAB){ 191 if (this._lastFocusItem){191 if(this._lastFocusItem){ 192 192 this._lastFocusItem.focus(); // send focus to last item in dialog if known 193 193 } 194 194 dojo.stopEvent(evt); 195 195 }else{ 196 196 // see if the key is for the dialog 197 while (node){197 while(node){ 198 198 if(node == this.domNode){ 199 if (evt.keyCode == dojo.keys.ESCAPE){199 if(evt.keyCode == dojo.keys.ESCAPE){ 200 200 this.hide(); 201 201 }else{ 202 202 return; // just let it go … … 205 205 node = node.parentNode; 206 206 } 207 207 // this key is for the disabled document window 208 if (evt.keyCode != dojo.keys.TAB){ // allow tabbing into the dialog for a11y208 if(evt.keyCode != dojo.keys.TAB){ // allow tabbing into the dialog for a11y 209 209 dojo.stopEvent(evt); 210 210 // opera won't tab to a div 211 211 }else if (!dojo.isOpera){ -
Users/peller/workspace/trunk/dijit/layout/StackContainer.js
362 362 switch(evt.keyCode){ 363 363 case dojo.keys.LEFT_ARROW: 364 364 case dojo.keys.UP_ARROW: 365 forward =false;365 forward = false; 366 366 // fall through 367 367 case dojo.keys.RIGHT_ARROW: 368 368 case dojo.keys.DOWN_ARROW: … … 370 370 dojo.stopEvent(evt); 371 371 break; 372 372 case dojo.keys.DELETE: 373 if (this._currentChild.closable){373 if(this._currentChild.closable){ 374 374 this.onCloseButtonClick(this._currentChild);