Skip to content

Commit 628ea19

Browse files
committed
Merge branch 't/10881' into major
2 parents 563c991 + 4fbc393 commit 628ea19

File tree

4 files changed

+67
-13
lines changed

4 files changed

+67
-13
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Fixed Issues:
1414
* [#10831](http://dev.ckeditor.com/ticket/10831): Image2: Merged `image2inline` and `image2block` into `image2` widget.
1515
* [#10835](http://dev.ckeditor.com/ticket/10835): Image2: Improved visibility of the resize handler.
1616
* [#10836](http://dev.ckeditor.com/ticket/10836): Image2: Preserve custom mouse cursor while resizing the image.
17+
* [#10881](http://dev.ckeditor.com/ticket/10881): Various improvements to *Enter* key behaviour in nested editables.
1718

1819
## CKEditor 4.3 Beta
1920

core/editor.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,10 @@
11681168
if ( filter === this.filter )
11691169
this.setActiveEnterMode( null, null );
11701170
else
1171-
this.setActiveEnterMode( filter.getAllowedEnterMode(), filter.getAllowedEnterMode( true ) );
1171+
this.setActiveEnterMode(
1172+
filter.getAllowedEnterMode( this.enterMode ),
1173+
filter.getAllowedEnterMode( this.shiftEnterMode, true )
1174+
);
11721175
}
11731176
},
11741177

core/filter.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -656,21 +656,28 @@
656656
* Returns first enter mode allowed by this filter rules. Modes are checked in `p`, `div`, `br` order.
657657
* If none of tags is allowed this method will return {@link CKEDITOR#ENTER_BR}.
658658
*
659+
* @since 4.3
660+
* @param {Number} defaultMode The default mode which will be checked as the first one.
659661
* @param {Boolean} [reverse] Whether to check modes in reverse order (used for shift enter mode).
660662
* @returns {Number} Allowed enter mode.
661663
*/
662664
getAllowedEnterMode: (function() {
663-
var enterModeTags = [ 'p', 'div', 'br' ],
665+
var tagsToCheck = [ 'p', 'div', 'br' ],
664666
enterModes = {
665667
p: CKEDITOR.ENTER_P,
666668
div: CKEDITOR.ENTER_DIV,
667669
br: CKEDITOR.ENTER_BR
668670
};
669671

670-
return function( reverse ) {
671-
var tags = enterModeTags.slice(),
672+
return function( defaultMode, reverse ) {
673+
// Clone the array first.
674+
var tags = tagsToCheck.slice(),
672675
tag;
673676

677+
// Check the default mode first.
678+
if ( this.check( enterModeTags[ defaultMode ] ) )
679+
return defaultMode;
680+
674681
// If not reverse order, reverse array so we can pop() from it.
675682
if ( !reverse )
676683
tags = tags.reverse();

plugins/widget/plugin.js

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@
823823
if ( !offline ) {
824824
editable.removeClass( 'cke_widget_editable' );
825825
editable.removeClass( 'cke_widget_editable_focused' );
826-
editable.removeAttributes( [ 'contenteditable', 'data-cke-widget-editable' ] );
826+
editable.removeAttributes( [ 'contenteditable', 'data-cke-widget-editable', 'data-cke-enter-mode' ] );
827827
}
828828

829829
delete this.editables[ editableName ];
@@ -911,7 +911,8 @@
911911

912912
editable.setAttributes( {
913913
contenteditable: 'true',
914-
'data-cke-widget-editable': editableName
914+
'data-cke-widget-editable': editableName,
915+
'data-cke-enter-mode': editable.enterMode
915916
} );
916917
editable.addClass( 'cke_widget_editable' );
917918
// This class may be left when d&ding widget which
@@ -1171,7 +1172,15 @@
11711172
// Call the base constructor.
11721173
CKEDITOR.dom.element.call( this, element.$ );
11731174
this.editor = editor;
1174-
this.filter = config.filter;
1175+
var filter = this.filter = config.filter;
1176+
1177+
// If blockless editable - always use BR mode.
1178+
if ( !CKEDITOR.dtd[ this.getName() ].p )
1179+
this.enterMode = this.shiftEnterMode = CKEDITOR.ENTER_BR;
1180+
else {
1181+
this.enterMode = filter ? filter.getAllowedEnterMode( editor.enterMode ) : editor.enterMode;
1182+
this.shiftEnterMode = filter ? filter.getAllowedEnterMode( editor.shiftEnterMode, true ) : editor.shiftEnterMode;
1183+
}
11751184
}
11761185

11771186
NestedEditable.prototype = CKEDITOR.tools.extend( CKEDITOR.tools.prototypedCopy( CKEDITOR.dom.element.prototype ), {
@@ -1186,7 +1195,7 @@
11861195
data = this.editor.dataProcessor.toHtml( data, {
11871196
context: this.getName(),
11881197
filter: this.filter,
1189-
enterMode: this.filter ? this.filter.getAllowedEnterMode() : this.editor.enterMode
1198+
enterMode: this.enterMode
11901199
} );
11911200
this.setHtml( data );
11921201
},
@@ -1200,11 +1209,41 @@
12001209
return this.editor.dataProcessor.toDataFormat( this.getHtml(), {
12011210
context: this.getName(),
12021211
filter: this.filter,
1203-
enterMode: this.filter ? this.filter.getAllowedEnterMode() : this.editor.enterMode
1212+
enterMode: this.enterMode
12041213
} );
12051214
}
12061215
} );
12071216

1217+
/**
1218+
* The editor instance.
1219+
*
1220+
* @readonly
1221+
* @property {CKEDITOR.editor} editor
1222+
*/
1223+
1224+
/**
1225+
* The filter instance if allowed content rules were defined.
1226+
*
1227+
* @readonly
1228+
* @property {CKEDITOR.filter} filter
1229+
*/
1230+
1231+
/**
1232+
* The enter mode active in this editable.
1233+
* It is determined from editable's name (whether it is a blockless editable),
1234+
* its allowed content rules (if defined) and the default editor's mode.
1235+
*
1236+
* @readonly
1237+
* @property {Number} enterMode
1238+
*/
1239+
1240+
/**
1241+
* The shift enter move active in this editable.
1242+
*
1243+
* @readonly
1244+
* @property {Number} shiftEnterMode
1245+
*/
1246+
12081247

12091248
//
12101249
// REPOSITORY helpers -----------------------------------------------------
@@ -1616,7 +1655,9 @@
16161655
}
16171656

16181657
function setFocusedEditable( widgetsRepo, widget, editableElement, offline ) {
1619-
widgetsRepo.editor.fire( 'lockSnapshot' );
1658+
var editor = widgetsRepo.editor;
1659+
1660+
editor.fire( 'lockSnapshot' );
16201661

16211662
if ( editableElement ) {
16221663
var editableName = editableElement.data( 'cke-widget-editable' ),
@@ -1627,17 +1668,19 @@
16271668
editableElement.addClass( 'cke_widget_editable_focused' );
16281669

16291670
if ( editableInstance.filter )
1630-
widgetsRepo.editor.setActiveFilter( editableInstance.filter );
1671+
editor.setActiveFilter( editableInstance.filter );
1672+
editor.setActiveEnterMode( editableInstance.enterMode, editableInstance.shiftEnterMode );
16311673
} else {
16321674
if ( !offline )
16331675
widget.focusedEditable.removeClass( 'cke_widget_editable_focused' );
16341676

16351677
widget.focusedEditable = null;
16361678
widgetsRepo.widgetHoldingFocusedEditable = null;
1637-
widgetsRepo.editor.setActiveFilter( null );
1679+
editor.setActiveFilter( null );
1680+
editor.setActiveEnterMode( null, null );
16381681
}
16391682

1640-
widgetsRepo.editor.fire( 'unlockSnapshot' );
1683+
editor.fire( 'unlockSnapshot' );
16411684
}
16421685

16431686
function setupContextMenu( editor ) {

0 commit comments

Comments
 (0)