mirror of https://github.com/zlatinb/muwire
on-demand fetching UI side
parent
8b1612460e
commit
9b1ab655d8
|
@ -24,6 +24,7 @@ import com.muwire.core.search.UIResultBatchEvent
|
||||||
import com.muwire.core.search.UIResultEvent
|
import com.muwire.core.search.UIResultEvent
|
||||||
|
|
||||||
import javax.swing.JTextField
|
import javax.swing.JTextField
|
||||||
|
import javax.swing.tree.TreePath
|
||||||
|
|
||||||
@ArtifactProviderFor(GriffonController)
|
@ArtifactProviderFor(GriffonController)
|
||||||
class BrowseController {
|
class BrowseController {
|
||||||
|
@ -126,7 +127,7 @@ class BrowseController {
|
||||||
for(BrowseStatusEvent event : statusCopy) {
|
for(BrowseStatusEvent event : statusCopy) {
|
||||||
model.status = event.status
|
model.status = event.status
|
||||||
if(event.status == BrowseStatus.FETCHING) {
|
if(event.status == BrowseStatus.FETCHING) {
|
||||||
model.currentBatch = event.currentItems
|
model.currentBatch += event.currentItems
|
||||||
model.totalResults = event.totalResults
|
model.totalResults = event.totalResults
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,4 +222,10 @@ class BrowseController {
|
||||||
|
|
||||||
mvcGroup.createMVCGroup("view-profile", uuid.toString(), params)
|
mvcGroup.createMVCGroup("view-profile", uuid.toString(), params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void requestFetch(TreePath treePath, boolean recursive) {
|
||||||
|
List<String> path = model.resultsTreeModel.getPathFromRoot(treePath)
|
||||||
|
if (path != null)
|
||||||
|
model.session.fetch(path, recursive)
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,6 +10,8 @@ import javax.swing.JTable
|
||||||
import javax.swing.JTextField
|
import javax.swing.JTextField
|
||||||
import javax.swing.JTree
|
import javax.swing.JTree
|
||||||
import javax.swing.KeyStroke
|
import javax.swing.KeyStroke
|
||||||
|
import javax.swing.event.TreeExpansionEvent
|
||||||
|
import javax.swing.event.TreeExpansionListener
|
||||||
import javax.swing.tree.TreePath
|
import javax.swing.tree.TreePath
|
||||||
import java.awt.event.ActionEvent
|
import java.awt.event.ActionEvent
|
||||||
import java.awt.event.KeyEvent
|
import java.awt.event.KeyEvent
|
||||||
|
@ -55,6 +57,8 @@ class BrowseView {
|
||||||
|
|
||||||
def sequentialDownloadCheckbox
|
def sequentialDownloadCheckbox
|
||||||
|
|
||||||
|
private boolean onDemandExpansionRegistered
|
||||||
|
|
||||||
void initUI() {
|
void initUI() {
|
||||||
int rowHeight = application.context.get("row-height")
|
int rowHeight = application.context.get("row-height")
|
||||||
int treeRowHeight = application.context.get("tree-row-height")
|
int treeRowHeight = application.context.get("tree-row-height")
|
||||||
|
@ -330,11 +334,13 @@ class BrowseView {
|
||||||
Set<TreePath> expanded = new HashSet<>(treeExpansions.expandedPaths)
|
Set<TreePath> expanded = new HashSet<>(treeExpansions.expandedPaths)
|
||||||
model.resultsTreeModel.nodeStructureChanged(model.root)
|
model.resultsTreeModel.nodeStructureChanged(model.root)
|
||||||
if (model.session == null && !model.session.supportsIncremental()) {
|
if (model.session == null && !model.session.supportsIncremental()) {
|
||||||
if (treeExpansions.manualExpansion)
|
TreeUtil.expand(tree)
|
||||||
expanded.each { tree.expandPath(it) }
|
} else if (!onDemandExpansionRegistered) {
|
||||||
else
|
onDemandExpansionRegistered = true
|
||||||
TreeUtil.expand(tree)
|
tree.addTreeExpansionListener(new OnDemandTreeExpansion())
|
||||||
}
|
}
|
||||||
|
if (treeExpansions.manualExpansion)
|
||||||
|
expanded.each { tree.expandPath(it) }
|
||||||
tree.setSelectionPaths(selectedPaths)
|
tree.setSelectionPaths(selectedPaths)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,4 +422,16 @@ class BrowseView {
|
||||||
controller.displayBatchedResults()
|
controller.displayBatchedResults()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class OnDemandTreeExpansion implements TreeExpansionListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void treeExpanded(TreeExpansionEvent event) {
|
||||||
|
controller.requestFetch(event.getPath(), false)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void treeCollapsed(TreeExpansionEvent event) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@ import javax.swing.tree.DefaultMutableTreeNode
|
||||||
import javax.swing.tree.DefaultTreeModel
|
import javax.swing.tree.DefaultTreeModel
|
||||||
import javax.swing.tree.MutableTreeNode
|
import javax.swing.tree.MutableTreeNode
|
||||||
import javax.swing.tree.TreeNode
|
import javax.swing.tree.TreeNode
|
||||||
|
import javax.swing.tree.TreePath
|
||||||
import java.text.Collator
|
import java.text.Collator
|
||||||
|
|
||||||
class ResultTreeModel extends DefaultTreeModel {
|
class ResultTreeModel extends DefaultTreeModel {
|
||||||
|
@ -31,7 +32,8 @@ class ResultTreeModel extends DefaultTreeModel {
|
||||||
elementNode = new MutableResultNode()
|
elementNode = new MutableResultNode()
|
||||||
elementNode.setUserObject(nodeData)
|
elementNode.setUserObject(nodeData)
|
||||||
node.addDescendant(elementNode)
|
node.addDescendant(elementNode)
|
||||||
}
|
} else
|
||||||
|
removePlaceholder(elementNode)
|
||||||
node = elementNode
|
node = elementNode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,16 +61,46 @@ class ResultTreeModel extends DefaultTreeModel {
|
||||||
elementNode = new MutableResultNode()
|
elementNode = new MutableResultNode()
|
||||||
elementNode.setUserObject(nodeData)
|
elementNode.setUserObject(nodeData)
|
||||||
node.addDescendant(elementNode)
|
node.addDescendant(elementNode)
|
||||||
|
} else {
|
||||||
|
removePlaceholder(elementNode)
|
||||||
}
|
}
|
||||||
elementNode.getUserObject().addResult(event)
|
elementNode.getUserObject().addResult(event)
|
||||||
node = elementNode
|
node = elementNode
|
||||||
}
|
}
|
||||||
|
|
||||||
def fileNode = new MutableResultNode(event)
|
def fileNode = new MutableResultNode(event)
|
||||||
|
removePlaceholder(node)
|
||||||
|
node.addDescendant(fileNode)
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removePlaceholder(SortedTreeNode node) {
|
||||||
TreeNode placeHolder = node.getByKey(ResultTreeRenderer.PLACEHOLDER)
|
TreeNode placeHolder = node.getByKey(ResultTreeRenderer.PLACEHOLDER)
|
||||||
if (placeHolder != null)
|
if (placeHolder != null)
|
||||||
node.remove(placeHolder)
|
node.remove(placeHolder)
|
||||||
node.addDescendant(fileNode)
|
}
|
||||||
|
|
||||||
|
List<String> 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<String> 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<UIResultEvent> {
|
static class MutableResultNode extends SortedTreeNode<UIResultEvent> {
|
||||||
|
|
|
@ -94,6 +94,10 @@ class ResultTreeRenderer extends DefaultTreeCellRenderer {
|
||||||
element
|
element
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getHiddenRoot() {
|
||||||
|
hiddenRoot
|
||||||
|
}
|
||||||
|
|
||||||
void addResult(UIResultEvent event) {
|
void addResult(UIResultEvent event) {
|
||||||
files++
|
files++
|
||||||
size += event.size
|
size += event.size
|
||||||
|
|
Loading…
Reference in New Issue