Merge "Selecting generated content with cursor keys"

This commit is contained in:
jenkins-bot 2013-04-24 22:26:22 +00:00 committed by Gerrit Code Review
commit 22cd7cfe98
3 changed files with 45 additions and 10 deletions

View file

@ -834,7 +834,7 @@ ve.ce.Surface.prototype.endRelocation = function () {
* @method
*/
ve.ce.Surface.prototype.handleLeftOrRightArrowKey = function ( e ) {
var selection, offset, range;
var selection, offset, range, offsetDelta, toNode, selectedNodes, i;
// On Mac OS pressing Command (metaKey) + Left/Right is same as pressing Home/End.
// As we are not able to handle it programmatically (because we don't know at which offsets
// lines starts and ends) let it happen natively.
@ -846,9 +846,37 @@ ve.ce.Surface.prototype.handleLeftOrRightArrowKey = function ( e ) {
// Stop with final poll cycle so we have correct information in model
this.surfaceObserver.stop( true );
selection = this.model.getSelection();
offsetDelta = e.keyCode === ve.Keys.DOM_VK_LEFT ? -1 : 1;
// Check for selecting/deselecting inline images and aliens
if ( selection.isCollapsed() ) {
toNode = this.documentView.documentNode.getNodeFromOffset( selection.to + offsetDelta );
// TODO: Develop better method to test for generated content
if ( toNode.model.constructor.static.generatedContent === true ) {
range = new ve.Range(
selection.to,
selection.to + toNode.getOuterLength() * offsetDelta
);
}
} else if ( !e.shiftKey ) {
selectedNodes = this.model.documentModel.selectNodes( selection );
for ( i = 0; i < Math.min( selectedNodes.length, 2 ); i++ ) {
if (
// TODO: Develop better method to test for generated content
selectedNodes[i].node.constructor.static.generatedContent === true &&
selectedNodes[i].nodeOuterRange.equals( selection ) ||
selectedNodes[i].nodeOuterRange.equals( selection.flip() )
) {
range = new ve.Range( offsetDelta === 1 ? selection.end : selection.start );
}
}
}
// Normal cursor movement
if ( range === undefined ) {
offset = this.getDocument().getRelativeOffset(
selection.to,
e.keyCode === ve.Keys.DOM_VK_LEFT ? -1 : 1, // direction (left or right)
offsetDelta,
e.altKey === true || e.ctrlKey === true ? 'word' : 'character' // unit
);
if ( e.shiftKey === true ) { // expanded range
@ -856,6 +884,7 @@ ve.ce.Surface.prototype.handleLeftOrRightArrowKey = function ( e ) {
} else { // collapsed range (just a cursor)
range = new ve.Range( offset );
}
}
this.model.change( null, range );
this.surfaceObserver.start();
};

View file

@ -30,6 +30,9 @@ ve.dm.AlienNode.static.name = 'alien';
ve.dm.AlienNode.static.storeHtmlAttributes = false;
// TODO: Develop better method to test for generated content
ve.dm.AlienNode.static.generatedContent = true;
ve.dm.AlienNode.static.toDataElement = function ( domElements, converter ) {
var isInline = this.isHybridInline( domElements, converter ),
type = isInline ? 'alienInline' : 'alienBlock',

View file

@ -28,6 +28,9 @@ ve.dm.MWImageNode.static.name = 'MWimage';
ve.dm.MWImageNode.static.matchTagNames = null;
// TODO: Develop better method to test for generated content
ve.dm.MWImageNode.static.generatedContent = true;
ve.dm.MWImageNode.static.matchRdfaTypes = [ 'mw:Image' ];
ve.dm.MWImageNode.static.toDataElement = function ( domElements ) {