widgetengine.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /**
  6. * @module image/widget/widgetengine
  7. */
  8. import Plugin from 'ckeditor5-core/src/plugin';
  9. import { WIDGET_SELECTED_CLASS_NAME, isWidget } from './utils';
  10. /**
  11. * The widget engine plugin.
  12. * Registers model to view selection converter for editing pipeline. It is hooked after default selection conversion.
  13. * If converted selection is placed around widget element, selection is marked as fake. Additionally, proper CSS class
  14. * is added to indicate that widget has been selected.
  15. *
  16. * @extends module:core/plugin~Plugin.
  17. */
  18. export default class WidgetEngine extends Plugin {
  19. /**
  20. * @inheritDoc
  21. */
  22. init() {
  23. let previouslySelected;
  24. // Model to view selection converter.
  25. // Converts selection placed over widget element to fake selection
  26. this.editor.editing.modelToView.on( 'selection', ( evt, data, consumable, conversionApi ) => {
  27. // Remove selected class from previously selected widget.
  28. if ( previouslySelected && previouslySelected.hasClass( WIDGET_SELECTED_CLASS_NAME ) ) {
  29. previouslySelected.removeClass( WIDGET_SELECTED_CLASS_NAME );
  30. }
  31. const viewSelection = conversionApi.viewSelection;
  32. const selectedElement = viewSelection.getSelectedElement();
  33. if ( !selectedElement || !isWidget( selectedElement ) ) {
  34. return;
  35. }
  36. viewSelection.setFake( true );
  37. selectedElement.addClass( WIDGET_SELECTED_CLASS_NAME );
  38. previouslySelected = selectedElement;
  39. }, { priority: 'low' } );
  40. }
  41. }