mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Open terminal in folder that was dragged to it from project view (IDEA-115145).
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user