From 1dcfd64e13a555523727a47f971db47a9e5843a2 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Sun, 10 Nov 2013 21:49:15 +0100 Subject: [PATCH] Fix removing terminal tabs on drag'n'drop. --- .../ui/layout/impl/RunnerContentUi.java | 2 +- .../com/intellij/ui/tabs/TabsListener.java | 8 ++++ .../com/intellij/ui/tabs/impl/JBTabsImpl.java | 11 +++++ .../terminal/JBTabbedTerminalWidget.java | 45 +++++++++---------- .../terminal/vfs/TerminalSessionEditor.java | 18 ++++---- 5 files changed, 49 insertions(+), 35 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java index 0ee9c952f9d1..4c9425d1e9ec 100644 --- a/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java +++ b/platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java @@ -236,7 +236,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac myComponent.setContent(wrappper); - myTabs.addListener(new TabsListener() { + myTabs.addListener(new TabsListener.Adapter() { @Override public void beforeSelectionChanged(TabInfo oldSelection, TabInfo newSelection) { diff --git a/platform/platform-api/src/com/intellij/ui/tabs/TabsListener.java b/platform/platform-api/src/com/intellij/ui/tabs/TabsListener.java index a9bba15c4d37..5ca61fede62d 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/TabsListener.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/TabsListener.java @@ -22,18 +22,26 @@ public interface TabsListener { void beforeSelectionChanged(TabInfo oldSelection, TabInfo newSelection); + void tabRemoved(TabInfo tabToRemove); + void tabsMoved(); class Adapter implements TabsListener { + @Override public void selectionChanged(TabInfo oldSelection, TabInfo newSelection) { } + @Override public void beforeSelectionChanged(TabInfo oldSelection, TabInfo newSelection) { } @Override public void tabsMoved() { } + + @Override + public void tabRemoved(TabInfo tabToRemove) { + } } } diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java index a37591b5e27a..2908b4f36715 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java @@ -891,6 +891,15 @@ public class JBTabsImpl extends JComponent } } + + void fireTabRemoved(TabInfo info) { + for (TabsListener eachListener : myTabListeners) { + if (eachListener != null) { + eachListener.tabRemoved(info); + } + } + } + @NotNull private ActionCallback requestFocus(final JComponent toFocus) { if (toFocus == null) return new ActionCallback.Done(); @@ -2438,6 +2447,8 @@ public class JBTabsImpl extends JComponent } revalidateAndRepaint(true); + + fireTabRemoved(info); return result; } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java index be22ab8ffbd7..5104e72fc42d 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTabbedTerminalWidget.java @@ -13,7 +13,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.components.JBTextField; -import com.intellij.ui.docking.DockContainer; import com.intellij.ui.docking.DockManager; import com.intellij.ui.docking.DragSession; import com.intellij.ui.tabs.TabInfo; @@ -28,8 +27,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.terminal.vfs.TerminalSessionVirtualFileImpl; import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.awt.*; import java.awt.event.*; import java.util.List; @@ -95,7 +92,7 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget { private TabInfo.DragOutDelegate myDragDelegate = new MyDragOutDelegate(); - private final CopyOnWriteArraySet myListeners = new CopyOnWriteArraySet(); + private final CopyOnWriteArraySet myListeners = new CopyOnWriteArraySet(); public JBTerminalTabs(@NotNull Project project, @NotNull Disposable parent) { final ActionManager actionManager = ActionManager.getInstance(); @@ -109,19 +106,22 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget { myTabs.addListener(new TabsListener.Adapter() { @Override public void selectionChanged(TabInfo oldSelection, TabInfo newSelection) { - fireChanged(new ChangeEvent(myTabs)); + for (TabChangeListener each : myListeners) { + each.selectionChanged(); + } + } + + @Override + public void tabRemoved(TabInfo tabInfo) { + for (TabChangeListener each : myListeners) { + each.tabRemoved(); + } } }); myTabs.setTabDraggingEnabled(true); } - private void fireChanged(ChangeEvent event) { - for (ChangeListener each : myListeners) { - each.stateChanged(event); - } - } - @Override public int getSelectedIndex() { return myTabs.getIndexOf(myTabs.getSelectedInfo()); @@ -161,7 +161,7 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget { } @Override - public void addChangeListener(ChangeListener listener) { + public void addChangeListener(TabChangeListener listener) { myListeners.add(listener); } @@ -348,20 +348,15 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget { @Override public void dragOutFinished(MouseEvent event, TabInfo source) { - boolean copy = - com.intellij.util.ui.UIUtil.isControlKeyDown(event) || mySession.getResponse(event) == DockContainer.ContentResponse.ACCEPT_COPY; - if (!copy) { - myFile.putUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN, Boolean.TRUE); - // FileEditorManagerEx.getInstanceEx(myProject).closeFile(myFile, myWindow); TODO - } - else { - source.setHidden(false); - } - + myFile.putUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN, Boolean.TRUE); + + + myTabs.removeTab(source); + mySession.process(event); - if (!copy) { - myFile.putUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN, null); - } + + myFile.putUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN, null); + myFile = null; mySession = null; 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 c1b4b5556867..72f4ab004c13 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditor.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/vfs/TerminalSessionEditor.java @@ -21,8 +21,8 @@ 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.impl.FileEditorManagerImpl; import com.intellij.openapi.util.UserDataHolderBase; -import com.jediterm.terminal.ui.JediTermWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,31 +34,29 @@ import java.beans.PropertyChangeListener; */ public class TerminalSessionEditor extends UserDataHolderBase implements FileEditor { - private final JediTermWidget myTerminal; - private final String myName; + private final TerminalSessionVirtualFileImpl myFile; public TerminalSessionEditor(@NotNull TerminalSessionVirtualFileImpl terminalFile) { - myTerminal = terminalFile.getTerminal(); - myName = terminalFile.getName(); + myFile = terminalFile; } @NotNull @Override public JComponent getComponent() { - return myTerminal; + return myFile.getTerminal(); } @Nullable @Override public JComponent getPreferredFocusedComponent() { - return myTerminal; + return myFile.getTerminal(); } @NotNull @Override public String getName() { - return myName; + return myFile.getName(); } @NotNull @@ -122,6 +120,8 @@ public class TerminalSessionEditor extends UserDataHolderBase implements FileEdi @Override public void dispose() { - myTerminal.close(); + if (!myFile.getUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN)) { + myFile.getTerminal().close(); + } } }