From 835446e63266d503a61848a3ed7d7ad48fb7ba86 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 30 Nov 2013 17:19:01 +0000 Subject: [PATCH] support all colors and underline in java ui --- phpdbg_utils.c | 4 +- tutorials/java/dist/phpdbg-ui.jar | Bin 42506 -> 45489 bytes .../java/src/phpdbg/ui/JTerminalPane.java | 319 +++++++++--------- 3 files changed, 162 insertions(+), 161 deletions(-) diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 5232f31747..4b58448f0a 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -257,12 +257,12 @@ PHPDBG_API int phpdbg_rlog(FILE *fp, const char *fmt, ...) { /* {{{ */ strftime(friendly, 100, "%a %b %d %T.%%04d %Y", localtime(&tp.tv_sec)); asprintf( - &buffer, friendly, tp.tv_usec/1000); + &buffer, friendly, tp.tv_usec/1000); asprintf( &format, "[%s]: %s\n", buffer, fmt); rc = vfprintf( fp, format, args); - + free(format); free(buffer); } diff --git a/tutorials/java/dist/phpdbg-ui.jar b/tutorials/java/dist/phpdbg-ui.jar index f1d9f9fddb89b094c3a91a1c0331dfd96aeac283..2252c545b9e0dbe494298f33ff99c72811f460b8 100644 GIT binary patch delta 6352 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 diff --git a/tutorials/java/src/phpdbg/ui/JTerminalPane.java b/tutorials/java/src/phpdbg/ui/JTerminalPane.java index ae63c22300..6f79eb0f89 100644 --- a/tutorials/java/src/phpdbg/ui/JTerminalPane.java +++ b/tutorials/java/src/phpdbg/ui/JTerminalPane.java @@ -16,172 +16,173 @@ 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 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 { + 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 = ""; } -- 2.50.1