Commit 717c442f authored by Roman Shevchenko's avatar Roman Shevchenko
Browse files

Merge remote-tracking branch 'origin/master'

parents a4d26de6 8b7ba248
Branches unavailable Tags unavailable
No related merge requests found
Showing with 274 additions and 161 deletions
+274 -161
......@@ -8,10 +8,13 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.javadoc.PsiDocTagValue;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.StringTokenizer;
......@@ -70,12 +73,12 @@ public class JavaDocUtil {
}
@Nullable
public static PsiElement findReferenceTarget(PsiManager manager, String refText, PsiElement context) {
public static PsiElement findReferenceTarget(@NotNull PsiManager manager, @NotNull String refText, PsiElement context) {
return findReferenceTarget(manager, refText, context, true);
}
@Nullable
public static PsiElement findReferenceTarget(PsiManager manager, String refText, PsiElement context, boolean useNavigationElement) {
public static PsiElement findReferenceTarget(@NotNull PsiManager manager, @NotNull String refText, PsiElement context, boolean useNavigationElement) {
LOG.assertTrue(context == null || context.isValid());
if (context != null) {
context = context.getNavigationElement();
......@@ -84,9 +87,7 @@ public class JavaDocUtil {
int poundIndex = refText.indexOf('#');
final JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject());
if (poundIndex < 0) {
PsiClass aClass = facade.getResolveHelper().resolveReferencedClass(refText, context);
if (aClass == null) aClass = facade.findClass(refText, context.getResolveScope());
PsiClass aClass = findClassFromRef(manager, facade, refText, context);
if (aClass != null) {
return useNavigationElement ? aClass.getNavigationElement() : aClass;
......@@ -98,9 +99,7 @@ public class JavaDocUtil {
else {
String classRef = refText.substring(0, poundIndex).trim();
if (!classRef.isEmpty()) {
PsiClass aClass = facade.getResolveHelper().resolveReferencedClass(classRef, context);
if (aClass == null) aClass = facade.findClass(classRef, context.getResolveScope());
PsiClass aClass = findClassFromRef(manager, facade, classRef, context);
if (aClass == null) return null;
PsiElement member = findReferencedMember(aClass, refText.substring(poundIndex + 1), context);
......@@ -110,7 +109,7 @@ public class JavaDocUtil {
String memberRefText = refText.substring(1);
PsiElement scope = context;
while (true) {
if (scope instanceof PsiFile) break;
if (scope instanceof PsiFile || scope == null) break;
if (scope instanceof PsiClass) {
PsiElement member = findReferencedMember((PsiClass)scope, memberRefText, context);
if (member != null) {
......@@ -124,6 +123,23 @@ public class JavaDocUtil {
}
}
private static PsiClass findClassFromRef(@NotNull PsiManager manager,
@NotNull JavaPsiFacade facade,
@NotNull String refText, PsiElement context) {
PsiClass aClass = facade.getResolveHelper().resolveReferencedClass(refText, context);
GlobalSearchScope projectScope = GlobalSearchScope.projectScope(manager.getProject());
if (aClass == null) aClass = facade.findClass(refText, projectScope);
if (aClass == null && refText.indexOf('.') == -1 && context != null) {
// find short-named class in the same package (maybe in the different module)
PsiFile file = context.getContainingFile();
PsiDirectory directory = file == null ? null : file.getContainingDirectory();
PsiPackage aPackage = directory == null ? null : JavaDirectoryService.getInstance().getPackage(directory);
aClass = aPackage == null ? null : ArrayUtil.getFirstElement(aPackage.findClassByShortName(refText, projectScope));
}
return aClass;
}
@Nullable
private static PsiElement findReferencedMember(PsiClass aClass, String memberRefText, PsiElement context) {
int parenthIndex = memberRefText.indexOf('(');
......
......@@ -289,7 +289,7 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya
@NotNull ResolveState state,
PsiElement lastParent,
@NotNull PsiElement place) {
GlobalSearchScope scope = place.getResolveScope();
GlobalSearchScope scope = PsiUtil.isInsideJavadocComment(place) ? allScope() : place.getResolveScope();
processor.handleEvent(PsiScopeProcessor.Event.SET_DECLARATION_HOLDER, this);
ElementClassHint classHint = processor.getHint(ElementClassHint.KEY);
......@@ -336,7 +336,7 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya
private static boolean processClasses(@NotNull PsiScopeProcessor processor,
@NotNull ResolveState state,
@NotNull PsiClass[] classes,
@NotNull Condition<String> nameCondition) {
@NotNull Condition<? super String> nameCondition) {
for (PsiClass aClass : classes) {
String name = aClass.getName();
if (name != null && nameCondition.value(name)) {
......
......@@ -314,7 +314,8 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava
if (processor instanceof ClassResolverProcessor &&
isPhysical() &&
(getUserData(PsiFileEx.BATCH_REFERENCE_PROCESSING) == Boolean.TRUE || myResolveCache.hasUpToDateValue())) {
(getUserData(PsiFileEx.BATCH_REFERENCE_PROCESSING) == Boolean.TRUE || myResolveCache.hasUpToDateValue()) &&
!PsiUtil.isInsideJavadocComment(place)) {
final ClassResolverProcessor hint = (ClassResolverProcessor)processor;
String name = hint.getName(state);
MostlySingularMultiMap<String, SymbolCollectingProcessor.ResultWithContext> cache = myResolveCache.getValue();
......
package pkg;
/**
* @see pkg1.PackageLocal - package local class in other package should resolve
* @see java.io.ObjectStreamClass.WeakClassKey - and JDK package local class too
* @see java.io.ObjectStreamClass.Caches - and even JDK private classes
*
* - but don't go over the top, of course:
* @see java.io.ObjectStreamClass.<error descr="Cannot resolve symbol 'java.io.ObjectStreamClass.XXXXXX'">XXXXXX</error>
*/
class JavadocMustResolveEvenOtherPackageLocalClasses {
}
package pkg1;
class PackageLocal {}
\ No newline at end of file
......@@ -4,7 +4,9 @@ package com.intellij.java.codeInsight.daemon;
import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase;
import com.intellij.codeInspection.javaDoc.JavaDocLocalInspection;
import com.intellij.codeInspection.javaDoc.JavaDocReferenceInspection;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.testFramework.IdeaTestUtil;
public class JavadocResolveTest extends DaemonAnalyzerTestCase {
private static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/javaDoc/resolve";
......@@ -16,6 +18,7 @@ public class JavadocResolveTest extends DaemonAnalyzerTestCase {
public void testPackageInfo() { doTest("/pkg/package-info.java"); }
public void testBrokenPackageInfo() { doTest("/pkg1/package-info.java"); }
public void testModuleInfo() { setLanguageLevel(LanguageLevel.JDK_1_9); doTest("/module-info.java"); }
public void testOtherPackageLocal() { doTest(); }
private void doTest() {
doTest("/pkg/" + getTestName(false) + ".java");
......@@ -28,4 +31,9 @@ public class JavadocResolveTest extends DaemonAnalyzerTestCase {
}
catch (Exception e) { throw new RuntimeException(e); }
}
@Override
protected Sdk getTestProjectJdk() {
return IdeaTestUtil.getMockJdk18();
}
}
\ No newline at end of file
......@@ -235,7 +235,7 @@ class CommunityLibraryLicenses {
url: "http://www.jcip.net", licenseUrl: "http://creativecommons.org/licenses/by/2.5"),
new LibraryLicense(name: "JDOM", version: "1.1 (with patches by JetBrains)", license: "modified Apache", url: "http://www.jdom.org/",
licenseUrl: "http://www.jdom.org/docs/faq.html#a0030"),
new LibraryLicense(name: "JediTerm", libraryName: "jediterm-pty", version: "2.10", license: "LGPL 3",
new LibraryLicense(name: "JediTerm", libraryName: "jediterm-pty", version: "2.11", license: "LGPL 3",
url: "https://github.com/JetBrains/jediterm",
licenseUrl: "https://github.com/JetBrains/jediterm/blob/master/LICENSE-LGPLv3.txt"),
new LibraryLicense(name: "JetBrains Annotations", libraryName: "jetbrains-annotations", version: "16.0.1", license: "Apache 2.0",
......
......@@ -55,7 +55,9 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
private final Project myProject;
private final JBTerminalSystemSettingsProviderBase mySettingsProvider;
public JBTerminalWidget(Project project, JBTerminalSystemSettingsProviderBase settingsProvider, Disposable parent) {
public JBTerminalWidget(Project project,
JBTerminalSystemSettingsProviderBase settingsProvider,
Disposable parent) {
this(project, 80, 24, settingsProvider, parent);
}
......@@ -212,4 +214,9 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
}
});
}
public void start(TtyConnector connector) {
setTtyConnector(connector);
start();
}
}
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.fileEditor;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory;
import com.intellij.openapi.fileEditor.impl.IdeDocumentHistoryImpl;
import com.intellij.testFramework.EditorTestUtil;
public class IdeDocumentHistoryFunctionalTest extends HeavyFileEditorManagerTestCase {
@Override
public void setUp() throws Exception {
super.setUp();
((IdeDocumentHistoryImpl)IdeDocumentHistory.getInstance(getProject())).projectOpened();
}
public void testNavigateBetweenEditLocations() {
myFixture.configureByText(getTestName(false) + ".txt",
"<caret>line1\n" +
"\n" +
"\n" +
"\n" +
"line2\n" +
"\n" +
"\n" +
"\n" +
"line3");
myFixture.type(' ');
moveCaret4LinesDown();
myFixture.type(' ');
moveCaret4LinesDown();
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_LAST_CHANGE);
myFixture.checkResult(" line1\n" +
"\n" +
"\n" +
"\n" +
"l <caret>ine2\n" +
"\n" +
"\n" +
"\n" +
"line3");
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_LAST_CHANGE);
myFixture.checkResult(" <caret>line1\n" +
"\n" +
"\n" +
"\n" +
"l ine2\n" +
"\n" +
"\n" +
"\n" +
"line3");
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_NEXT_CHANGE);
myFixture.checkResult(" line1\n" +
"\n" +
"\n" +
"\n" +
"l <caret>ine2\n" +
"\n" +
"\n" +
"\n" +
"line3");
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_NEXT_CHANGE);
myFixture.checkResult(" line1\n" +
"\n" +
"\n" +
"\n" +
"l <caret>ine2\n" +
"\n" +
"\n" +
"\n" +
"line3");
}
public void testForwardToANearPlace() {
myFixture.configureByText(getTestName(false) + ".java",
"class AA {}\n" +
"\n" +
"class BV extends A<caret>A {}");
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_DECLARATION);
myFixture.checkResult("class <caret>AA {}\n" +
"\n" +
"class BV extends AA {}");
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_BACK);
myFixture.checkResult("class AA {}\n" +
"\n" +
"class BV extends A<caret>A {}");
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_GOTO_FORWARD);
myFixture.checkResult("class <caret>AA {}\n" +
"\n" +
"class BV extends AA {}");
}
private void moveCaret4LinesDown() {
for (int i = 0; i < 4; i++) {
EditorTestUtil.executeAction(getEditor(), IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN);
}
}
}
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.fileEditor
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.testFramework.EditorTestUtil
internal class IdeDocumentHistoryFunctionalTest : HeavyFileEditorManagerTestCase() {
fun testNavigateBetweenEditLocations() {
myFixture.configureByText("${getTestName(false)}.txt",
"""<caret>line1
line2
line3""")
myFixture.type(' ')
moveCaret4LinesDown()
myFixture.type(' ')
moveCaret4LinesDown()
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_LAST_CHANGE)
myFixture.checkResult(""" line1
l <caret>ine2
line3""")
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_LAST_CHANGE)
myFixture.checkResult(""" <caret>line1
l ine2
line3""")
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_NEXT_CHANGE)
myFixture.checkResult(""" line1
l <caret>ine2
line3""")
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_NEXT_CHANGE)
myFixture.checkResult(""" line1
l <caret>ine2
line3""")
}
fun testForwardToANearPlace() {
myFixture.configureByText(getTestName(false) + ".java",
"""class AA {}
class BV extends A<caret>A {}""")
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_DECLARATION)
myFixture.checkResult("""class <caret>AA {}
class BV extends AA {}""")
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_BACK)
myFixture.checkResult("""class AA {}
class BV extends A<caret>A {}""")
EditorTestUtil.executeAction(editor, IdeActions.ACTION_GOTO_FORWARD)
myFixture.checkResult("""class <caret>AA {}
class BV extends AA {}""")
}
private fun moveCaret4LinesDown() {
for (i in 0..3) {
EditorTestUtil.executeAction(editor, IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN)
}
}
}
......@@ -25,8 +25,8 @@ import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.util.ui.UIUtil;
import com.jediterm.terminal.TtyConnector;
import com.jediterm.terminal.ui.AbstractTabbedTerminalWidget;
import com.jediterm.terminal.ui.TerminalSession;
import com.jediterm.terminal.ui.TerminalWidget;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
......@@ -81,10 +81,7 @@ public abstract class AbstractTerminalRunner<T extends Process> {
@NotNull
public JBTabbedTerminalWidget createTerminalWidget(@NotNull Disposable parent) {
final JBTerminalSystemSettingsProvider provider = new JBTerminalSystemSettingsProvider();
JBTabbedTerminalWidget terminalWidget = new JBTabbedTerminalWidget(myProject, provider, widget -> {
openSessionInDirectory(widget.getFirst(), widget.getSecond());
return true;
}, parent);
JBTabbedTerminalWidget terminalWidget = new JBTabbedTerminalWidget(myProject, provider, widget -> openSessionInDirectory(widget.getFirst(), widget.getSecond()), parent);
openSessionForFile(terminalWidget, TerminalView.getInstance(myProject).getFileToOpen());
return terminalWidget;
}
......@@ -111,10 +108,7 @@ public abstract class AbstractTerminalRunner<T extends Process> {
toolbarActions.add(createCloseAction(defaultExecutor, contentDescriptor));
final JBTerminalSystemSettingsProvider provider = new JBTerminalSystemSettingsProvider();
TerminalWidget widget = new JBTabbedTerminalWidget(myProject, provider, widget1 -> {
openSessionInDirectory(widget1.getFirst(), widget1.getSecond());
return true;
}, contentDescriptor);
JBTabbedTerminalWidget widget = new JBTabbedTerminalWidget(myProject, provider, w -> openSessionInDirectory(w.getFirst(), w.getSecond()), contentDescriptor);
createAndStartSession(widget, createTtyConnector(process));
......@@ -125,11 +119,11 @@ public abstract class AbstractTerminalRunner<T extends Process> {
processHandler.startNotify();
}
public void openSession(@NotNull TerminalWidget terminal) {
public void openSession(@NotNull JBTabbedTerminalWidget terminal) {
openSessionInDirectory(terminal, null);
}
public static void createAndStartSession(@NotNull TerminalWidget terminal, @NotNull TtyConnector ttyConnector) {
public static void createAndStartSession(@NotNull JBTabbedTerminalWidget terminal, @NotNull TtyConnector ttyConnector) {
TerminalSession session = terminal.createTerminalSession(ttyConnector);
TerminalView.recordUsage(ttyConnector);
......@@ -163,7 +157,7 @@ public abstract class AbstractTerminalRunner<T extends Process> {
public abstract String runningTargetName();
public void openSessionForFile(@NotNull TerminalWidget terminalWidget, @Nullable VirtualFile file) {
public void openSessionForFile(@NotNull JBTabbedTerminalWidget terminalWidget, @Nullable VirtualFile file) {
openSessionInDirectory(terminalWidget, getParentDirectoryPath(file));
}
......@@ -173,9 +167,11 @@ public abstract class AbstractTerminalRunner<T extends Process> {
return dir != null ? dir.getPath() : null;
}
public void openSessionInDirectory(@NotNull TerminalWidget terminalWidget, @Nullable String directory) {
public JBTabInnerTerminalWidget openSessionInDirectory(@NotNull AbstractTabbedTerminalWidget<JBTabInnerTerminalWidget> terminalWidget, @Nullable String directory) {
ModalityState modalityState = ModalityState.stateForComponent(terminalWidget.getComponent());
JBTabInnerTerminalWidget newTerminalWidget = terminalWidget.createNewTabWidget();
ApplicationManager.getApplication().executeOnPooledThread(() -> {
try {
// Create Server process
......@@ -183,7 +179,9 @@ public abstract class AbstractTerminalRunner<T extends Process> {
ApplicationManager.getApplication().invokeLater(() -> {
try {
createAndStartSession(terminalWidget, createTtyConnector(process));
terminalWidget.initSession(createTtyConnector(process), newTerminalWidget);
newTerminalWidget.start();
terminalWidget.getComponent().revalidate();
}
catch (RuntimeException e) {
......@@ -195,6 +193,8 @@ public abstract class AbstractTerminalRunner<T extends Process> {
ApplicationManager.getApplication().invokeLater(() -> showCannotOpenTerminalDialog(e), modalityState);
}
});
return newTerminalWidget;
}
private void showCannotOpenTerminalDialog(@NotNull Throwable e) {
......
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.terminal;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.terminal.JBTerminalSystemSettingsProviderBase;
import com.intellij.terminal.JBTerminalWidget;
import java.util.function.Function;
/**
* @author traff
*/
public class JBTabInnerTerminalWidget extends JBTerminalWidget {
private final Function<String, JBTabInnerTerminalWidget> myCreateNewSessionAction;
private JBTabbedTerminalWidget myTabbedWidget;
public JBTabInnerTerminalWidget(Project project,
JBTerminalSystemSettingsProviderBase settingsProvider,
Disposable parent,
Function<String, JBTabInnerTerminalWidget> createNewSessionAction,
JBTabbedTerminalWidget tabbedWidget) {
this(project, 80, 24, settingsProvider, parent, pair -> createNewSessionAction.apply(pair));
myTabbedWidget = tabbedWidget;
}
public JBTabInnerTerminalWidget(Project project,
int columns,
int lines,
JBTerminalSystemSettingsProviderBase settingsProvider,
Disposable parent,
Function<String, JBTabInnerTerminalWidget> createNewSessionAction) {
super(project, columns, lines, settingsProvider, parent);
myCreateNewSessionAction = createNewSessionAction;
}
public Function<String, JBTabInnerTerminalWidget> getCreateNewSessionAction() {
return myCreateNewSessionAction;
}
public JBTabbedTerminalWidget getTabbedWidget() {
return myTabbedWidget;
}
}
......@@ -21,7 +21,6 @@ import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.terminal.JBTerminalSystemSettingsProviderBase;
import com.intellij.terminal.JBTerminalWidget;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.components.JBTextField;
import com.intellij.ui.docking.DockManager;
......@@ -33,8 +32,9 @@ import com.intellij.ui.tabs.impl.JBTabsImpl;
import com.intellij.ui.tabs.impl.TabLabel;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import com.jediterm.terminal.ui.*;
import com.jediterm.terminal.ui.settings.TabbedSettingsProvider;
import com.jediterm.terminal.ui.AbstractTabbedTerminalWidget;
import com.jediterm.terminal.ui.AbstractTabs;
import com.jediterm.terminal.ui.TerminalAction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.terminal.vfs.TerminalSessionVirtualFileImpl;
......@@ -44,23 +44,26 @@ import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.function.Function;
/**
* @author traff
*/
public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disposable {
public class JBTabbedTerminalWidget extends AbstractTabbedTerminalWidget<JBTabInnerTerminalWidget> implements Disposable {
private final Project myProject;
private final JBTerminalSystemSettingsProviderBase mySettingsProvider;
private final Function<String, JBTabInnerTerminalWidget> myCreateNewSessionAction;
private final Disposable myParent;
public JBTabbedTerminalWidget(@NotNull Project project,
@NotNull JBTerminalSystemSettingsProviderBase settingsProvider,
final @NotNull Predicate<Pair<TerminalWidget, String>> createNewSessionAction, @NotNull Disposable parent) {
final @NotNull Function<Pair<AbstractTabbedTerminalWidget<JBTabInnerTerminalWidget>, String>, JBTabInnerTerminalWidget> createNewSessionAction, @NotNull Disposable parent) {
super(settingsProvider, input -> createNewSessionAction.apply(Pair.create(input, null)));
myProject = project;
mySettingsProvider = settingsProvider;
myCreateNewSessionAction = s -> createNewSessionAction.apply(Pair.create(this, s));
myParent = parent;
convertActions(this, getActions());
......@@ -113,8 +116,8 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
}
@Override
protected JediTermWidget createInnerTerminalWidget(TabbedSettingsProvider settingsProvider) {
JBTerminalWidget widget = new JBTerminalWidget(myProject, mySettingsProvider, myParent);
public JBTabInnerTerminalWidget createInnerTerminalWidget() {
JBTabInnerTerminalWidget widget = new JBTabInnerTerminalWidget(myProject, mySettingsProvider, myParent, myCreateNewSessionAction, this);
convertActions(widget, widget.getActions());
convertActions(widget.getTerminalPanel(), widget.getTerminalPanel().getActions(), input -> {
......@@ -126,11 +129,11 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
}
@Override
protected TerminalTabs createTabbedPane() {
protected JBTerminalTabs createTabbedPane() {
return new JBTerminalTabs(myProject, myParent);
}
public class JBTerminalTabs implements TerminalTabs {
public class JBTerminalTabs implements AbstractTabs<JBTabInnerTerminalWidget> {
private final JBEditorTabs myTabs;
private final TabInfo.DragOutDelegate myDragDelegate = new MyDragOutDelegate();
......@@ -210,8 +213,8 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
@Override
public JediTermWidget getComponentAt(int i) {
return (JediTermWidget)getTabAt(i).getComponent();
public JBTabInnerTerminalWidget getComponentAt(int i) {
return (JBTabInnerTerminalWidget)getTabAt(i).getComponent();
}
@Override
......@@ -225,7 +228,7 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
}
@Override
public void setSelectedComponent(JediTermWidget terminal) {
public void setSelectedComponent(JBTabInnerTerminalWidget terminal) {
TabInfo info = myTabs.findInfo(terminal);
if (info != null) {
myTabs.select(info, true);
......@@ -243,12 +246,12 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
}
@Override
public void addTab(String name, JediTermWidget terminal) {
public void addTab(String name, JBTabInnerTerminalWidget terminal) {
myTabs.addTab(createTabInfo(name, terminal));
myTabs.updateUI();
}
private TabInfo createTabInfo(String name, JediTermWidget terminal) {
private TabInfo createTabInfo(String name, JBTabInnerTerminalWidget terminal) {
TabInfo tabInfo = new TabInfo(terminal).setText(name).setDragOutDelegate(myDragDelegate);
return tabInfo
.setObject(new TerminalSessionVirtualFileImpl(tabInfo, terminal, mySettingsProvider));
......@@ -263,7 +266,7 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
}
@Override
public void remove(JediTermWidget terminal) {
public void remove(JBTabInnerTerminalWidget terminal) {
TabInfo info = myTabs.findInfo(terminal);
if (info != null) {
myTabs.removeTab(info);
......
......@@ -24,6 +24,7 @@ import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.openapi.wm.ex.ToolWindowManagerListener;
import com.intellij.openapi.wm.impl.InternalDecorator;
import com.intellij.terminal.JBTerminalWidget;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.awt.RelativeRectangle;
import com.intellij.ui.content.Content;
......@@ -33,9 +34,6 @@ import com.intellij.ui.docking.DockManager;
import com.intellij.ui.docking.DockableContent;
import com.intellij.util.ui.UIUtil;
import com.jediterm.terminal.TtyConnector;
import com.jediterm.terminal.ui.JediTermWidget;
import com.jediterm.terminal.ui.TabbedTerminalWidget;
import com.jediterm.terminal.ui.TerminalWidget;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.terminal.vfs.TerminalSessionVirtualFileImpl;
......@@ -125,9 +123,9 @@ public class TerminalView {
content.setCloseable(true);
myTerminalWidget = terminalRunner.createTerminalWidget(content);
myTerminalWidget.addTabListener(new TabbedTerminalWidget.TabListener() {
myTerminalWidget.addTabListener(new JBTabbedTerminalWidget.TabListener<JBTerminalWidget>() {
@Override
public void tabClosed(JediTermWidget terminal) {
public void tabClosed(JBTerminalWidget terminal) {
UIUtil.invokeLaterIfNeeded(() -> {
if (myTerminalWidget != null) {
hideIfNoActiveSessions(toolWindow, myTerminalWidget);
......@@ -230,9 +228,9 @@ public class TerminalView {
private static class NewSession extends DumbAwareAction {
private final AbstractTerminalRunner myTerminalRunner;
private final TerminalWidget myTerminal;
private final JBTabbedTerminalWidget myTerminal;
public NewSession(@NotNull AbstractTerminalRunner terminalRunner, @NotNull TerminalWidget terminal) {
public NewSession(@NotNull AbstractTerminalRunner terminalRunner, @NotNull JBTabbedTerminalWidget terminal) {
super("New Session", "Create New Terminal Session", AllIcons.General.Add);
myTerminalRunner = terminalRunner;
myTerminal = terminal;
......@@ -297,8 +295,8 @@ public class TerminalView {
public void add(@NotNull DockableContent content, RelativePoint dropTarget) {
if (isTerminalSessionContent(content)) {
TerminalSessionVirtualFileImpl terminalFile = (TerminalSessionVirtualFileImpl)content.getKey();
myTerminalWidget.addTab(terminalFile.getName(), terminalFile.getTerminal());
terminalFile.getTerminal().setNextProvider(myTerminalWidget);
myTerminalWidget.addTab(terminalFile.getName(), terminalFile.getTerminalWidget());
terminalFile.getTerminalWidget().setNextProvider(myTerminalWidget);
}
}
......
......@@ -53,7 +53,7 @@ public class TerminalSessionEditor extends UserDataHolderBase implements FileEdi
final TabbedSettingsProvider settings = myFile.getSettingsProvider();
myFile.getTerminal().setNextProvider(new TerminalActionProviderBase() {
myFile.getTerminalWidget().setNextProvider(new TerminalActionProviderBase() {
@Override
public List<TerminalAction> getActions() {
return Lists.newArrayList(
......@@ -65,7 +65,7 @@ public class TerminalSessionEditor extends UserDataHolderBase implements FileEdi
}
});
myWaitFor = new TtyConnectorWaitFor(myFile.getTerminal().getTtyConnector(), ConcurrencyUtil.newSingleThreadExecutor("Terminal session"));
myWaitFor = new TtyConnectorWaitFor(myFile.getTerminalWidget().getTtyConnector(), ConcurrencyUtil.newSingleThreadExecutor("Terminal session"));
myWaitFor
.setTerminationCallback(integer -> {
......@@ -76,19 +76,19 @@ public class TerminalSessionEditor extends UserDataHolderBase implements FileEdi
}
private void handleCloseSession() {
myFile.getTerminal().close();
myFile.getTerminalWidget().close();
}
@NotNull
@Override
public JComponent getComponent() {
return myFile.getTerminal();
return myFile.getTerminalWidget();
}
@Nullable
@Override
public JComponent getPreferredFocusedComponent() {
return myFile.getTerminal();
return myFile.getTerminalWidget();
}
@NotNull
......@@ -149,7 +149,7 @@ public class TerminalSessionEditor extends UserDataHolderBase implements FileEdi
Boolean closingToReopen = myFile.getUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN);
myWaitFor.detach();
if (closingToReopen == null || !closingToReopen) {
myFile.getTerminal().close();
myFile.getTerminalWidget().close();
}
}
}
......@@ -18,10 +18,13 @@ package org.jetbrains.plugins.terminal.vfs;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorPolicy;
import com.intellij.openapi.fileEditor.FileEditorProvider;
import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.tabs.TabInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.terminal.JBTabInnerTerminalWidget;
/**
* @author traff
......@@ -35,7 +38,26 @@ public class TerminalSessionEditorProvider implements FileEditorProvider, DumbAw
@NotNull
@Override
public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
return new TerminalSessionEditor(project, (TerminalSessionVirtualFileImpl)file);
if (file.getUserData(FileEditorManagerImpl.CLOSING_TO_REOPEN) != null) {
return new TerminalSessionEditor(project, (TerminalSessionVirtualFileImpl)file);
}
else {
TerminalSessionVirtualFileImpl terminalFile = (TerminalSessionVirtualFileImpl)file;
JBTabInnerTerminalWidget widget =
terminalFile.getTerminalWidget().getCreateNewSessionAction().apply(null);
widget.getTabbedWidget().removeTab(widget);
TabInfo tabInfo = new TabInfo(widget).setText(terminalFile.getName());
TerminalSessionVirtualFileImpl newSessionVirtualFile =
new TerminalSessionVirtualFileImpl(tabInfo, widget, terminalFile.getSettingsProvider());
tabInfo
.setObject(newSessionVirtualFile);
return new TerminalSessionEditor(project, newSessionVirtualFile);
}
}
@NotNull
......
......@@ -21,21 +21,21 @@ package org.jetbrains.plugins.terminal.vfs;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.ui.tabs.TabInfo;
import com.jediterm.terminal.ui.JediTermWidget;
import com.jediterm.terminal.ui.settings.TabbedSettingsProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.terminal.JBTabInnerTerminalWidget;
/**
* @author traff
*/
public class TerminalSessionVirtualFileImpl extends LightVirtualFile {
private final JediTermWidget myTerminal;
private final JBTabInnerTerminalWidget myTerminal;
private final TabbedSettingsProvider mySettingsProvider;
private final TabInfo myTabInfo;
public TerminalSessionVirtualFileImpl(@NotNull TabInfo tabInfo,
@NotNull JediTermWidget terminal,
@NotNull JBTabInnerTerminalWidget terminal,
@NotNull TabbedSettingsProvider settingsProvider) {
myTabInfo = tabInfo;
myTerminal = terminal;
......@@ -44,7 +44,7 @@ public class TerminalSessionVirtualFileImpl extends LightVirtualFile {
setWritable(true);
}
public JediTermWidget getTerminal() {
public JBTabInnerTerminalWidget getTerminalWidget() {
return myTerminal;
}
......@@ -53,6 +53,10 @@ public class TerminalSessionVirtualFileImpl extends LightVirtualFile {
return myTabInfo.getText();
}
public TabInfo getTabInfo() {
return myTabInfo;
}
public TabbedSettingsProvider getSettingsProvider() {
return mySettingsProvider;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment