/*
* ShellTreeViewModel.java
*
* Created on December 26, 2002, 1:02 PM
*/
package kiyut.swing.shell.shelltreeview;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.filechooser.FileSystemView;
import kiyut.swing.shell.io.*;
/** The data model for <code>ShellTreeView</code>
* The default values for fileHidingEnabled is true.
*
* @version 1.0
* @author tonny
*/
public class ShellTreeViewModel extends DefaultTreeModel {
/** the <code>FileSystemView</code> for this model */
protected FileSystemView fsv;
/** the use file hiding for this model */
protected boolean useFileHiding;
/** the view mode of <code>ShellTreeViewModel</code> */
protected int viewMode;
/** Constructs a <code>ShellTreeModel</code> */
public ShellTreeViewModel() {
this(FileSystemView.getFileSystemView(),true);
}
/** Constructs a <code>ShellTreeViewModel</code> using the given <code>FileSystemView</code>.
* @param fsv FileSystemView
* @param useFileHiding the boolean value that determines whether file hiding is turned on
*/
public ShellTreeViewModel(FileSystemView fsv, boolean useFileHiding) {
super(null);
this.fsv = fsv;
this.useFileHiding = useFileHiding;
TreeNode root = new DefaultMutableTreeNode(fsv.getRoots()[0]);
setRoot(root);
reload(root);
}
/** Returns whether the specified node is a leaf node.
* @param node the node to check
* @return true if the node is a leaf node
*/
public boolean isLeaf(Object node) {
DefaultMutableTreeNode fileNode = (DefaultMutableTreeNode)node;
File file = (File)fileNode.getUserObject();
boolean b = false;
if (fsv.isFloppyDrive(file)) {
b = false;
} else if (!file.isDirectory()) {
b = true;
}
return b;
}
/** Returns true if hidden files are not shown ; otherwise, returns false.
* @return the status of the file hiding
*
* @see #setFileHidingEnabled(boolean)
*/
public boolean isFileHidingEnabled() {
return this.useFileHiding;
}
/** Sets file hiding on or off. If true, hidden files are not shown.
* @param useFileHiding the boolean value that determines whether file hiding is turned on
*
* @see #isFileHidingEnabled()
*/
public void setFileHidingEnabled(boolean useFileHiding) {
this.useFileHiding = useFileHiding;
}
/** Returns the current view mode. The default is VM_FILES_AND_DIRECTORIES.
* @return the type of files to be displayed, one of the following:
* <ul>
* <li>ShellTree.VM_DIRECTORIES_ONLY.
* <li>ShellTree.VM_FILES_AND_DIRECTORIES.
* </ul>
* @see #setViewMode(int)
*/
public int getViewMode() {
return viewMode;
}
/**
* Sets the view mode.
* @param viewMode the type of files to be displayed:
* <ul>
* <li>ShellTree.VM_DIRECTORIES_ONLY.
* <li>ShellTree.VM_FILES_AND_DIRECTORIES.
* </ul>
* @throws IllegalArgumentException if <code>viewMode</code> is an illegal <code>viewMode</code>
*
* @see #getViewMode
*/
public void setViewMode(int viewMode) throws IllegalArgumentException {
if ((viewMode == ShellTreeView.VM_DIRECTORIES_ONLY) || (viewMode == ShellTreeView.VM_FILES_AND_DIRECTORIES)) {
this.viewMode = viewMode;
reload(root);
} else {
throw new IllegalArgumentException("illegal viewMode");
}
}
/** Returns the file system view.
* @return the <code>FileSystemView</code> object
*
* @see #setFileSystemView(javax.swing.filechooser.FileSystemView)
*/
public FileSystemView getFileSystemView() {
return fsv;
}
/** Sets the file system view that this model uses for accessing and creating file system resources,
* such as finding the floppy drive and getting a list of root drives.
* @param fsv the new FileSystemView
*
* @see #getFileSystemView
*/
public void setFileSystemView(FileSystemView fsv) {
this.fsv = fsv;
}
/** 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.
* @param path path to the node that the user has altered
* @param newValue the new value from the TreeCellEditor
*/
public void valueForPathChanged(TreePath path, Object newValue) {
// do nothing
}
/**
* Invoke this method if you've modified the TreeNodes upon which this
* model depends. The model will notify all of its listeners that the
* model has changed below the node <code>node</code>.
* @param node The node to reload
*/
public void reload(TreeNode node) {
if(node == null) {
return;
}
DefaultMutableTreeNode fileNode = (DefaultMutableTreeNode)node;
File file = (File)fileNode.getUserObject();
// Group the folder & file
File[] fileArray = fsv.getFiles(file,useFileHiding);
List<File> dirs = ShellFilter.filter(new DirectoryFilter(fsv),fileArray);
Collections.sort(dirs);
List<File> fileList = new ArrayList<File>(dirs);
if (viewMode == ShellTreeView.VM_FILES_AND_DIRECTORIES) {
List<File> files = ShellFilter.filter(new FileOnlyFilter(fsv),fileArray);
Collections.sort(files);
fileList.addAll(files);
}
fileNode.removeAllChildren();
for(int i=0; i<fileList.size(); i++) {
File f = fileList.get(i);
fileNode.add(new DefaultMutableTreeNode(f));
}
super.reload(node);
}
}