2 * Copyright 2000-2016 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.terminal;
18 import com.intellij.execution.filters.Filter;
19 import com.intellij.execution.process.ProcessAdapter;
20 import com.intellij.execution.process.ProcessEvent;
21 import com.intellij.execution.process.ProcessHandler;
22 import com.intellij.execution.process.ProcessOutputTypes;
23 import com.intellij.execution.ui.ConsoleViewContentType;
24 import com.intellij.execution.ui.ExecutionConsole;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.openapi.util.Key;
27 import com.intellij.openapi.vfs.encoding.EncodingProjectManager;
28 import com.jediterm.terminal.TerminalStarter;
29 import com.jediterm.terminal.TtyConnector;
30 import com.jediterm.terminal.model.HyperlinkFilter;
31 import com.jediterm.terminal.model.JediTerminal;
32 import com.jediterm.terminal.ui.TerminalSession;
33 import com.jediterm.terminal.util.CharUtils;
34 import org.jetbrains.annotations.NotNull;
38 import java.io.IOException;
39 import java.util.List;
40 import java.util.stream.Collectors;
45 public class TerminalExecutionConsole implements ExecutionConsole {
46 private JBTerminalWidget myTerminalWidget;
48 public TerminalExecutionConsole(@NotNull Project project, @NotNull ProcessHandler processHandler) {
49 final JBTerminalSystemSettingsProviderBase provider = new JBTerminalSystemSettingsProviderBase();
50 AppendableTerminalDataStream dataStream = new AppendableTerminalDataStream();
53 myTerminalWidget = new JBTerminalWidget(project, 200, 24, provider, this) {
55 protected TerminalStarter createTerminalStarter(JediTerminal terminal, TtyConnector connector) {
56 return new TerminalStarter(terminal, connector, dataStream);
60 TerminalSession session = myTerminalWidget
61 .createTerminalSession(new ProcessHandlerTtyConnector(processHandler, EncodingProjectManager.getInstance(project).getDefaultCharset()));
63 processHandler.addProcessListener(new ProcessAdapter() {
65 public void startNotified(ProcessEvent event) {
70 public void onTextAvailable(ProcessEvent event, Key outputType) {
72 if (outputType != ProcessOutputTypes.STDOUT) {
73 ConsoleViewContentType contentType = ConsoleViewContentType.getConsoleViewType(outputType);
74 dataStream.append(encodeColor(contentType.getAttributes().getForegroundColor()));
76 dataStream.append(event.getText());
77 if (outputType != ProcessOutputTypes.STDOUT) {
78 dataStream.append((char)CharUtils.ESC + "[39m"); //restore color
81 if (outputType == ProcessOutputTypes.SYSTEM) {
82 dataStream.append('\r');
85 catch (IOException e) {
91 public void processTerminated(ProcessEvent event) {
92 myTerminalWidget.getTerminalPanel().setCursorVisible(false);
97 public void addMessageFilter(Project project, Filter filter) {
98 myTerminalWidget.addHyperlinkFilter(new HyperlinkFilter() {
100 public Result apply(String line) {
101 Filter.Result r = filter.applyFilter(line, line.length());
103 return new Result() {
106 public List<ResultItem> getResultItems() {
107 return r.getResultItems().stream().map((item -> new ResultItem() {
109 public int getStartOffset() {
110 return item.getHighlightStartOffset();
114 public int getEndOffset() {
115 return item.getHighlightEndOffset();
119 public void navigate() {
120 item.getHyperlinkInfo().navigate(project);
122 })).collect(Collectors.toList());
133 private static String encodeColor(Color color) {
134 StringBuilder sb = new StringBuilder();
135 sb.append((char)CharUtils.ESC).append("[").append("38;2;").append(color.getRed()).append(";").append(color.getGreen()).append(";")
136 .append(color.getBlue()).append("m");
137 return sb.toString();
141 public JComponent getComponent() {
142 return myTerminalWidget.getComponent();
146 public JComponent getPreferredFocusableComponent() {
147 return myTerminalWidget.getComponent();
151 public void dispose() {
152 myTerminalWidget = null;