mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-21 16:06:16 -04:00
keep previous caret x location on pageup/down
This commit is contained in:
parent
db26ea218c
commit
5cd4dc1af2
1 changed files with 42 additions and 0 deletions
|
@ -2798,6 +2798,15 @@ function Ace2Inner() {
|
||||||
const isTypeForCmdKey = ((browser.safari || browser.chrome || browser.firefox) ? (type == 'keydown') : (type == 'keypress'));
|
const isTypeForCmdKey = ((browser.safari || browser.chrome || browser.firefox) ? (type == 'keydown') : (type == 'keypress'));
|
||||||
let stopped = false;
|
let stopped = false;
|
||||||
|
|
||||||
|
// previousCharacterOffset is used for ensuring caret
|
||||||
|
// location is kept on up/pagedown events
|
||||||
|
let previousCharacterOffset;
|
||||||
|
if (rep.selEnd[1] > 0) {
|
||||||
|
previousCharacterOffset = rep.selEnd[1];
|
||||||
|
} else {
|
||||||
|
previousCharacterOffset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
inCallStackIfNecessary('handleKeyEvent', function () {
|
inCallStackIfNecessary('handleKeyEvent', function () {
|
||||||
if (type == 'keypress' || (isTypeForSpecialKey && keyCode == 13 /* return*/)) {
|
if (type == 'keypress' || (isTypeForSpecialKey && keyCode == 13 /* return*/)) {
|
||||||
// in IE, special keys don't send keypress, the keydown does the action
|
// in IE, special keys don't send keypress, the keydown does the action
|
||||||
|
@ -3068,16 +3077,49 @@ function Ace2Inner() {
|
||||||
// put the caret on the first line in the first position
|
// put the caret on the first line in the first position
|
||||||
rep.selStart = [0, 0];
|
rep.selStart = [0, 0];
|
||||||
rep.selEnd = [0, 0];
|
rep.selEnd = [0, 0];
|
||||||
|
} else {
|
||||||
|
let line;
|
||||||
|
// need current character length of line
|
||||||
|
try {
|
||||||
|
line = rep.lines.atIndex(rep.selEnd[0]);
|
||||||
|
} catch (e) {
|
||||||
|
// silently fail, no big deal..
|
||||||
|
line = rep.lines.atIndex(visibleLineRange[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const lineLength = line.width;
|
||||||
|
// Keep the X character offset on page down
|
||||||
|
if (previousCharacterOffset <= line.width) {
|
||||||
|
rep.selStart[1] = previousCharacterOffset;
|
||||||
|
rep.selEnd[1] = previousCharacterOffset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPageDown) {
|
if (isPageDown) {
|
||||||
|
top.console.log('prevcharoffset', previousCharacterOffset);
|
||||||
|
|
||||||
// go to the bottom of the last visible content
|
// go to the bottom of the last visible content
|
||||||
if (rep.selStart[0] === 0) {
|
if (rep.selStart[0] === 0) {
|
||||||
rep.selStart[0] += visibleLineRange[1] - visibleLineRange[0] - 1;
|
rep.selStart[0] += visibleLineRange[1] - visibleLineRange[0] - 1;
|
||||||
rep.selEnd[0] += visibleLineRange[1] - visibleLineRange[0] - 1;
|
rep.selEnd[0] += visibleLineRange[1] - visibleLineRange[0] - 1;
|
||||||
} else {
|
} else {
|
||||||
top.console.log('am here..', visibleLineRange);
|
top.console.log('am here..', visibleLineRange);
|
||||||
|
let line;
|
||||||
|
// need current character length of line
|
||||||
|
try {
|
||||||
|
line = rep.lines.atIndex(rep.selEnd[0]);
|
||||||
|
} catch (e) {
|
||||||
|
// silently fail, no big deal..
|
||||||
|
line = rep.lines.atIndex(visibleLineRange[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const lineLength = line.width;
|
||||||
|
// Keep the X character offset on page down
|
||||||
|
if (previousCharacterOffset <= line.width) {
|
||||||
|
rep.selStart[1] = previousCharacterOffset;
|
||||||
|
rep.selEnd[1] = previousCharacterOffset;
|
||||||
|
}
|
||||||
rep.selStart[0] = rep.selStart[0] + (visibleLineRange[1] - visibleLineRange[0]);
|
rep.selStart[0] = rep.selStart[0] + (visibleLineRange[1] - visibleLineRange[0]);
|
||||||
rep.selEnd[0] = rep.selEnd[0] + (visibleLineRange[1] - visibleLineRange[0]);
|
rep.selEnd[0] = rep.selEnd[0] + (visibleLineRange[1] - visibleLineRange[0]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue