r2095 - trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable
Author: sletellier Date: 2010-09-29 14:01:07 +0200 (Wed, 29 Sep 2010) New Revision: 2095 Url: http://nuiton.org/repositories/revision/jaxx/2095 Log: Fire only needed events to keep tree table safe (http://www.nuiton.org/issues/show/904) Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java 2010-09-29 11:59:39 UTC (rev 2094) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableBridge.java 2010-09-29 12:01:07 UTC (rev 2095) @@ -34,6 +34,7 @@ import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.util.ArrayList; +import java.util.Enumeration; import java.util.EventListener; import java.util.List; @@ -118,19 +119,21 @@ @Override public void insertNodeInto(N newChild, N parent, int index) { - //FIXME c'est ca le code ? y'a rien d'ajoute au model c'est pas normal - model.nodeStructureChanged(parent); + parent.insert(newChild, index); + model.getModelSupport().fireChildAdded(getTreePath(parent), index, newChild); } @Override public void removeNodeFromParent(N node) { - //FIXME c'est ca le code ? y'a rien de supprimer au model c'est pas normal - model.nodeStructureChanged(node); + N parent = node.getParent(); + int index = parent.getIndex(node); + parent.remove(node); + model.getModelSupport().fireChildRemoved(getTreePath(parent), index, node); } @Override public void reload(N node) { - model.getModelSupport().fireTreeStructureChanged(new TreePath(getPathToRoot(node))); + model.getModelSupport().fireTreeStructureChanged(getTreePath(node)); } //-------------------------------------------------------------------------- @@ -154,30 +157,34 @@ @Override public void nodesChanged(TreeNode node, int[] childIndices) { - //FIXME c'est plus fin que ça je pense, on indique juste que les fils ont // changé par le node en lui meme - model.nodeChanged((NavTreeTableNode<?>) node); + NavTreeTableNode<?> tableNode = (NavTreeTableNode<?>) node; + + // Extract children + Object[] children = getChildren(tableNode, childIndices); + + model.getModelSupport().fireChildrenChanged(getTreePath(tableNode), childIndices, children); } @Override public void nodesWereInserted(N parent, int[] indices) { - //FIXME, hum c'est louche (on ne veut pas recharger tout le noeud sinon - // on peut perdre le positionnement de l'arbre - nodeStructureChanged(parent); + // Extract children + Object[] children = getChildren(parent, indices); + + model.getModelSupport().fireChildrenAdded(getTreePath(parent), indices, children); } @Override - public void nodeWereInserted(N parentNode, int childIndice, N node) { - //FIXME, hum c'est louche (on ne veut pas recharger tout le noeud sinon - // on peut perdre le positionnement de l'arbre - nodeStructureChanged(node); + public void nodeWereInserted(N parentNode, int index, N node) { + + model.getModelSupport().fireChildAdded(getTreePath(parentNode), index, node); } @Override public void nodesWereRemoved(TreeNode node, int[] childIndices, Object[] removedChildren) { - TreePath path = new TreePath(getPathToRoot(node)); - model.getModelSupport().fireChildrenRemoved(path, + + model.getModelSupport().fireChildrenRemoved(getTreePath(node), childIndices, removedChildren); } @@ -185,16 +192,43 @@ @Override @SuppressWarnings({"unchecked"}) public void notifyChildNodesInserted(N node) { - //FIXME quel raccourci :) pour moi ça va pas trop de faire ça c'est - // trop violent, il faut affiner - nodeStructureChanged(node); + int count = node.getChildCount(); + if (count < 1) { + if (log.isDebugEnabled()) { + log.debug("Skip for leaf node : " + node); + } + return; + } + if (log.isDebugEnabled()) { + log.debug("Notify for node : " + node + ", " + count + " child(s) inserted."); + } + int[] indices = new int[count]; + for (int i = 0; i < count; i++) { + indices[i] = i; + } + + nodesWereInserted(node, indices); + + // recurse notify on childs + for (Enumeration<? extends NavTreeTableNode<?>> childs = node.children(); + childs.hasMoreElements();) { + N child = (N) childs.nextElement(); + notifyChildNodesInserted(child); + } } @Override public void notifyNodeInserted(N node) { - //FIXME quel raccourci :) pour moi ça va pas trop de faire ça c'est - // trop violent, il faut affiner - nodeStructureChanged(node); + + N parent = node.getParent(); + if (parent != null) { + int indice = parent.getIndex(node); + if (log.isDebugEnabled()) { + log.debug("Notify for node : " + node + ", for parent [" + parent + "] child " + indice + " inserted."); + } + nodesWereInserted(parent, new int[]{indice}); + notifyChildNodesInserted(node); + } } //-------------------------------------------------------------------------- @@ -230,6 +264,24 @@ return (T[]) result.toArray(); } + // Extract children + protected Object[] getChildren(NavTreeTableNode<?> tableNode, int[] childIndices) { + + int size = childIndices.length; + Object[] children = new Object[size]; + for (int i = 0; i < size; i++) { + int index = childIndices[i]; + NavTreeTableNode<?> child = tableNode.getChildAt(index); + children[i] = child; + } + return children; + } + + // Create tree path for node in param + protected TreePath getTreePath(TreeNode node) { + return new TreePath(getPathToRoot(node)); + } + // //-------------------------------------------------------------------------- // //-- UI // //-------------------------------------------------------------------------- Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java 2010-09-29 11:59:39 UTC (rev 2094) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/nav/treetable/NavTreeTableNode.java 2010-09-29 12:01:07 UTC (rev 2095) @@ -31,8 +31,12 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTreeTable; import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; +import org.jdesktop.swingx.treetable.MutableTreeTableNode; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; +import java.util.List; /** * Implementation of {@link NavNode} used to create in tree table @@ -277,10 +281,15 @@ return (N) super.getChildAt(index); } + // It's a hack to prevent concurent modification exception, caused by + // children() of AbstractMutableTreeTableNode return Collections.enumeration @SuppressWarnings({"unchecked"}) @Override public Enumeration<N> children() { - return (Enumeration<N>) super.children(); + List<? extends MutableTreeTableNode> newChildrenList = + new ArrayList<MutableTreeTableNode>(super.children); + + return (Enumeration<N>) Collections.enumeration(newChildrenList); } public void removeAllChildren() {
participants (1)
-
sletellier@users.nuiton.org