enabletoolbarkeyboardfocus.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /**
  2. * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  4. */
  5. /**
  6. * @module ui/toolbar/enabletoolbarkeyboardfocus
  7. */
  8. /**
  9. * Enables focus/blur toolbar navigation using `Alt+F10` and `Esc` keystrokes.
  10. *
  11. * @param {Object} options Options of the utility.
  12. * @param {*} options.origin A view to which the focus will return when `Esc` is pressed and
  13. * `options.toolbar` is focused.
  14. * @param {module:utils/keystrokehandler~KeystrokeHandler} options.originKeystrokeHandler A keystroke
  15. * handler to register `Alt+F10` keystroke.
  16. * @param {module:utils/focustracker~FocusTracker} options.originFocusTracker A focus tracker
  17. * for `options.origin`.
  18. * @param {module:ui/toolbar/toolbarview~ToolbarView} options.toolbar A toolbar which is to gain
  19. * focus when `Alt+F10` is pressed.
  20. * @param {Function} [options.beforeFocus] A callback executed before the `options.toolbar` gains focus
  21. * upon the `Alt+F10` keystroke.
  22. * @param {Function} [options.afterBlur] A callback executed after `options.toolbar` loses focus upon
  23. * `Esc` keystroke but before the focus goes back to `options.origin`.
  24. */
  25. export default function enableToolbarKeyboardFocus( {
  26. origin,
  27. originKeystrokeHandler,
  28. originFocusTracker,
  29. toolbar,
  30. beforeFocus,
  31. afterBlur
  32. } ) {
  33. // Because toolbar items can get focus, the overall state of the toolbar must
  34. // also be tracked.
  35. originFocusTracker.add( toolbar.element );
  36. // Focus the toolbar on the keystroke, if not already focused.
  37. originKeystrokeHandler.set( 'Alt+F10', ( data, cancel ) => {
  38. if ( originFocusTracker.isFocused && !toolbar.focusTracker.isFocused ) {
  39. if ( beforeFocus ) {
  40. beforeFocus();
  41. }
  42. toolbar.focus();
  43. cancel();
  44. }
  45. } );
  46. // Blur the toolbar and bring the focus back to origin.
  47. toolbar.keystrokes.set( 'Esc', ( data, cancel ) => {
  48. if ( toolbar.focusTracker.isFocused ) {
  49. origin.focus();
  50. if ( afterBlur ) {
  51. afterBlur();
  52. }
  53. cancel();
  54. }
  55. } );
  56. }