1 // ========================================================================== 2 // Project: SproutCore - JavaScript Application Framework 3 // Copyright: ©2006-2011 Strobe Inc. and contributors. 4 // ©2008-2011 Apple Inc. All rights reserved. 5 // License: Licensed under MIT license (see license.js) 6 // ========================================================================== 7 sc_require("panes/pane"); 8 9 SC.Pane.reopen( 10 /** @scope SC.Pane.prototype */ { 11 12 performKeyEquivalent: function(keystring, evt) { 13 var ret = sc_super() ; // try normal view behavior first 14 if (!ret) { 15 var defaultResponder = this.get('defaultResponder') ; 16 if (defaultResponder) { 17 // try default responder's own performKeyEquivalent method, 18 // if it has one... 19 if (defaultResponder.performKeyEquivalent) { 20 ret = defaultResponder.performKeyEquivalent(keystring, evt) ; 21 } 22 23 // even if it does have one, if it doesn't handle the event, give 24 // methodName-style key equivalent handling a try 25 if (!ret && defaultResponder.tryToPerform) { 26 ret = defaultResponder.tryToPerform(keystring, evt) ; 27 } 28 } 29 } 30 return ret ; 31 }, 32 33 /** @private 34 If the user presses the tab key and the pane does not have a first 35 responder, try to give it to the next eligible responder. 36 37 If the keyDown event reaches the pane, we can assume that no responders in 38 the responder chain, nor the default responder, handled the event. 39 */ 40 keyDown: function(evt) { 41 var nextValidKeyView; 42 43 // Handle tab key presses if we don't have a first responder already 44 if (evt.keyCode === 9 && !this.get('firstResponder')) { 45 // Cycle forwards by default, backwards if the shift key is held 46 if (evt.shiftKey) { 47 nextValidKeyView = this.get('previousValidKeyView'); 48 } else { 49 nextValidKeyView = this.get('nextValidKeyView'); 50 } 51 52 if (nextValidKeyView) { 53 this.makeFirstResponder(nextValidKeyView); 54 return YES; 55 }else if(!SC.TABBING_ONLY_INSIDE_DOCUMENT){ 56 evt.allowDefault(); 57 } 58 } 59 60 return NO; 61 }, 62 63 /** @private method forwards status changes in a generic way. */ 64 _forwardKeyChange: function(shouldForward, methodName, pane, isKey) { 65 var keyView, responder, newKeyView; 66 if (shouldForward && (responder = this.get('firstResponder'))) { 67 newKeyView = (pane) ? pane.get('firstResponder') : null ; 68 keyView = this.get('firstResponder') ; 69 if (keyView && keyView[methodName]) { keyView[methodName](newKeyView); } 70 71 if ((isKey !== undefined) && responder) { 72 responder.set('isKeyResponder', isKey); 73 } 74 } 75 } 76 }); 77