Removed redundant group-related tree classes
This commit is contained in:
parent
e25799a78e
commit
78996eaa67
4 changed files with 28 additions and 79 deletions
|
@ -11,13 +11,13 @@ import javax.swing.JScrollPane;
|
||||||
import javax.swing.JTree;
|
import javax.swing.JTree;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.tree.DefaultMutableTreeNode;
|
import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
|
import javax.swing.tree.DefaultTreeCellRenderer;
|
||||||
import javax.swing.tree.DefaultTreeModel;
|
import javax.swing.tree.DefaultTreeModel;
|
||||||
import javax.swing.tree.TreePath;
|
import javax.swing.tree.TreePath;
|
||||||
import javax.swing.tree.TreeSelectionModel;
|
import javax.swing.tree.TreeSelectionModel;
|
||||||
|
|
||||||
import net.vhati.modmanager.ui.tree.ChecklistTreeManager;
|
import net.vhati.modmanager.ui.tree.ChecklistTreeManager;
|
||||||
import net.vhati.modmanager.ui.tree.ChecklistTreeSelectionModel;
|
import net.vhati.modmanager.ui.tree.ChecklistTreeSelectionModel;
|
||||||
import net.vhati.modmanager.ui.tree.GroupTreeCellRenderer;
|
|
||||||
import net.vhati.modmanager.ui.tree.TreeTransferHandler;
|
import net.vhati.modmanager.ui.tree.TreeTransferHandler;
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,9 +32,9 @@ public class ChecklistTreePanel extends JPanel {
|
||||||
super( new BorderLayout() );
|
super( new BorderLayout() );
|
||||||
|
|
||||||
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode( "Root", true );
|
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode( "Root", true );
|
||||||
treeModel = new DefaultTreeModel( rootNode );
|
treeModel = new DefaultTreeModel( rootNode, true );
|
||||||
tree = new JTree( treeModel );
|
tree = new JTree( treeModel );
|
||||||
tree.setCellRenderer( new GroupTreeCellRenderer() );
|
tree.setCellRenderer( new DefaultTreeCellRenderer() );
|
||||||
tree.setRootVisible( false );
|
tree.setRootVisible( false );
|
||||||
tree.getSelectionModel().setSelectionMode( TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION );
|
tree.getSelectionModel().setSelectionMode( TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION );
|
||||||
checklistManager = new ChecklistTreeManager( tree, true, null );
|
checklistManager = new ChecklistTreeManager( tree, true, null );
|
||||||
|
@ -103,7 +103,7 @@ public class ChecklistTreePanel extends JPanel {
|
||||||
*/
|
*/
|
||||||
public void addGroup() {
|
public void addGroup() {
|
||||||
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode)treeModel.getRoot();
|
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode)treeModel.getRoot();
|
||||||
GroupAwareTreeNode groupNode = new GroupAwareTreeNode( "New Group", true );
|
DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode( "New Group", true );
|
||||||
rootNode.add( groupNode );
|
rootNode.add( groupNode );
|
||||||
treeModel.nodesWereInserted( rootNode, new int[]{rootNode.getIndex( groupNode )} );
|
treeModel.nodesWereInserted( rootNode, new int[]{rootNode.getIndex( groupNode )} );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
package net.vhati.modmanager.ui.tree;
|
|
||||||
|
|
||||||
import javax.swing.tree.DefaultMutableTreeNode;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A TreeNode that remembers whether it allows children when cloned.
|
|
||||||
*/
|
|
||||||
public class GroupAwareTreeNode extends DefaultMutableTreeNode {
|
|
||||||
|
|
||||||
public GroupAwareTreeNode( Object userObject, boolean allowsChildren ) {
|
|
||||||
super( userObject, allowsChildren );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object clone() {
|
|
||||||
GroupAwareTreeNode newNode = (GroupAwareTreeNode)super.clone();
|
|
||||||
newNode.setAllowsChildren( this.getAllowsChildren() );
|
|
||||||
|
|
||||||
return newNode;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package net.vhati.modmanager.ui.tree;
|
|
||||||
|
|
||||||
import java.awt.Component;
|
|
||||||
import javax.swing.JTree;
|
|
||||||
import javax.swing.UIManager;
|
|
||||||
import javax.swing.tree.DefaultMutableTreeNode;
|
|
||||||
import javax.swing.tree.DefaultTreeCellRenderer;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A renderer that sets icons based on whether children are allowed.
|
|
||||||
*
|
|
||||||
* A group with no children will still have a group icon.
|
|
||||||
*/
|
|
||||||
public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus ) {
|
|
||||||
super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasFocus );
|
|
||||||
|
|
||||||
if ( value instanceof DefaultMutableTreeNode ) {
|
|
||||||
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
|
|
||||||
if ( node.getAllowsChildren() ) {
|
|
||||||
if ( expanded ) {
|
|
||||||
this.setIcon( this.getDefaultOpenIcon() );
|
|
||||||
this.setDisabledIcon( this.getDefaultOpenIcon() );
|
|
||||||
} else {
|
|
||||||
this.setIcon( this.getDefaultClosedIcon() );
|
|
||||||
this.setDisabledIcon( this.getDefaultClosedIcon() );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.setIcon( this.getDefaultLeafIcon() );
|
|
||||||
this.setDisabledIcon( this.getDefaultLeafIcon() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -16,6 +16,7 @@ import javax.swing.JTree;
|
||||||
import javax.swing.TransferHandler;
|
import javax.swing.TransferHandler;
|
||||||
import javax.swing.tree.DefaultMutableTreeNode;
|
import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
import javax.swing.tree.DefaultTreeModel;
|
import javax.swing.tree.DefaultTreeModel;
|
||||||
|
import javax.swing.tree.MutableTreeNode;
|
||||||
import javax.swing.tree.TreeNode;
|
import javax.swing.tree.TreeNode;
|
||||||
import javax.swing.tree.TreePath;
|
import javax.swing.tree.TreePath;
|
||||||
|
|
||||||
|
@ -30,7 +31,9 @@ import javax.swing.tree.TreePath;
|
||||||
* Dragging onto a node that allows children will insert into it.
|
* Dragging onto a node that allows children will insert into it.
|
||||||
* Dragging onto a node that doesn't allow children will insert after it.
|
* Dragging onto a node that doesn't allow children will insert after it.
|
||||||
*
|
*
|
||||||
* All nodes must be instances of DefaultMutableTreeNode (or subclasses).
|
* The TreeModel must be DefaultTreeModel (or a subclass).
|
||||||
|
* All nodes must be DefaultMutableTreeNode (or a subclass) and properly
|
||||||
|
* implement Cloneable.
|
||||||
* Set the Jtree's DropMode to ON_OR_INSERT.
|
* Set the Jtree's DropMode to ON_OR_INSERT.
|
||||||
* The root node must be hidden, to prevent it from being dragged.
|
* The root node must be hidden, to prevent it from being dragged.
|
||||||
* The tree's selection model may be set to single or multiple.
|
* The tree's selection model may be set to single or multiple.
|
||||||
|
@ -122,13 +125,13 @@ public class TreeTransferHandler extends TransferHandler {
|
||||||
|
|
||||||
dstTree.setCursor( Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) );
|
dstTree.setCursor( Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) );
|
||||||
if ( dropPath == null ) return false;
|
if ( dropPath == null ) return false;
|
||||||
DefaultMutableTreeNode dropParentNode = (DefaultMutableTreeNode)dropPath.getLastPathComponent();
|
MutableTreeNode dropParentNode = (MutableTreeNode)dropPath.getLastPathComponent();
|
||||||
|
|
||||||
// When dropping onto a non-group node, insert into the position after it instead.
|
// When dropping onto a non-group node, insert into the position after it instead.
|
||||||
if ( !dropParentNode.getAllowsChildren() ) {
|
if ( !dropParentNode.getAllowsChildren() ) {
|
||||||
DefaultMutableTreeNode prevParentNode = dropParentNode;
|
MutableTreeNode prevParentNode = dropParentNode;
|
||||||
dropPath = dropPath.getParentPath();
|
dropPath = dropPath.getParentPath();
|
||||||
dropParentNode = (DefaultMutableTreeNode)dropPath.getLastPathComponent();
|
dropParentNode = (MutableTreeNode)dropPath.getLastPathComponent();
|
||||||
dropIndex = dropParentNode.getIndex( prevParentNode ) + 1;
|
dropIndex = dropParentNode.getIndex( prevParentNode ) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +151,7 @@ public class TreeTransferHandler extends TransferHandler {
|
||||||
for ( TreePath path : draggedPaths ) {
|
for ( TreePath path : draggedPaths ) {
|
||||||
// Copy the dragged node and any children.
|
// Copy the dragged node and any children.
|
||||||
DefaultMutableTreeNode srcNode = (DefaultMutableTreeNode)path.getLastPathComponent();
|
DefaultMutableTreeNode srcNode = (DefaultMutableTreeNode)path.getLastPathComponent();
|
||||||
DefaultMutableTreeNode newNode = (DefaultMutableTreeNode)cloneNodes( srcNode );
|
MutableTreeNode newNode = (MutableTreeNode)cloneNodes( srcNode );
|
||||||
|
|
||||||
if ( dropIndex != -1 ) {
|
if ( dropIndex != -1 ) {
|
||||||
// Insert.
|
// Insert.
|
||||||
|
@ -158,8 +161,9 @@ public class TreeTransferHandler extends TransferHandler {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add to the end.
|
// Add to the end.
|
||||||
dropParentNode.add( newNode );
|
int addIndex = dropParentNode.getChildCount();
|
||||||
dstTreeModel.nodesWereInserted( dropParentNode, new int[]{dropParentNode.getChildCount()-1} );
|
dropParentNode.insert( newNode, addIndex );
|
||||||
|
dstTreeModel.nodesWereInserted( dropParentNode, new int[]{addIndex} );
|
||||||
if ( !dstTree.isExpanded( dropPath ) ) dstTree.expandPath( dropPath );
|
if ( !dstTree.isExpanded( dropPath ) ) dstTree.expandPath( dropPath );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -186,12 +190,11 @@ public class TreeTransferHandler extends TransferHandler {
|
||||||
|
|
||||||
if ( action == TransferHandler.MOVE ) {
|
if ( action == TransferHandler.MOVE ) {
|
||||||
// Remove original dragged rows now that the move completed.
|
// Remove original dragged rows now that the move completed.
|
||||||
// Scan the tree checking equality is fine (DefaultMutableTreeNode's equals() does ==).
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
TreePath[] draggedPaths = (TreePath[])data.getTransferData( localTreePathFlavor );
|
TreePath[] draggedPaths = (TreePath[])data.getTransferData( localTreePathFlavor );
|
||||||
for ( TreePath path : draggedPaths ) {
|
for ( TreePath path : draggedPaths ) {
|
||||||
DefaultMutableTreeNode doomedNode = (DefaultMutableTreeNode)path.getLastPathComponent();
|
MutableTreeNode doomedNode = (MutableTreeNode)path.getLastPathComponent();
|
||||||
TreeNode parentNode = doomedNode.getParent();
|
TreeNode parentNode = doomedNode.getParent();
|
||||||
int doomedIndex = parentNode.getIndex( doomedNode );
|
int doomedIndex = parentNode.getIndex( doomedNode );
|
||||||
doomedNode.removeFromParent();
|
doomedNode.removeFromParent();
|
||||||
|
@ -208,16 +211,24 @@ public class TreeTransferHandler extends TransferHandler {
|
||||||
/**
|
/**
|
||||||
* Recursively clones a node and its descendants.
|
* Recursively clones a node and its descendants.
|
||||||
*
|
*
|
||||||
* The clone() methods will reuse userObjects, but the nodes themselves will be new.
|
* The clone() methods will generally do a shallow copy, sharing
|
||||||
|
* userObjects.
|
||||||
|
*
|
||||||
|
* Sidenote: The parameter couldn't just be MutableTreeNode, because that
|
||||||
|
* doesn't offer the clone() method. And blindly using reflection to
|
||||||
|
* invoke it wouldn't be pretty. Conceivably, a settable factory could be
|
||||||
|
* designed to copy specific custom classes (using constructors instead
|
||||||
|
* of clone(). But that'd be overkill.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("Unchecked")
|
@SuppressWarnings("Unchecked")
|
||||||
private DefaultMutableTreeNode cloneNodes( DefaultMutableTreeNode srcNode ) {
|
protected MutableTreeNode cloneNodes( DefaultMutableTreeNode srcNode ) {
|
||||||
DefaultMutableTreeNode resultNode = (DefaultMutableTreeNode)srcNode.clone();
|
MutableTreeNode resultNode = (MutableTreeNode)srcNode.clone();
|
||||||
|
|
||||||
Enumeration enumer = srcNode.children();
|
Enumeration enumer = srcNode.children();
|
||||||
while ( enumer.hasMoreElements() ) {
|
while ( enumer.hasMoreElements() ) {
|
||||||
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode)enumer.nextElement();
|
DefaultMutableTreeNode childNode = (DefaultMutableTreeNode)enumer.nextElement();
|
||||||
resultNode.add( cloneNodes( (DefaultMutableTreeNode)childNode ) );
|
int addIndex = resultNode.getChildCount();
|
||||||
|
resultNode.insert( cloneNodes( (DefaultMutableTreeNode)childNode ), addIndex );
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultNode;
|
return resultNode;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue