package org.ripple.power.ui.view; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Cursor; import java.awt.Dialog; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.LineBorder; import org.ripple.power.config.LSystem; import org.ripple.power.i18n.LangConfig; import org.ripple.power.txns.Updateable; import org.ripple.power.ui.UIConfig; import org.ripple.power.ui.UIRes; import org.ripple.power.ui.graphics.LColor; import org.ripple.power.ui.graphics.geom.Point; import org.ripple.power.utils.SwingUtils; public class RPPushTool { public static interface ClosedListener { public void closed(); } public final static int TITLE_SIZE = 30; private ClosedListener listener; public Object obj = null; public static class TipDialog extends JDialog { /** * */ private static final long serialVersionUID = 1L; private static Dimension dim; private int x, y, endTop; private final int width, height; private static Insets screenInsets; boolean closed; public TipDialog(final Point start, final int end, final int width, final int height) { super(LSystem.applicationMain, Dialog.ModalityType.MODELESS); this.width = width; this.height = height; dim = Toolkit.getDefaultToolkit().getScreenSize(); screenInsets = Toolkit.getDefaultToolkit().getScreenInsets( this.getGraphicsConfiguration()); if (end < 0) { this.endTop = height; } else { this.endTop = end; } if (start == null) { x = (int) (dim.getWidth() - width - 3); y = (int) (dim.getHeight() - screenInsets.bottom - 3); } else { x = (int) start.x; y = (int) start.y; } initComponents(); } public void run() { for (int i = 0; i <= endTop; i += 10) { this.setLocation(x, y - i); LSystem.sleep(5); } } private void initComponents() { this.setSize(width, height); this.setLocation(x, y); this.setBackground(LColor.black); } public void close() { x = this.getX(); y = this.getY(); int ybottom = (int) dim.getHeight() - screenInsets.bottom; for (int i = 0; i <= ybottom - y; i += 10) { try { this.setLocation(x, y + i); Thread.sleep(5); } catch (InterruptedException ex) { } } closed = true; SwingUtils.close(this); } } private JPanel _headPane = null; private JPanel _backPane = null; private JPanel _btnPane = null; private RPLabel _titleLabel = null; private RPLabel _closeLabel = null; private JPanel _backagePane = null; private RPLabel _updateLabel = null; private Point _oldPos; private TipDialog _tpDialog = null; private int _width = -1, _height = -1; public RPPushTool(final boolean bottom, final Point start, final int endTop, final String title, final Component comp, final int w, final int h, final boolean autoClose) { _width = w; _height = h; _tpDialog = new TipDialog(start, endTop, _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(title); _closeLabel = new RPLabel("X"); _closeLabel.setHorizontalAlignment(JLabel.CENTER); _backagePane = new JPanel(new BorderLayout()); ((JPanel) _tpDialog.getContentPane()) .setBackground(UIConfig.dialogbackground); _headPane.setBackground(UIConfig.dialogbackground); _backPane.setBackground(UIConfig.dialogbackground); _btnPane.setBackground(UIConfig.dialogbackground); Dimension dim = new Dimension(_width, TITLE_SIZE); _headPane.setPreferredSize(dim); _headPane.setSize(dim); _tpDialog.getRootPane().setBorder( BorderFactory.createMatteBorder(1, 1, 1, 1, LColor.gray)); _titleLabel.setFont(UIRes.getFont()); _titleLabel .setPreferredSize(new Dimension(_width - 40, TITLE_SIZE - 4)); _titleLabel.setVerticalTextPosition(RPLabel.CENTER); _titleLabel.setHorizontalTextPosition(RPLabel.LEFT); _closeLabel.setFont(new Font("Arial", Font.BOLD, 15)); dim = new Dimension(25, 20); _closeLabel.setPreferredSize(dim); _closeLabel.setSize(dim); _closeLabel.setVerticalTextPosition(RPLabel.CENTER); _closeLabel.setHorizontalTextPosition(RPLabel.RIGHT); _closeLabel.setCursor(new Cursor(12)); _closeLabel.setToolTipText(LangConfig.get(this, "close", "Close")); _backagePane.setPreferredSize(new Dimension(_width, _height)); _backagePane.setBorder(LineBorder.createBlackLineBorder()); _backagePane.add(comp); _headPane.add(_titleLabel); _headPane.add(_closeLabel); _backPane.add(_backagePane); _tpDialog.add(_headPane, BorderLayout.NORTH); _tpDialog.add(_backPane, BorderLayout.CENTER); if (bottom) { _tpDialog.add(_btnPane, BorderLayout.SOUTH); _updateLabel = new RPLabel(); _updateLabel.setPreferredSize(new Dimension(_width, TITLE_SIZE)); _updateLabel.setCursor(new Cursor(12)); _btnPane.add(_updateLabel); _updateLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent e) { _tpDialog.close(); if (listener != null) { listener.closed(); } } @Override public void mouseEntered(final MouseEvent e) { _updateLabel.setBorder(BorderFactory .createLineBorder(LColor.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()); double x = _tpDialog.getX() + (newP.x - _oldPos.x); double y = _tpDialog.getY() + (newP.y - _oldPos.y); _tpDialog.setLocation((int) x, (int) 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(); if (listener != null) { listener.closed(); } } @Override public void mouseEntered(final MouseEvent e) { _closeLabel.setBorder(BorderFactory .createLineBorder(LColor.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) { try { Thread.sleep(LSystem.SECOND * 20); } catch (InterruptedException e) { } _tpDialog.close(); } }; LSystem.postThread(update); } } public boolean isClose() { return _tpDialog.closed; } public void setTitle(String title) { _titleLabel.setText(title); } public void setVisible(boolean v) { _tpDialog.setVisible(v); } public boolean isVisible() { return _tpDialog.isVisible(); } public void setOpacity(float opacity) { _tpDialog.setOpacity(opacity); } public float getOpacity() { return _tpDialog.getOpacity(); } public void close() { _tpDialog.close(); } public Dialog getDialog() { return _tpDialog; } public static RPPushTool pop(Point start, int end, String title, Component comp, int w, int h) { return pop(start, end, title, comp, w, h, false); } public static RPPushTool pop(Point start, int end, String title, Component comp, int w, int h, boolean ac) { return pop(false, start, end, title, comp, w, h, ac); } public static RPPushTool pop(Point start, int end, String title, Component comp, boolean ac) { return pop(false, start, end, title, comp, comp.getWidth(), comp.getHeight(), ac); } public static RPPushTool pop(Point start, int end, String title, Component comp) { return pop(false, start, end, title, comp, comp.getWidth(), comp.getHeight(), false); } public static RPPushTool pop(boolean bottom, Point start, int end, String title, Component comp, int w, int h, boolean ac) { return new RPPushTool(bottom, start, end, title, comp, w, h + (bottom ? (RPPushTool.TITLE_SIZE * 2) : RPPushTool.TITLE_SIZE), ac); } public ClosedListener getListener() { return listener; } public void setListener(ClosedListener listener) { this.listener = listener; } }