UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

88 lines 7.25 kB
"use strict"; 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