package org.limewire.ui.swing.mainframe; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JPanel; import org.limewire.core.api.Application; 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.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; public class StorePanel extends JPanel { private final Browser browser; private final Application application; /** * Used to ignore the first component hidden event coming through to the * ComponentListener. The load and hidden events are coming out of order because * of the usage of card layout, and loading StorePanel lazily. When adding a component * to CardLayout, card layout calls setVisible false on it. The main issue is that we have * started loading components lazily as they are selected. So we can't force that componsnts * are added to the card layout before we use them. */ private final AtomicBoolean firstHiddenIgnored = new AtomicBoolean(false); @Inject public StorePanel(Application application, final Navigator navigator) { this.application = application; browser = new Browser(VisibilityMode.FORCED_HIDDEN, VisibilityMode.FORCED_HIDDEN, VisibilityMode.DEFAULT); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 1; gbc.weighty = 1; add(browser, gbc); // Hide the page when the browser goes away. addComponentListener(new ComponentAdapter() { @Override public void componentHidden(ComponentEvent e) { if (firstHiddenIgnored.getAndSet(true) && MozillaInitialization.isInitialized()) { browser.load("about:blank"); } } }); BrowserUtils.addTargetedUrlAction("_lwStore", new UriAction() { @Override public boolean uriClicked(final TargetedUri targetedUrl) { SwingUtils.invokeLater(new Runnable() { @Override public void run() { navigator.getNavItem(NavCategory.LIMEWIRE, StoreMediator.NAME).select(); load(targetedUrl.getUri()); } }); return true; } }); } public void loadDefaultUrl() { load("http://store.limewire.com/"); } public void load(String url) { url = application.addClientInfoToUrl(url); if (!MozillaInitialization.isInitialized()) { NativeLaunchUtils.openURL(url); } else { // Reset the page to blank before continuing -- blocking is OK // because this is fast. MozillaAutomation.blockingLoad(browser, "about:blank"); browser.load(url + "&isClient=true"); } } }