blob: f5bec9ac6be4cf910d106692cba98048a98aee9d [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.execution.console;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.execution.process.ConsoleHistoryModel;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.EmptyAction;
import com.intellij.openapi.command.impl.UndoManagerImpl;
import com.intellij.openapi.command.undo.DocumentReferenceManager;
import com.intellij.openapi.command.undo.UndoManager;
import com.intellij.openapi.editor.ex.DocumentEx;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Conditions;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ConsoleExecuteAction extends DumbAwareAction {
static final String CONSOLE_EXECUTE_ACTION_ID = "Console.Execute";
private final LanguageConsoleView myConsoleView;
private final LanguageConsoleImpl myConsole;
final ConsoleExecuteActionHandler myExecuteActionHandler;
private final Condition<LanguageConsoleImpl> myEnabledCondition;
@SuppressWarnings("UnusedDeclaration")
public ConsoleExecuteAction(@NotNull LanguageConsoleView console, @NotNull BaseConsoleExecuteActionHandler executeActionHandler) {
this(console, executeActionHandler, CONSOLE_EXECUTE_ACTION_ID, Conditions.<LanguageConsoleImpl>alwaysTrue());
}
/**
* Only internal usage, to keep backward compatibility
* to remove in IDEA 14
*/
public static ConsoleExecuteAction createAction(@NotNull final LanguageConsoleImpl languageConsole,
@NotNull ProcessBackedConsoleExecuteActionHandler consoleExecuteActionHandler) {
final ConsoleExecuteActionHandler handler = consoleExecuteActionHandler;
return new ConsoleExecuteAction(languageConsole, new ConsoleExecuteActionHandler(handler.myPreserveMarkup) {
@Override
void doExecute(@NotNull String text, @NotNull LanguageConsoleImpl console, @Nullable LanguageConsoleView consoleView) {
handler.doExecute(text, languageConsole, null);
}
}, consoleExecuteActionHandler);
}
ConsoleExecuteAction(@NotNull LanguageConsoleImpl console, final @NotNull ConsoleExecuteActionHandler executeActionHandler, @Nullable Condition<LanguageConsoleImpl> enabledCondition) {
this(console, null, executeActionHandler, CONSOLE_EXECUTE_ACTION_ID, enabledCondition);
}
public ConsoleExecuteAction(@NotNull LanguageConsoleView console,
@NotNull BaseConsoleExecuteActionHandler executeActionHandler,
@Nullable Condition<LanguageConsoleImpl> enabledCondition) {
this(console.getConsole(), console, executeActionHandler, CONSOLE_EXECUTE_ACTION_ID, enabledCondition);
}
public ConsoleExecuteAction(@NotNull LanguageConsoleView console,
@NotNull BaseConsoleExecuteActionHandler executeActionHandler,
@NotNull String emptyExecuteActionId,
@NotNull Condition<LanguageConsoleImpl> enabledCondition) {
this(console.getConsole(), console, executeActionHandler, emptyExecuteActionId, enabledCondition);
}
private ConsoleExecuteAction(@NotNull LanguageConsoleImpl console,
@Nullable LanguageConsoleView consoleView,
@NotNull ConsoleExecuteActionHandler executeActionHandler,
@NotNull String emptyExecuteActionId,
@Nullable Condition<LanguageConsoleImpl> enabledCondition) {
super(null, null, AllIcons.Actions.Execute);
myConsole = console;
myConsoleView = consoleView;
myExecuteActionHandler = executeActionHandler;
myEnabledCondition = enabledCondition == null ? Conditions.<LanguageConsoleImpl>alwaysTrue() : enabledCondition;
EmptyAction.setupAction(this, emptyExecuteActionId, null);
}
@Override
public final void update(@NotNull AnActionEvent e) {
EditorEx editor = myConsole.getConsoleEditor();
boolean enabled = !editor.isRendererMode() && isEnabled() &&
(myExecuteActionHandler.isEmptyCommandExecutionAllowed() || !StringUtil.isEmptyOrSpaces(editor.getDocument().getCharsSequence()));
if (enabled) {
Lookup lookup = LookupManager.getActiveLookup(editor);
// we should check getCurrentItem() also - fast typing could produce outdated lookup, such lookup reports isCompletion() true
enabled = lookup == null || !lookup.isCompletion() || lookup.getCurrentItem() == null;
}
e.getPresentation().setEnabled(enabled);
}
@Override
public final void actionPerformed(@NotNull AnActionEvent e) {
myExecuteActionHandler.runExecuteAction(myConsole, myConsoleView);
}
public boolean isEnabled() {
return myEnabledCondition.value(myConsole);
}
public void execute(@Nullable TextRange range, @NotNull String text, @Nullable EditorEx editor) {
if (range == null) {
myConsole.doAddPromptToHistory();
DocumentEx document = myConsole.getHistoryViewer().getDocument();
document.insertString(document.getTextLength(), text);
if (!text.endsWith("\n")) {
document.insertString(document.getTextLength(), "\n");
}
}
else {
assert editor != null;
myConsole.addTextRangeToHistory(range, editor, myExecuteActionHandler.myPreserveMarkup);
}
myExecuteActionHandler.addToCommandHistoryAndExecute(myConsole, myConsoleView, text);
}
public static abstract class ConsoleExecuteActionHandler {
private final ConsoleHistoryModel myCommandHistoryModel;
private boolean myAddToHistory = true;
final boolean myPreserveMarkup;
boolean useProcessStdIn;
public ConsoleExecuteActionHandler(boolean preserveMarkup) {
myCommandHistoryModel = new ConsoleHistoryModel();
myPreserveMarkup = preserveMarkup;
}
public ConsoleHistoryModel getConsoleHistoryModel() {
return myCommandHistoryModel;
}
public boolean isEmptyCommandExecutionAllowed() {
return true;
}
public final void setAddCurrentToHistory(boolean addCurrentToHistory) {
myAddToHistory = addCurrentToHistory;
}
protected void beforeExecution(@NotNull LanguageConsoleImpl console) {
}
protected void runExecuteAction(@NotNull LanguageConsoleImpl console, @Nullable LanguageConsoleView consoleView) {
if (!useProcessStdIn) {
beforeExecution(console);
}
String text = console.prepareExecuteAction(myAddToHistory && !useProcessStdIn, myPreserveMarkup, true);
((UndoManagerImpl)UndoManager.getInstance(console.getProject())).invalidateActionsFor(DocumentReferenceManager.getInstance().create(console.getCurrentEditor().getDocument()));
if (useProcessStdIn) {
assert consoleView != null;
consoleView.print(text, ConsoleViewContentType.USER_INPUT);
consoleView.print("\n", ConsoleViewContentType.USER_INPUT);
}
else {
addToCommandHistoryAndExecute(console, consoleView, text);
}
}
private void addToCommandHistoryAndExecute(@NotNull LanguageConsoleImpl console, @Nullable LanguageConsoleView consoleView, @NotNull String text) {
myCommandHistoryModel.addToHistory(text);
doExecute(text, console, consoleView);
}
abstract void doExecute(@NotNull String text, @NotNull LanguageConsoleImpl console, @Nullable LanguageConsoleView consoleView);
}
}