editor-tab.js revision daeb6d531149c45a2ceb543ae2cf1e56e5235bbe
6a6a6d5448f8c49592581707a20e891abe577bfaDav Glass /**
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * Handles tab and shift-tab indent/outdent support.
e0b25dbc0322a078f384c45b48e5690f23d7eb15Dav Glass * @module editor
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass * @submodule editor-tab
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass */
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass /**
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass * Handles tab and shift-tab indent/outdent support.
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass * @class Plugin.EditorTab
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass * @constructor
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass * @extends Base
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass */
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass var EditorTab = function() {
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass EditorTab.superclass.constructor.apply(this, arguments);
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass }, HOST = 'host';
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass Y.extend(EditorTab, Y.Base, {
55b12015bcdecf19f771f5387bc9b14af54da374Dav Glass /**
e0b25dbc0322a078f384c45b48e5690f23d7eb15Dav Glass * Listener for host's nodeChange event and captures the tabkey interaction.
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * @private
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * @method _onNodeChange
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * @param {Event} e The Event facade passed from the host.
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass */
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass _onNodeChange: function(e) {
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass var action = 'indent';
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass if (e.changedType === 'tab') {
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass if (!e.changedNode.test('li, li *')) {
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass e.changedEvent.halt();
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass e.preventDefault();
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass if (e.changedEvent.shiftKey) {
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass action = 'outdent';
762b21413a7bbc38b5c7b2d94385fb44f26f9d39Dav Glass }
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass Y.log('Overriding TAB to ' + action, 'info', 'editorTab');
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass this.get(HOST).execCommand(action, '');
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass }
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass }
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass },
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass initializer: function() {
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass this.get(HOST).on('nodeChange', Y.bind(this._onNodeChange, this));
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass }
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass }, {
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass /**
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * editorTab
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * @property NAME
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * @static
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass */
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass NAME: 'editorTab',
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass /**
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * tab
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass * @property NS
e0b25dbc0322a078f384c45b48e5690f23d7eb15Dav Glass * @static
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass */
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass NS: 'tab',
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass ATTRS: {
fc2d50365b169f761de7a15d7a4fe406b33fd403Dav Glass host: {
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass value: false
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass }
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass }
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass });
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass Y.namespace('Plugin');
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass Y.Plugin.EditorTab = EditorTab;
84e4fc4350d23a4c37b8d6a3f5ee4c131cacf5ddDav Glass