1 package org.jetbrains.plugins.ipnb.editor.panels.code;
3 import com.intellij.openapi.editor.colors.EditorColorsManager;
4 import com.intellij.openapi.util.text.StringUtil;
5 import com.intellij.ui.JBColor;
6 import org.jetbrains.annotations.NotNull;
7 import org.jetbrains.annotations.Nullable;
8 import org.jetbrains.plugins.ipnb.editor.IpnbEditorUtil;
9 import org.jetbrains.plugins.ipnb.format.cells.output.IpnbErrorOutputCell;
12 import javax.swing.text.AttributeSet;
13 import javax.swing.text.SimpleAttributeSet;
14 import javax.swing.text.StyleConstants;
15 import javax.swing.text.StyleContext;
17 import java.util.List;
19 public class IpnbErrorPanel extends IpnbCodeOutputPanel<IpnbErrorOutputCell> {
20 public IpnbErrorPanel(@NotNull final IpnbErrorOutputCell cell, @Nullable IpnbCodePanel ipnbCodePanel) {
21 super(cell, null, ipnbCodePanel);
25 protected JComponent createViewPanel() {
26 final List<String> text = myCell.getText();
27 if (text == null) return new JLabel();
28 ColorPane ansiColoredPane = new ColorPane();
29 final Font font = ansiColoredPane.getFont();
30 final Font newFont = new Font(font.getName(), font.getStyle(), EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize());
31 ansiColoredPane.setFont(newFont);
32 ansiColoredPane.appendANSI(StringUtil.join(text, ""));
33 ansiColoredPane.setBackground(IpnbEditorUtil.getBackground());
34 ansiColoredPane.setEditable(false);
35 return ansiColoredPane;
39 public static class ColorPane extends JTextPane {
40 static final Color D_Red = Color.decode("#8B0000");
41 static final Color D_Magenta = JBColor.MAGENTA;
42 static final Color D_Green = Color.decode("#006400");
43 static final Color D_Yellow = Color.decode("#A52A2A");
44 static final Color D_Cyan = Color.decode("#5AB4EB");
46 static final Color cReset = JBColor.BLACK;
48 static Color currentColor = cReset;
49 String remaining = "";
51 public void append(Color color, String s) {
52 StyleContext styleContext = StyleContext.getDefaultStyleContext();
53 AttributeSet attributeSet = styleContext.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, color);
54 int len = getDocument().getLength();
55 setCaretPosition(len);
56 setCharacterAttributes(attributeSet, false);
60 public void appendANSI(String string) {
65 boolean continueSearch;
66 String addString = remaining + string;
69 if (addString.length() > 0) {
70 index = addString.indexOf("\u001B");
72 append(currentColor, addString);
77 substring = addString.substring(0, index);
78 append(currentColor, substring);
81 continueSearch = true;
82 while (continueSearch) {
83 mIndex = addString.indexOf("m", position);
85 remaining = addString.substring(position, addString.length());
86 continueSearch = false;
90 substring = addString.substring(position, mIndex + 1);
91 //noinspection AssignmentToStaticFieldFromInstanceMethod
92 currentColor = getANSIColor(substring);
94 position = mIndex + 1;
96 index = addString.indexOf("\u001B", position);
99 substring = addString.substring(position, addString.length());
100 append(currentColor, substring);
101 continueSearch = false;
105 substring = addString.substring(position, index);
107 append(currentColor, substring);
112 public static Color getANSIColor(String ANSIColor) {
113 if (ANSIColor.equals("\u001B[30m") || ANSIColor.equals("\u001B[0;30m") || ANSIColor.equals("\u001B[1;30m")) {
114 return JBColor.BLACK;
116 else if (ANSIColor.equals("\u001B[31m") || ANSIColor.equals("\u001B[0;31m") || ANSIColor.equals("\u001B[1;31m")) {
119 else if (ANSIColor.equals("\u001B[32m") || ANSIColor.equals("\u001B[0;32m") || ANSIColor.equals("\u001B[1;32m")) {
122 else if (ANSIColor.equals("\u001B[33m") || ANSIColor.equals("\u001B[0;33m") || ANSIColor.equals("\u001B[1;33m")) {
125 else if (ANSIColor.equals("\u001B[34m") || ANSIColor.equals("\u001B[0;34m") || ANSIColor.equals("\u001B[1;34m")) {
128 else if (ANSIColor.equals("\u001B[35m") || ANSIColor.equals("\u001B[0;35m") || ANSIColor.equals("\u001B[1;35m")) {
131 else if (ANSIColor.equals("\u001B[36m") || ANSIColor.equals("\u001B[0;36m") || ANSIColor.equals("\u001B[1;36m")) {
134 else if (ANSIColor.equals("\u001B[37m") || ANSIColor.equals("\u001B[0;37m") || ANSIColor.equals("\u001B[1;37m")) {
135 return JBColor.WHITE;
137 else if (ANSIColor.equals("\u001B[0m")) {
141 return JBColor.WHITE;