import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
+import java.util.HashMap;
import javax.imageio.ImageIO;
public class JTerminalPane extends JTextPane {
-
- private static final Color D_Black = Color.getHSBColor( 0.000f, 0.000f, 0.000f );
- private static final Color D_Red = Color.getHSBColor( 0.000f, 1.000f, 0.502f );
- private static final Color D_Blue = Color.getHSBColor( 0.667f, 1.000f, 0.502f );
- private static final Color D_Magenta = Color.getHSBColor( 0.833f, 1.000f, 0.502f );
- private static final Color D_Green = Color.getHSBColor( 0.333f, 1.000f, 0.502f );
- private static final Color D_Yellow = Color.getHSBColor( 0.167f, 1.000f, 0.502f );
- private static final Color D_Cyan = Color.getHSBColor( 0.500f, 1.000f, 0.502f );
- private static final Color D_White = Color.getHSBColor( 0.000f, 0.000f, 0.753f );
- private static final Color B_Black = Color.getHSBColor( 0.000f, 0.000f, 0.502f );
- private static final Color B_Red = Color.getHSBColor( 0.000f, 1.000f, 1.000f );
- private static final Color B_Blue = Color.getHSBColor( 0.667f, 1.000f, 1.000f );
- private static final Color B_Magenta = Color.getHSBColor( 0.833f, 1.000f, 1.000f );
- private static final Color B_Green = Color.getHSBColor( 0.333f, 1.000f, 1.000f );
- private static final Color B_Yellow = Color.getHSBColor( 0.167f, 1.000f, 1.000f );
- private static final Color B_Cyan = Color.getHSBColor( 0.500f, 1.000f, 1.000f );
- private static final Color B_White = Color.getHSBColor( 0.000f, 0.000f, 1.000f );
- private static final Color cReset = Color.getHSBColor( 0.000f, 0.000f, 1.000f );
-
- private Color colorCurrent = cReset;
- private String remaining = "";
-
- public JTerminalPane() {
- super();
- setOpaque(false);
- setBackground(new Color(0, 0, 0, 0));
- }
-
- @Override public void paintComponent(Graphics g) {
- g.setColor(Color.BLACK);
- g.fillRect(0, 0, getWidth(), getHeight());
-
- try {
- Image image = ImageIO.read(
- JTerminalPane.class.getResource("logo-small.png"));
-
- g.drawImage(
- image,
- getWidth() - image.getWidth(this) - 10,
- getHeight() - image.getHeight(this) - 10,
- image.getWidth(this), image.getHeight(this), this);
-
- } catch (IOException | NullPointerException | IllegalArgumentException ex) {}
-
- super.paintComponent(g);
- }
-
- public void append(Color c, String s) {
- StyleContext sc = StyleContext.getDefaultStyleContext();
- AttributeSet aset = sc.addAttribute(
- SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
- setCharacterAttributes(aset, false);
- replaceSelection(s);
- setCaretPosition(getDocument().getLength());
- }
-
- public synchronized void appendANSI(String s) {
- int aPos = 0;
- int aIndex;
- int mIndex;
- String tmpString;
- boolean stillSearching;
-
- String addString = remaining + s;
-
- remaining = "";
-
- if (addString.length() > 0) {
- aIndex = addString.indexOf("\u001B");
- if (aIndex == -1) {
- append(colorCurrent,addString);
- return;
- }
-
- if (aIndex > 0) {
- tmpString = addString.substring(0,aIndex);
- append(colorCurrent, tmpString);
- aPos = aIndex;
- }
-
- stillSearching = true;
- while (stillSearching) {
- mIndex = addString.indexOf("m",aPos);
- if (mIndex < 0) {
- remaining = addString.substring(aPos,addString.length());
- stillSearching = false;
- continue;
+ private static class JTerminalColor {
+ private final Color color;
+ private final Boolean bold;
+ private final Boolean underline;
+
+ public JTerminalColor(Float h, Float s, Float b, Boolean bold, Boolean underline) {
+ this.color = Color.getHSBColor(h, s, b);
+ this.bold = bold;
+ this.underline = underline;
+ }
+
+ public JTerminalColor(Float h, Float s, Float b, Boolean bold) {
+ this.color = Color.getHSBColor(h, s, b);
+ this.bold = bold;
+ this.underline = false;
+ }
+
+ public JTerminalColor(Float h, Float s, Float b) {
+ this.color = Color.getHSBColor(h, s, b);
+ this.underline = false;
+ this.bold = false;
+ }
+
+ public Boolean isUnderlined() { return this.underline; }
+ public Boolean isBold() { return this.bold; }
+ public Color getColor() { return this.color; }
+ }
+
+ private static class JTerminalColors extends HashMap<String, JTerminalColor> {
+ public JTerminalColors() {
+ put("\u001B[0;30m", new JTerminalColor(0.000f, 0.000f, 0.502f));
+ put("\u001B[0;31m", new JTerminalColor(0.000f, 1.000f, 1.000f));
+ put("\u001B[0;32m", new JTerminalColor(0.333f, 1.000f, 1.000f));
+ put("\u001B[0;33m", new JTerminalColor(0.167f, 1.000f, 1.000f));
+ put("\u001B[0;34m", new JTerminalColor(0.667f, 1.000f, 1.000f));
+ put("\u001B[0;35m", new JTerminalColor(0.833f, 1.000f, 1.000f));
+ put("\u001B[0;36m", new JTerminalColor(0.500f, 1.000f, 1.000f));
+ put("\u001B[0;37m", new JTerminalColor(0.000f, 0.000f, 1.000f));
+ put("\u001B[0;64m", new JTerminalColor(0.000f, 0.000f, 1.000f));
+
+ put("\u001B[1;30m", new JTerminalColor(0.000f, 0.000f, 0.502f, true));
+ put("\u001B[1;31m", new JTerminalColor(0.000f, 1.000f, 1.000f, true));
+ put("\u001B[1;32m", new JTerminalColor(0.333f, 1.000f, 1.000f, true));
+ put("\u001B[1;33m", new JTerminalColor(0.167f, 1.000f, 1.000f, true));
+ put("\u001B[1;34m", new JTerminalColor(0.667f, 1.000f, 1.000f, true));
+ put("\u001B[1;35m", new JTerminalColor(0.833f, 1.000f, 1.000f, true));
+ put("\u001B[1;36m", new JTerminalColor(0.500f, 1.000f, 1.000f, true));
+ put("\u001B[1;37m", new JTerminalColor(0.000f, 0.000f, 1.000f, true));
+ put("\u001B[1;64m", new JTerminalColor(0.000f, 0.000f, 1.000f, true));
+
+ put("\u001B[4;30m", new JTerminalColor(0.000f, 0.000f, 0.502f, false, true));
+ put("\u001B[4;31m", new JTerminalColor(0.000f, 1.000f, 1.000f, false, true));
+ put("\u001B[4;32m", new JTerminalColor(0.333f, 1.000f, 1.000f, false, true));
+ put("\u001B[4;33m", new JTerminalColor(0.167f, 1.000f, 1.000f, false, true));
+ put("\u001B[4;34m", new JTerminalColor(0.667f, 1.000f, 1.000f, false, true));
+ put("\u001B[4;35m", new JTerminalColor(0.833f, 1.000f, 1.000f, false, true));
+ put("\u001B[4;36m", new JTerminalColor(0.500f, 1.000f, 1.000f, false, true));
+ put("\u001B[4;37m", new JTerminalColor(0.000f, 0.000f, 1.000f, false, true));
+ put("\u001B[4;64m", new JTerminalColor(0.000f, 0.000f, 1.000f, false, true));
+
+ put("reset", new JTerminalColor(0.000f, 0.000f, 1.000f));
}
- else {
- tmpString = addString.substring(aPos,mIndex+1);
- colorCurrent = getANSIColor(tmpString);
+
+ public JTerminalColor find(String ANSIColor) {
+ if (containsKey(ANSIColor)) {
+ return get(ANSIColor);
+ } else return get("reset");
}
- aPos = mIndex + 1;
+ }
+
+ public JTerminalPane() {
+ super();
+ setOpaque(false);
+ setBackground(new Color(0, 0, 0, 0));
+ colorCurrent = colors.find("reset");
+ }
+
+ @Override public void paintComponent(Graphics g) {
+ g.setColor(Color.BLACK);
+ g.fillRect(0, 0, getWidth(), getHeight());
+
+ try {
+ Image image = ImageIO.read(
+ JTerminalPane.class.getResource("logo-small.png"));
- aIndex = addString.indexOf("\u001B", aPos);
+ g.drawImage(
+ image,
+ getWidth() - image.getWidth(this) - 10,
+ getHeight() - image.getHeight(this) - 10,
+ image.getWidth(this), image.getHeight(this), this);
- if (aIndex == -1) {
- tmpString = addString.substring(aPos,addString.length());
- append(colorCurrent, tmpString);
- stillSearching = false;
- continue;
+ } catch (IOException | NullPointerException | IllegalArgumentException ex) {}
+
+ super.paintComponent(g);
+ }
+
+ private void append(JTerminalColor c, String s) {
+ StyleContext sc = StyleContext.getDefaultStyleContext();
+ AttributeSet aset = sc.addAttribute(
+ SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c.getColor());
+
+ aset = sc.addAttribute(aset, StyleConstants.Underline, c.isUnderlined());
+ aset = sc.addAttribute(aset, StyleConstants.Bold, c.isBold());
+
+ setCharacterAttributes(aset, false);
+ replaceSelection(s);
+ setCaretPosition(getDocument().getLength());
+ }
+
+ public synchronized void appendANSI(String s) {
+ int aPos = 0;
+ int aIndex;
+ int mIndex;
+ String tmpString;
+ boolean stillSearching;
+
+ String addString = remaining + s;
+
+ remaining = "";
+
+ if (addString.length() > 0) {
+ aIndex = addString.indexOf("\u001B");
+ if (aIndex == -1) {
+ append(colorCurrent,addString);
+ return;
+ }
+
+ if (aIndex > 0) {
+ tmpString = addString.substring(0,aIndex);
+ append(colorCurrent, tmpString);
+ aPos = aIndex;
+ }
+
+ stillSearching = true;
+ while (stillSearching) {
+ mIndex = addString.indexOf("m",aPos);
+ if (mIndex < 0) {
+ remaining = addString.substring(aPos,addString.length());
+ stillSearching = false;
+ continue;
+ }
+ else {
+ tmpString = addString.substring(aPos,mIndex+1);
+ colorCurrent = colors.find(tmpString);
+ }
+ aPos = mIndex + 1;
+
+ aIndex = addString.indexOf("\u001B", aPos);
+
+ if (aIndex == -1) {
+ tmpString = addString.substring(aPos,addString.length());
+ append(colorCurrent, tmpString);
+ stillSearching = false;
+ continue;
+ }
+ tmpString = addString.substring(aPos,aIndex);
+ aPos = aIndex;
+ append(colorCurrent, tmpString);
+ }
}
- tmpString = addString.substring(aPos,aIndex);
- aPos = aIndex;
- append(colorCurrent, tmpString);
- }
}
- }
-
- public Color getANSIColor(String ANSIColor) {
- switch (ANSIColor) {
- case "\u001B[30m":
- return D_Black;
- case "\u001B[31m":
- return D_Red;
- case "\u001B[32m":
- return D_Green;
- case "\u001B[33m":
- return D_Yellow;
- case "\u001B[34m":
- return D_Blue;
- case "\u001B[35m":
- return D_Magenta;
- case "\u001B[36m":
- return D_Cyan;
- case "\u001B[37m":
- return D_White;
- case "\u001B[0;30m":
- return D_Black;
- case "\u001B[0;31m":
- return D_Red;
- case "\u001B[0;32m":
- return D_Green;
- case "\u001B[0;33m":
- return D_Yellow;
- case "\u001B[0;34m":
- return D_Blue;
- case "\u001B[0;35m":
- return D_Magenta;
- case "\u001B[0;36m":
- return D_Cyan;
- case "\u001B[0;37m":
- return D_White;
- case "\u001B[1;30m":
- return B_Black;
- case "\u001B[1;31m":
- return B_Red;
- case "\u001B[1;32m":
- return B_Green;
- case "\u001B[1;33m":
- return B_Yellow;
- case "\u001B[1;34m":
- return B_Blue;
- case "\u001B[1;35m":
- return B_Magenta;
- case "\u001B[1;36m":
- return B_Cyan;
- case "\u001B[1;37m":
- return B_White;
- case "\u001B[0m":
- return cReset;
- default:
- return B_White;
- }
- }
+
+ private static JTerminalColors colors = new JTerminalColors();
+ private JTerminalColor colorCurrent;
+ private String remaining = "";
}