/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.wicket.browser;
import java.io.File;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxFallbackLink;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.util.convert.IConverter;
/**
* A data view listing files in a certain directory, subject to a file filter
* @author Andrea Aime - OpenGeo
*
*/
@SuppressWarnings("serial")
public abstract class FileDataView extends Panel {
private static final IConverter<File> FILE_NAME_CONVERTER = new StringConverter() {
public String convertToString(File file, Locale locale) {
if(file.isDirectory()) {
return file.getName() + "/";
} else {
return file.getName();
}
}
};
private static final IConverter<File> FILE_LASTMODIFIED_CONVERTER = new StringConverter() {
public String convertToString(File file, Locale locale) {
long lastModified = file.lastModified();
if (lastModified == 0L)
return null;
else {
return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(
new Date(file.lastModified()));
}
}
};
private static final IConverter<File> FILE_SIZE_CONVERTER = new StringConverter() {
private static final double KBYTE = 1024;
private static final double MBYTE = KBYTE * 1024;
private static final double GBYTE = MBYTE * 1024;
public String convertToString(File value, Locale locale) {
File file = (File) value;
if(!file.isFile())
return "";
long size = file.length();
if (size == 0L)
return null;
if (size < KBYTE) {
return size + "";
} else if (size < MBYTE) {
return new DecimalFormat("#.#").format(size / KBYTE) + "K";
} else if (size < GBYTE) {
return new DecimalFormat("#.#").format(size / MBYTE) + "M";
} else {
return new DecimalFormat("#.#").format(size / GBYTE) + "G";
}
}
};
FileProvider provider;
WebMarkupContainer fileContent;
String tableHeight = "25em";
public FileDataView(String id, FileProvider fileProvider) {
super(id);
this.provider = fileProvider;
// provider.setDirectory(currentPosition);
// provider.setSort(new SortParam(NAME, true));
final WebMarkupContainer table = new WebMarkupContainer("fileTable");
table.setOutputMarkupId(true);
add(table);
DataView<File> fileTable = new DataView<File>("files", fileProvider) {
@Override
protected void populateItem(final Item<File> item) {
// odd/even alternate style
item.add(AttributeModifier.replace("class",
item.getIndex() % 2 == 0 ? "even" : "odd"));
// navigation/selection links
AjaxFallbackLink<?> link = new IndicatingAjaxFallbackLink<Void>("nameLink") {
@Override
public void onClick(AjaxRequestTarget target) {
linkNameClicked((File) item.getModelObject(), target);
}
};
link.add(new Label("name", item.getModel()) {
@SuppressWarnings("unchecked")
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
return (IConverter<C>) FILE_NAME_CONVERTER;
}
});
item.add(link);
// last modified and size labels
item.add(new Label("lastModified", item.getModel()) {
@SuppressWarnings("unchecked")
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
return (IConverter<C>) FILE_LASTMODIFIED_CONVERTER;
}
});
item.add(new Label("size", item.getModel()) {
@SuppressWarnings("unchecked")
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
return (IConverter<C>) FILE_SIZE_CONVERTER;
}
});
}
};
fileContent = new WebMarkupContainer("fileContent") {
@Override
protected void onComponentTag(ComponentTag tag) {
if(tableHeight != null) {
tag.getAttributes().put("style", "overflow:auto; height:" + tableHeight);
}
}
};
fileContent.add(fileTable);
table.add(fileContent);
table.add(new OrderByBorder<String>("nameHeader", FileProvider.NAME, fileProvider));
table.add(new OrderByBorder<String>("lastModifiedHeader", FileProvider.LAST_MODIFIED, fileProvider));
table.add(new OrderByBorder<String>("sizeHeader", FileProvider.SIZE, fileProvider));
}
protected abstract void linkNameClicked(File file, AjaxRequestTarget target);
private static abstract class StringConverter implements IConverter<File> {
public File convertToObject(String value, Locale locale) {
throw new UnsupportedOperationException("This converter works only for strings");
}
}
public FileProvider getProvider() {
return provider;
}
public void setTableHeight(String tableHeight) {
this.tableHeight = tableHeight;
}
}