package com.constellio.app.ui.framework.buttons;
import com.constellio.app.ui.util.FileIconUtils;
import com.vaadin.server.ConnectorResource;
import com.vaadin.server.DownloadStream;
import com.vaadin.server.Page;
import com.vaadin.server.Resource;
import com.vaadin.ui.Link;
import com.vaadin.ui.themes.ValoTheme;
public class DownloadLink extends Link {
public static final String STYLE_NAME = "download-link";
protected Resource downloadedResource;
public DownloadLink(Resource downloadedResource, String caption) {
super(caption, wrapForDownload(downloadedResource));
this.downloadedResource = downloadedResource;
addStyleName(STYLE_NAME);
addStyleName(ValoTheme.BUTTON_LINK);
if (downloadedResource instanceof ConnectorResource) {
ConnectorResource connectorResource = (ConnectorResource) downloadedResource;
String fileName = connectorResource.getFilename();
Resource icon = FileIconUtils.getIcon(fileName);
if (icon != null) {
setIcon(icon);
}
}
if (Page.getCurrent().getWebBrowser().isIOS()) {
setTargetName("_blank");
}
}
public static Resource wrapForDownload(Resource downloadedResource) {
Resource resourceOrWrapper;
if (downloadedResource instanceof ConnectorResource) {
final ConnectorResource adaptee = (ConnectorResource) downloadedResource;
resourceOrWrapper = new ConnectorResource() {
@Override
public String getMIMEType() {
return adaptee.getMIMEType();
}
@Override
public DownloadStream getStream() {
DownloadStream stream = adaptee.getStream();
if (stream.getParameter("Content-Disposition") == null) {
// Content-Disposition: attachment generally forces download
stream.setParameter("Content-Disposition",
"attachment; filename=\"" + stream.getFileName() + "\"");
}
return stream;
}
@Override
public String getFilename() {
return adaptee.getFilename();
}
};
} else {
resourceOrWrapper = downloadedResource;
}
return resourceOrWrapper;
}
}