package org.limewire.ui.swing.action;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.Action;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.event.HyperlinkEvent.EventType;
import org.limewire.concurrent.FutureEvent;
import org.limewire.listener.EventListener;
import org.limewire.listener.SwingEDTEvent;
import org.limewire.ui.swing.components.HTMLPane;
import org.limewire.ui.swing.components.LimeJDialog;
import org.limewire.ui.swing.components.HTMLPane.LoadResult;
import org.limewire.ui.swing.util.NativeLaunchUtils;
import org.limewire.ui.swing.util.ResizeUtils;
public class UrlAction extends AbstractAction {
private final LaunchType type;
private String url;
private final String title;
private final GetParamAppender getParamAppender;
/**
* Constructs an UrlAction whose name is its URL with a given launch type and the param
* appender passed.
*/
public UrlAction(String url, LaunchType type, GetParamAppender getParamAppender) {
this(url, url, null, type, getParamAppender);
}
/**
* Constructs an action that will spawn the url in an in process popup with the given title.
*/
public UrlAction(String url, String title, GetParamAppender getParamAppender) {
this(url, url, title, LaunchType.POPUP, getParamAppender);
}
/**
* Constructs an UrlAction whose name is its URL, without any identifying
* information added to the URL and the default {@link LaunchType}.
*/
public UrlAction(String url) {
this(url, url, null, LaunchType.EXTERNAL_BROWSER, null);
}
/**
* Constructs an UrlAction with a specific name & url, without any identifying
* information added to the URL.
*/
public UrlAction(String name, String url) {
this(name, url, null, LaunchType.EXTERNAL_BROWSER, null);
}
/**
* Constructs an UrlAction with a specific name & url, a specific launch type, and
* without any identifying information added to the URL.
*/
public UrlAction(String name, String url, LaunchType type) {
this(name, url, null, type, null);
}
/**
* Constructs an UrlAction with a specific name & url, with identifying
* information added to the URL, and a specific launch type.
*/
public UrlAction(String name, String url, String title, LaunchType type, GetParamAppender getParamAppender) {
super(name);
this.url = url;
this.type = type;
this.title = title;
this.getParamAppender = getParamAppender;
putValue(Action.SHORT_DESCRIPTION, url);
}
public void setURL(String url) {
this.url = url;
}
@Override
public void actionPerformed(ActionEvent e) {
String urlToShow = url;
if (getParamAppender != null) {
urlToShow = getParamAppender.appendParams(urlToShow);
}
if (type == LaunchType.EXTERNAL_BROWSER) {
NativeLaunchUtils.openURL(urlToShow);
}
else {
showPopup(urlToShow, title);
}
}
private static void showPopup(final String urlToShow, final String title) {
new LimeJDialog() {
{ getContentPane().setLayout(new BorderLayout());
HTMLPane browser = new HTMLPane();
browser.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == EventType.ACTIVATED) {
NativeLaunchUtils.openURL(e.getURL().toString());
}
}
});
JScrollPane scrollPane = new JScrollPane(browser,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
getContentPane().add(scrollPane);
ResizeUtils.forceSize(this, new Dimension(600,400));
setTitle(title);
setModal(true);
setResizable(true);
setAlwaysOnTop(true);
getContentPane();
pack();
setLocationRelativeTo(null);
// If popout browser does not work use the system browser.
browser.setPageAsynchronous(urlToShow, null).addFutureListener(new EventListener<FutureEvent<LoadResult>>() {
@SwingEDTEvent
@Override
public void handleEvent(FutureEvent<LoadResult> event) {
if (event.getResult() != LoadResult.SERVER_PAGE) {
dispose();
NativeLaunchUtils.openURL(urlToShow);
}
}
});
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setVisible(true);
}
};
}
/**
* The type of show action to be used.
*/
public enum LaunchType {
/** Launch the url in an external browser **/
EXTERNAL_BROWSER,
/** Spawn a temporary dialogue to show the url **/
POPUP;
}
/**
* An interface used to append get params to the url before launching it.
*/
public static interface GetParamAppender {
public String appendParams(String original);
}
}