diff --git a/src/main/java/org/qortal/gui/SplashFrame.java b/src/main/java/org/qortal/gui/SplashFrame.java index 37d20ec5..967377d1 100644 --- a/src/main/java/org/qortal/gui/SplashFrame.java +++ b/src/main/java/org/qortal/gui/SplashFrame.java @@ -16,6 +16,7 @@ public class SplashFrame { private static SplashFrame instance; private JFrame splashDialog; + private SplashPanel splashPanel; @SuppressWarnings("serial") public static class SplashPanel extends JPanel { @@ -23,22 +24,39 @@ public class SplashFrame { private String defaultSplash = "Qlogo_512.png"; + private JLabel statusLabel; + public SplashPanel() { image = Gui.loadImage(defaultSplash); setOpaque(false); - setLayout(new GridBagLayout()); - } + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + setBorder(null); - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, getWidth(), getHeight(), this); + // Add logo + JLabel imageLabel = new JLabel(new ImageIcon(image)); + imageLabel.setSize(new Dimension(300, 300)); + add(imageLabel); + + // Add status label + statusLabel = new JLabel("Starting Qortal Core...", JLabel.CENTER); + statusLabel.setMaximumSize(new Dimension(500, 50)); + statusLabel.setFont(new Font("Verdana", Font.PLAIN, 22)); + statusLabel.setBackground(new Color(255, 255, 255)); + statusLabel.setOpaque(true); + statusLabel.setBorder(null); + add(statusLabel); } @Override public Dimension getPreferredSize() { - return new Dimension(500, 500); + return new Dimension(500, 550); + } + + public void updateStatus(String text) { + if (statusLabel != null) { + statusLabel.setText(text); + } } } @@ -55,7 +73,8 @@ public class SplashFrame { icons.add(Gui.loadImage("icons/Qlogo_128.png")); this.splashDialog.setIconImages(icons); - this.splashDialog.getContentPane().add(new SplashPanel()); + this.splashPanel = new SplashPanel(); + this.splashDialog.getContentPane().add(this.splashPanel); this.splashDialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); this.splashDialog.setUndecorated(true); this.splashDialog.pack(); @@ -79,4 +98,8 @@ public class SplashFrame { this.splashDialog.dispose(); } + public void updateStatus(String text) { + this.splashPanel.updateStatus(text); + } + } diff --git a/src/main/java/org/qortal/repository/Bootstrap.java b/src/main/java/org/qortal/repository/Bootstrap.java index 0a822d5f..0becf107 100644 --- a/src/main/java/org/qortal/repository/Bootstrap.java +++ b/src/main/java/org/qortal/repository/Bootstrap.java @@ -8,6 +8,7 @@ import org.qortal.controller.Controller; import org.qortal.data.account.MintingAccountData; import org.qortal.data.block.BlockData; import org.qortal.data.crosschain.TradeBotData; +import org.qortal.gui.SplashFrame; import org.qortal.repository.hsqldb.HSQLDBImportExport; import org.qortal.repository.hsqldb.HSQLDBRepositoryFactory; import org.qortal.settings.Settings; @@ -302,14 +303,14 @@ public class Bootstrap { try (final Repository repository = RepositoryManager.getRepository()) { this.repository = repository; - LOGGER.info("Starting import of bootstrap..."); + this.updateStatus("Starting import of bootstrap..."); this.doImport(); break; } catch (DataException e) { LOGGER.info("Bootstrap import failed: {}", e.getMessage()); - LOGGER.info("Retrying in 5 minutes"); + this.updateStatus("Bootstrapping failed. Retrying in 5 minutes"); Thread.sleep(5 * 60 * 1000L); } } @@ -363,7 +364,7 @@ public class Bootstrap { String bootstrapFilename = this.getFilename(); try { - LOGGER.info("Downloading bootstrap..."); + this.updateStatus("Downloading bootstrap..."); String bootstrapUrl = String.format("%s/%s", bootstrapHost, bootstrapFilename); InputStream in = new URL(bootstrapUrl).openStream(); Files.copy(in, path, REPLACE_EXISTING); @@ -379,12 +380,12 @@ public class Bootstrap { blockchainLock.lockInterruptibly(); try { - LOGGER.info("Extracting bootstrap..."); + this.updateStatus("Extracting bootstrap..."); Path input = path.toAbsolutePath(); Path output = path.toAbsolutePath().getParent().toAbsolutePath(); SevenZ.decompress(input.toString(), output.toFile()); - LOGGER.info("Stopping repository..."); + this.updateStatus("Stopping repository..."); // Close the repository while we are still able to // Otherwise, the caller will run into difficulties when it tries to close it repository.discardChanges(); @@ -399,11 +400,11 @@ public class Bootstrap { } // Move the "bootstrap" folder in place of the "db" folder - LOGGER.info("Moving files to output directory..."); + this.updateStatus("Moving files to output directory..."); FileUtils.deleteDirectory(outputPath.toFile()); Files.move(inputPath, outputPath); - LOGGER.info("Starting repository from bootstrap..."); + this.updateStatus("Starting repository from bootstrap..."); RepositoryFactory repositoryFactory = new HSQLDBRepositoryFactory(Controller.getRepositoryUrl()); RepositoryManager.setRepositoryFactory(repositoryFactory); @@ -413,4 +414,9 @@ public class Bootstrap { } } + private void updateStatus(String text) { + LOGGER.info(text); + SplashFrame.getInstance().updateStatus(text); + } + }