Open terminal in folder that was dragged to it from project view (IDEA-115145).

This commit is contained in:
Dmitry Trofimov
2014-03-06 22:02:12 +01:00
parent e5740c5442
commit 38bdd09c12
3 changed files with 58 additions and 22 deletions
@@ -15,6 +15,7 @@ import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowManager;
@@ -23,6 +24,7 @@ import com.jediterm.terminal.TtyConnector;
import com.jediterm.terminal.ui.TerminalSession;
import com.jediterm.terminal.ui.TerminalWidget;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
@@ -65,7 +67,7 @@ public abstract class AbstractTerminalRunner<T extends Process> {
private void doRun() {
// Create Server process
try {
final T process = createProcess();
final T process = createProcess(null);
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
@@ -79,21 +81,21 @@ public abstract class AbstractTerminalRunner<T extends Process> {
}
}
protected abstract T createProcess() throws ExecutionException;
protected abstract T createProcess(@Nullable String directory) throws ExecutionException;
protected abstract ProcessHandler createProcessHandler(T process);
@NotNull
public JBTabbedTerminalWidget createTerminalWidget(@NotNull Disposable parent) {
final JBTerminalSystemSettingsProvider provider = new JBTerminalSystemSettingsProvider();
JBTabbedTerminalWidget terminalWidget = new JBTabbedTerminalWidget(myProject, provider, new Predicate<TerminalWidget>() {
JBTabbedTerminalWidget terminalWidget = new JBTabbedTerminalWidget(myProject, provider, new Predicate<Pair<TerminalWidget, String>>() {
@Override
public boolean apply(TerminalWidget widget) {
openSession(widget);
public boolean apply(Pair<TerminalWidget, String> widget) {
openSessionInDirectory(widget.getFirst(), widget.getSecond());
return true;
}
}, parent);
openSession(terminalWidget);
openSessionInDirectory(terminalWidget, null);
return terminalWidget;
}
@@ -102,12 +104,10 @@ public abstract class AbstractTerminalRunner<T extends Process> {
final DefaultActionGroup toolbarActions = new DefaultActionGroup();
final ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, toolbarActions, false);
final JPanel panel = new JPanel(new BorderLayout());
panel.add(actionToolbar.getComponent(), BorderLayout.WEST);
actionToolbar.setTargetComponent(panel);
@@ -121,15 +121,15 @@ public abstract class AbstractTerminalRunner<T extends Process> {
toolbarActions.add(createCloseAction(defaultExecutor, contentDescriptor));
final JBTerminalSystemSettingsProvider provider = new JBTerminalSystemSettingsProvider();
TerminalWidget widget = new JBTabbedTerminalWidget(myProject, provider, new Predicate<TerminalWidget>() {
TerminalWidget widget = new JBTabbedTerminalWidget(myProject, provider, new Predicate<Pair<TerminalWidget, String>>() {
@Override
public boolean apply(TerminalWidget widget) {
openSession(widget);
public boolean apply(Pair<TerminalWidget, String> widget) {
openSessionInDirectory(widget.getFirst(), widget.getSecond());
return true;
}
}, contentDescriptor);
openSession(widget, createTtyConnector(process));
createAndStartSession(widget, createTtyConnector(process));
panel.add(widget.getComponent(), BorderLayout.CENTER);
@@ -138,7 +138,11 @@ public abstract class AbstractTerminalRunner<T extends Process> {
processHandler.startNotify();
}
public static void openSession(@NotNull TerminalWidget terminal, @NotNull TtyConnector ttyConnector) {
public void openSession(@NotNull TerminalWidget terminal) {
openSessionInDirectory(terminal, null);
}
public static void createAndStartSession(@NotNull TerminalWidget terminal, @NotNull TtyConnector ttyConnector) {
TerminalSession session = terminal.createTerminalSession(ttyConnector);
session.start();
}
@@ -156,7 +160,7 @@ public abstract class AbstractTerminalRunner<T extends Process> {
// Show in run toolwindow
ExecutionManager.getInstance(myProject).getContentManager().showRunContent(defaultExecutor, myDescriptor);
// Request focus
// Request focus
final ToolWindow window = ToolWindowManager.getInstance(myProject).getToolWindow(defaultExecutor.getId());
window.activate(new Runnable() {
public void run() {
@@ -170,12 +174,12 @@ public abstract class AbstractTerminalRunner<T extends Process> {
return myProject;
}
public void openSession(@NotNull TerminalWidget terminalWidget) {
public void openSessionInDirectory(@NotNull TerminalWidget terminalWidget, @Nullable String directory) {
// Create Server process
try {
final T process = createProcess();
final T process = createProcess(directory);
openSession(terminalWidget, createTtyConnector(process));
createAndStartSession(terminalWidget, createTtyConnector(process));
}
catch (Exception e) {
LOG.error("Can't open terminal session:" + e.getMessage(), e);
@@ -1,6 +1,10 @@
package org.jetbrains.plugins.terminal;
import com.google.common.base.Predicate;
import com.intellij.ide.dnd.DnDDropHandler;
import com.intellij.ide.dnd.DnDEvent;
import com.intellij.ide.dnd.DnDSupport;
import com.intellij.ide.dnd.TransferableWrapper;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
@@ -11,7 +15,11 @@ import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.components.JBTextField;
import com.intellij.ui.docking.DockManager;
@@ -44,8 +52,13 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
public JBTabbedTerminalWidget(@NotNull Project project,
@NotNull JBTerminalSystemSettingsProvider settingsProvider,
@NotNull Predicate<TerminalWidget> createNewSessionAction, @NotNull Disposable parent) {
super(settingsProvider, createNewSessionAction);
final @NotNull Predicate<Pair<TerminalWidget, String>> createNewSessionAction, @NotNull Disposable parent) {
super(settingsProvider, new Predicate<TerminalWidget>() {
@Override
public boolean apply(TerminalWidget input) {
return createNewSessionAction.apply(Pair.<TerminalWidget, String>create(input, null));
}
});
myProject = project;
mySettingsProvider = settingsProvider;
@@ -55,6 +68,26 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
Disposer.register(parent, this);
Disposer.register(this, settingsProvider);
DnDSupport.createBuilder(this).setDropHandler(new DnDDropHandler() {
@Override
public void drop(DnDEvent event) {
if (event.getAttachedObject() instanceof TransferableWrapper) {
TransferableWrapper ao = (TransferableWrapper)event.getAttachedObject();
if (ao != null &&
ao.getPsiElements() != null &&
ao.getPsiElements().length == 1 &&
ao.getPsiElements()[0] instanceof PsiFileSystemItem) {
PsiFileSystemItem element = (PsiFileSystemItem)ao.getPsiElements()[0];
PsiDirectory dir = element instanceof PsiFile ? ((PsiFile)element).getContainingDirectory() : (PsiDirectory)element;
createNewSessionAction.apply(Pair.<TerminalWidget, String>create(JBTabbedTerminalWidget.this, dir.getVirtualFile().getPath()));
}
}
}
}
).install();
}
public static void convertActions(@NotNull JComponent component,
@@ -9,7 +9,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Consumer;
import com.intellij.util.containers.HashMap;
@@ -65,12 +64,12 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess
}
@Override
protected PtyProcess createProcess() throws ExecutionException {
protected PtyProcess createProcess(@Nullable String directory) throws ExecutionException {
Map<String, String> envs = new HashMap<String, String>(System.getenv());
envs.put("TERM", "xterm-256color");
EncodingEnvironmentUtil.fixDefaultEncodingIfMac(envs, getProject());
try {
return PtyProcess.exec(getCommand(), envs, currentProjectFolder());
return PtyProcess.exec(getCommand(), envs, directory != null ? directory : currentProjectFolder());
}
catch (IOException e) {
throw new ExecutionException(e);