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