1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | import { Plugin } from 'ckeditor5/src/core';
|
11 | import { WidgetResize } from 'ckeditor5/src/widget';
|
12 |
|
13 | import ImageLoadObserver from '../image/imageloadobserver';
|
14 |
|
15 | const RESIZABLE_IMAGES_CSS_SELECTOR =
|
16 | 'figure.image.ck-widget > img,' +
|
17 | 'figure.image.ck-widget > picture > img,' +
|
18 | 'figure.image.ck-widget > a > img,' +
|
19 | 'figure.image.ck-widget > a > picture > img,' +
|
20 | 'span.image-inline.ck-widget > img,' +
|
21 | 'span.image-inline.ck-widget > picture > img';
|
22 |
|
23 | const IMAGE_WIDGETS_CLASSES_MATCH_REGEXP = /(image|image-inline)/;
|
24 |
|
25 | const RESIZED_IMAGE_CLASS = 'image_resized';
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | export default class ImageResizeHandles extends Plugin {
|
36 | |
37 |
|
38 |
|
39 | static get requires() {
|
40 | return [ WidgetResize ];
|
41 | }
|
42 |
|
43 | |
44 |
|
45 |
|
46 | static get pluginName() {
|
47 | return 'ImageResizeHandles';
|
48 | }
|
49 |
|
50 | |
51 |
|
52 |
|
53 | init() {
|
54 | const command = this.editor.commands.get( 'resizeImage' );
|
55 | this.bind( 'isEnabled' ).to( command );
|
56 |
|
57 | this._setupResizerCreator();
|
58 | }
|
59 |
|
60 | |
61 |
|
62 |
|
63 |
|
64 |
|
65 | _setupResizerCreator() {
|
66 | const editor = this.editor;
|
67 | const editingView = editor.editing.view;
|
68 |
|
69 | editingView.addObserver( ImageLoadObserver );
|
70 |
|
71 | this.listenTo( editingView.document, 'imageLoaded', ( evt, domEvent ) => {
|
72 |
|
73 | if ( !domEvent.target.matches( RESIZABLE_IMAGES_CSS_SELECTOR ) ) {
|
74 | return;
|
75 | }
|
76 |
|
77 | const domConverter = editor.editing.view.domConverter;
|
78 | const imageView = domConverter.domToView( domEvent.target );
|
79 | const widgetView = imageView.findAncestor( { classes: IMAGE_WIDGETS_CLASSES_MATCH_REGEXP } );
|
80 | let resizer = this.editor.plugins.get( WidgetResize ).getResizerByViewElement( widgetView );
|
81 |
|
82 | if ( resizer ) {
|
83 |
|
84 |
|
85 | resizer.redraw();
|
86 |
|
87 | return;
|
88 | }
|
89 |
|
90 | const mapper = editor.editing.mapper;
|
91 | const imageModel = mapper.toModelElement( widgetView );
|
92 |
|
93 | resizer = editor.plugins
|
94 | .get( WidgetResize )
|
95 | .attachTo( {
|
96 | unit: editor.config.get( 'image.resizeUnit' ),
|
97 |
|
98 | modelElement: imageModel,
|
99 | viewElement: widgetView,
|
100 | editor,
|
101 |
|
102 | getHandleHost( domWidgetElement ) {
|
103 | return domWidgetElement.querySelector( 'img' );
|
104 | },
|
105 | getResizeHost() {
|
106 |
|
107 | return domConverter.viewToDom( mapper.toViewElement( imageModel.parent ) );
|
108 | },
|
109 |
|
110 | isCentered() {
|
111 | const imageStyle = imageModel.getAttribute( 'imageStyle' );
|
112 |
|
113 | return !imageStyle || imageStyle == 'block' || imageStyle == 'alignCenter';
|
114 | },
|
115 |
|
116 | onCommit( newValue ) {
|
117 |
|
118 |
|
119 |
|
120 |
|
121 | editingView.change( writer => {
|
122 | writer.removeClass( RESIZED_IMAGE_CLASS, widgetView );
|
123 | } );
|
124 |
|
125 | editor.execute( 'resizeImage', { width: newValue } );
|
126 | }
|
127 | } );
|
128 |
|
129 | resizer.on( 'updateSize', () => {
|
130 | if ( !widgetView.hasClass( RESIZED_IMAGE_CLASS ) ) {
|
131 | editingView.change( writer => {
|
132 | writer.addClass( RESIZED_IMAGE_CLASS, widgetView );
|
133 | } );
|
134 | }
|
135 | } );
|
136 |
|
137 | resizer.bind( 'isEnabled' ).to( this );
|
138 | } );
|
139 | }
|
140 | }
|