package org.ripple.power.ui.view; import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Window; import java.awt.image.BufferedImage; import javax.swing.JPanel; import org.ripple.power.config.LSystem; import org.ripple.power.txns.Updateable; import org.ripple.power.ui.RPDialogTool; import org.ripple.power.ui.UIConfig; import org.ripple.power.ui.graphics.Cycle; import org.ripple.power.ui.graphics.LFont; import org.ripple.power.ui.graphics.LGraphics; import org.ripple.power.utils.MathUtils; public class WaitDialog { private static WaitDialog lock = null; private boolean isRunning = false; private RPDialogTool tool; public WaitDialog(Window parent) { Dimension dim = new Dimension(400, 128); JPanel panel = new JPanel(new BorderLayout()); panel.setBackground(UIConfig.dialogbackground); panel.setPreferredSize(dim); panel.setSize(dim); isRunning = true; new ShowPanel(panel, dim.width, dim.height); tool = RPDialogTool.show(parent, "Transaction Broadcast", panel, -1, -1, true, LSystem.MINUTE); } public static WaitDialog showDialog(Window parent, boolean show) { if (show) { synchronized (WaitDialog.class) { if (lock == null) { return (lock = new WaitDialog(parent)); } else { if (lock != null) { lock.closeDialog(); lock = new WaitDialog(parent); } return lock; } } } return null; } public static WaitDialog showDialog(Window parent) { return showDialog(parent, true); } public RPDialogTool get() { return tool; } public void closeDialog() { synchronized (WaitDialog.class) { isRunning = false; tool.close(); lock = null; } } class ShowPanel extends Canvas { private static final long serialVersionUID = 1L; private final BufferedImage image; ShowPanel(final JPanel panel, final int w, final int h) { final String message = "Broadcasting transaction .... please wait"; image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); setBackground(UIConfig.dialogbackground); Updateable update = new Updateable() { public void action(Object o) { int width = w / 2; int height = h / 2; int index = MathUtils.random(0, 6); if (index == 4) { index = 2; } Cycle cycle = Cycle.newSample(index, width, height); LGraphics g = new LGraphics(image); LFont font = LFont.getFont(18); for (; isRunning;) { synchronized (image) { g.setColor(UIConfig.dialogbackground); g.fillRect(0, 0, getWidth(), getHeight()); if (cycle != null) { switch (index) { case 0: g.translate(105, 22); break; case 1: g.translate(155, 12); g.scale(0.5, 0.5); break; case 2: g.translate(144, 7); g.scale(0.5, 0.5); break; case 3: g.translate(100, 40); break; case 5: g.translate(160, 15); g.scale(0.5, 0.5); break; case 6: g.translate(160, 15); g.scale(0.5, 0.5); break; default: g.translate(144, 7); g.scale(0.5, 0.5); break; } cycle.update(30); cycle.createUI(g); g.restore(); } g.setAntiAlias(true); g.setFont(font); g.drawString(message, (w - font.stringWidth(message)) / 2 - 5, (h - font.getHeight()) / 2 + 15); g.setAntiAlias(false); } LSystem.invokeLater(new Runnable() { @Override public void run() { if (panel != null && isRunning && panel.getGraphics() != null) { panel.update(panel.getGraphics()); panel.repaint(); } repaint(); } }); LSystem.sleep(45); } } }; LSystem.postThread(update); panel.add(this); } public void update(Graphics g) { paint(g); } @Override public synchronized void paint(Graphics g) { if (image != null) { synchronized (image) { g.drawImage(image, 0, 0, this); } } } } }