Highlight urls in terminal on hover when control is down (IDEA-136672)

This commit is contained in:
Dmitry Trofimov
2017-02-02 14:14:08 +01:00
parent 7de51ce97b
commit 4ec7a7550f
5 changed files with 43 additions and 44 deletions
Binary file not shown.
Binary file not shown.
@@ -29,10 +29,13 @@ import com.intellij.util.ui.RegionPainter;
import com.jediterm.terminal.SubstringFinder;
import com.jediterm.terminal.TerminalStarter;
import com.jediterm.terminal.TtyConnector;
import com.jediterm.terminal.model.HyperlinkFilter;
import com.jediterm.terminal.model.JediTerminal;
import com.jediterm.terminal.model.StyleState;
import com.jediterm.terminal.model.TerminalTextBuffer;
import com.jediterm.terminal.model.hyperlinks.HyperlinkFilter;
import com.jediterm.terminal.model.hyperlinks.LinkInfo;
import com.jediterm.terminal.model.hyperlinks.LinkResult;
import com.jediterm.terminal.model.hyperlinks.LinkResultItem;
import com.jediterm.terminal.ui.JediTermWidget;
import com.jediterm.terminal.ui.TerminalAction;
import com.jediterm.terminal.ui.settings.SettingsProvider;
@@ -55,7 +58,11 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
this(project, 80, 24, settingsProvider, parent);
}
public JBTerminalWidget(Project project, int columns, int lines, JBTerminalSystemSettingsProviderBase settingsProvider, Disposable parent) {
public JBTerminalWidget(Project project,
int columns,
int lines,
JBTerminalSystemSettingsProviderBase settingsProvider,
Disposable parent) {
super(columns, lines, settingsProvider);
myProject = project;
mySettingsProvider = settingsProvider;
@@ -112,24 +119,24 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
@Override
public List<TerminalAction> getActions() {
List<TerminalAction> actions = super.getActions();
if (!mySettingsProvider.overrideIdeShortcuts()) {
actions
.add(new TerminalAction("EditorEscape", new KeyStroke[]{KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)}, new Predicate<KeyEvent>() {
@Override
public boolean apply(KeyEvent input) {
if (!myTerminalPanel.getTerminalTextBuffer().isUsingAlternateBuffer()) {
ToolWindowManager.getInstance(myProject).activateEditorComponent();
return true;
}
else {
return false;
}
}
}).withHidden(true));
}
return actions;
};
List<TerminalAction> actions = super.getActions();
if (!mySettingsProvider.overrideIdeShortcuts()) {
actions
.add(new TerminalAction("EditorEscape", new KeyStroke[]{KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)}, new Predicate<KeyEvent>() {
@Override
public boolean apply(KeyEvent input) {
if (!myTerminalPanel.getTerminalTextBuffer().isUsingAlternateBuffer()) {
ToolWindowManager.getInstance(myProject).activateEditorComponent();
return true;
}
else {
return false;
}
}
}).withHidden(true));
}
return actions;
}
@Override
public void dispose() {
@@ -178,31 +185,12 @@ public class JBTerminalWidget extends JediTermWidget implements Disposable {
public void addMessageFilter(Project project, Filter filter) {
addHyperlinkFilter(new HyperlinkFilter() {
@Override
public Result apply(String line) {
public LinkResult apply(String line) {
Filter.Result r = filter.applyFilter(line, line.length());
if (r != null) {
return new Result() {
@Override
public List<ResultItem> getResultItems() {
return r.getResultItems().stream().map((item -> new ResultItem() {
@Override
public int getStartOffset() {
return item.getHighlightStartOffset();
}
@Override
public int getEndOffset() {
return item.getHighlightEndOffset();
}
@Override
public void navigate() {
item.getHyperlinkInfo().navigate(project);
}
})).collect(Collectors.toList());
}
};
return new LinkResult(r.getResultItems().stream().map(
(item -> new LinkResultItem(item.getHighlightStartOffset(), item.getHighlightEndOffset(), new LinkInfo(
() -> item.getHyperlinkInfo().navigate(project))))).collect(Collectors.toList()));
}
else {
return null;
@@ -27,6 +27,7 @@ import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
import com.jediterm.terminal.HyperlinkStyle;
import com.jediterm.terminal.TerminalStarter;
import com.jediterm.terminal.TtyConnector;
import com.jediterm.terminal.model.JediTerminal;
@@ -49,7 +50,13 @@ public class TerminalExecutionConsole implements ConsoleView {
public TerminalExecutionConsole(@NotNull Project project, @NotNull ProcessHandler processHandler) {
myProject = project;
final JBTerminalSystemSettingsProviderBase provider = new JBTerminalSystemSettingsProviderBase();
final JBTerminalSystemSettingsProviderBase provider = new JBTerminalSystemSettingsProviderBase() {
@Override
public HyperlinkStyle.HighlightMode getHyperlinkHighlightingMode() {
return HyperlinkStyle.HighlightMode.ALWAYS;
}
};
myDataStream = new AppendableTerminalDataStream();
@@ -16,6 +16,7 @@
package org.jetbrains.plugins.terminal;
import com.google.common.base.Predicate;
import com.intellij.execution.filters.UrlFilter;
import com.intellij.ide.dnd.DnDDropHandler;
import com.intellij.ide.dnd.DnDEvent;
import com.intellij.ide.dnd.DnDSupport;
@@ -138,6 +139,9 @@ public class JBTabbedTerminalWidget extends TabbedTerminalWidget implements Disp
@Override
protected JediTermWidget createInnerTerminalWidget(TabbedSettingsProvider settingsProvider) {
JBTerminalWidget widget = new JBTerminalWidget(myProject, mySettingsProvider, myParent);
widget.addMessageFilter(myProject, new UrlFilter());
convertActions(widget, widget.getActions());
convertActions(widget.getTerminalPanel(), widget.getTerminalPanel().getActions(), new Predicate<KeyEvent>() {
@Override