/** * Select/Deselect all children nodes and propagates selection to grand-children nodes. * * @param abstractNode the abstract node. * @param enabled true when the node is checked, false otherwise. */ private void updateEnabledState(@NonNull AbstractNode node, boolean enabled) { if (node instanceof ResultValidatableNode) { ResultConstrainingNode otherTreeNode = ((ResultValidatableNode) node).getResultConstrainingNode(); otherTreeNode.setEnabled(enabled); } else if (node instanceof ResultConstrainingNode) { ResultValidatableNode otherTreeNode = ((ResultConstrainingNode) node).getResultValidatableNode(); otherTreeNode.setEnabled(enabled); } else { for (AbstractNode child : node.getChildren()) { node.setEnabled(enabled); if (child != null) { updateEnabledState(child, enabled); } } } }
/* (non-Javadoc) * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent) */ public void checkStateChanged(CheckStateChangedEvent event) { // long start = System.currentTimeMillis(); RootNode rootNode = validityView.getValidityManager().getRootNode(); assert rootNode != null; Object element = event.getElement(); // System.out.format(Thread.currentThread().getName() + " %3.3f update start\n", // (System.currentTimeMillis() - start) * 0.001); if (element instanceof AbstractNode) { AbstractNode abstractNode = (AbstractNode) element; boolean enabled = event.getChecked(); abstractNode.setEnabled(enabled); /* * Propagate the new checked/enabled state of this node to all non-Result children and at the leaves across to the other tree's results. */ updateEnabledState(abstractNode, enabled); /* * Propgation of the corresponding grayed states up is performed as a total traversal during redraw since this ensures that * each node is visited just once, whereas propagating across and up is surprisingly wasteful. */ } validityView.redraw(); // System.out.format(Thread.currentThread().getName() + " %3.3f redraw end\n", // (System.currentTimeMillis() - start) * 0.001); }