Fix removing terminal tabs on drag'n'drop.

This commit is contained in:
Dmitry Trofimov
2013-11-10 21:49:15 +01:00
parent e0ff96dc2c
commit 1dcfd64e13
5 changed files with 49 additions and 35 deletions
@@ -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) {
@@ -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) {
}
}
}
@@ -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;
}
@@ -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<ChangeListener> myListeners = new CopyOnWriteArraySet<ChangeListener>();
private final CopyOnWriteArraySet<TabChangeListener> myListeners = new CopyOnWriteArraySet<TabChangeListener>();
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;
@@ -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();
}
}
}