private static VisitorResult doTraverse ( final WComponent node , final boolean visibleOnly , final WComponentTreeVisitor visitor ) { if ( visibleOnly ) { // Push through Invisible Containers // 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 ) { // If inside a WWindow, only process if it is Active // 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 ; } }
Internal implementation of tree traversal method .