From 2719ce5b88f1e1160002726a36cd9c6a1a5171aa Mon Sep 17 00:00:00 2001 From: "Jason P. Leasure" Date: Wed, 5 Aug 2020 10:05:50 -0400 Subject: [PATCH] open external links in help with an external browser --- .../java/docking/help/GHelpHTMLEditorKit.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java b/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java index 1c4abca00c..4fd0f7b57f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java @@ -15,6 +15,7 @@ */ package docking.help; +import java.awt.Desktop; import java.awt.Image; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -53,6 +54,8 @@ public class GHelpHTMLEditorKit extends HTMLEditorKit { private static final String G_HELP_STYLE_SHEET = "help/shared/Frontpage.css"; + private static final Pattern EXTERNAL_URL_PATTERN = Pattern.compile("https?://.*"); + /** A pattern to strip the font size value from a line of CSS */ private static final Pattern FONT_SIZE_PATTERN = Pattern.compile("font-size:\\s*(\\d{1,2})"); private static final String HELP_WINDOW_ZOOM_FACTOR = "HELP.WINDOW.FONT.SIZE.MODIFIER"; @@ -116,6 +119,10 @@ public class GHelpHTMLEditorKit extends HTMLEditorKit { } if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + if (isExternalLink(e)) { + browseExternalLink(e); + return; + } Msg.trace(this, "Link activated: " + e.getURL()); e = validateURL(e); Msg.trace(this, "Validated event: " + e.getURL()); @@ -127,6 +134,28 @@ public class GHelpHTMLEditorKit extends HTMLEditorKit { } } + private boolean isExternalLink(HyperlinkEvent e) { + String description = e.getDescription(); + return description != null && EXTERNAL_URL_PATTERN.matcher(description).matches(); + } + + private void browseExternalLink(HyperlinkEvent e) { + String description = e.getDescription(); + if (!Desktop.isDesktopSupported()) { + Msg.info(this, "Unable to launch external browser for " + description); + return; + } + + try { + // use an external browser + URI uri = e.getURL().toURI(); + Desktop.getDesktop().browse(uri); + } + catch (URISyntaxException | IOException e1) { + Msg.error(this, "Error browsing to external URL " + description, e1); + } + } + /** * Tests the URL of the given event. If the URL is invalid, a new event may be created if * a new, valid URL can be created. Creates a new event with a patched URL if