/**
* The base class of all <em>interactive</em>,
* {@linkplain RemoteCommand remote commands}.
*/
export class InteractiveRemoteCommand extends RemoteCommand {
constructor(commandName) {
super(commandName);
}
execute(mode, docView, params, event=null) {
if (mode === EXECUTE_TEST) {
return super.execute(mode, docView, params, event);
}
// This kind of command (e.g. EditPITargetCmd) does not have to check
// on the client-side whether the not being acted upon is
// editable. This will be done by the remote command executed on the
// server-side.
Command.consumeEvent(event);
return docView.sendExecuteCommand(mode, this.commandName, params)
.then((result) => {
if (result !== null &&
result.status === COMMAND_RESULT_STOPPED &&
result.value !== null) {
return new Promise((resolve, reject) => {
this.resumeExecution(mode, docView, params,
result.value, resolve, reject);
});
} else {
return this.commandExecuted(mode, docView, params, result);
}
});
// No need to catch errors here. At worst, sendExecuteCommand will
// return a null Promise.
}
/**
* Invoked when the command execution has been stopped and
* some information has been returned by the command.
* <p>This information is typically used to display a dialog box
* letting the user choose something in order to actually execute
* the command (this time without being stopped for lack
* of sufficient input).
* <p>Default implementation is transparent and simply causes the command
* to return its original {@link CommandResult CommandResult.STOPPED}
* result.
*/
resumeExecution(mode, docView, params,
stoppedCommandInfo, resolve, reject) {
resolve(new CommandResult(COMMAND_RESULT_STOPPED, stoppedCommandInfo));
}
}