package com.link_intersystems.swing;
import java.awt.Component;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.apache.commons.io.FileUtils;
public class HumanReadableFileSizeTreeCellRenderer extends
DefaultTreeCellRenderer {
private static final long serialVersionUID = 5381781656497174451L;
/**
* {@value}
*/
public static final String DEFAULT_FORMAT = "%s [%s]";
private String format = DEFAULT_FORMAT;
private FileModelAdapterFactory fileModelAdapterFactory = DefaultMutableTreeNodeFileModelAdapterFactory.INSTANCE;
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
row, hasFocus);
String text = "";
FileModel fileModel = fileModelAdapterFactory.createAdapter(value);
if (fileModel != null) {
String displaySize = FileUtils.byteCountToDisplaySize(fileModel
.getSize());
String name = fileModel.getName();
text = String.format(format, name, displaySize);
}
setText(text);
return this;
}
/**
* The format string for the {@link FileModel}. Default is
* {@link #DEFAULT_FORMAT}.
*
* @param format
*/
public void setFormat(String format) {
if (format == null) {
format = DEFAULT_FORMAT;
}
this.format = format;
}
public void setFileModelAdapterFactory(
FileModelAdapterFactory fileModelAdapterFactory) {
if (fileModelAdapterFactory == null) {
fileModelAdapterFactory = DefaultMutableTreeNodeFileModelAdapterFactory.INSTANCE;
}
this.fileModelAdapterFactory = fileModelAdapterFactory;
}
private static class DefaultMutableTreeNodeFileModelAdapterFactory
implements FileModelAdapterFactory {
private static final DefaultMutableTreeNodeFileModelAdapterFactory INSTANCE = new DefaultMutableTreeNodeFileModelAdapterFactory();
@Override
public FileModel createAdapter(Object treeModelObject) {
FileModel fileModel = null;
if (treeModelObject instanceof FileModel) {
fileModel = FileModel.class.cast(treeModelObject);
} else if (treeModelObject instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode mutableTreeNode = DefaultMutableTreeNode.class
.cast(treeModelObject);
Object userObject = mutableTreeNode.getUserObject();
if (userObject instanceof FileModel) {
fileModel = FileModel.class.cast(userObject);
}
}
return fileModel;
}
}
}