2015-06-01 09:35:51 +00:00
|
|
|
package com.bytezone.diskbrowser.gui;
|
|
|
|
|
|
|
|
/***********************************************************************************************
|
|
|
|
* JPanel which displays a scrolling JTree containing details of all disks in the user's
|
|
|
|
* root directory. The JTree consists entirely of FileNode objects (which are simply
|
|
|
|
* wrappers for File objects). There will always be exactly one instance contained in
|
|
|
|
* Catalog Panel, along with any number of AppleDiskTab instances.
|
|
|
|
***********************************************************************************************/
|
|
|
|
|
|
|
|
import java.awt.Font;
|
|
|
|
import java.io.File;
|
|
|
|
import java.util.Enumeration;
|
|
|
|
|
|
|
|
import javax.swing.JTree;
|
|
|
|
import javax.swing.event.TreeExpansionEvent;
|
|
|
|
import javax.swing.event.TreeSelectionEvent;
|
|
|
|
import javax.swing.event.TreeSelectionListener;
|
|
|
|
import javax.swing.event.TreeWillExpandListener;
|
|
|
|
import javax.swing.tree.DefaultMutableTreeNode;
|
|
|
|
import javax.swing.tree.ExpandVetoException;
|
|
|
|
import javax.swing.tree.TreePath;
|
|
|
|
|
|
|
|
import com.bytezone.diskbrowser.disk.DiskFactory;
|
|
|
|
import com.bytezone.diskbrowser.disk.FormattedDisk;
|
|
|
|
import com.bytezone.diskbrowser.gui.RedoHandler.RedoEvent;
|
|
|
|
import com.bytezone.diskbrowser.gui.TreeBuilder.FileNode;
|
|
|
|
|
|
|
|
class FileSystemTab extends AbstractTab
|
|
|
|
{
|
|
|
|
File rootFolder;
|
|
|
|
|
|
|
|
public FileSystemTab (File folder, DiskAndFileSelector selector, RedoHandler navMan,
|
2016-12-07 10:42:01 +00:00
|
|
|
Font font, DiskSelectedEvent diskEvent)
|
2015-06-01 09:35:51 +00:00
|
|
|
{
|
|
|
|
super (navMan, selector, font);
|
|
|
|
this.rootFolder = folder;
|
|
|
|
|
|
|
|
TreeBuilder tb = new TreeBuilder (folder);
|
|
|
|
|
2016-12-07 10:42:01 +00:00
|
|
|
setTree (tb.getTree ());
|
2015-06-01 09:35:51 +00:00
|
|
|
setSelectionListener (tree);
|
|
|
|
|
|
|
|
if (diskEvent == null)
|
|
|
|
{
|
|
|
|
DefaultMutableTreeNode node = findFirstLeafNode ();
|
|
|
|
if (node != null)
|
|
|
|
{
|
|
|
|
FileNode fn = (FileNode) node.getUserObject ();
|
|
|
|
diskEvent = new DiskSelectedEvent (this, DiskFactory.createDisk (fn.file));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (diskEvent != null)
|
|
|
|
navMan.diskSelected (diskEvent);
|
|
|
|
else
|
|
|
|
System.out.println ("No disk event");
|
|
|
|
}
|
|
|
|
|
|
|
|
public FileSystemTab (File folder, DiskAndFileSelector selector, RedoHandler navMan,
|
2016-08-19 09:57:29 +00:00
|
|
|
Font font)
|
2015-06-01 09:35:51 +00:00
|
|
|
{
|
2016-12-07 10:42:01 +00:00
|
|
|
this (folder, selector, navMan, font, null); // default to first available disk
|
2015-06-01 09:35:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void activate ()
|
|
|
|
{
|
2016-12-07 10:42:01 +00:00
|
|
|
tree.setSelectionPath (null); // turn off any current selection to force an event
|
2016-03-03 06:19:40 +00:00
|
|
|
redoHandler.setCurrentData (redoData);
|
2015-06-01 09:35:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// connected to RefreshTreeAction
|
|
|
|
@Override
|
|
|
|
public void refresh ()
|
|
|
|
{
|
|
|
|
String currentDiskName = ((FileNode) getSelectedObject ()).file.getAbsolutePath ();
|
|
|
|
TreeBuilder tb = new TreeBuilder (rootFolder);
|
2016-12-07 10:42:01 +00:00
|
|
|
setTree (tb.getTree ());
|
2015-06-01 09:35:51 +00:00
|
|
|
if (currentDiskName != null)
|
|
|
|
showNode (findNode (currentDiskName));
|
|
|
|
setSelectionListener (tree);
|
|
|
|
}
|
|
|
|
|
|
|
|
void redoEvent (RedoEvent event)
|
|
|
|
{
|
|
|
|
DefaultMutableTreeNode node = null;
|
|
|
|
if (event.type.equals ("FileNodeEvent"))
|
|
|
|
{
|
|
|
|
FileNode fn = ((FileNodeSelectedEvent) event.value).getFileNode ();
|
|
|
|
node = fn.parentNode;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FormattedDisk disk = ((DiskSelectedEvent) event.value).getFormattedDisk ();
|
|
|
|
node = findNode (disk.getAbsolutePath ());
|
|
|
|
}
|
|
|
|
if (node == null)
|
|
|
|
node = findNode (2);
|
|
|
|
if (node != null)
|
|
|
|
showNode (node);
|
|
|
|
else
|
|
|
|
System.out.println ("Disk node not found");
|
|
|
|
}
|
|
|
|
|
2016-12-10 07:36:44 +00:00
|
|
|
void selectDisk (String path)
|
2015-06-01 09:35:51 +00:00
|
|
|
{
|
2016-12-11 05:18:04 +00:00
|
|
|
DefaultMutableTreeNode node = findNode (rootFolder.getAbsolutePath () + path);
|
|
|
|
if (node != null)
|
|
|
|
showNode (node);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
System.out.println ("Path not found: " + rootFolder.getAbsolutePath () + path);
|
|
|
|
}
|
2016-12-10 07:36:44 +00:00
|
|
|
}
|
2015-06-01 09:35:51 +00:00
|
|
|
|
2016-12-10 07:36:44 +00:00
|
|
|
private DefaultMutableTreeNode findNode (String absolutePath)
|
|
|
|
{
|
|
|
|
return search (getRootNode (), absolutePath);
|
2015-06-01 09:35:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private DefaultMutableTreeNode search (DefaultMutableTreeNode node, String absolutePath)
|
|
|
|
{
|
|
|
|
FileNode fn = (FileNode) node.getUserObject ();
|
|
|
|
|
|
|
|
int children = node.getChildCount ();
|
|
|
|
if (children == 0)
|
|
|
|
{
|
|
|
|
fn.readFiles ();
|
|
|
|
children = node.getChildCount ();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < children; i++)
|
|
|
|
{
|
|
|
|
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt (i);
|
|
|
|
FileNode fn2 = (FileNode) childNode.getUserObject ();
|
|
|
|
|
|
|
|
String path = fn2.file.getAbsolutePath ();
|
|
|
|
if (absolutePath.equals (path))
|
|
|
|
return childNode;
|
|
|
|
|
2016-12-11 05:18:04 +00:00
|
|
|
if (fn2.file.isDirectory () && absolutePath.startsWith (path))
|
2015-06-01 09:35:51 +00:00
|
|
|
{
|
2016-12-11 05:18:04 +00:00
|
|
|
if (absolutePath.charAt (path.length ()) == File.separatorChar)
|
|
|
|
{
|
|
|
|
DefaultMutableTreeNode node2 = search (childNode, absolutePath);
|
|
|
|
if (node2 != null)
|
|
|
|
return node2;
|
|
|
|
}
|
2015-06-01 09:35:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void replaceDisk (FormattedDisk disk)
|
|
|
|
{
|
|
|
|
// first check currently selected disk
|
|
|
|
FileNode fn = (FileNode) getSelectedObject ();
|
|
|
|
if (fn != null && fn.replaceDisk (disk))
|
|
|
|
return;
|
|
|
|
|
|
|
|
// find the old disk and replace it
|
|
|
|
DefaultMutableTreeNode rootNode = getRootNode ();
|
|
|
|
Enumeration<DefaultMutableTreeNode> children = rootNode.breadthFirstEnumeration ();
|
|
|
|
while (children.hasMoreElements ())
|
|
|
|
{
|
|
|
|
DefaultMutableTreeNode node = children.nextElement ();
|
|
|
|
fn = (FileNode) node.getUserObject ();
|
|
|
|
if (fn.replaceDisk (disk))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setSelectionListener (JTree tree)
|
|
|
|
{
|
|
|
|
tree.addTreeSelectionListener (new TreeSelectionListener ()
|
|
|
|
{
|
|
|
|
@Override
|
|
|
|
public void valueChanged (TreeSelectionEvent e)
|
|
|
|
{
|
|
|
|
FileNode fn = (FileNode) getSelectedObject ();
|
|
|
|
if (fn != null)
|
|
|
|
eventHandler.fireDiskSelectionEvent (fn);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
tree.addTreeWillExpandListener (new TreeWillExpandListener ()
|
|
|
|
{
|
|
|
|
@Override
|
|
|
|
public void treeWillCollapse (TreeExpansionEvent e) throws ExpandVetoException
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void treeWillExpand (TreeExpansionEvent e) throws ExpandVetoException
|
|
|
|
{
|
|
|
|
TreePath path = e.getPath ();
|
2016-08-19 09:57:29 +00:00
|
|
|
DefaultMutableTreeNode node =
|
|
|
|
(DefaultMutableTreeNode) path.getLastPathComponent ();
|
2015-06-01 09:35:51 +00:00
|
|
|
FileNode fn = (FileNode) node.getUserObject ();
|
|
|
|
if (node.getChildCount () == 0)
|
|
|
|
fn.readFiles ();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2016-08-19 09:57:29 +00:00
|
|
|
}
|