mirror of
https://github.com/fastmail/Squire.git
synced 2024-12-22 15:23:29 -05:00
Take over selection deletion in more cases.
Never really want to let the browser delete a selection; it always makes a mess of it. This now covers the case when an English letter key or number key is pressed when a selection exists. Handling this completely (to include all keys that produce a symbol) is tricky due to cross-browser key event compatibility issues.
This commit is contained in:
parent
4a264a52c7
commit
a46dc2ef02
3 changed files with 35 additions and 37 deletions
|
@ -2726,15 +2726,12 @@ var afterDelete = function ( self, range ) {
|
||||||
};
|
};
|
||||||
|
|
||||||
var keyHandlers = {
|
var keyHandlers = {
|
||||||
enter: function ( self, event ) {
|
enter: function ( self, event, range ) {
|
||||||
|
var block, parent, tag, splitTag, nodeAfterSplit;
|
||||||
|
|
||||||
// We handle this ourselves
|
// We handle this ourselves
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
// Must have some form of selection
|
|
||||||
var range = self.getSelection(),
|
|
||||||
block, parent, tag, splitTag, nodeAfterSplit;
|
|
||||||
if ( !range ) { return; }
|
|
||||||
|
|
||||||
// Save undo checkpoint and add any links in the preceding section.
|
// Save undo checkpoint and add any links in the preceding section.
|
||||||
// Remove any zws so we don't think there's content in an empty
|
// Remove any zws so we don't think there's content in an empty
|
||||||
// block.
|
// block.
|
||||||
|
@ -2879,10 +2876,9 @@ var keyHandlers = {
|
||||||
// We're not still in an undo state
|
// We're not still in an undo state
|
||||||
self._docWasChanged();
|
self._docWasChanged();
|
||||||
},
|
},
|
||||||
backspace: function ( self, event ) {
|
backspace: function ( self, event, range ) {
|
||||||
self._removeZWS();
|
self._removeZWS();
|
||||||
// Record undo checkpoint.
|
// Record undo checkpoint.
|
||||||
var range = self.getSelection();
|
|
||||||
self._recordUndoState( range );
|
self._recordUndoState( range );
|
||||||
self._getRangeAndRemoveBookmark( range );
|
self._getRangeAndRemoveBookmark( range );
|
||||||
// If not collapsed, delete contents
|
// If not collapsed, delete contents
|
||||||
|
@ -2939,10 +2935,9 @@ var keyHandlers = {
|
||||||
setTimeout( function () { afterDelete( self ); }, 0 );
|
setTimeout( function () { afterDelete( self ); }, 0 );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'delete': function ( self, event ) {
|
'delete': function ( self, event, range ) {
|
||||||
self._removeZWS();
|
self._removeZWS();
|
||||||
// Record undo checkpoint.
|
// Record undo checkpoint.
|
||||||
var range = self.getSelection();
|
|
||||||
self._recordUndoState( range );
|
self._recordUndoState( range );
|
||||||
self._getRangeAndRemoveBookmark( range );
|
self._getRangeAndRemoveBookmark( range );
|
||||||
// If not collapsed, delete contents
|
// If not collapsed, delete contents
|
||||||
|
@ -2985,10 +2980,9 @@ var keyHandlers = {
|
||||||
setTimeout( function () { afterDelete( self ); }, 0 );
|
setTimeout( function () { afterDelete( self ); }, 0 );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tab: function ( self, event ) {
|
tab: function ( self, event, range ) {
|
||||||
|
var node, parent;
|
||||||
self._removeZWS();
|
self._removeZWS();
|
||||||
var range = self.getSelection(),
|
|
||||||
node, parent;
|
|
||||||
// If no selection and in an empty block
|
// If no selection and in an empty block
|
||||||
if ( range.collapsed &&
|
if ( range.collapsed &&
|
||||||
rangeDoesStartAtBlockBoundary( range ) &&
|
rangeDoesStartAtBlockBoundary( range ) &&
|
||||||
|
@ -3011,9 +3005,8 @@ var keyHandlers = {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
space: function ( self ) {
|
space: function ( self, _, range ) {
|
||||||
var range = self.getSelection(),
|
var node, parent;
|
||||||
node, parent;
|
|
||||||
self._recordUndoState( range );
|
self._recordUndoState( range );
|
||||||
addLinks( range.startContainer );
|
addLinks( range.startContainer );
|
||||||
self._getRangeAndRemoveBookmark( range );
|
self._getRangeAndRemoveBookmark( range );
|
||||||
|
@ -3071,7 +3064,8 @@ keyHandlers[ ctrlKey + 'shift-z' ] = mapKeyTo( 'redo' );
|
||||||
proto._onKey = function ( event ) {
|
proto._onKey = function ( event ) {
|
||||||
var code = event.keyCode,
|
var code = event.keyCode,
|
||||||
key = keys[ code ],
|
key = keys[ code ],
|
||||||
modifiers = '';
|
modifiers = '',
|
||||||
|
range = this.getSelection();
|
||||||
|
|
||||||
if ( !key ) {
|
if ( !key ) {
|
||||||
key = String.fromCharCode( code ).toLowerCase();
|
key = String.fromCharCode( code ).toLowerCase();
|
||||||
|
@ -3106,7 +3100,12 @@ proto._onKey = function ( event ) {
|
||||||
key = modifiers + key;
|
key = modifiers + key;
|
||||||
|
|
||||||
if ( keyHandlers[ key ] ) {
|
if ( keyHandlers[ key ] ) {
|
||||||
keyHandlers[ key ]( this, event );
|
keyHandlers[ key ]( this, event, range );
|
||||||
|
} else if ( key.length === 1 && !range.collapsed ) {
|
||||||
|
deleteContentsOfRange( range );
|
||||||
|
this._ensureBottomLine();
|
||||||
|
this.setSelection( range );
|
||||||
|
this._updatePath( range, true );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1647,15 +1647,12 @@ var afterDelete = function ( self, range ) {
|
||||||
};
|
};
|
||||||
|
|
||||||
var keyHandlers = {
|
var keyHandlers = {
|
||||||
enter: function ( self, event ) {
|
enter: function ( self, event, range ) {
|
||||||
|
var block, parent, tag, splitTag, nodeAfterSplit;
|
||||||
|
|
||||||
// We handle this ourselves
|
// We handle this ourselves
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
// Must have some form of selection
|
|
||||||
var range = self.getSelection(),
|
|
||||||
block, parent, tag, splitTag, nodeAfterSplit;
|
|
||||||
if ( !range ) { return; }
|
|
||||||
|
|
||||||
// Save undo checkpoint and add any links in the preceding section.
|
// Save undo checkpoint and add any links in the preceding section.
|
||||||
// Remove any zws so we don't think there's content in an empty
|
// Remove any zws so we don't think there's content in an empty
|
||||||
// block.
|
// block.
|
||||||
|
@ -1800,10 +1797,9 @@ var keyHandlers = {
|
||||||
// We're not still in an undo state
|
// We're not still in an undo state
|
||||||
self._docWasChanged();
|
self._docWasChanged();
|
||||||
},
|
},
|
||||||
backspace: function ( self, event ) {
|
backspace: function ( self, event, range ) {
|
||||||
self._removeZWS();
|
self._removeZWS();
|
||||||
// Record undo checkpoint.
|
// Record undo checkpoint.
|
||||||
var range = self.getSelection();
|
|
||||||
self._recordUndoState( range );
|
self._recordUndoState( range );
|
||||||
self._getRangeAndRemoveBookmark( range );
|
self._getRangeAndRemoveBookmark( range );
|
||||||
// If not collapsed, delete contents
|
// If not collapsed, delete contents
|
||||||
|
@ -1860,10 +1856,9 @@ var keyHandlers = {
|
||||||
setTimeout( function () { afterDelete( self ); }, 0 );
|
setTimeout( function () { afterDelete( self ); }, 0 );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'delete': function ( self, event ) {
|
'delete': function ( self, event, range ) {
|
||||||
self._removeZWS();
|
self._removeZWS();
|
||||||
// Record undo checkpoint.
|
// Record undo checkpoint.
|
||||||
var range = self.getSelection();
|
|
||||||
self._recordUndoState( range );
|
self._recordUndoState( range );
|
||||||
self._getRangeAndRemoveBookmark( range );
|
self._getRangeAndRemoveBookmark( range );
|
||||||
// If not collapsed, delete contents
|
// If not collapsed, delete contents
|
||||||
|
@ -1906,10 +1901,9 @@ var keyHandlers = {
|
||||||
setTimeout( function () { afterDelete( self ); }, 0 );
|
setTimeout( function () { afterDelete( self ); }, 0 );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tab: function ( self, event ) {
|
tab: function ( self, event, range ) {
|
||||||
|
var node, parent;
|
||||||
self._removeZWS();
|
self._removeZWS();
|
||||||
var range = self.getSelection(),
|
|
||||||
node, parent;
|
|
||||||
// If no selection and in an empty block
|
// If no selection and in an empty block
|
||||||
if ( range.collapsed &&
|
if ( range.collapsed &&
|
||||||
rangeDoesStartAtBlockBoundary( range ) &&
|
rangeDoesStartAtBlockBoundary( range ) &&
|
||||||
|
@ -1932,9 +1926,8 @@ var keyHandlers = {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
space: function ( self ) {
|
space: function ( self, _, range ) {
|
||||||
var range = self.getSelection(),
|
var node, parent;
|
||||||
node, parent;
|
|
||||||
self._recordUndoState( range );
|
self._recordUndoState( range );
|
||||||
addLinks( range.startContainer );
|
addLinks( range.startContainer );
|
||||||
self._getRangeAndRemoveBookmark( range );
|
self._getRangeAndRemoveBookmark( range );
|
||||||
|
@ -1992,7 +1985,8 @@ keyHandlers[ ctrlKey + 'shift-z' ] = mapKeyTo( 'redo' );
|
||||||
proto._onKey = function ( event ) {
|
proto._onKey = function ( event ) {
|
||||||
var code = event.keyCode,
|
var code = event.keyCode,
|
||||||
key = keys[ code ],
|
key = keys[ code ],
|
||||||
modifiers = '';
|
modifiers = '',
|
||||||
|
range = this.getSelection();
|
||||||
|
|
||||||
if ( !key ) {
|
if ( !key ) {
|
||||||
key = String.fromCharCode( code ).toLowerCase();
|
key = String.fromCharCode( code ).toLowerCase();
|
||||||
|
@ -2027,7 +2021,12 @@ proto._onKey = function ( event ) {
|
||||||
key = modifiers + key;
|
key = modifiers + key;
|
||||||
|
|
||||||
if ( keyHandlers[ key ] ) {
|
if ( keyHandlers[ key ] ) {
|
||||||
keyHandlers[ key ]( this, event );
|
keyHandlers[ key ]( this, event, range );
|
||||||
|
} else if ( key.length === 1 && !range.collapsed ) {
|
||||||
|
deleteContentsOfRange( range );
|
||||||
|
this._ensureBottomLine();
|
||||||
|
this.setSelection( range );
|
||||||
|
this._updatePath( range, true );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue