diff --git a/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreePanel.java b/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreePanel.java index 37ec53a..267592b 100644 --- a/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreePanel.java +++ b/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreePanel.java @@ -31,7 +31,7 @@ public class ChecklistTreePanel extends JPanel { public ChecklistTreePanel() { super( new BorderLayout() ); - DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode( "Root" ); + DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode( "Root", true ); treeModel = new DefaultTreeModel( rootNode ); tree = new JTree( treeModel ); tree.setCellRenderer( new GroupTreeCellRenderer() ); diff --git a/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreeSelectionModel.java b/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreeSelectionModel.java index 09d82aa..992e4ce 100644 --- a/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreeSelectionModel.java +++ b/src/main/java/net/vhati/modmanager/ui/tree/ChecklistTreeSelectionModel.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; +import java.util.List; import java.util.Stack; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreeModel; @@ -122,7 +123,7 @@ public class ChecklistTreeSelectionModel extends DefaultTreeSelectionModel { TreePath[] selectionPaths = getSelectionPaths(); if ( selectionPaths == null ) break; - ArrayList toBeRemoved = new ArrayList(); + List toBeRemoved = new ArrayList(); for ( int j=0; j < selectionPaths.length; j++ ) { if ( isDescendant( selectionPaths[j], path ) ) { toBeRemoved.add( selectionPaths[j] ); @@ -209,7 +210,7 @@ public class ChecklistTreeSelectionModel extends DefaultTreeSelectionModel { * Otherwise, the given path will be unselected, and nothing else will change. */ private void toggleRemoveSelection( TreePath path ) { - Stack stack = new Stack(); + Stack stack = new Stack(); TreePath parent = path.getParentPath(); while ( parent != null && !isPathSelected( parent ) ) { @@ -226,8 +227,8 @@ public class ChecklistTreeSelectionModel extends DefaultTreeSelectionModel { } while ( !stack.isEmpty() ) { - TreePath temp = (TreePath)stack.pop(); - TreePath peekPath = ( stack.isEmpty() ? path : (TreePath)stack.peek() ); + TreePath temp = stack.pop(); + TreePath peekPath = ( stack.isEmpty() ? path : stack.peek() ); Object node = temp.getLastPathComponent(); Object peekNode = peekPath.getLastPathComponent(); @@ -243,16 +244,22 @@ public class ChecklistTreeSelectionModel extends DefaultTreeSelectionModel { } - public Enumeration getAllSelectedPaths() { + public Enumeration getAllSelectedPaths() { + Enumeration result = null; + TreePath[] treePaths = getSelectionPaths(); if ( treePaths == null ) { - return Collections.enumeration( Collections.EMPTY_LIST ); + List pathsList = Collections.emptyList(); + result = Collections.enumeration( pathsList ); + } + else { + List pathsList = Arrays.asList( treePaths ); + result = Collections.enumeration( pathsList ); + if ( dig ) { + result = new PreorderEnumeration( result, model ); + } } - Enumeration enumer = Collections.enumeration( Arrays.asList( treePaths ) ); - if ( dig ) { - enumer = new PreorderEnumeration( enumer, model ); - } - return enumer; + return result; } } diff --git a/src/main/java/net/vhati/modmanager/ui/tree/ChildrenEnumeration.java b/src/main/java/net/vhati/modmanager/ui/tree/ChildrenEnumeration.java index 0d132ef..95f7d3b 100644 --- a/src/main/java/net/vhati/modmanager/ui/tree/ChildrenEnumeration.java +++ b/src/main/java/net/vhati/modmanager/ui/tree/ChildrenEnumeration.java @@ -29,7 +29,7 @@ import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; -public class ChildrenEnumeration implements Enumeration { +public class ChildrenEnumeration implements Enumeration { private TreePath path; private TreeModel model; @@ -49,7 +49,7 @@ public class ChildrenEnumeration implements Enumeration { } @Override - public Object nextElement() { + public TreePath nextElement() { if( !hasMoreElements() ) throw new NoSuchElementException(); return path.pathByAddingChild( model.getChild( path.getLastPathComponent(), position++ ) ); diff --git a/src/main/java/net/vhati/modmanager/ui/tree/PreorderEnumeration.java b/src/main/java/net/vhati/modmanager/ui/tree/PreorderEnumeration.java index 7ebf789..3e8fe9e 100644 --- a/src/main/java/net/vhati/modmanager/ui/tree/PreorderEnumeration.java +++ b/src/main/java/net/vhati/modmanager/ui/tree/PreorderEnumeration.java @@ -25,22 +25,23 @@ package net.vhati.modmanager.ui.tree; import java.util.Collections; import java.util.Enumeration; +import java.util.List; import java.util.Stack; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; -public class PreorderEnumeration implements Enumeration { +public class PreorderEnumeration implements Enumeration { private TreeModel model; - protected Stack stack = new Stack(); + protected Stack> stack = new Stack>(); public PreorderEnumeration( TreePath path, TreeModel model ) { this( Collections.enumeration( Collections.singletonList( path ) ), model ); } - public PreorderEnumeration( Enumeration enumer, TreeModel model ){ + public PreorderEnumeration( Enumeration enumer, TreeModel model ){ this.model = model; stack.push( enumer ); } @@ -52,9 +53,9 @@ public class PreorderEnumeration implements Enumeration { } @Override - public Object nextElement() { - Enumeration enumer = stack.peek(); - TreePath path = (TreePath)enumer.nextElement(); + public TreePath nextElement() { + Enumeration enumer = stack.peek(); + TreePath path = enumer.nextElement(); if ( !enumer.hasMoreElements() ) stack.pop(); diff --git a/src/main/java/net/vhati/modmanager/ui/tree/TreeState.java b/src/main/java/net/vhati/modmanager/ui/tree/TreeState.java new file mode 100644 index 0000000..1ea710f --- /dev/null +++ b/src/main/java/net/vhati/modmanager/ui/tree/TreeState.java @@ -0,0 +1,66 @@ +package net.vhati.modmanager.ui.tree; + +import java.util.ArrayList; +import java.util.List; + + +/** + * An implementation-agnostic model to pass between the GUI thread and the + * (de)serializer. + */ +public class TreeState { + + protected TreeNodeState rootNodeState; + + + public TreeState() { + } + + + public void setRootNodeState( TreeNodeState rootNodeState ) { + this.rootNodeState = rootNodeState; + } + + public TreeNodeState getRootNodeState() { + return rootNodeState; + } + + + + public static class TreeNodeState { + + protected Object userObject = null; + protected boolean expand = false; + protected List children = null; + + + public TreeNodeState() { + this( false, false ); + } + + public TreeNodeState( boolean allowsChildren, boolean expand ) { + if ( allowsChildren ) { + this.expand = expand; + children = new ArrayList(); + } + } + + + public boolean getAllowsChildren() { + return ( children != null ); + } + + public List getChildren() { + return children; + } + + + public void setUserObject( Object userObject ) { + this.userObject = userObject; + } + + public Object getUserObject() { + return userObject; + } + } +} diff --git a/src/main/java/net/vhati/modmanager/ui/tree/TreeTransferHandler.java b/src/main/java/net/vhati/modmanager/ui/tree/TreeTransferHandler.java index 3ec1edd..4622aa0 100644 --- a/src/main/java/net/vhati/modmanager/ui/tree/TreeTransferHandler.java +++ b/src/main/java/net/vhati/modmanager/ui/tree/TreeTransferHandler.java @@ -71,7 +71,7 @@ public class TreeTransferHandler extends TransferHandler { // For each length (shortest-first), iterate its paths. // For each of those paths, search longer lengths' lists, // removing any paths that are descendants of those short ancestor nodes. - List lengthsList = new ArrayList( pathsByLengthMap.keySet() ); + List lengthsList = new ArrayList( pathsByLengthMap.keySet() ); for ( int i=0; i < lengthsList.size(); i++ ) { for ( TreePath ancestorPath : pathsByLengthMap.get( lengthsList.get( i ) ) ) { for ( int j=i+1; j < lengthsList.size(); j++ ) {