# Source: cmd/OnMouseEventCmd.js

    /**
     * The abstract base class of all local commands bound to a mouse event.
     */
    export class OnMouseEventCmd extends Command {
        /**
         * Constructor.
         *
         * @param {boolean} alwaysConsumeEvent - if <code>true</code>,
         * the mouse event  which triggers this command will be
         * automatically be consumed.
         */
        constructor(alwaysConsumeEvent) {
            super();
            this._alwaysConsumeEvent = alwaysConsumeEvent;
        }

        execute(mode, docView, params, event) {
            let canExecute = this.canExecuteImpl(docView, params, event);
            if (mode === EXECUTE_TEST) {
                return Promise.resolve(canExecute);
            } else {
                if (!canExecute) {
                    Command.consumeEvent(event);
                    return Promise.resolve(null); // Not CommandResult.FAILED.
                }
            }

            // ---

            if (this._alwaysConsumeEvent) {
                Command.consumeEvent(event);
            }
            // Otherwise it is executeImpl which will do that.

            // For an OnMouseEventCmd implementation, don't care about mode.
            return this.executeImpl(docView, params, event)
                .catch((error) => {
                    // Do not display an error dialog for a command triggered by a
                    // mouse event.
                    console.error(`Command "${this.commandName}" has failed: \
    ${error}`);

                    return null; // Not CommandResult.FAILED.
                });
        }

        /**
         * Invoked by <code>OnMouseEventCmd</code> redefinition of
         * {@link Command.execute} when execution mode is
         * {@link Command.EXECUTE_NORMAL} or {@link Command.EXECUTE_HELPER}.
         * <p><strong>Must be redefined by subclass</strong>.
         * Default implementation returns a <code>Promise</code>
         * containing {@link CommandResult.FAILED)}.
         *
         * @param {DocumentView} docView - the target of this command.
         * @param {string} params - parameterizes the command.
         * May be <code>null</code>.
         * @param {UIEvent} event - the mouse event which triggered this command.
         * @returns {Promise} A Promise containing {@link CommandResult} or
         * <code>null</code> if, for any reason, this command has not been executed.
         */
        executeImpl(docView, params, event) {
            if (!this._alwaysConsumeEvent) {
                Command.consumeEvent(event);
            }

            console.error(`OnMouseEventCmd.executeImpl: NOT IMPLEMENTED: \
    command "${this.commandName}" \
    (params="${params}", event=${event})`);

            return Promise.resolve(CommandResult.FAILED);
        }

        /**
         * Invoked by <code>OnMouseEventCmd</code> redefinition of
         * {@link Command.execute} when execution mode is
         * {@link Command.EXECUTE_TEST}.
         * <p><strong>May be redefined by subclass</strong>.
         * Default implementation always returns <code>true</code>.
         *
         * @param {DocumentView} docView - the target of this command.
         * @param {string} params - parameterizes the command.
         * May be <code>null</code>.
         * @param {UIEvent} event - the mouse event which triggered this command.
         * @returns {boolean} <code>true</code> if the command can be executed,
         * <code>false</code> otherwise.
         */
        canExecuteImpl(docView, params, event) {
            return (event !== null && (event instanceof MouseEvent));
        }
    }