package pl.touk.tola.gwt.client.widgets.export;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.google.gwt.user.client.Window;
import java.util.HashMap;
import java.util.Map;
import pl.touk.tola.gwt.shared.ExportParameters.ExportParameterNameInRequest;
/**
* Button do exportu.
*
* @author rpietra
*/
public class CsvExportButton extends Button {
public static final String DELIMETER = "||";
private final String controllerUrl;
private final String clazz;
private final String buttonLabel;
private final String sortColumn;
private final String filenamePrefix;
private Map<String, Object> additionalParameters;
private final boolean xlsExport;
private final boolean automaticExport;
/**
*
* @param controllerUrl - url do kontorllera obslugujacego export
* @param clazz - klasa(bean hibernate'owy) ktory repezentuje exportowana tabelę
* @param buttonLabel - nazwa przycisu
* @param sortColumn - kolumna (bean property) po której sortować wynik exportu
* @param additionalParameters - dodatkowe parametry typu: Long, Integer lub String
*/
public CsvExportButton(String controllerUrl, String clazz, String buttonLabel, String sortColumn, Map<String, Object> additionalParameters, boolean xls, boolean automaticExport) {
this(controllerUrl, clazz, buttonLabel, sortColumn, buttonLabel, additionalParameters, xls, automaticExport);
}
/**
*
* @param controllerUrl - url do kontorllera obslugujacego export
* @param clazz - klasa(bean hibernate'owy) ktory repezentuje exportowana tabelę
* @param buttonLabel - nazwa przycisu
* @param sortColumn - kolumna (bean property) po której sortować wynik exportu
*/
public CsvExportButton(String controllerUrl, String clazz, String buttonLabel, String sortColumn) {
this(controllerUrl, clazz, buttonLabel, sortColumn, buttonLabel, null, false, true);
}
/**
*
* @param controllerUrl - url do kontorllera obslugujacego export
* @param clazz - klasa(bean hibernate'owy) ktory repezentuje exportowana tabelę
* @param buttonLabel - nazwa przycisu
* @param sortColumn - kolumna (bean property) po której sortować wynik exportu
* @param filenamePrefix - nazwa pliku
* @param additionalParameters - dodatkowe parametry typu: Long, Integer lub String
* @param xls - export do xls
*/
public CsvExportButton(String controllerUrl, String clazz, String buttonLabel, String sortColumn, String filenamePrefix, Map<String, Object> additionalParameters, final boolean xls, final boolean automaticExport) {
super(buttonLabel);
this.controllerUrl = controllerUrl;
this.clazz = clazz;
this.buttonLabel = buttonLabel.replace(" ", "_");
this.sortColumn = sortColumn;
this.filenamePrefix = filenamePrefix;
this.additionalParameters = additionalParameters;
this.xlsExport = xls;
this.automaticExport = automaticExport;
}
@Override
protected void onClick(ComponentEvent ce) {
super.onClick(ce);
if (automaticExport) {
export();
}
}
String buildUrl() {
StringBuffer buffer = new StringBuffer();
buffer.append(controllerUrl);
//standard parameters
buffer.append("?").append(ExportParameterNameInRequest.clazz).append("=");
buffer.append(clazz);
// buffer.append("&sortColumn=");//TODO: use enum
buffer.append("&").append(ExportParameterNameInRequest.sortColumn).append("=");
buffer.append(sortColumn);
// buffer.append("&filePrefix=");//TODO: use enum
buffer.append("&").append(ExportParameterNameInRequest.filePrefix).append("=");
buffer.append(filenamePrefix);
if (xlsExport) {
buffer.append("&").append(ExportParameterNameInRequest.xlsExport).append("=");
buffer.append(xlsExport);
}
//additional parameters
if (additionalParameters != null) {
for (String paramName : additionalParameters.keySet()) {
buffer.append("&").append(paramName).append("=");
Object paramValue = additionalParameters.get(paramName);
buffer.append(paramValue);
buffer.append(DELIMETER);
String className = paramValue.getClass().toString();
buffer.append(className.substring("class ".length()));
}
}
buffer = replaceInStringBuffer(buffer, " ", "%20");
return buffer.toString();
}
private boolean validateExportParameters() {
boolean clazzPresent = clazz != null && !"".equals(clazz.trim());
boolean sortColumnPresent = sortColumn != null && !"".equals(sortColumn.trim());
return clazzPresent && sortColumnPresent;
}
public void setAdditionalParams(HashMap<String, Object> params) {
additionalParameters = params;
}
public String getButtonLabel() {
return buttonLabel;
}
public void export() {
String url = CsvExportButton.this.buildUrl();
Window.open(url, buttonLabel, "export");
}
//TODO: to tak pospolita funkcjonalnosc, ze mozna omyslec o jej wydzieleniu do jakiejs klasy
public StringBuffer replaceInStringBuffer(StringBuffer buffer, String textToReplace, String replacementText) {
int position = 0;
int limit = buffer.length() - textToReplace.length();
while (position <= limit) {
position = buffer.indexOf(textToReplace, position);
if (position < 0) {
break;
}
buffer.replace(position, position + textToReplace.length(), replacementText);
}
return buffer;
}
}