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

204 lines
7.4 KiB
Java
Raw Permalink Normal View History

2015-06-01 09:35:51 +00:00
package com.bytezone.diskbrowser.gui;
/***********************************************************************************************
* Parent class of FileSystemTab and AppleDiskTab.
2019-11-04 00:14:06 +00:00
*
*
2015-06-01 09:35:51 +00:00
***********************************************************************************************/
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;
2016-03-03 06:19:40 +00:00
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;
2015-06-01 09:35:51 +00:00
import com.bytezone.diskbrowser.gui.RedoHandler.RedoData;
import com.bytezone.diskbrowser.gui.TreeBuilder.FileNode;
2019-11-04 00:14:06 +00:00
// -----------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
abstract class AbstractTab extends JPanel implements Tab
2019-11-04 00:14:06 +00:00
// -----------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
private final static Cursor handCursor = new Cursor (Cursor.HAND_CURSOR);
2020-02-02 10:17:49 +00:00
private final List<MouseAdapter> adapters = new ArrayList<> ();
2015-06-01 09:35:51 +00:00
private Font font;
2019-11-04 00:14:06 +00:00
private final JScrollPane scrollPane;
2015-06-01 09:35:51 +00:00
final DiskAndFileSelector eventHandler;
2016-03-03 06:19:40 +00:00
final RedoHandler redoHandler;
2015-06-01 09:35:51 +00:00
final RedoData redoData;
protected JTree tree;
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2016-03-03 06:19:40 +00:00
public AbstractTab (RedoHandler redoHandler, DiskAndFileSelector selector, Font font)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
super (new BorderLayout ());
2016-03-03 06:19:40 +00:00
2015-06-01 09:35:51 +00:00
this.eventHandler = selector;
this.font = font;
2016-03-03 06:19:40 +00:00
this.redoHandler = redoHandler;
this.redoData = redoHandler.createData ();
2015-06-01 09:35:51 +00:00
2019-11-04 00:14:06 +00:00
scrollPane =
2016-03-03 06:19:40 +00:00
new JScrollPane (null, VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_NEVER);
2019-11-04 00:14:06 +00:00
scrollPane.setBorder (null);
// scrollPane.setBorder (BorderFactory.createEmptyBorder ());
add (scrollPane, BorderLayout.CENTER);
2015-06-01 09:35:51 +00:00
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
protected void setTree (JTree tree)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
this.tree = tree;
tree.setFont (font);
2019-11-04 00:14:06 +00:00
scrollPane.setViewportView (tree);
2015-06-01 09:35:51 +00:00
TreeSelectionModel tsm = tree.getSelectionModel ();
tsm.setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION);
if (adapters.size () > 0)
restoreAdapters ();
else
addTreeMouseListener (new CursorHandler ());
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
protected void setTreeFont (Font font)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
tree.setFont (font);
this.font = font;
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
public void addTreeMouseListener (MouseAdapter adapter)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
tree.addMouseListener (adapter);
adapters.add (adapter);
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
private void restoreAdapters ()
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
for (MouseAdapter ma : adapters)
tree.addMouseListener (ma);
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
protected Object getSelectedObject ()
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
DefaultMutableTreeNode node =
2016-03-03 06:19:40 +00:00
(DefaultMutableTreeNode) tree.getLastSelectedPathComponent ();
2015-06-01 09:35:51 +00:00
return node == null ? null : node.getUserObject ();
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
@Override
public DefaultMutableTreeNode getRootNode ()
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
return (DefaultMutableTreeNode) tree.getModel ().getRoot ();
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
protected DefaultMutableTreeNode findNode (int nodeNo)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
DefaultMutableTreeNode rootNode = getRootNode ();
2017-11-25 20:12:59 +00:00
Enumeration<TreeNode> children = rootNode.breadthFirstEnumeration ();
2015-06-01 09:35:51 +00:00
int count = 0;
DefaultMutableTreeNode selectNode = null;
while (children.hasMoreElements () && ++count <= nodeNo)
2017-11-25 20:12:59 +00:00
selectNode = (DefaultMutableTreeNode) children.nextElement ();
2015-06-01 09:35:51 +00:00
return selectNode;
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
protected DefaultMutableTreeNode findFirstLeafNode ()
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
DefaultMutableTreeNode rootNode = getRootNode ();
2017-11-25 20:12:59 +00:00
Enumeration<TreeNode> children = rootNode.depthFirstEnumeration ();
2015-06-01 09:35:51 +00:00
DefaultMutableTreeNode selectNode = null;
while (children.hasMoreElements ())
{
2017-11-25 20:12:59 +00:00
selectNode = (DefaultMutableTreeNode) children.nextElement ();
2015-06-01 09:35:51 +00:00
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)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
protected void showNode (DefaultMutableTreeNode treeNode)
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
2019-11-04 00:14:06 +00:00
assert treeNode != null;
TreePath tp = getPathToNode (treeNode);
if (tp == null)
{
2019-11-04 00:14:06 +00:00
System.out.println ("Not found: " + treeNode);
return;
}
2019-11-04 00:14:06 +00:00
tree.requestFocusInWindow ();
2015-06-01 09:35:51 +00:00
tree.setSelectionPath (tp);
2016-08-19 09:57:29 +00:00
tree.scrollPathToVisible (tp);
2019-11-04 00:14:06 +00:00
if (!treeNode.isLeaf ())
tree.expandPath (tp);
2015-06-01 09:35:51 +00:00
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
protected TreePath getPathToNode (DefaultMutableTreeNode selectNode)
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel ();
TreeNode[] nodes = treeModel.getPathToRoot (selectNode);
if (nodes == null)
return null;
2015-06-01 09:35:51 +00:00
return new TreePath (nodes);
}
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
private class CursorHandler extends MouseAdapter
2019-11-04 00:14:06 +00:00
// ---------------------------------------------------------------------------------//
2015-06-01 09:35:51 +00:00
{
private Cursor oldCursor;
@Override
public void mouseEntered (MouseEvent e)
{
oldCursor = getCursor ();
setCursor (handCursor);
}
@Override
public void mouseExited (MouseEvent e)
{
setCursor (oldCursor);
}
}
}