package org.ripple.power.ui.view; import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Window; import org.ripple.power.config.LSystem; import org.ripple.power.txns.Updateable; import org.ripple.power.ui.UIConfig; import org.ripple.power.ui.UIRes; import org.ripple.power.ui.graphics.LImage; import org.ripple.power.utils.GraphicsUtils; import org.ripple.power.utils.SwingUtils; public class RPSplash extends Canvas { /** * */ private static final long serialVersionUID = 1L; private FontMetrics fontMetrics; private Window window; private Image image; private Image _offscreenImg; private Graphics _offscreen; private int progress; private String version; private String build; private final Color progressColour; private final Color gradientColour; private final Color buildTextColour; private int versionLabelX; private int versionLabelY; private int buildLabelX; private int buildLabelY; private static final int PROGRESS_HEIGHT = 15; private final Color versionTextColour; public RPSplash(Color progressBarColour, String imageResourcePath, String build, Color buildTextColour, int buildLabelX, int buildLabelY, String versionNumber, boolean autonClose, Updateable update) { this(progressBarColour, imageResourcePath, build, buildTextColour, buildLabelX, buildLabelY, versionNumber, -1, -1, autonClose, update); } public RPSplash(Color progressBarColour, String imageResourcePath, String build, Color buildTextColour, int buildLabelX, int buildLabelY, String versionNumber, int versionLabelX, int versionLabelY, boolean autonClose, Updateable update) { this(progressBarColour, imageResourcePath, build, buildTextColour, buildLabelX, buildLabelY, versionNumber, UIConfig .getBrandColor(), versionLabelX, versionLabelY, autonClose, update); } public RPSplash(Color progressBarColour, String imageResourcePath, String buildString, Color buildTextColour, int buildLabelX, int buildLabelY, String versionNumber, Color versionTextColour, int versionLabelX, int versionLabelY, boolean autonClose, final Updateable update) { this.buildTextColour = buildTextColour; this.buildLabelX = buildLabelX; this.buildLabelY = buildLabelY; this.versionTextColour = versionTextColour; this.versionLabelX = versionLabelX; this.versionLabelY = versionLabelY; progressColour = progressBarColour; setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); setBackground(Color.white); gradientColour = UIRes.getBrighter(progressBarColour, 0.75); Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 11); setFont(font); fontMetrics = getFontMetrics(font); image = LImage.createImage(imageResourcePath).getBufferedImage(); if (buildString != null) { build = buildString; } if (versionNumber != null) { version = versionNumber; } Dimension size = new Dimension(image.getWidth(this), image.getHeight(this)); window = new Window(new Frame()); window.setSize(size); window.setLayout(new BorderLayout()); window.add(BorderLayout.CENTER, this); window.setLocation(UIRes.getPointToCenter(window, size)); window.validate(); window.setVisible(true); if (autonClose) { Updateable call = new Updateable() { @Override public void action(Object o) { for (; progress < 10;) { process(); try { Thread.sleep(100); } catch (InterruptedException e) { } } RPSplash.this.dispose(); if (update != null) { update.action(progress); } } }; LSystem.postThread(call); } } public int getProgress() { return progress; } public synchronized void process() { progress++; repaint(); } public synchronized void paint(Graphics g) { Dimension size = getSize(); if (_offscreenImg == null) { _offscreenImg = createImage(size.width, size.height); _offscreen = _offscreenImg.getGraphics(); } _offscreen.drawImage(image, 0, 0, this); _offscreen.setColor(progressColour); Graphics2D offscreen2d = (Graphics2D) _offscreen; offscreen2d.setPaint(new GradientPaint(0, image.getHeight(this) - PROGRESS_HEIGHT, gradientColour, 0, image.getHeight(this), progressColour)); _offscreen.fillRect(0, image.getHeight(this) - PROGRESS_HEIGHT, (window.getWidth() * progress) / 9, PROGRESS_HEIGHT); if (version != null) { if (versionLabelX == -1) { versionLabelX = (getWidth() - fontMetrics.stringWidth(version)) / 2; } if (versionLabelY == -1) { versionLabelY = image.getHeight(this) - PROGRESS_HEIGHT - fontMetrics.getHeight(); } GraphicsUtils.setAntialiasAll(offscreen2d, true); _offscreen.setColor(buildTextColour); _offscreen.setFont(GraphicsUtils.getFont(Font.SANS_SERIF, 1, 28)); _offscreen.drawString(build, buildLabelX, buildLabelY); _offscreen.setColor(versionTextColour); _offscreen.setFont(GraphicsUtils.getFont(14)); _offscreen.drawString(version, versionLabelX, versionLabelY); } g.drawImage(_offscreenImg, 0, 0, this); } public void dispose() { SwingUtils.close(window); } public void update(Graphics g) { paint(g); } }