speed up building of ResultTree

dbus-notify
Zlatin Balevsky 2022-03-24 04:26:38 +00:00
parent 378cf8a5d0
commit 0ca754d1da
No known key found for this signature in database
GPG Key ID: A72832072D525E41
4 changed files with 44 additions and 15 deletions

View File

@ -49,7 +49,7 @@ class BrowseModel {
private final List<TreeNode> topLevelNodes = new ArrayList<>()
void mvcGroupInit(Map<String,String> args) {
root = new DefaultMutableTreeNode()
root = new ResultTreeModel.MutableResultNode()
resultsTreeModel = new ResultTreeModel(root)
}

View File

@ -66,7 +66,7 @@ class SearchTabModel {
boolean treeVisible = true
void mvcGroupInit(Map<String, String> args) {
root = new DefaultMutableTreeNode()
root = new ResultTreeModel.MutableResultNode()
treeModel = new ResultTreeModel(root)
core = mvcGroup.parentGroup.model.core
uiSettings = application.context.get("ui-settings")

View File

@ -4,6 +4,7 @@ import com.muwire.core.search.UIResultEvent
import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.DefaultTreeModel
import javax.swing.tree.MutableTreeNode
import javax.swing.tree.TreeNode
class ResultTreeModel extends DefaultTreeModel {
@ -13,10 +14,9 @@ class ResultTreeModel extends DefaultTreeModel {
}
void addToTree(UIResultEvent event) {
def node = root
MutableResultNode node = root
if (event.path == null || event.path.length == 0) {
def child = new DefaultMutableTreeNode()
child.setUserObject(event)
def child = new MutableResultNode(event)
node.add(child)
return
}
@ -28,15 +28,10 @@ class ResultTreeModel extends DefaultTreeModel {
String hiddenRoot = elements.remove(0)
for (String element : elements) {
def nodeData = new ResultTreeRenderer.ResultTreeNode(hiddenRoot, element)
def elementNode = null
for(int i = 0; i < node.childCount; i++) {
if (Objects.equals(node.getChildAt(i).getUserObject(), nodeData)) {
elementNode = node.getChildAt(i)
break
}
}
def elementNode = node.childrenMap.get(nodeData)
if (elementNode == null) {
elementNode = new DefaultMutableTreeNode()
elementNode = new MutableResultNode()
elementNode.setUserObject(nodeData)
node.add(elementNode)
}
@ -44,8 +39,35 @@ class ResultTreeModel extends DefaultTreeModel {
node = elementNode
}
def fileNode = new DefaultMutableTreeNode()
fileNode.setUserObject(event)
def fileNode = new MutableResultNode(event)
node.add(fileNode)
}
static class MutableResultNode extends DefaultMutableTreeNode {
private final Map<Object, MutableResultNode> childrenMap
MutableResultNode() {
super()
childrenMap = new HashMap<>()
}
MutableResultNode(UIResultEvent event) {
super()
childrenMap = Collections.emptyMap()
setUserObject(event)
}
@Override
void removeAllChildren() {
if (!childrenMap.isEmpty())
childrenMap.clear()
super.removeAllChildren()
}
@Override
void add(MutableTreeNode newChild) {
MutableResultNode mrn = (MutableResultNode) newChild
childrenMap.put(mrn.getUserObject(), mrn)
super.add(newChild)
}
}
}

View File

@ -5,6 +5,7 @@ import com.muwire.core.search.UIResultEvent
import com.muwire.core.util.DataUtil
import net.i2p.data.DataHelper
import javax.swing.tree.DefaultMutableTreeNode
import java.util.function.Predicate
import static com.muwire.gui.Translator.trans
@ -61,11 +62,13 @@ class ResultTreeRenderer extends DefaultTreeCellRenderer {
public static class ResultTreeNode {
private final String hiddenRoot, element
private final int hashCode
private int files
private long size
ResultTreeNode(String hiddenRoot, String element) {
this.hiddenRoot = hiddenRoot
this.element = element
this.hashCode = Objects.hash(hiddenRoot, element)
}
private String getToolTip() {
@ -82,6 +85,10 @@ class ResultTreeRenderer extends DefaultTreeCellRenderer {
size += event.size
}
public int hashCode() {
hashCode
}
public boolean equals(Object o) {
if (!(o instanceof ResultTreeNode))
return false