PY-19960 PY-14096 Merge right-click menu creation for toggle output and split/merge...
[idea/community.git] / python / ipnb / src / org / jetbrains / plugins / ipnb / editor / panels / code / IpnbErrorPanel.java
1 package org.jetbrains.plugins.ipnb.editor.panels.code;
2
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;
10
11 import javax.swing.*;
12 import javax.swing.text.AttributeSet;
13 import javax.swing.text.SimpleAttributeSet;
14 import javax.swing.text.StyleConstants;
15 import javax.swing.text.StyleContext;
16 import java.awt.*;
17 import java.util.List;
18
19 public class IpnbErrorPanel extends IpnbCodeOutputPanel<IpnbErrorOutputCell> {
20   public IpnbErrorPanel(@NotNull final IpnbErrorOutputCell cell, @Nullable IpnbCodePanel ipnbCodePanel) {
21     super(cell, null, ipnbCodePanel);
22   }
23
24   @Override
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;
36   }
37
38
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");
45
46     static final Color cReset = JBColor.BLACK;
47
48     static Color currentColor = cReset;
49     String remaining = "";
50
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);
57       replaceSelection(s);
58     }
59
60     public void appendANSI(String string) {
61       int position = 0;
62       int index;
63       int mIndex;
64       String substring;
65       boolean continueSearch;
66       String addString = remaining + string;
67       remaining = "";
68
69       if (addString.length() > 0) {
70         index = addString.indexOf("\u001B");
71         if (index == -1) {
72           append(currentColor, addString);
73           return;
74         }
75
76         if (index > 0) {
77           substring = addString.substring(0, index);
78           append(currentColor, substring);
79           position = index;
80         }
81         continueSearch = true;
82         while (continueSearch) {
83           mIndex = addString.indexOf("m", position);
84           if (mIndex < 0) {
85             remaining = addString.substring(position, addString.length());
86             continueSearch = false;
87             continue;
88           }
89           else {
90             substring = addString.substring(position, mIndex + 1);
91             //noinspection AssignmentToStaticFieldFromInstanceMethod
92             currentColor = getANSIColor(substring);
93           }
94           position = mIndex + 1;
95
96           index = addString.indexOf("\u001B", position);
97
98           if (index == -1) {
99             substring = addString.substring(position, addString.length());
100             append(currentColor, substring);
101             continueSearch = false;
102             continue;
103           }
104
105           substring = addString.substring(position, index);
106           position = index;
107           append(currentColor, substring);
108         }
109       }
110     }
111
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;
115       }
116       else if (ANSIColor.equals("\u001B[31m") || ANSIColor.equals("\u001B[0;31m") || ANSIColor.equals("\u001B[1;31m")) {
117         return D_Red;
118       }
119       else if (ANSIColor.equals("\u001B[32m") || ANSIColor.equals("\u001B[0;32m") || ANSIColor.equals("\u001B[1;32m")) {
120         return D_Green;
121       }
122       else if (ANSIColor.equals("\u001B[33m") || ANSIColor.equals("\u001B[0;33m") || ANSIColor.equals("\u001B[1;33m")) {
123         return D_Yellow;
124       }
125       else if (ANSIColor.equals("\u001B[34m") || ANSIColor.equals("\u001B[0;34m") || ANSIColor.equals("\u001B[1;34m")) {
126         return JBColor.BLUE;
127       }
128       else if (ANSIColor.equals("\u001B[35m") || ANSIColor.equals("\u001B[0;35m") || ANSIColor.equals("\u001B[1;35m")) {
129         return D_Magenta;
130       }
131       else if (ANSIColor.equals("\u001B[36m") || ANSIColor.equals("\u001B[0;36m") || ANSIColor.equals("\u001B[1;36m")) {
132         return D_Cyan;
133       }
134       else if (ANSIColor.equals("\u001B[37m") || ANSIColor.equals("\u001B[0;37m") || ANSIColor.equals("\u001B[1;37m")) {
135         return JBColor.WHITE;
136       }
137       else if (ANSIColor.equals("\u001B[0m")) {
138         return cReset;
139       }
140       else {
141         return JBColor.WHITE;
142       }
143     }
144   }
145 }