package org.rr.jeborker.gui.model;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import javax.swing.event.TreeModelListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.mufs.IResourceHandler;
import org.rr.commons.mufs.ResourceHandlerFactory;
public class FileSystemTreeModel extends AbstractFileTreeModel {
private static final long serialVersionUID = -456216843620742653L;
private DefaultMutableTreeNode root;
public FileSystemTreeModel() {
super(new DefaultMutableTreeNode("root"));
this.root = (DefaultMutableTreeNode) getRoot();
init();
}
private void init() {
List<File> specialFolders = getSpecialFolders();
for(File specialFolder : specialFolders) {
IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(specialFolder);
FileSystemNode basePathNode = new FileSystemNode(resourceHandler, null);
this.root.add(basePathNode);
}
File[] listRoots = File.listRoots();
Arrays.sort(listRoots);
for(File root : listRoots) {
if(!root.toString().equalsIgnoreCase("A:\\")) {
IResourceHandler resourceHandler = ResourceHandlerFactory.getResourceHandler(root);
FileSystemNode basePathNode = new FileSystemNode(resourceHandler, null);
this.root.add(basePathNode);
}
}
}
protected void fireTreeStructureChanged(Object source, Object[] path, int[] childIndices, Object[] children) {
super.fireTreeStructureChanged(source, path, childIndices, children);
}
/**
* This sets the user object of the TreeNode identified by path and posts a node changed. If you use custom user objects in the TreeModel you're going to
* need to subclass this and set the user object of the changed node to something meaningful.
*/
public void valueForPathChanged(TreePath path, Object newValue) {
final FileSystemNode aNode = (FileSystemNode) path.getLastPathComponent();
String oldPathName = aNode.getResource().getResourceString();
String newPathName = oldPathName.substring(0, oldPathName.length() - aNode.getResource().getName().length()) + newValue;
try {
aNode.renameTo(ResourceHandlerFactory.getResourceHandler(newPathName));
} catch (IOException e) {
LoggerFactory.getLogger().log(Level.WARNING, "Rename " + oldPathName +" to" + newPathName + " has failed.", e);
}
nodeChanged(aNode);
}
public void dispose() {
TreeModelListener[] treeModelListeners = getTreeModelListeners();
for(TreeModelListener treeModelListener : treeModelListeners) {
removeTreeModelListener(treeModelListener);
}
}
/**
* Get some special folder to be shown at the root file levels.
*/
private List<File> getSpecialFolders() {
final ArrayList<File> result = new ArrayList<>();
final FileSystemView fileSystemView = FileSystemView.getFileSystemView();
File defaultDirectory = fileSystemView.getDefaultDirectory();
if(defaultDirectory != null) {
result.add(defaultDirectory);
}
File homeDirectory = fileSystemView.getHomeDirectory();
if(homeDirectory != null && !homeDirectory.equals(defaultDirectory)) {
result.add(homeDirectory);
}
return result;
}
}