diff --git a/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy b/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy index 211f5fba..9b7d263d 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy @@ -24,6 +24,7 @@ import com.muwire.core.search.UIResultBatchEvent import com.muwire.core.search.UIResultEvent import javax.swing.JTextField +import javax.swing.tree.TreePath @ArtifactProviderFor(GriffonController) class BrowseController { @@ -126,7 +127,7 @@ class BrowseController { for(BrowseStatusEvent event : statusCopy) { model.status = event.status if(event.status == BrowseStatus.FETCHING) { - model.currentBatch = event.currentItems + model.currentBatch += event.currentItems model.totalResults = event.totalResults } } @@ -221,4 +222,10 @@ class BrowseController { mvcGroup.createMVCGroup("view-profile", uuid.toString(), params) } + + void requestFetch(TreePath treePath, boolean recursive) { + List path = model.resultsTreeModel.getPathFromRoot(treePath) + if (path != null) + model.session.fetch(path, recursive) + } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/BrowseView.groovy b/gui/griffon-app/views/com/muwire/gui/BrowseView.groovy index 2530a550..7a9febbe 100644 --- a/gui/griffon-app/views/com/muwire/gui/BrowseView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/BrowseView.groovy @@ -10,6 +10,8 @@ import javax.swing.JTable import javax.swing.JTextField import javax.swing.JTree import javax.swing.KeyStroke +import javax.swing.event.TreeExpansionEvent +import javax.swing.event.TreeExpansionListener import javax.swing.tree.TreePath import java.awt.event.ActionEvent import java.awt.event.KeyEvent @@ -55,6 +57,8 @@ class BrowseView { def sequentialDownloadCheckbox + private boolean onDemandExpansionRegistered + void initUI() { int rowHeight = application.context.get("row-height") int treeRowHeight = application.context.get("tree-row-height") @@ -330,11 +334,13 @@ class BrowseView { Set expanded = new HashSet<>(treeExpansions.expandedPaths) model.resultsTreeModel.nodeStructureChanged(model.root) if (model.session == null && !model.session.supportsIncremental()) { - if (treeExpansions.manualExpansion) - expanded.each { tree.expandPath(it) } - else - TreeUtil.expand(tree) + TreeUtil.expand(tree) + } else if (!onDemandExpansionRegistered) { + onDemandExpansionRegistered = true + tree.addTreeExpansionListener(new OnDemandTreeExpansion()) } + if (treeExpansions.manualExpansion) + expanded.each { tree.expandPath(it) } tree.setSelectionPaths(selectedPaths) } @@ -416,4 +422,16 @@ class BrowseView { controller.displayBatchedResults() } } + + private class OnDemandTreeExpansion implements TreeExpansionListener { + + @Override + void treeExpanded(TreeExpansionEvent event) { + controller.requestFetch(event.getPath(), false) + } + + @Override + void treeCollapsed(TreeExpansionEvent event) { + } + } } \ No newline at end of file diff --git a/gui/src/main/groovy/com/muwire/gui/ResultTreeModel.groovy b/gui/src/main/groovy/com/muwire/gui/ResultTreeModel.groovy index 1b4159f5..95e8082e 100644 --- a/gui/src/main/groovy/com/muwire/gui/ResultTreeModel.groovy +++ b/gui/src/main/groovy/com/muwire/gui/ResultTreeModel.groovy @@ -7,6 +7,7 @@ import javax.swing.tree.DefaultMutableTreeNode import javax.swing.tree.DefaultTreeModel import javax.swing.tree.MutableTreeNode import javax.swing.tree.TreeNode +import javax.swing.tree.TreePath import java.text.Collator class ResultTreeModel extends DefaultTreeModel { @@ -31,7 +32,8 @@ class ResultTreeModel extends DefaultTreeModel { elementNode = new MutableResultNode() elementNode.setUserObject(nodeData) node.addDescendant(elementNode) - } + } else + removePlaceholder(elementNode) node = elementNode } @@ -59,16 +61,46 @@ class ResultTreeModel extends DefaultTreeModel { elementNode = new MutableResultNode() elementNode.setUserObject(nodeData) node.addDescendant(elementNode) + } else { + removePlaceholder(elementNode) } elementNode.getUserObject().addResult(event) node = elementNode } def fileNode = new MutableResultNode(event) + removePlaceholder(node) + node.addDescendant(fileNode) + } + + private static void removePlaceholder(SortedTreeNode node) { TreeNode placeHolder = node.getByKey(ResultTreeRenderer.PLACEHOLDER) if (placeHolder != null) node.remove(placeHolder) - node.addDescendant(fileNode) + } + + List getPathFromRoot(TreePath treePath) { + + MutableResultNode last = (MutableResultNode)treePath.getLastPathComponent() + if (last.getChildCount() != 1) + return null + if (!(last.getChildAt(0) instanceof PlaceholderNode)) + return null + + Object [] objects = treePath.getPath() + + List rv = new ArrayList<>() + String hiddenRoot = null + for (int i = 1; i < objects.length; i++) { + Object userObject = objects[i].getUserObject() + if (userObject instanceof ResultTreeRenderer.ResultTreeNode) { + hiddenRoot = userObject.getHiddenRoot() + rv << userObject.toString() + } + } + + rv.add(0, hiddenRoot) + rv } static class MutableResultNode extends SortedTreeNode { diff --git a/gui/src/main/groovy/com/muwire/gui/ResultTreeRenderer.groovy b/gui/src/main/groovy/com/muwire/gui/ResultTreeRenderer.groovy index e7dc74f4..3bb0b1e0 100644 --- a/gui/src/main/groovy/com/muwire/gui/ResultTreeRenderer.groovy +++ b/gui/src/main/groovy/com/muwire/gui/ResultTreeRenderer.groovy @@ -94,6 +94,10 @@ class ResultTreeRenderer extends DefaultTreeCellRenderer { element } + String getHiddenRoot() { + hiddenRoot + } + void addResult(UIResultEvent event) { files++ size += event.size