All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jdesktop.swingx.treetable.FileSystemModel Maven / Gradle / Ivy

There is a newer version: 1.6.8
Show newest version
/*
 * $Id$
 *
 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package org.jdesktop.swingx.treetable;

import java.io.File;
import java.util.Arrays;
import java.util.Date;

/**
 * A tree table model to simulate a file system.
 * 

* This tree table model implementation extends {@code AbstractTreeTableModel}. * The file system metaphor demonstrates that it is often easier to directly * implement tree structures directly instead of using intermediaries, such as * {@code TreeTableNode}. *

* A comparison of this class with {@code SimpleFileSystemModel}, shows that * extending {@code AbstractTreeTableModel} is often easier than creating a model * from scratch. *

* A "full" version of this model might allow editing of file names, the * deletion of files, and the movement of files. This simple implementation does * not intend to tackle such problems, but this implementation may be extended * to handle such details. * * @author Ramesh Gupta * @author Karl Schaefer */ public class FileSystemModel extends AbstractTreeTableModel { // The the returned file length for directories. private static final Long DIRECTORY = 0L; /** * Creates a file system model using the root directory as the model root. */ public FileSystemModel() { this(new File(File.separator)); } /** * Creates a file system model using the specified {@code root}. * * @param root * the root for this model; this may be different than the root * directory for a file system. */ public FileSystemModel(File root) { super(root); } private boolean isValidFileNode(Object file) { boolean result = false; if (file instanceof File) { File f = (File) file; while (!result && f != null) { result = f.equals(root); f = f.getParentFile(); } } return result; } /** * {@inheritDoc} */ @Override public File getChild(Object parent, int index) { if (!isValidFileNode(parent)) { throw new IllegalArgumentException("parent is not a file governed by this model"); } File parentFile = (File) parent; String[] children = parentFile.list(); if (children != null) { return new File(parentFile, children[index]); } return null; } /** * {@inheritDoc} */ @Override public int getChildCount(Object parent) { if (parent instanceof File) { String[] children = ((File) parent).list(); if (children != null) { return children.length; } } return 0; } /** * {@inheritDoc} */ @Override public Class getColumnClass(int column) { switch (column) { case 0: return String.class; case 1: return Long.class; case 2: return Boolean.class; case 3: return Date.class; default: return super.getColumnClass(column); } } @Override public int getColumnCount() { return 4; } @Override public String getColumnName(int column) { switch (column) { case 0: return "Name"; case 1: return "Size"; case 2: return "Directory"; case 3: return "Modification Date"; default: return super.getColumnName(column); } } @Override public Object getValueAt(Object node, int column) { if (node instanceof File) { File file = (File) node; switch (column) { case 0: return file.getName(); case 1: return isLeaf(node) ? file.length() : DIRECTORY; case 2: return file.isDirectory(); case 3: return new Date(file.lastModified()); } } return null; } /** * {@inheritDoc} */ @Override public int getIndexOfChild(Object parent, Object child) { if (parent instanceof File && child instanceof File) { File parentFile = (File) parent; File[] files = parentFile.listFiles(); Arrays.sort(files); for (int i = 0, len = files.length; i < len; i++) { if (files[i].equals(child)) { return i; } } } return -1; } /** * {@inheritDoc} */ @Override public File getRoot() { return (File) root; } /** * Sets the root for this tree table model. This method will notify * listeners that a change has taken place. * * @param root * the new root node to set */ public void setRoot(File root) { this.root = root; modelSupport.fireNewRoot(); } /** * {@inheritDoc} */ @Override public boolean isLeaf(Object node) { if (node instanceof File) { //do not use isFile(); some system files return false return ((File) node).list() == null; } return true; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy