# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: D:\hg\core-main # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: core.browser/src/org/netbeans/core/browser/layer.xml --- core.browser/src/org/netbeans/core/browser/layer.xml Base (BASE) +++ core.browser/src/org/netbeans/core/browser/layer.xml Locally Modified (Based On LOCAL) @@ -5,6 +5,7 @@ + Index: core.ui/src/org/netbeans/core/ui/resources/layer.xml --- core.ui/src/org/netbeans/core/ui/resources/layer.xml Base (BASE) +++ core.ui/src/org/netbeans/core/ui/resources/layer.xml Locally Modified (Based On LOCAL) @@ -471,6 +471,7 @@ + Index: o.n.core/nbproject/project.xml --- o.n.core/nbproject/project.xml Base (BASE) +++ o.n.core/nbproject/project.xml Locally Modified (Based On LOCAL) @@ -92,7 +92,7 @@ - 7.11 + 7.14 Index: o.n.core/src/org/netbeans/core/IDESettings.java --- o.n.core/src/org/netbeans/core/IDESettings.java Base (BASE) +++ o.n.core/src/org/netbeans/core/IDESettings.java Locally Modified (Based On LOCAL) @@ -60,12 +60,15 @@ public class IDESettings { /** Web Browser prefered by user */ public static final String PROP_WWWBROWSER = "WWWBrowser"; // NOI18N + public static final String PROP_EXTERNAL_WWWBROWSER = "ExternalWWWBrowser"; // NOI18N static Preferences getPreferences() { return NbPreferences.forModule(IDESettings.class); } - /** Getter for preffered web browser. + /** Getter for preffered web browser. The browser may be an internal one + * (URLs will be rendered in some TopComponent) or external browser like + * Mozilla or Internet Explorer. * * First time when this function is called Lookup is used * to find prefered browser factory in a browser registry. @@ -74,9 +77,70 @@ * may return null if it is not possible to get the browser */ public static HtmlBrowser.Factory getWWWBrowser () { + return getBrowser( PROP_WWWBROWSER, false ); + } + + /** Getter for preffered external web browser. + * + * First time when this function is called Lookup is used + * to find prefered browser factory in a browser registry. + * + * @return prefered external browser, + * may return null if it is not possible to get the browser or no external + * browser is available. + */ + public static HtmlBrowser.Factory getExternalWWWBrowser () { + return getBrowser( PROP_EXTERNAL_WWWBROWSER, true ); + } + + /** Setter for preffered browser. + * + * Actually Node.Handle of node that represent browser in lookup folder is stored. + * + * @param brow prefered browser capable of providing implementation + */ + public static void setWWWBrowser (HtmlBrowser.Factory brow) { + setBrowser( PROP_WWWBROWSER, brow ); + if( isExternal( brow ) ) { + setExternalWWWBrowser(brow); + } + } + + /** Setter for preffered external browser. + * + * Actually Node.Handle of node that represent browser in lookup folder is stored. + * + * @param brow prefered browser capable of providing implementation + */ + public static void setExternalWWWBrowser (HtmlBrowser.Factory brow) { + setBrowser( PROP_EXTERNAL_WWWBROWSER, brow ); + } + + private static void setBrowser (String prefId, HtmlBrowser.Factory brow) { try { - Object obj = getPreferences().get(PROP_WWWBROWSER, null); + if (brow == null) { + getPreferences().put(prefId, "");//NOI18N + return; + } + Lookup.Item item = + Lookup.getDefault ().lookupItem (new Lookup.Template (HtmlBrowser.Factory.class, null, brow)); + if (item != null) { + getPreferences().put(prefId, item.getId ()); + } else { + // strange + Logger.getLogger (IDESettings.class.getName ()).warning ("IDESettings: Cannot find browser in lookup");// NOI18N + getPreferences().put(prefId, "");//NOI18N + } + } catch (Exception ex) { + Exceptions.printStackTrace (ex); + } + } + + private static HtmlBrowser.Factory getBrowser( String prefId, boolean mustBeExternal ) { + try { + Object obj = getPreferences().get(prefId, null); + if (obj instanceof String && !"".equals (obj)) { // use new style Lookup.Item item = Lookup.getDefault ().lookupItem (new Lookup.Template (HtmlBrowser.Factory.class, (String)obj, null)); @@ -101,6 +165,8 @@ try { if (Boolean.TRUE.equals (dobjs[i].getPrimaryFile ().getAttribute ("hidden"))) continue; + if (mustBeExternal && Boolean.TRUE.equals (dobjs[i].getPrimaryFile ().getAttribute ("internal")) ) + continue; InstanceCookie cookie = (InstanceCookie) dobjs[i].getCookie (InstanceCookie.class); if (cookie == null) @@ -127,32 +193,38 @@ return null; } - /** Setter for preffered browser. - * - * Actually Node.Handle of node that represent browser in lookup folder is stored. - * - * @param brow prefered browser capable of providing implementation - */ - public static void setWWWBrowser (HtmlBrowser.Factory brow) { + private static boolean isExternal( HtmlBrowser.Factory brow ) { + // check if it is not set to be hidden + FileObject fo = FileUtil.getConfigFile ("Services/Browsers"); // NOI18N + + DataFolder folder = DataFolder.findFolder (fo); + DataObject [] dobjs = folder.getChildren (); + for (int i = 0; i < dobjs.length; i++) { + Object o = null; + try { - if (brow == null) { - getPreferences().put(PROP_WWWBROWSER, "");//NOI18N - return; - } + if (Boolean.TRUE.equals (dobjs[i].getPrimaryFile ().getAttribute ("hidden"))) + continue; + if (!Boolean.TRUE.equals (dobjs[i].getPrimaryFile ().getAttribute ("internal")) ) + continue; + InstanceCookie cookie = (InstanceCookie) dobjs[i].getCookie (InstanceCookie.class); - Lookup.Item item = - Lookup.getDefault ().lookupItem (new Lookup.Template (HtmlBrowser.Factory.class, null, brow)); - if (item != null) { - getPreferences().put(PROP_WWWBROWSER, item.getId ()); - } else { - // strange - Logger.getLogger (IDESettings.class.getName ()).warning ("IDESettings: Cannot find browser in lookup");// NOI18N - getPreferences().put(PROP_WWWBROWSER, "");//NOI18N + if (cookie == null) + continue; + o = cookie.instanceCreate (); + if (o != null && o.equals (brow)) { + return false; } - } catch (Exception ex) { - Exceptions.printStackTrace (ex); } + // exceptions are thrown if module is uninstalled + catch (java.io.IOException ex) { + Logger.getLogger (IDESettings.class.getName ()).log (Level.WARNING, null, ex); + } catch (ClassNotFoundException ex) { + Logger.getLogger (IDESettings.class.getName ()).log (Level.WARNING, null, ex); } + } + return false; + } /** Used in layer xml to register FactoryEditor. */ private static org.netbeans.beaninfo.editors.HtmlBrowser.FactoryEditor createHtmlBrowserFactoryEditor() { Index: o.n.core/src/org/netbeans/core/NbTopManager.java --- o.n.core/src/org/netbeans/core/NbTopManager.java Base (BASE) +++ o.n.core/src/org/netbeans/core/NbTopManager.java Locally Modified (Based On LOCAL) @@ -235,7 +235,19 @@ } }); } + + @Override + public void showURLExternal(final URL u) { + Mutex.EVENT.readAccess(new Runnable() { + public void run() { + if (htmlViewer == null) { + htmlViewer = new NbBrowser(); } + htmlViewer.showUrlExternal(u); + } + }); + } + } /** @@ -587,6 +599,7 @@ public static class NbBrowser { private HtmlBrowserComponent brComp; + private HtmlBrowserComponent externalBrowser; private PreferenceChangeListener idePCL; private static Lookup.Result factoryResult; @@ -615,6 +628,12 @@ brComp = new HtmlBrowserComponent(browser, true, true); brComp.putClientProperty("TabPolicy", "HideWhenAlone"); // NOI18N } + browser = IDESettings.getExternalWWWBrowser(); + if (browser == null) { + //external browser is not available, fallback to swingbrowser + browser = new SwingBrowser(); + } + externalBrowser = new HtmlBrowserComponent(browser, true, true); setListener(); } @@ -646,6 +665,14 @@ } /** + * Show URL in an external browser. + * @param url URL to show + */ + private void showUrlExternal(URL url) { + externalBrowser.setURLAndOpen(url); + } + + /** * Sets listener that invalidates this as main IDE's browser if user changes the settings */ private void setListener () { Index: openide.awt/apichanges.xml --- openide.awt/apichanges.xml Base (BASE) +++ openide.awt/apichanges.xml Locally Modified (Based On LOCAL) @@ -47,6 +47,26 @@ AWT API + + + URLDisplayer can show URLs in an external browser even + if the preferred browser is an internal one. + + + + + + URLDisplayer.showURL(URL) shows the given page using preferred + web browser defined in IDE options. However when the preffered browser + is an internal one (either embedded native browser or SwingBrowser) + then there's need to show some URLs in an external browser, e.g. when + a modal dialog is showing. + Method showURLExternal(URL) attempts to display the given page in + an external browser. The default implementation just delegates to showURL(URL). + + + + Added 'location' String property to HtmlBrowser.Impl Index: openide.awt/nbproject/project.properties --- openide.awt/nbproject/project.properties Base (BASE) +++ openide.awt/nbproject/project.properties Locally Modified (Based On LOCAL) @@ -44,4 +44,4 @@ javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml -spec.version.base=7.13.0 +spec.version.base=7.14.0 Index: openide.awt/src/org/openide/awt/HtmlBrowser.java --- openide.awt/src/org/openide/awt/HtmlBrowser.java Base (BASE) +++ openide.awt/src/org/openide/awt/HtmlBrowser.java Locally Modified (Based On LOCAL) @@ -924,7 +924,20 @@ * @param u the URL to show */ public abstract void showURL(URL u); + + /** + * Attempts to display given URL in preferred external browser. + * The default implementation just delegates to showURL(URL). + * The URL may be still rendered using an internal browser implementation + * if no external browser is available. + * + * @param u the URL to show + * @since 7.14 + */ + public void showURLExternal(URL u) { + showURL(u); } + } private static final class TrivialURLDisplayer extends URLDisplayer { public TrivialURLDisplayer() {