package org.limewire.ui.swing.home; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.net.URL; import javax.swing.BorderFactory; import javax.swing.JScrollPane; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import org.jdesktop.swingx.JXPanel; import org.limewire.core.api.Application; import org.limewire.inject.LazySingleton; import org.limewire.ui.swing.browser.Browser; import org.limewire.ui.swing.browser.BrowserUtils; import org.limewire.ui.swing.browser.UriAction; import org.limewire.ui.swing.components.HTMLPane; import org.limewire.ui.swing.nav.NavCategory; import org.limewire.ui.swing.nav.Navigator; import org.limewire.ui.swing.util.NativeLaunchUtils; import org.limewire.ui.swing.util.SwingUtils; import org.mozilla.browser.MozillaAutomation; import org.mozilla.browser.MozillaInitialization; import org.mozilla.browser.MozillaPanel.VisibilityMode; import com.google.inject.Inject; /** The main home page.*/ @LazySingleton public class HomePanel extends JXPanel { private boolean firstRequest = true; private final Application application; private final Browser browser; private final HTMLPane fallbackBrowser; @Inject public HomePanel(Application application, final Navigator navigator) { this.application = application; setPreferredSize(new Dimension(500, 500)); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1; gbc.weighty = 1; if(MozillaInitialization.isInitialized()) { // Hide the page when the browser goes away. addComponentListener(new ComponentAdapter() { @Override public void componentHidden(ComponentEvent e) { browser.load("about:blank"); } }); BrowserUtils.addTargetedUrlAction("_lwHome", new UriAction() { @Override public boolean uriClicked(final TargetedUri targetedUrl) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { navigator.getNavItem(NavCategory.LIMEWIRE, HomeMediator.NAME).select(); load(targetedUrl.getUri()); } }); return true; } }); browser = new Browser(VisibilityMode.FORCED_HIDDEN, VisibilityMode.FORCED_HIDDEN, VisibilityMode.DEFAULT); fallbackBrowser = null; add(browser, gbc); } else { browser = null; fallbackBrowser = new HTMLPane(); fallbackBrowser.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { NativeLaunchUtils.openURL(e.getURL().toExternalForm()); } } }); JScrollPane scroller = new JScrollPane(fallbackBrowser, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scroller.setBorder(BorderFactory.createEmptyBorder()); add(scroller, gbc); } } public void loadDefaultUrl() { load("http://mnutt.github.com/limewire-remote/loading.html"); } public void load(String url) { url = application.addClientInfoToUrl(url); if(MozillaInitialization.isInitialized()) { if(firstRequest) { if(browser.isLastRequestSuccessful()) { firstRequest = false; } else { url += "&firstRequest=true"; } } // Reset the page to blank before continuing -- blocking is OK because this is fast. MozillaAutomation.blockingLoad(browser, "about:blank"); browser.load(url); } else { URL bgImage = HomePanel.class.getResource("/org/limewire/ui/swing/mainframe/resources/icons/static_pages/body_bg.png"); URL topImage = HomePanel.class.getResource("/org/limewire/ui/swing/mainframe/resources/icons/static_pages/header_logo.png"); String offlinePage = "<html><head><style type=\"text/css\">* {margin: 0; padding: 0;} body {background: #EAEAEA url(\""+ bgImage.toExternalForm() + "\") repeat-x left top; font-family: Arial, sans-serif;}table#layout tr td#header { background: url(\"" + topImage.toExternalForm() + "\") no-repeat center top;}table#layout tr td h2 { font-size: 16px; margin: 0 0 8px 0; color: #807E7E;}table#layout tr td p { font-size: 11px; color: #931F22;}</style></head><body><center> <table id=\"layout\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"400\" style=\"margin: 46px 0 0 0\"> <tr valign=\"top\"> <td id=\"header\" height=\"127\" align=\"center\"></td> </tr> <tr valign=\"top\"> <td align=\"center\"> <h2>You are offline</h2> <p>Please check your internet connection.</p> </td> </tr> </table></center></body></html>"; url += "&html32=true"; if(firstRequest) { if(fallbackBrowser.isLastRequestSuccessful()) { firstRequest = false; } else { url += "&firstRequest=true"; } } fallbackBrowser.setPageAsynchronous(url, offlinePage); } } }