@launchmenu/core
Version:
An environment for visual keyboard controlled applets
88 lines • 7.25 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.shouldTextCommandsMerge = exports.createUndoableTextFieldKeyHandler = void 0;
const baseSettings_1 = require("../../../../application/settings/baseSettings/baseSettings");
const UndoRedoFacility_1 = require("../../../../undoRedo/UndoRedoFacility");
const CompoundTextEditCommand_1 = require("../../commands/CompoundTextEditCommand");
const ITextEditCommand_1 = require("../../commands/_types/ITextEditCommand");
/**
* Creates a key handler for undoable key events, according to the specified createHandler callback.
* This function takes care of the command execution and command merging based on the user's preferences
* @param textField The text field to be altered
* @param context The context to obtain the user's settings from
* @param createHandler The function to construct the actual keyhandler
* @param options Any additional options for customization
* @returns A key handler
*/
function createUndoableTextFieldKeyHandler(textField, context, createHandler, options = {}) {
var _a;
const undoRedo = (_a = options.undoRedoFacility) !== null && _a !== void 0 ? _a : new UndoRedoFacility_1.UndoRedoFacility();
let prevCommandWasSelectionChange = false;
const onChange = async (command) => {
const historyPast = undoRedo.getCommands().past;
const prevCommand = historyPast[historyPast.length - 1];
if (ITextEditCommand_1.isTextEditCommand(command) && command.isSelectionChange()) {
// Text alterations shouldn't be undone, TODO: add an option for this
command.execute();
prevCommandWasSelectionChange = true;
return;
}
// Detect whether a batch should be split
let merge = false;
if (!prevCommandWasSelectionChange &&
prevCommand &&
ITextEditCommand_1.isTextEditCommand(prevCommand) &&
ITextEditCommand_1.isTextEditCommand(command))
merge = shouldTextCommandsMerge(prevCommand, command);
if (!merge)
undoRedo.splitBatch();
// Execute the command, and make sure the compound text edit command is used for merging
undoRedo.execute(command, prevCommand => {
if (!prevCommand || ITextEditCommand_1.isTextEditCommand(prevCommand))
return CompoundTextEditCommand_1.CompoundTextEditCommand;
return false;
});
prevCommandWasSelectionChange = false;
};
// Create the handler using the created command dispatcher and undo redo controller
const textControls = context.settings.get(baseSettings_1.baseSettings).controls.field;
return createHandler({
undoableTextField: { textField, onChange },
onEditCommand: onChange,
handleUndoRedoInput: e => {
if (textControls.undo.get().matches(e)) {
undoRedo.undo();
return true;
}
if (textControls.redo.get().matches(e)) {
undoRedo.redo();
return true;
}
},
});
}
exports.createUndoableTextFieldKeyHandler = createUndoableTextFieldKeyHandler;
/**
* Checks whether two given commands should merge
* @param prevCommand Command a
* @param command Command b
* @returns Whether the commands should merge
*/
function shouldTextCommandsMerge(prevCommand, command) {
const isSelectionChange = command.isSelectionChange();
const prevIsSelectionChange = prevCommand.isSelectionChange();
if (isSelectionChange || prevIsSelectionChange) {
return isSelectionChange == prevIsSelectionChange;
}
const addedTexts = command.getAddedText();
const prevAddedTexts = prevCommand.getAddedText();
if (addedTexts == undefined || prevAddedTexts == undefined) {
return addedTexts == prevAddedTexts;
}
// Make sure the new text doesn't contain a space
if (addedTexts.match(/\s/))
return false;
return true;
}
exports.shouldTextCommandsMerge = shouldTextCommandsMerge;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVW5kb2FibGVUZXh0RmllbGRLZXlIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3RleHRGaWVsZHMvaW50ZXJhY3Rpb24vYWR2YW5jZWQva2V5aGFuZGxlci9jcmVhdGVVbmRvYWJsZVRleHRGaWVsZEtleUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkZBQXdGO0FBR3hGLDRFQUF1RTtBQUd2RSxvRkFBK0U7QUFDL0UsNkVBR2dEO0FBR2hEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQzdDLFNBQXFCLEVBQ3JCLE9BQW1CLEVBQ25CLGFBSU8sRUFDUCxVQUdJLEVBQUU7O0lBRU4sTUFBTSxRQUFRLFNBQUcsT0FBTyxDQUFDLGdCQUFnQixtQ0FBSSxJQUFJLG1DQUFnQixFQUFFLENBQUM7SUFFcEUsSUFBSSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxFQUFFLE9BQWlCLEVBQUUsRUFBRTtRQUN6QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXhELElBQUksb0NBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDM0QscUVBQXFFO1lBQ3JFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQiw2QkFBNkIsR0FBRyxJQUFJLENBQUM7WUFDckMsT0FBTztTQUNWO1FBRUQseUNBQXlDO1FBQ3pDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUNJLENBQUMsNkJBQTZCO1lBQzlCLFdBQVc7WUFDWCxvQ0FBaUIsQ0FBQyxXQUFXLENBQUM7WUFDOUIsb0NBQWlCLENBQUMsT0FBTyxDQUFDO1lBRTFCLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUs7WUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFbEMsd0ZBQXdGO1FBQ3hGLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxXQUFXLElBQUksb0NBQWlCLENBQUMsV0FBVyxDQUFDO2dCQUM5QyxPQUFPLGlEQUF1QixDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO0lBQzFDLENBQUMsQ0FBQztJQUVGLG1GQUFtRjtJQUNuRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQywyQkFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN2RSxPQUFPLGFBQWEsQ0FBQztRQUNqQixpQkFBaUIsRUFBRSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUM7UUFDeEMsYUFBYSxFQUFFLFFBQVE7UUFDdkIsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDckIsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoQixPQUFPLElBQUksQ0FBQzthQUNmO1FBQ0wsQ0FBQztLQUNKLENBQUMsQ0FBQztBQUNQLENBQUM7QUFoRUQsOEVBZ0VDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FDbkMsV0FBNkIsRUFDN0IsT0FBeUI7SUFFekIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN0RCxNQUFNLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzlELElBQUksaUJBQWlCLElBQUkscUJBQXFCLEVBQUU7UUFDNUMsT0FBTyxpQkFBaUIsSUFBSSxxQkFBcUIsQ0FBQztLQUNyRDtJQUVELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbEQsSUFBSSxVQUFVLElBQUksU0FBUyxJQUFJLGNBQWMsSUFBSSxTQUFTLEVBQUU7UUFDeEQsT0FBTyxVQUFVLElBQUksY0FBYyxDQUFDO0tBQ3ZDO0lBRUQsaURBQWlEO0lBQ2pELElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV6QyxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBcEJELDBEQW9CQyJ9
;