From 46667e24623ae836cfc76a1caaabd2f68f7c25a1 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Sun, 10 Nov 2013 22:27:38 +0100 Subject: [PATCH] Fix closing tab on session end. Fix popup for editor terminal tabs. --- .../terminal/JBTabbedTerminalWidget.java | 2 +- .../terminal/vfs/TerminalSessionEditor.java | 55 ++++++++++++++++++- .../vfs/TerminalSessionEditorProvider.java | 2 +- .../vfs/TerminalSessionVirtualFileImpl.java | 11 +++- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java index 5104e72fc42d..800d1a1e6022 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java @@ -195,7 +195,7 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget { private TabInfo createTabInfo(String name, JediTermWidget terminal) { return new TabInfo(terminal).setText(name).setDragOutDelegate(myDragDelegate) - .setObject(new TerminalSessionVirtualFileImpl(name, terminal)); + .setObject(new TerminalSessionVirtualFileImpl(name, terminal, mySettingsProvider)); } public String getTitleAt(int i) { diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditor.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditor.java index 6cb785c08ee5..5dc7b629af57 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditor.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditor.java @@ -15,31 +15,83 @@ */ package org.jetbrains.plugins.terminal.vfs; +import com.google.common.base.Predicate; +import com.google.common.collect.Lists; import com.intellij.codeHighlighting.BackgroundEditorHighlighter; import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorLocation; import com.intellij.openapi.fileEditor.FileEditorState; import com.intellij.openapi.fileEditor.FileEditorStateLevel; +import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.UserDataHolderBase; +import com.jediterm.terminal.TtyConnectorWaitFor; +import com.jediterm.terminal.ui.TerminalAction; +import com.jediterm.terminal.ui.TerminalActionProviderBase; +import com.jediterm.terminal.ui.settings.TabbedSettingsProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.event.KeyEvent; import java.beans.PropertyChangeListener; +import java.util.List; +import java.util.concurrent.Executors; /** * @author traff */ public class TerminalSessionEditor extends UserDataHolderBase implements FileEditor { + private Project myProject; private final TerminalSessionVirtualFileImpl myFile; + private final TtyConnectorWaitFor myWaitFor; - public TerminalSessionEditor(@NotNull TerminalSessionVirtualFileImpl terminalFile) { + public TerminalSessionEditor(Project project, @NotNull TerminalSessionVirtualFileImpl terminalFile) { + myProject = project; myFile = terminalFile; + + final TabbedSettingsProvider settings = myFile.getSettingsProvider(); + + myFile.getTerminal().setNextProvider(new TerminalActionProviderBase() { + @Override + public List getActions() { + return Lists.newArrayList( + new TerminalAction("Close Session", settings.getCloseSessionKeyStrokes(), new Predicate() { + @Override + public boolean apply(KeyEvent input) { + handleCloseSession(); + return true; + } + }).withMnemonicKey(KeyEvent.VK_S) + ); + } + }); + + myWaitFor = new TtyConnectorWaitFor(myFile.getTerminal().getTtyConnector(), Executors.newSingleThreadExecutor()); + + myWaitFor + .setTerminationCallback(new Predicate() { + @Override + public boolean apply(Integer integer) { + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + FileEditorManagerEx.getInstanceEx(myProject).closeFile(myFile); + } + }); + + return true; + } + }); } + private void handleCloseSession() { + myFile.getTerminal().close(); + } @NotNull @Override @@ -121,6 +173,7 @@ public class TerminalSessionEditor extends UserDataHolderBase implements FileEdi @Override public void dispose() { Boolean closingToReopen = myFile.getUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN); + myWaitFor.detach(); if (closingToReopen == null || !closingToReopen) { myFile.getTerminal().close(); } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java index c3201c08a7d4..cf1fd5978f5e 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditorProvider.java @@ -38,7 +38,7 @@ public class TerminalSessionEditorProvider implements FileEditorProvider, DumbAw @NotNull @Override public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) { - return new TerminalSessionEditor((TerminalSessionVirtualFileImpl)file); + return new TerminalSessionEditor(project, (TerminalSessionVirtualFileImpl)file); } @Override diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionVirtualFileImpl.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionVirtualFileImpl.java index 3f29a182b9e2..912bd63f210d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionVirtualFileImpl.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionVirtualFileImpl.java @@ -21,6 +21,7 @@ package org.jetbrains.plugins.terminal.vfs; import com.intellij.testFramework.LightVirtualFile; import com.jediterm.terminal.ui.JediTermWidget; +import com.jediterm.terminal.ui.settings.TabbedSettingsProvider; import org.jetbrains.annotations.NotNull; /** @@ -28,12 +29,14 @@ import org.jetbrains.annotations.NotNull; */ public class TerminalSessionVirtualFileImpl extends LightVirtualFile { private final JediTermWidget myTerminal; + private TabbedSettingsProvider mySettingsProvider; private final String myName; - - public TerminalSessionVirtualFileImpl(String name, JediTermWidget terminal) { + + public TerminalSessionVirtualFileImpl(String name, JediTermWidget terminal, TabbedSettingsProvider settingsProvider) { myName = name; myTerminal = terminal; + mySettingsProvider = settingsProvider; setFileType(TerminalSessionFileType.INSTANCE); setWritable(true); } @@ -46,4 +49,8 @@ public class TerminalSessionVirtualFileImpl extends LightVirtualFile { public String getName() { return myName; } + + public TabbedSettingsProvider getSettingsProvider() { + return mySettingsProvider; + } }