Skip to content

Commit 1bb7369

Browse files
author
Piotr Jasiun
committed
Merge branch 't/12169' into major
2 parents cb28e9c + a336e57 commit 1bb7369

File tree

5 files changed

+524
-53
lines changed

5 files changed

+524
-53
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ New Features:
99
* [#11437](http://dev.ckeditor.com/ticket/11437): Drag and Drop support.
1010
* [#11460](http://dev.ckeditor.com/ticket/11460): Custom handling for dropped content in the editor.
1111
* [#12168](http://dev.ckeditor.com/ticket/12168): `dataTransfer` facade.
12+
* [#12169](http://dev.ckeditor.com/ticket/12169): Introduce [`editor.drop`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-drop), [`editor.dragstart`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-dragstart) and [`editor.dragend`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-dragend) events.
1213

1314
Fixed Issues:
1415

dev/console/console.js

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,90 @@ var CKCONSOLE = ( function() {
226226
logItemTpl = new CKEDITOR.template(
227227
'<li class="ckconsole_log_item ckconsole_fresh_log_item"><time datetime="{time}" class="ckconsole_time">{time}</time> <code>{msg}</code></li>'
228228
);
229-
230229
return that;
231-
} )();
230+
} )();
231+
232+
/**
233+
* Usage:
234+
*
235+
* CKCONSOLE.addEventPanel( 'drop' );
236+
* CKCONSOLE.create( 'drop', { editor: 'inline' } );
237+
*
238+
* or (with observed types):
239+
*
240+
* CKCONSOLE.addEventPanel( 'drop', [ 'nativeEvent', 'target' ] );
241+
* CKCONSOLE.create( 'drop', { editor: 'inline' } );
242+
*
243+
* or (with observed types mapping):
244+
*
245+
* CKCONSOLE.addEventPanel( 'drop',
246+
* [ 'nativeEvent', 'target' ],
247+
* function( evt ) {
248+
* return {
249+
* 'nativeEvent': evt.data.nativeEvent,
250+
* 'target': evt.data.target
251+
* };
252+
* }
253+
* );
254+
* CKCONSOLE.create( 'drop', { editor: 'inline' } );
255+
*
256+
*/
257+
CKCONSOLE.addEventPanel = function( evtName, types, mapping ) {
258+
var values,
259+
content = '<ul class="ckconsole_list">';
260+
261+
if ( !types ) {
262+
var types = [];
263+
}
264+
if ( !mapping ) {
265+
mapping = function( evt ) {
266+
var ret = {};
267+
268+
for ( var i = 0; i < types.length; i++ ) {
269+
ret[ types[ i ] ] = evt.data[ types[ i ] ];
270+
};
271+
return ret;
272+
}
273+
}
274+
275+
for ( var i = 0; i < types.length; i++ ) {
276+
content += '<li>'+ types[ i ] + ': <span class="ckconsole_value" data-value="'+ types[ i ] + '"></span></li>';
277+
};
278+
content += '</ul>';
279+
280+
CKCONSOLE.add( evtName, {
281+
panels: [
282+
{
283+
type: 'box',
284+
content: content,
285+
286+
refresh: function( editor ) {
287+
values.header = evtName;
288+
return values;
289+
},
290+
291+
refreshOn: function( editor, refresh ) {
292+
editor.on( evtName, function( evt ) {
293+
values = mapping( evt );
294+
refresh();
295+
} );
296+
}
297+
},
298+
{
299+
type: 'log',
300+
on: function( editor, log, logFn ) {
301+
editor.on( evtName, function( evt ) {
302+
var logStr = evtName + '; '
303+
values = mapping( evt );
304+
305+
for ( var i = 0; i < types.length; i++ ) {
306+
logStr += types[ i ] + ': ' + values[ types[ i ] ] +'; ';
307+
}
308+
309+
logFn( logStr )();
310+
} );
311+
}
312+
}
313+
]
314+
} );
315+
}

plugins/clipboard/dev/dnd.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,20 @@ <h2>Technical details <a id="tech-details" name="tech-details"></a></h2>
166166
CKEDITOR.replace( 'classic' );
167167
CKEDITOR.inline( 'inline' );
168168

169+
CKCONSOLE.addEventPanel( 'dragstart', [ 'nativeEvent', 'target', 'dataTransfer' ] );
170+
CKCONSOLE.addEventPanel( 'dragend', [ 'nativeEvent', 'target', 'dataTransfer' ] );
171+
CKCONSOLE.addEventPanel( 'drop',
172+
[ 'nativeEvent', 'target', 'dataTransfer', 'dragRange', 'dropRange' ] );
173+
174+
CKCONSOLE.create( 'dragstart', { editor: 'classic' } );
175+
CKCONSOLE.create( 'drop', { editor: 'classic' } );
169176
CKCONSOLE.create( 'paste', { editor: 'classic' } );
177+
CKCONSOLE.create( 'dragend', { editor: 'classic' } );
178+
179+
CKCONSOLE.create( 'dragstart', { editor: 'inline' } );
180+
CKCONSOLE.create( 'drop', { editor: 'inline' } );
170181
CKCONSOLE.create( 'paste', { editor: 'inline' } );
182+
CKCONSOLE.create( 'dragend', { editor: 'inline' } );
171183
</script>
172184
</body>
173185
</html>

plugins/clipboard/plugin.js

Lines changed: 103 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,14 +1221,21 @@
12211221
// and save range and selected HTML.
12221222
editable.attachListener( dropTarget, 'dragstart', function( evt ) {
12231223
// 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 );
12251227
} );
12261228

12271229
// Clean up on dragend.
12281230
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+
}
12321239
} );
12331240

12341241
editable.attachListener( dropTarget, 'drop', function( evt ) {
@@ -1247,6 +1254,15 @@
12471254
if ( !dropRange )
12481255
return;
12491256

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;
12501266

12511267
if ( dataTransfer.getTransferType() == CKEDITOR.DATA_TRANSFER_INTERNAL ) {
12521268
internalDrop( dragRange, dropRange, dataTransfer );
@@ -1375,6 +1391,29 @@
13751391
editor.toolbox.focus();
13761392
} );
13771393
}
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+
}
13781417
} );
13791418
}
13801419

@@ -1748,9 +1787,13 @@
17481787
}
17491788

17501789
// 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 ) {}
17541797
}
17551798

17561799
if ( editor ) {
@@ -1990,3 +2033,56 @@
19902033
* @param {CKEDITOR.editor} editor This editor instance.
19912034
* @param {Function} [data] Callback that will be passed to {@link CKEDITOR.editor#openDialog}.
19922035
*/
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

Comments
 (0)