in tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/RenderUtils.java [151:214]
public static void decodedStateOfTreeData(final FacesContext facesContext, final AbstractUIData data) {
if (!data.isTreeModel()) {
return;
}
// selected
final List<Integer> selectedIndices = decodeIndices(facesContext, data, AbstractUIData.SUFFIX_SELECTED);
// expanded
final List<Integer> expandedIndices = decodeIndices(facesContext, data, AbstractUIData.SUFFIX_EXPANDED);
final int last = data.isRowsUnlimited() ? Integer.MAX_VALUE : data.getFirst() + data.getRows();
for (int rowIndex = data.getFirst(); rowIndex < last; rowIndex++) {
data.setRowIndex(rowIndex);
if (!data.isRowAvailable()) {
break;
}
// if the node is not rendered, the state must not be evaluated.
boolean skip = false;
for (final UIComponent uiComponent : data.getChildren()) {
if (uiComponent instanceof AbstractUITreeNodeBase && !uiComponent.isRendered()) {
skip = true;
break;
}
}
if (skip) {
continue;
}
final TreePath path = data.getPath();
// selected
if (selectedIndices != null) {
final SelectedState selectedState = data.getSelectedState();
final boolean oldSelected = selectedState.isSelected(path);
final boolean newSelected = selectedIndices.contains(rowIndex);
if (newSelected != oldSelected) {
if (newSelected) {
selectedState.select(path);
} else {
selectedState.unselect(path);
}
}
}
// expanded
if (expandedIndices != null) {
final ExpandedState expandedState = data.getExpandedState();
final boolean oldExpanded = expandedState.isExpanded(path);
final boolean newExpanded = expandedIndices.contains(rowIndex);
if (newExpanded != oldExpanded) {
if (newExpanded) {
expandedState.expand(path);
} else {
expandedState.collapse(path);
}
}
}
}
data.setRowIndex(-1);
}