package au.edu.anu.dcclient.bagfilesexplorer;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Map.Entry;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import au.edu.anu.datacommons.storage.info.BagSummary;
import au.edu.anu.datacommons.storage.info.FileSummary;
public class BagFilesTree extends JTree {
private static final Logger LOGGER = LoggerFactory.getLogger(BagFilesTree.class);
private static final long serialVersionUID = 1L;
private BagSummary bagSummary;
public BagFilesTree(BagSummary bagSummary) {
this.bagSummary = bagSummary;
configTree();
populateTree();
}
private void configTree() {
setDragEnabled(true);
setActionListener();
setPropertyListener();
}
public BagSummary getBagSummary() {
return bagSummary;
}
private void setActionListener() {
this.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
if (((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) && (getSelectionCount() > 0)) {
BagFileMenu popupMenu = new BagFileMenu(BagFilesTree.this);
popupMenu.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
BagFilesTree.this.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
}
});
popupMenu.show(BagFilesTree.this, e.getX(), e.getY());
}
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
});
}
private void setPropertyListener() {
// TODO Auto-generated method stub
}
private void populateTree() {
DefaultMutableTreeNode rootNode = null;
for (Entry<String, FileSummary> fsEntry : bagSummary.getFileSummaryMap().entrySet()) {
rootNode = addNodeToTree(rootNode, fsEntry);
}
TreeModel model = new DefaultTreeModel(rootNode);
this.setCellRenderer(new BagFilesTreeCellRenderer());
this.setModel(model);
}
private DefaultMutableTreeNode addNodeToTree(DefaultMutableTreeNode rootNode, Entry<String, FileSummary> fsEntry) {
String[] pathParts = fsEntry.getKey().split("/");
DefaultMutableTreeNode parentNode = null;
for (int iPathPart = 0; iPathPart < pathParts.length; iPathPart++) {
if (iPathPart == 0) {
if (rootNode == null) {
rootNode = new DefaultMutableTreeNode(pathParts[iPathPart], true);
}
parentNode = rootNode;
} else if (iPathPart == pathParts.length - 1) {
DefaultMutableTreeNode bagFileNode = new DefaultMutableTreeNode(fsEntry, false);
parentNode.add(bagFileNode);
} else {
int iChild;
for (iChild = 0; iChild < parentNode.getChildCount(); iChild++) {
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) parentNode.getChildAt(iChild);
if (childNode.getUserObject() instanceof String) {
if (((String) childNode.getUserObject()).equals(pathParts[iPathPart])) {
parentNode = childNode;
break;
}
} else {
throw new RuntimeException("Node is not of type String.");
}
}
if (iChild == parentNode.getChildCount()) {
DefaultMutableTreeNode createdChild = new DefaultMutableTreeNode(pathParts[iPathPart], true);
parentNode.add(createdChild);
parentNode = createdChild;
}
}
}
return rootNode;
}
}