Search in sources :

Example 1 with WRepeatRoot

use of com.github.bordertech.wcomponents.WRepeater.WRepeatRoot in project wcomponents by BorderTech.

the class TreeUtil method doTraverse.

/**
 * Internal implementation of tree traversal method.
 *
 * @param node the node to traverse.
 * @param visibleOnly if true, only visit visible components.
 * @param visitor the visitor to notify as the tree is traversed.
 * @return how the traversal should continue.
 */
private static VisitorResult doTraverse(final WComponent node, final boolean visibleOnly, final WComponentTreeVisitor visitor) {
    if (visibleOnly) {
        // Certain components have their visibility altered to implement custom processing.
        if (node instanceof WInvisibleContainer) {
            WComponent parent = node.getParent();
            // If inside a CardManager, skip the InvisibleContainer and process the visible card.
            if (parent instanceof WCardManager) {
                WComponent visible = ((WCardManager) node.getParent()).getVisible();
                if (visible == null) {
                    return VisitorResult.ABORT_BRANCH;
                }
                return doTraverse(visible, visibleOnly, visitor);
            } else if (parent instanceof WWindow) {
                // Abort branch if WWindow is not in ACTIVE state
                if (((WWindow) parent).getState() != WWindow.ACTIVE_STATE) {
                    return VisitorResult.ABORT_BRANCH;
                }
            }
        } else if (node instanceof WRepeatRoot) {
        // Let be processed.
        } else if (!node.isVisible()) {
            // For most components, we just need to see if they're marked as visible
            return VisitorResult.ABORT_BRANCH;
        }
    }
    VisitorResult result = visitor.visit(node);
    switch(result) {
        case ABORT_BRANCH:
            // Continue processing, but not down this branch
            return VisitorResult.CONTINUE;
        case CONTINUE:
            // Process repeater rows
            if (node instanceof WRepeater) {
                // Get parent repeater
                WRepeater repeater = (WRepeater) node;
                // Get row contexts
                List<UIContext> rowContextList = repeater.getRowContexts();
                WRepeatRoot repeatRoot = (WRepeatRoot) repeater.getRepeatedComponent().getParent();
                for (UIContext rowContext : rowContextList) {
                    UIContextHolder.pushContext(rowContext);
                    try {
                        result = doTraverse(repeatRoot, visibleOnly, visitor);
                    } finally {
                        UIContextHolder.popContext();
                    }
                    if (VisitorResult.ABORT.equals(result)) {
                        return VisitorResult.ABORT;
                    }
                }
            } else if (node instanceof Container) {
                Container container = (Container) node;
                for (int i = 0; i < container.getChildCount(); i++) {
                    result = doTraverse(container.getChildAt(i), visibleOnly, visitor);
                    if (VisitorResult.ABORT.equals(result)) {
                        return VisitorResult.ABORT;
                    }
                }
            }
            return VisitorResult.CONTINUE;
        default:
            // Abort entire traversal
            return VisitorResult.ABORT;
    }
}
Also used : WComponent(com.github.bordertech.wcomponents.WComponent) VisitorResult(com.github.bordertech.wcomponents.util.WComponentTreeVisitor.VisitorResult) Container(com.github.bordertech.wcomponents.Container) WInvisibleContainer(com.github.bordertech.wcomponents.WInvisibleContainer) WRepeatRoot(com.github.bordertech.wcomponents.WRepeater.WRepeatRoot) UIContext(com.github.bordertech.wcomponents.UIContext) WCardManager(com.github.bordertech.wcomponents.WCardManager) WWindow(com.github.bordertech.wcomponents.WWindow) WInvisibleContainer(com.github.bordertech.wcomponents.WInvisibleContainer) WRepeater(com.github.bordertech.wcomponents.WRepeater)

Aggregations

Container (com.github.bordertech.wcomponents.Container)1 UIContext (com.github.bordertech.wcomponents.UIContext)1 WCardManager (com.github.bordertech.wcomponents.WCardManager)1 WComponent (com.github.bordertech.wcomponents.WComponent)1 WInvisibleContainer (com.github.bordertech.wcomponents.WInvisibleContainer)1 WRepeater (com.github.bordertech.wcomponents.WRepeater)1 WRepeatRoot (com.github.bordertech.wcomponents.WRepeater.WRepeatRoot)1 WWindow (com.github.bordertech.wcomponents.WWindow)1 VisitorResult (com.github.bordertech.wcomponents.util.WComponentTreeVisitor.VisitorResult)1