mirror of
https://github.com/php/php-src.git
synced 2025-08-19 17:04:47 +02:00
182 lines
7 KiB
Java
182 lines
7 KiB
Java
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
package phpdbg.ui;
|
|
|
|
/**
|
|
*
|
|
* @author krakjoe
|
|
*/
|
|
import javax.swing.*;
|
|
import javax.swing.text.*;
|
|
import java.awt.Color;
|
|
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 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(h, s, b, bold, false);
|
|
}
|
|
|
|
public JTerminalColor(Float h, Float s, Float b) {
|
|
this(h, s, b, false, 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));
|
|
}
|
|
|
|
public JTerminalColor find(String ANSIColor) {
|
|
if (containsKey(ANSIColor)) {
|
|
return get(ANSIColor);
|
|
} else return get("reset");
|
|
}
|
|
}
|
|
|
|
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"));
|
|
|
|
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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static JTerminalColors colors = new JTerminalColors();
|
|
private JTerminalColor colorCurrent;
|
|
private String remaining = "";
|
|
}
|