mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-09-29 07:55:13 +00:00
204 lines
7.4 KiB
Java
Executable File
204 lines
7.4 KiB
Java
Executable File
package com.bytezone.diskbrowser.gui;
|
|
|
|
/***********************************************************************************************
|
|
* Parent class of FileSystemTab and AppleDiskTab.
|
|
*
|
|
*
|
|
***********************************************************************************************/
|
|
|
|
import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER;
|
|
import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
|
|
|
|
import java.awt.BorderLayout;
|
|
import java.awt.Cursor;
|
|
import java.awt.Font;
|
|
import java.awt.event.MouseAdapter;
|
|
import java.awt.event.MouseEvent;
|
|
import java.util.ArrayList;
|
|
import java.util.Enumeration;
|
|
import java.util.List;
|
|
|
|
import javax.swing.JPanel;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.JTree;
|
|
import javax.swing.tree.DefaultMutableTreeNode;
|
|
import javax.swing.tree.DefaultTreeModel;
|
|
import javax.swing.tree.TreeNode;
|
|
import javax.swing.tree.TreePath;
|
|
import javax.swing.tree.TreeSelectionModel;
|
|
|
|
import com.bytezone.diskbrowser.gui.RedoHandler.RedoData;
|
|
import com.bytezone.diskbrowser.gui.TreeBuilder.FileNode;
|
|
|
|
// -----------------------------------------------------------------------------------//
|
|
abstract class AbstractTab extends JPanel implements Tab
|
|
// -----------------------------------------------------------------------------------//
|
|
{
|
|
private final static Cursor handCursor = new Cursor (Cursor.HAND_CURSOR);
|
|
private final List<MouseAdapter> adapters = new ArrayList<> ();
|
|
private Font font;
|
|
private final JScrollPane scrollPane;
|
|
final DiskAndFileSelector eventHandler;
|
|
final RedoHandler redoHandler;
|
|
final RedoData redoData;
|
|
protected JTree tree;
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
public AbstractTab (RedoHandler redoHandler, DiskAndFileSelector selector, Font font)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
super (new BorderLayout ());
|
|
|
|
this.eventHandler = selector;
|
|
this.font = font;
|
|
this.redoHandler = redoHandler;
|
|
this.redoData = redoHandler.createData ();
|
|
|
|
scrollPane =
|
|
new JScrollPane (null, VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_NEVER);
|
|
scrollPane.setBorder (null);
|
|
// scrollPane.setBorder (BorderFactory.createEmptyBorder ());
|
|
add (scrollPane, BorderLayout.CENTER);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
protected void setTree (JTree tree)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
this.tree = tree;
|
|
tree.setFont (font);
|
|
scrollPane.setViewportView (tree);
|
|
TreeSelectionModel tsm = tree.getSelectionModel ();
|
|
tsm.setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION);
|
|
|
|
if (adapters.size () > 0)
|
|
restoreAdapters ();
|
|
else
|
|
addTreeMouseListener (new CursorHandler ());
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
protected void setTreeFont (Font font)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
tree.setFont (font);
|
|
this.font = font;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
public void addTreeMouseListener (MouseAdapter adapter)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
tree.addMouseListener (adapter);
|
|
adapters.add (adapter);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
private void restoreAdapters ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
for (MouseAdapter ma : adapters)
|
|
tree.addMouseListener (ma);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
protected Object getSelectedObject ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
DefaultMutableTreeNode node =
|
|
(DefaultMutableTreeNode) tree.getLastSelectedPathComponent ();
|
|
return node == null ? null : node.getUserObject ();
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
@Override
|
|
public DefaultMutableTreeNode getRootNode ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
return (DefaultMutableTreeNode) tree.getModel ().getRoot ();
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
protected DefaultMutableTreeNode findNode (int nodeNo)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
DefaultMutableTreeNode rootNode = getRootNode ();
|
|
Enumeration<TreeNode> children = rootNode.breadthFirstEnumeration ();
|
|
int count = 0;
|
|
DefaultMutableTreeNode selectNode = null;
|
|
while (children.hasMoreElements () && ++count <= nodeNo)
|
|
selectNode = (DefaultMutableTreeNode) children.nextElement ();
|
|
return selectNode;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
protected DefaultMutableTreeNode findFirstLeafNode ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
DefaultMutableTreeNode rootNode = getRootNode ();
|
|
Enumeration<TreeNode> children = rootNode.depthFirstEnumeration ();
|
|
DefaultMutableTreeNode selectNode = null;
|
|
while (children.hasMoreElements ())
|
|
{
|
|
selectNode = (DefaultMutableTreeNode) children.nextElement ();
|
|
if (selectNode.isLeaf ())
|
|
{
|
|
FileNode node = (FileNode) selectNode.getUserObject ();
|
|
if (node.file.isFile ())
|
|
return selectNode;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// Trigger the TreeSelectionListener set by the real Tab (if the value is different)
|
|
// ---------------------------------------------------------------------------------//
|
|
protected void showNode (DefaultMutableTreeNode treeNode)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
assert treeNode != null;
|
|
TreePath tp = getPathToNode (treeNode);
|
|
if (tp == null)
|
|
{
|
|
System.out.println ("Not found: " + treeNode);
|
|
return;
|
|
}
|
|
|
|
tree.requestFocusInWindow ();
|
|
tree.setSelectionPath (tp);
|
|
tree.scrollPathToVisible (tp);
|
|
if (!treeNode.isLeaf ())
|
|
tree.expandPath (tp);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
protected TreePath getPathToNode (DefaultMutableTreeNode selectNode)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel ();
|
|
TreeNode[] nodes = treeModel.getPathToRoot (selectNode);
|
|
if (nodes == null)
|
|
return null;
|
|
return new TreePath (nodes);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
private class CursorHandler extends MouseAdapter
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
private Cursor oldCursor;
|
|
|
|
@Override
|
|
public void mouseEntered (MouseEvent e)
|
|
{
|
|
oldCursor = getCursor ();
|
|
setCursor (handCursor);
|
|
}
|
|
|
|
@Override
|
|
public void mouseExited (MouseEvent e)
|
|
{
|
|
setCursor (oldCursor);
|
|
}
|
|
}
|
|
} |