package org.ripple.power.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.LineBorder;
import org.ripple.power.config.LSystem;
import org.ripple.power.i18n.LangConfig;
import org.ripple.power.sound.LWaveSound;
import org.ripple.power.txns.Updateable;
import org.ripple.power.ui.graphics.LColor;
import org.ripple.power.ui.view.RPLabel;
import org.ripple.power.ui.view.RPTextArea;
public class RPBubbleDialog {
final static LWaveSound wave = new LWaveSound();
public static class TipDialog extends JDialog implements WindowListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private static Dimension dim;
private int x, y;
private final int width, height;
private static Insets screenInsets;
private boolean closed;
public TipDialog(final int width, final int height) {
this.width = width;
this.height = height;
dim = Toolkit.getDefaultToolkit().getScreenSize();
screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(
this.getGraphicsConfiguration());
x = (int) (dim.getWidth() - width - 3);
y = (int) (dim.getHeight() - screenInsets.bottom - 3);
initComponents();
}
public void run() {
for (int i = 0; i <= height; i += 10) {
this.setLocation(x, y - i);
LSystem.sleep(5);
}
wave.playSound("jump.wav");
}
private void initComponents() {
this.setSize(width, height);
this.setLocation(x, y);
this.setBackground(LColor.black);
}
public void close() {
if (!closed) {
closed = true;
x = this.getX();
y = this.getY();
int ybottom = (int) dim.getHeight() - screenInsets.bottom;
for (int i = 0; i <= ybottom - y; i += 10) {
setLocation(x, y + i);
LSystem.sleep(5);
}
dispose();
}
}
public boolean isClosed() {
return closed;
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
close();
}
@Override
public void windowDeactivated(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowOpened(WindowEvent e) {
}
}
private JPanel _headPane = null;
private JPanel _backPane = null;
private JPanel _btnPane = null;
private RPLabel _titleLabel = null;
private RPLabel _closeLabel = null;
private RPTextArea _contentText = null;
private JScrollPane _backagePane = null;
private RPLabel _updateLabel = null;
private Point _oldPos;
private TipDialog _tpDialog = null;
private int _width = 300, _height = 120;
private String _message;
public RPBubbleDialog(final String mes, final boolean autoClose) {
this(mes, 300, 120, autoClose);
}
public RPBubbleDialog(final String mes, final int w, final int h,
final boolean autoClose) {
_message = mes;
_width = w;
_height = h;
_tpDialog = new TipDialog(_width, _height);
_headPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
_backPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
_btnPane = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
_titleLabel = new RPLabel(LangConfig.get(this, "news", "News"));
_closeLabel = new RPLabel("X");
_closeLabel.setHorizontalAlignment(JLabel.CENTER);
_contentText = new RPTextArea(_message);
_backagePane = new JScrollPane(_contentText);
_updateLabel = new RPLabel();
((JPanel) _tpDialog.getContentPane())
.setBackground(UIConfig.dialogbackground);
_headPane.setBackground(UIConfig.dialogbackground);
_backPane.setBackground(UIConfig.dialogbackground);
_btnPane.setBackground(UIConfig.dialogbackground);
_headPane.setPreferredSize(new Dimension(300, 30));
_tpDialog.getRootPane().setBorder(
BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray));
_titleLabel.setFont(UIRes.getFont());
_titleLabel.setPreferredSize(new Dimension(260, 26));
_titleLabel.setVerticalTextPosition(RPLabel.CENTER);
_titleLabel.setHorizontalTextPosition(RPLabel.CENTER);
_closeLabel.setFont(new Font("Arial", Font.BOLD, 15));
_closeLabel.setPreferredSize(new Dimension(20, 20));
_closeLabel.setVerticalTextPosition(RPLabel.CENTER);
_closeLabel.setHorizontalTextPosition(RPLabel.CENTER);
_closeLabel.setCursor(new Cursor(12));
_closeLabel.setToolTipText(LangConfig.get(this, "close", "Close"));
_contentText.setEditable(false);
_contentText
.setFont(new Font(LangConfig.getFontName(), Font.PLAIN, 13));
_contentText.setForeground(LColor.white);
_contentText.setLineWrap(true);
_contentText.setText(_message);
_backagePane.setPreferredSize(new Dimension(_width - 10, 100));
_backagePane.setBorder(LineBorder.createBlackLineBorder());
_updateLabel.setPreferredSize(new Dimension(110, 30));
_updateLabel.setCursor(new Cursor(12));
_headPane.add(_titleLabel);
_headPane.add(_closeLabel);
_backPane.add(_backagePane);
_btnPane.add(_updateLabel);
_tpDialog.add(_headPane, BorderLayout.NORTH);
_tpDialog.add(_backPane, BorderLayout.CENTER);
_tpDialog.add(_btnPane, BorderLayout.SOUTH);
_updateLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
_tpDialog.close();
}
@Override
public void mouseEntered(final MouseEvent e) {
_updateLabel.setBorder(BorderFactory
.createLineBorder(Color.gray));
}
@Override
public void mouseExited(final MouseEvent e) {
_updateLabel.setBorder(null);
}
});
_titleLabel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(final MouseEvent e) {
Point newP = new Point(e.getXOnScreen(), e.getYOnScreen());
int x = _tpDialog.getX() + (newP.x - _oldPos.x);
int y = _tpDialog.getY() + (newP.y - _oldPos.y);
_tpDialog.setLocation(x, y);
_oldPos = newP;
}
});
_titleLabel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent e) {
_oldPos = new Point(e.getXOnScreen(), e.getYOnScreen());
}
});
_closeLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
_tpDialog.close();
}
@Override
public void mouseEntered(final MouseEvent e) {
_closeLabel.setBorder(BorderFactory
.createLineBorder(Color.gray));
}
@Override
public void mouseExited(final MouseEvent e) {
_closeLabel.setBorder(null);
}
});
_tpDialog.setAlwaysOnTop(true);
_tpDialog.setUndecorated(true);
_tpDialog.setResizable(false);
_tpDialog.setVisible(true);
_tpDialog.run();
if (autoClose) {
Updateable update = new Updateable() {
@Override
public void action(Object o) {
LSystem.sleep(LSystem.SECOND * 20);
_tpDialog.close();
}
};
LSystem.postThread(update);
}
}
public static void pop(final String msg) {
new RPBubbleDialog(msg, false);
}
public static void pop(final String msg, final boolean ac) {
new RPBubbleDialog(msg, ac);
}
}