From 6024f6e5f206d6df12afcf67d82fc5b75595d235 Mon Sep 17 00:00:00 2001 From: Sibo Van Gool Date: Wed, 26 Jan 2022 01:58:41 +0100 Subject: [PATCH] [fixes #825] Implement UpdateInfoDialog This is the dialog that pops up when a new update is found --- .../gui/dialogs/UpdateInfoDialog.java | 110 +++++++++++------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java index 5919410e9..56766256f 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/UpdateInfoDialog.java @@ -1,74 +1,100 @@ package net.sf.openrocket.gui.dialogs; -import java.awt.Window; +import java.awt.Desktop; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.Collections; -import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.communication.ReleaseInfo; import net.sf.openrocket.communication.UpdateInfo; -import net.sf.openrocket.gui.components.URLLabel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.Chars; -import net.sf.openrocket.util.ComparablePair; import net.sf.openrocket.gui.widgets.SelectColorButton; +import net.sf.openrocket.util.BuildProperties; +import net.sf.openrocket.util.MarkdownUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +/** + * Dialog that pops up when a new update for OpenRocket is found + * + * @author Sibo Van Gool + */ public class UpdateInfoDialog extends JDialog { - private final JCheckBox checkAtStartup; + private static final Logger log = LoggerFactory.getLogger(UpdateInfoDialog.class); private static final Translator trans = Application.getTranslator(); private final SwingPreferences preferences = (SwingPreferences) Application.getPreferences(); public UpdateInfoDialog(UpdateInfo info) { //// OpenRocket update available - super((Window)null, "OpenRocket update available", ModalityType.APPLICATION_MODAL); + super(null, "Update OpenRocket", ModalityType.APPLICATION_MODAL); // TODO: replace with trans JPanel panel = new JPanel(new MigLayout("fill")); - - panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")), - "spany 100, top"); - - //// OpenRocket version - panel.add(new JLabel("OpenRocket version " + info.getLatestVersion() + - " is available!"), "wrap para"); - - List> updates = info.getUpdates(); - if (updates.size() > 0) { - //// Updates include: - panel.add(new JLabel("Updates include:"), "wrap rel"); - - Collections.sort(updates); - int count = 0; - int n = -1; - for (int i=updates.size()-1; i>=0; i--) { - // Add only specific number of top features - if (count >= 4 && n != updates.get(i).getU()) - break; - n = updates.get(i).getU(); - panel.add(new JLabel(" " + Chars.BULLET + " " + updates.get(i).getV()), - "wrap 0px"); - count++; - } - } + panel.add(new JLabel(Icons.loadImageIcon("pix/icon/icon-about.png", "OpenRocket")), + "spany 1, top"); + + // Release information box + final JTextPane textPane = new JTextPane(); + textPane.setEditable(false); + textPane.setContentType("text/html"); + textPane.putClientProperty(JTextPane.HONOR_DISPLAY_PROPERTIES, true); + + ReleaseInfo release = info.getLatestRelease(); + StringBuilder sb = new StringBuilder(); + + // OpenRocket version available! + sb.append(""); + sb.append(String.format("

OpenRocket version %s available!

", release.getReleaseName())); + + // Your version + sb.append(String.format("Your current version: %s

", BuildProperties.getVersion())); + + // Changelog + sb.append("

Changelog

"); // TODO: replace with trans + String releaseNotes = release.getReleaseNotes(); + releaseNotes = releaseNotes.replaceAll("^\"|\"$", ""); // Remove leading and trailing quotations + sb.append(MarkdownUtil.toHtml(releaseNotes)).append("

"); + + // GitHub link + String releaseURL = release.getReleaseURL(); + releaseURL = releaseURL.replaceAll("^\"|\"$", ""); // Remove leading and trailing quotations + sb.append(String.format("Read more on GitHub", releaseURL)); + sb.append(""); + textPane.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { + Desktop desktop = Desktop.getDesktop(); + try { + desktop.browse(e.getURL().toURI()); + } catch (Exception ex) { + log.debug("Exception hyperlink: " + ex.getMessage()); + } + } + } + }); + + textPane.setText(sb.toString()); + + panel.add(new JScrollPane(textPane), "grow, span, wrap"); - //// Download the new version from: - panel.add(new JLabel("Download the new version from:"), - "gaptop para, alignx 50%, wrap unrel"); - panel.add(new URLLabel(AboutDialog.OPENROCKET_URL), "alignx 50%, wrap para"); - //// Check for software updates at startup - checkAtStartup = new JCheckBox(trans.get("pref.dlg.checkbox.Checkupdates")); + JCheckBox checkAtStartup = new JCheckBox(trans.get("pref.dlg.checkbox.Checkupdates")); //// Check for software updates every time you start up OpenRocket checkAtStartup.setToolTipText(trans.get("pref.dlg.checkbox.Checkupdates.ttip")); checkAtStartup.setSelected(preferences.getCheckUpdates()); @@ -89,7 +115,9 @@ public class UpdateInfoDialog extends JDialog { } }); panel.add(button, "right, gapright para"); - + + panel.setPreferredSize(new Dimension(1000, 600)); + this.add(panel); this.pack();