diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index ed5cc28b27f..620fcbdc08b 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -26,6 +26,7 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.Collections; import java.util.List; @@ -85,6 +86,7 @@ public enum FControl implements KeyEventDispatcher { private boolean altKeyLastDown; private CloseAction closeAction; private final List currentMatches = Lists.newArrayList(); + private String snapsVersion = ""; public enum CloseAction { NONE, @@ -212,6 +214,12 @@ public enum FControl implements KeyEventDispatcher { /** After view and model have been initialized, control can start.*/ public void initialize() { + //get version string + try { + URL url = new URL("https://downloads.cardforge.org/dailysnapshots/version.txt"); + snapsVersion = FileUtil.readFileToString(url); + + } catch (Exception e) {} // Preloads skin components (using progress bar). FSkin.loadFull(true); @@ -267,6 +275,12 @@ public enum FControl implements KeyEventDispatcher { FView.SINGLETON_INSTANCE.setSplashProgessBarMessage(localizer.getMessage("lblOpeningMainWindow")); SwingUtilities.invokeLater(() -> Singletons.getView().initialize()); } + public String compareVersion(String currentVersion) { + if (currentVersion.isEmpty() || snapsVersion.isEmpty() + || !currentVersion.contains("SNAPSHOT") || currentVersion.equalsIgnoreCase(snapsVersion)) + return ""; + return "NEW SNAPSHOT AVAILABLE!!!"; + } private void setGlobalKeyboardHandler() { final KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); diff --git a/forge-gui-desktop/src/main/java/forge/view/FTitleBarBase.java b/forge-gui-desktop/src/main/java/forge/view/FTitleBarBase.java index 017e9daf455..16e80ea4022 100644 --- a/forge-gui-desktop/src/main/java/forge/view/FTitleBarBase.java +++ b/forge-gui-desktop/src/main/java/forge/view/FTitleBarBase.java @@ -12,17 +12,22 @@ import java.awt.Window; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; +import java.util.concurrent.CompletableFuture; import javax.swing.SpringLayout; import javax.swing.SwingUtilities; +import forge.control.FControl; +import forge.download.AutoUpdater; import forge.gui.framework.ILocalRepaint; import forge.toolbox.FSkin; import forge.toolbox.FSkin.Colors; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedMenuBar; +import forge.util.BuildInfo; import forge.util.Localizer; +import forge.util.RSSReader; @SuppressWarnings("serial") public abstract class FTitleBarBase extends SkinnedMenuBar { @@ -42,6 +47,7 @@ public abstract class FTitleBarBase extends SkinnedMenuBar { protected final FullScreenButton btnFullScreen = new FullScreenButton(); protected final MaximizeButton btnMaximize = new MaximizeButton(); protected final CloseButton btnClose = new CloseButton(); + protected final UpdaterButton btnUpdateShortcut = new UpdaterButton(); protected FTitleBarBase(ITitleBarOwner owner0) { this.owner = owner0; @@ -71,6 +77,11 @@ public abstract class FTitleBarBase extends SkinnedMenuBar { add(btnLockTitleBar); layout.putConstraint(SpringLayout.EAST, btnLockTitleBar, 0, SpringLayout.WEST, btnMinimize); layout.putConstraint(SpringLayout.SOUTH, btnLockTitleBar, 0, SpringLayout.SOUTH, btnMinimize); + + add(btnUpdateShortcut); + layout.putConstraint(SpringLayout.EAST, btnUpdateShortcut, 0, SpringLayout.WEST, btnMinimize); + layout.putConstraint(SpringLayout.SOUTH, btnUpdateShortcut, 0, SpringLayout.SOUTH, btnMinimize); + } else { int offset = owner instanceof FDialog && ((FDialog)owner).allowResize() ? 0 : -1; @@ -408,4 +419,34 @@ public abstract class FTitleBarBase extends SkinnedMenuBar { g2d.drawLine(x2, y1, x1, y2); } } + public class UpdaterButton extends TitleBarButton { + final int MARQUEE_SPEED_DIV = 25; + final int REPAINT_WITHIN_MS = 25; + final String displayText = FControl.instance.compareVersion(BuildInfo.getVersionString()); + private UpdaterButton() { + setToolTipText(Localizer.getInstance().getMessage("btnCheckForUpdates")); + setPreferredSize(new Dimension(160, 25)); + setEnabled(!displayText.isEmpty()); + } + @Override + protected void onClick() { + try { + new AutoUpdater(false).attemptToUpdate(CompletableFuture.supplyAsync(() -> RSSReader.getCommitLog(null, null, null))); + } catch (Exception e) { + e.printStackTrace(); + } + } + @Override + public void paintComponent(Graphics g) { + g.translate((int)((System.currentTimeMillis() / MARQUEE_SPEED_DIV) % (getWidth() * 2)) - getWidth(), 0); + super.paintComponent(g); + int thickness = 2; + Graphics2D g2d = (Graphics2D) g; + FSkin.setGraphicsColor(g2d, foreColor); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setStroke(new BasicStroke(thickness)); + g2d.drawString(displayText, 0, 17); + repaint(REPAINT_WITHIN_MS); + } + } }