|
1221 | 1221 | // and save range and selected HTML.
|
1222 | 1222 | editable.attachListener( dropTarget, 'dragstart', function( evt ) {
|
1223 | 1223 | // Create a dataTransfer object and save it globally.
|
1224 |
| - clipboard.initDragDataTransfer( evt, editor ); |
| 1224 | + var dataTransfer = clipboard.initDragDataTransfer( evt, editor ); |
| 1225 | + |
| 1226 | + fireDragEvent( 'dragstart', evt, dataTransfer ); |
1225 | 1227 | } );
|
1226 | 1228 |
|
1227 | 1229 | // Clean up on dragend.
|
1228 | 1230 | editable.attachListener( dropTarget, 'dragend', function( evt ) {
|
1229 |
| - // When drag & drop is done we need to reset dataTransfer so the future |
1230 |
| - // external drop will be not recognize as internal. |
1231 |
| - clipboard.resetDragDataTransfer(); |
| 1231 | + var dataTransfer = clipboard.initDragDataTransfer( evt, editor ); |
| 1232 | + |
| 1233 | + // Fire dragend |
| 1234 | + if ( fireDragEvent( 'dragend', evt, dataTransfer ) ) { |
| 1235 | + // When drag & drop is done we need to reset dataTransfer so the future |
| 1236 | + // external drop will be not recognize as internal. |
| 1237 | + clipboard.resetDragDataTransfer(); |
| 1238 | + } |
1232 | 1239 | } );
|
1233 | 1240 |
|
1234 | 1241 | editable.attachListener( dropTarget, 'drop', function( evt ) {
|
|
1247 | 1254 | if ( !dropRange )
|
1248 | 1255 | return;
|
1249 | 1256 |
|
| 1257 | + // Fire drop. |
| 1258 | + var data = fireDragEvent( 'drop', evt, dataTransfer, dragRange, dropRange ); |
| 1259 | + if ( !data ) { |
| 1260 | + return; |
| 1261 | + } |
| 1262 | + |
| 1263 | + // Let user modify drag and drop range. |
| 1264 | + dropRange = data.dropRange; |
| 1265 | + dragRange = data.dragRange; |
1250 | 1266 |
|
1251 | 1267 | if ( dataTransfer.getTransferType() == CKEDITOR.DATA_TRANSFER_INTERNAL ) {
|
1252 | 1268 | internalDrop( dragRange, dropRange, dataTransfer );
|
|
1375 | 1391 | editor.toolbox.focus();
|
1376 | 1392 | } );
|
1377 | 1393 | }
|
| 1394 | + |
| 1395 | + // Fire drag/drop events (dragstart, dragend, drop). |
| 1396 | + function fireDragEvent( name, evt, dataTransfer, dragRange, dropRange ) { |
| 1397 | + var eventData = { |
| 1398 | + nativeEvent: evt.data.$, |
| 1399 | + target: evt.data.getTarget(), |
| 1400 | + dataTransfer: dataTransfer |
| 1401 | + }; |
| 1402 | + |
| 1403 | + if ( dragRange ) { |
| 1404 | + eventData.dragRange = dragRange; |
| 1405 | + } |
| 1406 | + if ( dropRange ) { |
| 1407 | + eventData.dropRange = dropRange; |
| 1408 | + } |
| 1409 | + |
| 1410 | + if ( !editor.fire( name, eventData ) ) { |
| 1411 | + evt.data.preventDefault(); |
| 1412 | + return false; |
| 1413 | + } |
| 1414 | + |
| 1415 | + return eventData; |
| 1416 | + } |
1378 | 1417 | } );
|
1379 | 1418 | }
|
1380 | 1419 |
|
|
1748 | 1787 | }
|
1749 | 1788 |
|
1750 | 1789 | // In IE10+ we can not use any data type besides text, so we do not call setData.
|
1751 |
| - if ( evt && evt.name != 'drop' && clipboardIdDataType != 'Text' ) { |
1752 |
| - // dataTransfer object will be passed from the drag to the drop event. |
1753 |
| - this.$.setData( clipboardIdDataType, this.id ); |
| 1790 | + if ( clipboardIdDataType != 'Text' ) { |
| 1791 | + // Try to set ID so it will be passed from the drag to the drop event. |
| 1792 | + // On some browsers with some event it is not possible to setData so we |
| 1793 | + // need to catch exceptions. |
| 1794 | + try { |
| 1795 | + this.$.setData( clipboardIdDataType, this.id ); |
| 1796 | + } catch ( err ) {} |
1754 | 1797 | }
|
1755 | 1798 |
|
1756 | 1799 | if ( editor ) {
|
|
1990 | 2033 | * @param {CKEDITOR.editor} editor This editor instance.
|
1991 | 2034 | * @param {Function} [data] Callback that will be passed to {@link CKEDITOR.editor#openDialog}.
|
1992 | 2035 | */
|
| 2036 | + |
| 2037 | +/** |
| 2038 | + * Facade for native `drop` event. Fired when native `drop` event occur. |
| 2039 | + * Editors event have dataTransfer facade instead of native dataTransfers object what allows you |
| 2040 | + * to use custom data type on any browser. This event let you modify drag and drop range and |
| 2041 | + * cancel drop event. Use it only form drag and drop operations. To manipulate dropped data use |
| 2042 | + * {@link CKEDITOR.editor#paste paste event}. |
| 2043 | + * |
| 2044 | + * @since 4.5 |
| 2045 | + * @event drop |
| 2046 | + * @member CKEDITOR.editor |
| 2047 | + * @param {CKEDITOR.editor} editor This editor instance. |
| 2048 | + * @param data |
| 2049 | + * @param {Object} data.nativeEvent Native drop event. |
| 2050 | + * @param {CKEDITOR.dom.node} data.target Drop target. |
| 2051 | + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. |
| 2052 | + * @param {CKEDITOR.dom.range} data.dragRange Drag range, let you manipulate with drag range. |
| 2053 | + * Note that dragged html is saved as `text/html` data on `dragstart` so if you change drag range |
| 2054 | + * on drop dropped html will not change. You need to change it manually using |
| 2055 | + * {@link CKEDITOR.plugins.clipboard.dataTransfer#setData dataTransfer.setData}. |
| 2056 | + * @param {CKEDITOR.dom.range} data.dropRange Drop range, let you manipulate with drop range. |
| 2057 | + */ |
| 2058 | + |
| 2059 | +/** |
| 2060 | + * Facade for native `dragstart` event. Fired when native `dragstart` event occur. |
| 2061 | + * Editors event have dataTransfer facade instead of native dataTransfers object what allows you |
| 2062 | + * to use custom data type on any browser. This event let you cancel `dragstart`. |
| 2063 | + * |
| 2064 | + * @since 4.5 |
| 2065 | + * @event dragstart |
| 2066 | + * @member CKEDITOR.editor |
| 2067 | + * @param {CKEDITOR.editor} editor This editor instance. |
| 2068 | + * @param data |
| 2069 | + * @param {Object} data.nativeEvent Native dragstart event. |
| 2070 | + * @param {CKEDITOR.dom.node} data.target Drag target. |
| 2071 | + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. |
| 2072 | + */ |
| 2073 | + |
| 2074 | +/** |
| 2075 | + * Facade for native `dragend` event. Fired when native `dragend` event occur. |
| 2076 | + * Editors event have dataTransfer facade instead of native dataTransfers object what allows you |
| 2077 | + * to use custom data type on any browser. This event let you cancel `dragend` event and prevent |
| 2078 | + * removing dataTransfer for the global scope. |
| 2079 | + * |
| 2080 | + * @since 4.5 |
| 2081 | + * @event dragend |
| 2082 | + * @member CKEDITOR.editor |
| 2083 | + * @param {CKEDITOR.editor} editor This editor instance. |
| 2084 | + * @param data |
| 2085 | + * @param {Object} data.nativeEvent Native dragend event. |
| 2086 | + * @param {CKEDITOR.dom.node} data.target Drag target. |
| 2087 | + * @param {CKEDITOR.plugins.clipboard.dataTransfer} data.dataTransfer DataTransfer facade. |
| 2088 | + */ |
0 commit comments