Changeset 7516


Ignore:
Timestamp:
06/27/12 18:10:56 (3 years ago)
Author:
fredck
Message:

#8985 : Better handling of ENTER key events on dialogs.

Location:
CKEditor/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CKEditor/trunk/CHANGES.html

    r7515 r7516  
    6060                <li><a href="http://dev.ckeditor.com/ticket/8917">#8917</a> : [IE7] Dialog size are stretched when long text field value is received.</li>
    6161                <li><a href="http://dev.ckeditor.com/ticket/8945">#8945</a> : Fake elements now show alternative text on High Contrast mode.</li>
     62                <li><a href="http://dev.ckeditor.com/ticket/8985">#8985</a> : Better handling of ENTER key events on dialogs.</li>
    6263        </ul>
    6364        <h3>
  • CKEditor/trunk/_source/plugins/dialog/plugin.js

    r7477 r7516  
    142142                        tabsToRemove = {},
    143143                        i,
    144                         processed;
     144                        processed, stopPropagation;
    145145
    146146                        if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) ||    // The buttons in MacOS Apps are in reverse order (#4750)
     
    398398
    399399
    400                 function focusKeydownHandler( evt )
     400                function keydownHandler( evt )
    401401                {
    402402                        // If I'm not the top dialog, ignore.
     
    405405
    406406                        var keystroke = evt.data.getKeystroke(),
    407                                 rtl = editor.lang.dir == 'rtl';
    408 
    409                         processed = 0;
     407                                rtl = editor.lang.dir == 'rtl',
     408                                button;
     409
     410                        processed = stopPropagation = 0;
     411
    410412                        if ( keystroke == 9 || keystroke == CKEDITOR.SHIFT + 9 )
    411413                        {
     
    451453                                processed = 1;
    452454                        }
    453 
     455                        // If user presses enter key in a text box, it implies clicking OK for the dialog.
     456                        else if ( keystroke == 13 /*ENTER*/ )
     457                        {
     458                                // Don't do that for a target that handles ENTER.
     459                                var target = evt.data.getTarget();
     460                                if ( !target.is( 'a', 'button', 'select' ) && ( !target.is( 'input' ) || target.$.type != 'button' ) )
     461                                {
     462                                        button = this.getButton( 'ok' );
     463                                        button && CKEDITOR.tools.setTimeout( button.click, 0, button );
     464                                        processed = 1
     465                                }
     466                                stopPropagation = 1; // Always block the propagation (#4269)
     467                        }
     468                        else if ( keystroke == 27 /*ESC*/ )
     469                        {
     470                                button = this.getButton( 'cancel' );
     471
     472                                // If there's a Cancel button, click it, else just fire the cancel event and hide the dialog.
     473                                if ( button )
     474                                        CKEDITOR.tools.setTimeout( button.click, 0, button );
     475                                else
     476                                {
     477                                        if ( this.fire( 'cancel', { hide : true } ).hide !== false )
     478                                                this.hide();
     479                                }
     480                                stopPropagation = 1; // Always block the propagation (#4269)
     481                        }
     482                        else
     483                                return;
     484
     485                        keypressHandler( evt );
     486                }
     487
     488                function keypressHandler( evt )
     489                {
    454490                        if ( processed )
    455                         {
    456                                 evt.stop();
    457                                 evt.data.preventDefault();
    458                         }
    459                 }
    460 
    461                 function focusKeyPressHandler( evt )
    462                 {
    463                         processed && evt.data.preventDefault();
     491                                evt.data.preventDefault(1);
     492                        else if ( stopPropagation )
     493                                evt.data.stopPropagation();
    464494                }
    465495
     
    468498                this.on( 'show', function()
    469499                        {
    470                                 dialogElement.on( 'keydown', focusKeydownHandler, this, null, 0 );
     500                                dialogElement.on( 'keydown', keydownHandler, this );
     501
    471502                                // Some browsers instead, don't cancel key events in the keydown, but in the
    472                                 // keypress. So we must do a longer trip in those cases. (#4531)
    473                                 if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
    474                                         dialogElement.on( 'keypress', focusKeyPressHandler, this );
     503                                // keypress. So we must do a longer trip in those cases. (#4531,#8985)
     504                                if ( CKEDITOR.env.opera || CKEDITOR.env.gecko )
     505                                        dialogElement.on( 'keypress', keypressHandler, this );
    475506
    476507                        } );
    477508                this.on( 'hide', function()
    478509                        {
    479                                 dialogElement.removeListener( 'keydown', focusKeydownHandler );
    480                                 if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
    481                                         dialogElement.removeListener( 'keypress', focusKeyPressHandler );
     510                                dialogElement.removeListener( 'keydown', keydownHandler );
     511                                if ( CKEDITOR.env.opera || CKEDITOR.env.gecko )
     512                                        dialogElement.removeListener( 'keypress', keypressHandler );
    482513
    483514                                // Reset fields state when closing dialog.
     
    487518                        {
    488519                                var doc = new CKEDITOR.dom.document( evt.data.iframe.$.contentWindow.document );
    489                                 doc.on( 'keydown', focusKeydownHandler, this, null, 0 );
     520                                doc.on( 'keydown', keydownHandler, this, null, 0 );
    490521                        } );
    491522
     
    816847                        element.on( CKEDITOR.env.opera ? 'keypress' : 'keyup', accessKeyUpHandler );
    817848
    818                         // Prevent some keys from bubbling up. (#4269)
    819                         for ( var event in { keyup :1, keydown :1, keypress :1 } )
    820                                 element.on( event, preventKeyBubbling );
    821 
    822                         // Register the Esc hotkeys.
    823                         registerAccessKey( this, this, '\x1b', null, function()
    824                                         {
    825                                                 var button = this.getButton( 'cancel' );
    826                                                 // If there's a Cancel button, click it, else just fire the cancel event and hide the dialog
    827                                                 if ( button )
    828                                                         button.click();
    829                                                 else
    830                                                 {
    831                                                         if ( this.fire( 'cancel', { hide : true } ).hide !== false )
    832                                                                 this.hide();
    833                                                 }
    834                                         } );
    835 
    836849                        // Reset the hasFocus state.
    837850                        this._.hasFocus = false;
     
    979992                                element.removeListener( 'keydown', accessKeyDownHandler );
    980993                                element.removeListener( CKEDITOR.env.opera ? 'keypress' : 'keyup', accessKeyUpHandler );
    981 
    982                                 // Remove bubbling-prevention handler. (#4269)
    983                                 for ( var event in { keyup :1, keydown :1, keypress :1 } )
    984                                         element.removeListener( event, preventKeyBubbling );
    985994
    986995                                var editor = this._.editor;
     
    22002209        };
    22012210
    2202         // ESC, ENTER
    2203         var preventKeyBubblingKeys = { 27 :1, 13 :1 };
    2204         var preventKeyBubbling = function( e )
    2205         {
    2206                 if ( e.data.getKeystroke() in preventKeyBubblingKeys )
    2207                         e.data.stopPropagation();
    2208         };
    2209 
    22102211        (function()
    22112212        {
  • CKEditor/trunk/_source/plugins/dialogui/plugin.js

    r7495 r7516  
    241241                                        attributes.style = elementDefinition.inputStyle;
    242242
    243                                 // If user presses Enter in a text box, it implies clicking OK for the dialog.
    244                                 var me = this, keyPressedOnMe = false;
    245                                 dialog.on( 'load', function()
    246                                         {
    247                                                 me.getInputElement().on( 'keydown', function( evt )
    248                                                         {
    249                                                                 if ( evt.data.getKeystroke() == 13 )
    250                                                                         keyPressedOnMe = true;
    251                                                         } );
    252 
    253                                                 // Lower the priority this 'keyup' since 'ok' will close the dialog.(#3749)
    254                                                 me.getInputElement().on( 'keyup', function( evt )
    255                                                         {
    256                                                                 if ( evt.data.getKeystroke() == 13 && keyPressedOnMe )
    257                                                                 {
    258                                                                         dialog.getButton( 'ok' ) && setTimeout( function ()
    259                                                                         {
    260                                                                                 dialog.getButton( 'ok' ).click();
    261                                                                         }, 0 );
    262                                                                         keyPressedOnMe = false;
    263                                                                 }
    264                                                         }, null, null, 1000 );
    265                                         } );
    266 
    267243                                /** @ignore */
    268244                                var innerHTML = function()
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2015 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy