From 38bdd09c126cc4f0b53ba1f8ddf63b2ea47ec134 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 6 Mar 2014 22:02:12 +0100 Subject: [PATCH] Open terminal in folder that was dragged to it from project view (IDEA-115145). --- .../terminal/AbstractTerminalRunner.java | 38 ++++++++++--------- .../terminal/JBTabbedTerminalWidget.java | 37 +++++++++++++++++- .../terminal/LocalTerminalDirectRunner.java | 5 +-- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java index 6624ad9b5555..d252c93bcb34 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/AbstractTerminalRunner.java @@ -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 { 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 { } } - 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() { + JBTabbedTerminalWidget terminalWidget = new JBTabbedTerminalWidget(myProject, provider, new Predicate>() { @Override - public boolean apply(TerminalWidget widget) { - openSession(widget); + public boolean apply(Pair widget) { + openSessionInDirectory(widget.getFirst(), widget.getSecond()); return true; } }, parent); - openSession(terminalWidget); + openSessionInDirectory(terminalWidget, null); return terminalWidget; } @@ -102,12 +104,10 @@ public abstract class AbstractTerminalRunner { 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 { toolbarActions.add(createCloseAction(defaultExecutor, contentDescriptor)); final JBTerminalSystemSettingsProvider provider = new JBTerminalSystemSettingsProvider(); - TerminalWidget widget = new JBTabbedTerminalWidget(myProject, provider, new Predicate() { + TerminalWidget widget = new JBTabbedTerminalWidget(myProject, provider, new Predicate>() { @Override - public boolean apply(TerminalWidget widget) { - openSession(widget); + public boolean apply(Pair 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 { 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 { // 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 { 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); diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java index 8e9ec736acb2..9b595a9209b5 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java @@ -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 createNewSessionAction, @NotNull Disposable parent) { - super(settingsProvider, createNewSessionAction); + final @NotNull Predicate> createNewSessionAction, @NotNull Disposable parent) { + super(settingsProvider, new Predicate() { + @Override + public boolean apply(TerminalWidget input) { + return createNewSessionAction.apply(Pair.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.create(JBTabbedTerminalWidget.this, dir.getVirtualFile().getPath())); + } + } + } + } + + ).install(); } public static void convertActions(@NotNull JComponent component, diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java index e1d84c97eca3..caaa54166e7d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java @@ -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 envs = new HashMap(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);