package nbtool.gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import nbtool.util.Debug;
import nbtool.util.Debug.DebugSettings;
import nbtool.util.Debug.LogLevel;
import nbtool.util.Utility;
public class ToolMessage extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private static final Color DARK_GREEN = new Color(0,100,0);
private static final Color DARK_ORANGE = new Color(255,140,0);
public static void displayAndPrint(String format, Object ... args) {
dbs.print(format, args);
String displayed = String.format("nbt: " + format, args);
display(displayed, Color.CYAN);
}
public static void displayInfo(String format, Object ... args) {
if (Debug.level.shows(LogLevel.levelINFO)) {
dbs.info(format, args);
String displayed = String.format("nbt: " + format, args);
display(displayed, DARK_GREEN);
}
}
public static void displayWarn(String format, Object ... args) {
if (Debug.level.shows(LogLevel.levelWARN)) {
dbs.warn(format, args);
String displayed = String.format("nbt: " + format, args);
display(displayed, DARK_ORANGE);
}
}
public static void displayError(String format, Object ... args) {
if (Debug.level.shows(LogLevel.levelERROR)) {
dbs.error(format, args);
String displayed = String.format("nbt: " + format, args);
display(displayed, Color.RED);
}
}
private static final int toolMessageSpace = 40;
private static final ToolMessage[] spaces =
new ToolMessage[Toolkit.getDefaultToolkit().getScreenSize().height / toolMessageSpace - 1];
private int yIndex = -1;
static {
for (int i = 0; i < spaces.length; ++i)
spaces[i] = null;
}
public static void display(final String message, final Color color) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
final ToolMessage tm = new ToolMessage(message, color);
}
});
}
private static DebugSettings dbs = new DebugSettings(true, true, true, null, null){
@Override
protected String instanceLocation() {
StackTraceElement rel = Utility.codeLocation(5);
return formatLocation(rel);
}
};
private ToolMessage(String message, Color textColor) {
super();
synchronized(spaces) {
for (int i = 0; i < spaces.length; ++i) {
if (spaces[i] == null) {
yIndex = i;
spaces[i] = this;
break;
}
}
}
// Debug.plain("%d out of %d", yIndex, spaces.length);
if (yIndex < 0) yIndex = 1;
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
initComponents(message, textColor);
setVisible(true);
disposeTimer = new Timer(5000, this);
disposeTimer.start();
this.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
actionPerformed(null);
}
});
}
private final int fontSize = 16;
private final int labelHeight = 30;
private Timer disposeTimer;
private void initComponents(String msg, Color color) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setLayout(null);
setUndecorated(true);
setAlwaysOnTop(true);
setFocusable(false);
setResizable(false);
setOpacity(0.8F);
JLabel msgLabel = new JLabel(msg);
msgLabel.setForeground(color);
msgLabel.setFont(msgLabel.getFont().deriveFont((float) fontSize));
add(msgLabel);
Font labelFont = msgLabel.getFont();
int stringWidth = msgLabel.getFontMetrics(labelFont).stringWidth(msg);
final int labelWidth = stringWidth + 10;
msgLabel.setBounds(0, 0, labelWidth, labelHeight);
setBounds(screenSize.width - labelWidth - 50,
50 + toolMessageSpace*yIndex, labelWidth,
labelHeight);
}
@Override
public void actionPerformed(ActionEvent e) {
if (disposeTimer != null) {
disposeTimer.stop();
disposeTimer = null;
synchronized(spaces) {
if (spaces[yIndex] == this)
spaces[yIndex] = null;
}
this.setVisible(false);
this.dispose();
}
}
//testing
public static void main(String[] args) throws InterruptedException {
String string = "The quick brown fox jumped over the lazy dog.";
ToolMessage.displayInfo(string);
ToolMessage.displayWarn(string);
ToolMessage.displayError(string);
}
}