dmolony-DiskBrowser/src/com/bytezone/diskbrowser/gui/FileSystemTab.java

227 lines
8.1 KiB
Java
Raw Permalink Normal View History

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;
2017-11-25 20:12:59 +00:00
import javax.swing.tree.TreeNode;
2015-06-01 09:35:51 +00:00
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;
2019-11-03 05:49:01 +00:00
// -----------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
class FileSystemTab extends AbstractTab
2019-11-03 05:49:01 +00:00
// -----------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
File rootFolder;
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2019-10-26 00:53:28 +00:00
public FileSystemTab (File folder, DiskAndFileSelector selector,
RedoHandler redoHandler, Font font, DiskSelectedEvent diskEvent)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2019-09-13 05:32:35 +00:00
super (redoHandler, selector, font);
2015-06-01 09:35:51 +00:00
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)
2019-09-13 05:32:35 +00:00
redoHandler.diskSelected (diskEvent);
2015-06-01 09:35:51 +00:00
else
System.out.println ("No disk event");
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
public FileSystemTab (File folder, DiskAndFileSelector selector, RedoHandler navMan,
2016-08-19 09:57:29 +00:00
Font font)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
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
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
@Override
public void activate ()
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
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
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
@Override
public void refresh ()
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
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);
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
void redoEvent (RedoEvent event)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
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");
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2016-12-10 07:36:44 +00:00
void selectDisk (String path)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +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
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2016-12-10 07:36:44 +00:00
private DefaultMutableTreeNode findNode (String absolutePath)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2016-12-10 07:36:44 +00:00
{
return search (getRootNode (), absolutePath);
2015-06-01 09:35:51 +00:00
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
private DefaultMutableTreeNode search (DefaultMutableTreeNode node, String absolutePath)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
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;
if (fn2.file.isDirectory () && absolutePath.startsWith (path))
2015-06-01 09:35:51 +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;
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
public void replaceDisk (FormattedDisk disk)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
// 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 ();
2017-11-25 20:12:59 +00:00
Enumeration<TreeNode> children = rootNode.breadthFirstEnumeration ();
2015-06-01 09:35:51 +00:00
while (children.hasMoreElements ())
{
2017-11-25 20:12:59 +00:00
DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement ();
2015-06-01 09:35:51 +00:00
fn = (FileNode) node.getUserObject ();
if (fn.replaceDisk (disk))
break;
}
}
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
private void setSelectionListener (JTree tree)
2019-11-03 05:49:01 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
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
{
2016-08-19 09:57:29 +00:00
DefaultMutableTreeNode node =
2019-11-03 05:49:01 +00:00
(DefaultMutableTreeNode) e.getPath ().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
}